diff --git a/backend/src/managers/image/image-processor.service.ts b/backend/src/managers/image/image-processor.service.ts index 14355a2..2242fdf 100644 --- a/backend/src/managers/image/image-processor.service.ts +++ b/backend/src/managers/image/image-processor.service.ts @@ -9,7 +9,6 @@ import { import { AsyncFailable, Fail } from 'picsur-shared/dist/types'; import { QOIColorSpace, QOIdecode, QOIencode } from 'qoi-img'; import sharp from 'sharp'; -import { UsrPreferenceService } from '../../collections/preference-db/usr-preference-db.service'; interface ProcessResult { image: Buffer; @@ -18,8 +17,6 @@ interface ProcessResult { @Injectable() export class ImageProcessorService { - constructor(private readonly userPref: UsrPreferenceService) {} - public async process( image: Buffer, mime: FullMime, diff --git a/backend/src/managers/image/image.service.ts b/backend/src/managers/image/image.service.ts index 6a9f313..34f3e42 100644 --- a/backend/src/managers/image/image.service.ts +++ b/backend/src/managers/image/image.service.ts @@ -1,11 +1,13 @@ import { Injectable } from '@nestjs/common'; import { fileTypeFromBuffer, FileTypeResult } from 'file-type'; import { FullMime } from 'picsur-shared/dist/dto/mimes.dto'; +import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.dto'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; import { ParseMime } from 'picsur-shared/dist/util/parse-mime'; import { IsQOI } from 'qoi-img'; import { ImageDBService } from '../../collections/image-db/image-db.service'; import { ImageFileDBService } from '../../collections/image-db/image-file-db.service'; +import { UsrPreferenceService } from '../../collections/preference-db/usr-preference-db.service'; import { ImageFileType } from '../../models/constants/image-file-types.const'; import { EImageFileBackend } from '../../models/entities/image-file.entity'; import { EImageBackend } from '../../models/entities/image.entity'; @@ -21,6 +23,7 @@ export class ImageManagerService { private readonly imagesService: ImageDBService, private readonly imageFilesService: ImageFileDBService, private readonly processService: ImageProcessorService, + private readonly userPref: UsrPreferenceService, ) {} public async retrieveInfo(id: string): AsyncFailable { @@ -40,6 +43,14 @@ export class ImageManagerService { const fullMime = await this.getFullMimeFromBuffer(image); if (HasFailed(fullMime)) return fullMime; + // Check if need to save orignal + const keepOriginal = await this.userPref.getBooleanPreference( + userid, + UsrPreference.KeepOriginal, + ); + if (HasFailed(keepOriginal)) return keepOriginal; + + // Process const processResult = await this.processService.process( image, fullMime, @@ -47,6 +58,7 @@ export class ImageManagerService { ); if (HasFailed(processResult)) return processResult; + // Save processed to db const imageEntity = await this.imagesService.create(); if (HasFailed(imageEntity)) return imageEntity; @@ -58,15 +70,15 @@ export class ImageManagerService { ); if (HasFailed(imageFileEntity)) return imageFileEntity; - // // nothing happens right now - // const keepOriginal = await this.userPref.getBooleanPreference( - // userid, - // UsrPreference.KeepOriginal, - // ); - // if (HasFailed(keepOriginal)) return keepOriginal; - - // if (keepOriginal) { - // } + if (keepOriginal) { + const originalFileEntity = await this.imageFilesService.setFile( + imageEntity.id, + ImageFileType.ORIGINAL, + image, + fullMime.mime, + ); + if (HasFailed(originalFileEntity)) return originalFileEntity; + } return imageEntity; } diff --git a/frontend/src/app/services/api/api.service.ts b/frontend/src/app/services/api/api.service.ts index eb38d39..6d2653a 100644 --- a/frontend/src/app/services/api/api.service.ts +++ b/frontend/src/app/services/api/api.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { ApiResponseSchema } from 'picsur-shared/dist/dto/api/api.dto'; -import { MimeExt } from 'picsur-shared/dist/dto/mimes.dto'; +import { Mime2Ext } from 'picsur-shared/dist/dto/mimes.dto'; import { AsyncFailable, Fail, HasFailed } from 'picsur-shared/dist/types'; import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto'; import { Subject } from 'rxjs'; @@ -130,7 +130,7 @@ export class ApiService { } } - const mimeTypeExt = MimeExt(mimeType); + const mimeTypeExt = Mime2Ext(mimeType); if (mimeTypeExt !== undefined && !name.endsWith(mimeTypeExt)) { name += '.' + mimeTypeExt; } diff --git a/shared/src/dto/mimes.dto.ts b/shared/src/dto/mimes.dto.ts index 8f43020..300392f 100644 --- a/shared/src/dto/mimes.dto.ts +++ b/shared/src/dto/mimes.dto.ts @@ -32,7 +32,7 @@ export interface FullMime { type: SupportedMimeCategory; } -export const MimeExtMap: { +export const Mime2ExtMap: { [key in ImageMime | AnimMime]: string; } = { [ImageMime.JPEG]: 'jpg', @@ -47,6 +47,14 @@ export const MimeExtMap: { [AnimMime.GIF]: 'gif', }; -export const MimeExt = (mime: string): string | undefined => { - return MimeExtMap[mime as ImageMime | AnimMime]; -} +export const Ext2MimeMap: { + [key: string]: string; +} = Object.fromEntries(Object.entries(Mime2ExtMap).map(([k, v]) => [v, k])); + +export const Mime2Ext = (mime: string): string | undefined => { + return Mime2ExtMap[mime as ImageMime | AnimMime]; +}; + +export const Ext2Mime = (ext: string): string | undefined => { + return Ext2MimeMap[ext]; +};