Overwrite existing filename on reupload.

This commit is contained in:
flash 2024-04-02 19:10:31 +00:00
parent 116202929b
commit bca1630ea9
4 changed files with 53 additions and 24 deletions

View file

@ -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;
}

View file

@ -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 {

View file

@ -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();
}

View file

@ -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\-_]+)')]