diff --git a/src/Uploads/UploadInfo.php b/src/Uploads/UploadInfo.php index d6575d3..1e9b96a 100644 --- a/src/Uploads/UploadInfo.php +++ b/src/Uploads/UploadInfo.php @@ -121,6 +121,10 @@ class UploadInfo { return $this->bump; } + public function getBumpAmountForUpdate(): ?int { + return $this->expires !== null && $this->bump > 0 ? $this->bump : null; + } + public function getName(): string { return $this->name; } diff --git a/src/Uploads/UploadsContext.php b/src/Uploads/UploadsContext.php index b23f708..724228d 100644 --- a/src/Uploads/UploadsContext.php +++ b/src/Uploads/UploadsContext.php @@ -65,8 +65,8 @@ class UploadsContext { return sprintf('%s.t', $this->getFileUrlV1($uploadInfo, $forceApiDomain)); } - public function convertToClientJsonV1(UploadInfo $uploadInfo): array { - return [ + public function convertToClientJsonV1(UploadInfo $uploadInfo, array $overrides = []): array { + return array_merge([ 'id' => $uploadInfo->getId(), 'url' => $this->getFileUrlV1($uploadInfo), 'urlf' => $this->getFileUrlV1($uploadInfo, true), @@ -84,7 +84,7 @@ class UploadsContext { // These can never be reached, and in situation where they technically could it's because of an outdated local record 'deleted' => null, 'dmca' => null, - ]; + ], $overrides); } public function supportsThumbnailing(UploadInfo $uploadInfo): bool { diff --git a/src/Uploads/UploadsData.php b/src/Uploads/UploadsData.php index 321b174..1184319 100644 --- a/src/Uploads/UploadsData.php +++ b/src/Uploads/UploadsData.php @@ -121,23 +121,39 @@ class UploadsData { return $this->getUpload(uploadId: $uploadId); } - public function bumpUploadAccess(UploadInfo $uploadInfo): void { - $stmt = $this->cache->get('UPDATE prm_uploads SET upload_accessed = NOW() WHERE upload_id = ?'); - $stmt->addParameter(1, $uploadInfo->getId()); - $stmt->execute(); - } + public function updateUpload( + UploadInfo|string $uploadInfo, + ?string $fileName = null, + int|null|bool $accessedAt = false, + int|null|false $expiresAt = false + ): void { + $fields = []; + $values = []; - public function bumpUploadExpires(UploadInfo|string $uploadInfo): void { - if(!$uploadInfo->hasExpiryTime()) + if($fileName !== null) { + $fields[] = 'upload_name = ?'; + $values[] = $fileName; + } + + if($accessedAt !== false) { + $fields[] = sprintf('upload_accessed = %s', $accessedAt === true ? 'NOW()' : 'FROM_UNIXTIME(?)'); + if($accessedAt !== true) + $values[] = $accessedAt; + } + + if($expiresAt !== false) { + $fields[] = 'upload_expires = NOW() + INTERVAL ? SECOND'; + $values[] = $expiresAt; + } + + if(empty($fields)) return; - $bumpAmount = $uploadInfo->getBumpAmount(); - if($bumpAmount < 1) - return; - - $stmt = $this->cache->get('UPDATE prm_uploads SET upload_expires = NOW() + INTERVAL ? SECOND WHERE upload_id = ?'); - $stmt->addParameter(1, $bumpAmount); - $stmt->addParameter(2, $uploadInfo->getId()); + $args = 0; + $stmt = $this->cache->get(sprintf('UPDATE prm_uploads SET %s WHERE upload_id = ?', implode(', ', $fields))); + foreach($values as $value) + $stmt->addParameter(++$args, $value); + $stmt->addParameter(++$args, $uploadInfo instanceof UploadInfo ? $uploadInfo->getId() : $uploadInfo); $stmt->execute(); } diff --git a/src/Uploads/UploadsRoutes.php b/src/Uploads/UploadsRoutes.php index 03610d7..83edac8 100644 --- a/src/Uploads/UploadsRoutes.php +++ b/src/Uploads/UploadsRoutes.php @@ -81,10 +81,12 @@ class UploadsRoutes implements IRouteHandler { return 404; } - if(!$isThumbnail) { - $uploadsData->bumpUploadAccess($uploadInfo); - $uploadsData->bumpUploadExpires($uploadInfo); - } + if(!$isThumbnail) + $uploadsData->updateUpload( + $uploadInfo, + accessedAt: true, + expiresAt: $uploadInfo->getBumpAmountForUpdate(), + ); $fileName = $uploadInfo->getName(); $contentType = $uploadInfo->getMediaTypeString(); @@ -164,11 +166,12 @@ class UploadsRoutes implements IRouteHandler { if($blInfo !== null) return 451; + $fileName = $file->getSuggestedFileName(); $uploadInfo = $uploadsData->getUpload(appInfo: $appInfo, userInfo: $userInfo, hashString: $hash); if($uploadInfo === null) { $uploadInfo = $uploadsData->createUpload( $appInfo, $userInfo, $_SERVER['REMOTE_ADDR'], - $file->getSuggestedFileName(), mime_content_type($localFile), + $fileName, mime_content_type($localFile), $fileSize, $hash, $appInfo->getBumpAmount(), true ); $filePath = $this->uploadsCtx->getFileDataPath($uploadInfo); @@ -178,13 +181,19 @@ class UploadsRoutes implements IRouteHandler { if($uploadInfo->isDeleted()) $uploadsData->restoreUpload($uploadInfo); - $uploadsData->bumpUploadExpires($uploadInfo); + $uploadsData->updateUpload( + $uploadInfo, + fileName: $fileName, + expiresAt: $uploadInfo->getBumpAmountForUpdate(), + ); } $response->setStatusCode(201); $response->setHeader('Content-Type', 'application/json; charset=utf-8'); - return $this->uploadsCtx->convertToClientJsonV1($uploadInfo); + return $this->uploadsCtx->convertToClientJsonV1($uploadInfo, [ + 'name' => $fileName, + ]); } #[HttpDelete('/uploads/([A-Za-z0-9\-_]+)')]