|
|
|
|
@ -24,20 +24,14 @@ import { AuthDto } from 'src/dtos/auth.dto';
|
|
|
|
|
import { AssetStatus, AssetType, AssetVisibility, CacheControl, JobName, Permission, StorageFolder } from 'src/enum';
|
|
|
|
|
import { AuthRequest } from 'src/middleware/auth.guard';
|
|
|
|
|
import { BaseService } from 'src/services/base.service';
|
|
|
|
|
import { UploadFile } from 'src/types';
|
|
|
|
|
import { UploadFile, UploadRequest } from 'src/types';
|
|
|
|
|
import { requireUploadAccess } from 'src/utils/access';
|
|
|
|
|
import { asRequest, getAssetFiles, onBeforeLink } from 'src/utils/asset.util';
|
|
|
|
|
import { asUploadRequest, getAssetFiles, onBeforeLink } from 'src/utils/asset.util';
|
|
|
|
|
import { isAssetChecksumConstraint } from 'src/utils/database';
|
|
|
|
|
import { getFilenameExtension, getFileNameWithoutExtension, ImmichFileResponse } from 'src/utils/file';
|
|
|
|
|
import { mimeTypes } from 'src/utils/mime-types';
|
|
|
|
|
import { fromChecksum } from 'src/utils/request';
|
|
|
|
|
|
|
|
|
|
interface UploadRequest {
|
|
|
|
|
auth: AuthDto | null;
|
|
|
|
|
fieldName: UploadFieldName;
|
|
|
|
|
file: UploadFile;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface AssetMediaRedirectResponse {
|
|
|
|
|
targetSize: AssetMediaSize | 'original';
|
|
|
|
|
}
|
|
|
|
|
@ -89,15 +83,15 @@ export class AssetMediaService extends BaseService {
|
|
|
|
|
throw new BadRequestException(`Unsupported file type ${filename}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getUploadFilename({ auth, fieldName, file }: UploadRequest): string {
|
|
|
|
|
getUploadFilename({ auth, fieldName, file, body }: UploadRequest): string {
|
|
|
|
|
requireUploadAccess(auth);
|
|
|
|
|
|
|
|
|
|
const originalExtension = extname(file.originalName);
|
|
|
|
|
const extension = extname(body.filename || file.originalName);
|
|
|
|
|
|
|
|
|
|
const lookup = {
|
|
|
|
|
[UploadFieldName.ASSET_DATA]: originalExtension,
|
|
|
|
|
[UploadFieldName.ASSET_DATA]: extension,
|
|
|
|
|
[UploadFieldName.SIDECAR_DATA]: '.xmp',
|
|
|
|
|
[UploadFieldName.PROFILE_DATA]: originalExtension,
|
|
|
|
|
[UploadFieldName.PROFILE_DATA]: extension,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return sanitize(`${file.uuid}${lookup[fieldName]}`);
|
|
|
|
|
@ -117,8 +111,8 @@ export class AssetMediaService extends BaseService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async onUploadError(request: AuthRequest, file: Express.Multer.File) {
|
|
|
|
|
const uploadFilename = this.getUploadFilename(asRequest(request, file));
|
|
|
|
|
const uploadFolder = this.getUploadFolder(asRequest(request, file));
|
|
|
|
|
const uploadFilename = this.getUploadFilename(asUploadRequest(request, file));
|
|
|
|
|
const uploadFolder = this.getUploadFolder(asUploadRequest(request, file));
|
|
|
|
|
const uploadPath = `${uploadFolder}/${uploadFilename}`;
|
|
|
|
|
|
|
|
|
|
await this.jobRepository.queue({ name: JobName.FileDelete, data: { files: [uploadPath] } });
|
|
|
|
|
|