diff --git a/backend/src/collections/preference-db/preference-defaults.service.ts b/backend/src/collections/preference-db/preference-defaults.service.ts index a084b1d..34105a6 100644 --- a/backend/src/collections/preference-db/preference-defaults.service.ts +++ b/backend/src/collections/preference-db/preference-defaults.service.ts @@ -42,7 +42,6 @@ export class PreferenceDefaultsService { [SysPreference.BCryptStrength]: 10, [SysPreference.RemoveDerivativesAfter]: '7d', - [SysPreference.SaveDerivatives]: true, [SysPreference.AllowEditing]: true, [SysPreference.ConversionTimeLimit]: '15s', diff --git a/backend/src/layers/success/success.interceptor.ts b/backend/src/layers/success/success.interceptor.ts index 625484a..2cfc6bf 100644 --- a/backend/src/layers/success/success.interceptor.ts +++ b/backend/src/layers/success/success.interceptor.ts @@ -4,7 +4,7 @@ import { Injectable, Logger, NestInterceptor, - Optional, + Optional } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { FastifyReply } from 'fastify'; @@ -46,6 +46,20 @@ export class SuccessInterceptor implements NestInterceptor { return data; } }), + map((data) => { + const request = context.switchToHttp().getRequest(); + const response = context.switchToHttp().getResponse(); + const traceString = `(${request.ip} -> ${request.method} ${request.url})`; + + this.logger.verbose( + `Handled ${traceString} with ${response.statusCode} in ${Math.ceil( + response.getResponseTime(), + )}ms`, + SuccessInterceptor.name, + ); + + return data; + }), ); } diff --git a/backend/src/main.ts b/backend/src/main.ts index 10864e2..68befda 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -44,12 +44,9 @@ async function bootstrap() { ); // Configure logger - const logger = app.get(PicsurLoggerService) - app.useLogger(logger); + app.useLogger(app.get(PicsurLoggerService)); app.flushLogs(); - console.log(logger); - app.useGlobalFilters(app.get(MainExceptionFilter)); app.useGlobalInterceptors(app.get(SuccessInterceptor)); app.useGlobalPipes(app.get(ZodValidationPipe)); diff --git a/backend/src/managers/image/image.module.ts b/backend/src/managers/image/image-manager.module.ts similarity index 96% rename from backend/src/managers/image/image.module.ts rename to backend/src/managers/image/image-manager.module.ts index f90cc62..a4104cf 100644 --- a/backend/src/managers/image/image.module.ts +++ b/backend/src/managers/image/image-manager.module.ts @@ -49,11 +49,12 @@ export class ImageManagerModule implements OnModuleInit { return; } - const after_ms = ms(remove_derivatives_after as any); + let after_ms = ms(remove_derivatives_after as any); if (isNaN(after_ms) || after_ms === 0) { this.logger.log('remove_derivatives_after is 0, skipping cron'); return; } + if (after_ms < 60000) after_ms = 60000; const result = await this.imageFileDB.cleanupDerivatives(after_ms / 1000); if (HasFailed(result)) { diff --git a/backend/src/managers/image/image.service.ts b/backend/src/managers/image/image.service.ts index 734c53b..dc722bf 100644 --- a/backend/src/managers/image/image.service.ts +++ b/backend/src/managers/image/image.service.ts @@ -5,7 +5,8 @@ import { ImageRequestParams } from 'picsur-shared/dist/dto/api/image.dto'; import { ImageEntryVariant } from 'picsur-shared/dist/dto/image-entry-variant.enum'; import { AnimFileType, - FileType, ImageFileType, + FileType, + ImageFileType, Mime2FileType } from 'picsur-shared/dist/dto/mimes.dto'; import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; @@ -144,19 +145,15 @@ export class ImageManagerService { const converted_key = this.getConvertHash({ mime: fileType, ...options }); - const [save_derivatives, allow_editing] = await Promise.all([ - this.sysPref.getBooleanPreference(SysPreference.SaveDerivatives), - this.sysPref.getBooleanPreference(SysPreference.AllowEditing), - ]); - if (HasFailed(save_derivatives)) return save_derivatives; + const allow_editing = await this.sysPref.getBooleanPreference( + SysPreference.AllowEditing, + ); if (HasFailed(allow_editing)) return allow_editing; return MutexFallBack( converted_key, () => { - if (save_derivatives) - return this.imageFilesService.getDerivative(imageId, converted_key); - else return Promise.resolve(null); + return this.imageFilesService.getDerivative(imageId, converted_key); }, async () => { const masterImage = await this.getMaster(imageId); @@ -180,21 +177,12 @@ export class ImageManagerService { } in ${Date.now() - startTime}ms`, ); - if (save_derivatives) { - return await this.imageFilesService.addDerivative( - imageId, - converted_key, - convertResult.filetype, - convertResult.image, - ); - } else { - const derivative = new EImageDerivativeBackend(); - derivative.filetype = convertResult.filetype; - derivative.data = convertResult.image; - derivative.image_id = imageId; - derivative.key = converted_key; - return derivative; - } + return await this.imageFilesService.addDerivative( + imageId, + converted_key, + convertResult.filetype, + convertResult.image, + ); }, ); } diff --git a/backend/src/routes/image/image.module.ts b/backend/src/routes/image/image.module.ts index dd61c51..0828e38 100644 --- a/backend/src/routes/image/image.module.ts +++ b/backend/src/routes/image/image.module.ts @@ -1,12 +1,16 @@ import { Module } from '@nestjs/common'; import { UserDbModule } from '../../collections/user-db/user-db.module'; import { DecoratorsModule } from '../../decorators/decorators.module'; -import { ImageManagerModule } from '../../managers/image/image.module'; +import { ImageManagerModule } from '../../managers/image/image-manager.module'; import { ImageManageController } from './image-manage.controller'; import { ImageController } from './image.controller'; @Module({ - imports: [ImageManagerModule, UserDbModule, DecoratorsModule], + imports: [ + ImageManagerModule, + UserDbModule, + DecoratorsModule, + ], controllers: [ImageController, ImageManageController], }) export class ImageModule {} diff --git a/frontend/src/app/i18n/sys-pref.i18n.ts b/frontend/src/app/i18n/sys-pref.i18n.ts index ed42bf2..f6415da 100644 --- a/frontend/src/app/i18n/sys-pref.i18n.ts +++ b/frontend/src/app/i18n/sys-pref.i18n.ts @@ -17,13 +17,7 @@ export const SysPreferenceUI: { [SysPreference.RemoveDerivativesAfter]: { name: 'Cached Images Expiry Time', helpText: - 'Time before cached images are deleted. This does not affect the original image. Set to 0 to disable.', - category: 'Image Processing', - }, - [SysPreference.SaveDerivatives]: { - name: 'Cache Converted Images', - helpText: - 'Cache converted images, this will reduce the time it takes to load images. It does however use more disk space.', + 'Time before cached converted images are deleted. This does not affect the original image. A lower cache time will save on disk space but cost more cpu. Set to 0 to disable.', category: 'Image Processing', }, [SysPreference.AllowEditing]: { diff --git a/shared/src/dto/sys-preferences.enum.ts b/shared/src/dto/sys-preferences.enum.ts index 8edba0b..93953df 100644 --- a/shared/src/dto/sys-preferences.enum.ts +++ b/shared/src/dto/sys-preferences.enum.ts @@ -13,7 +13,6 @@ export enum SysPreference { JwtExpiresIn = 'jwt_expires_in', BCryptStrength = 'bcrypt_strength', - SaveDerivatives = 'save_derivatives', RemoveDerivativesAfter = 'remove_derivatives_after', AllowEditing = 'allow_editing', @@ -41,7 +40,6 @@ export const SysPreferenceValueTypes: { [SysPreference.BCryptStrength]: 'number', [SysPreference.RemoveDerivativesAfter]: 'string', - [SysPreference.SaveDerivatives]: 'boolean', [SysPreference.AllowEditing]: 'boolean', [SysPreference.ConversionTimeLimit]: 'string', @@ -63,8 +61,7 @@ export const SysPreferenceValidators: { [SysPreference.JwtExpiresIn]: IsValidMS(), [SysPreference.BCryptStrength]: IsPosInt(), - [SysPreference.RemoveDerivativesAfter]: IsValidMS(), - [SysPreference.SaveDerivatives]: z.boolean(), + [SysPreference.RemoveDerivativesAfter]: IsValidMS(60000), [SysPreference.AllowEditing]: z.boolean(), [SysPreference.ConversionTimeLimit]: IsValidMS(), diff --git a/shared/src/validators/ms.validator.ts b/shared/src/validators/ms.validator.ts index bcbfb2a..3192aae 100644 --- a/shared/src/validators/ms.validator.ts +++ b/shared/src/validators/ms.validator.ts @@ -1,7 +1,7 @@ import ms from 'ms'; import { z } from 'zod'; -export const IsValidMS = () => +export const IsValidMS = (min = 0) => z.preprocess( (v: any) => { try { @@ -17,5 +17,5 @@ export const IsValidMS = () => }), }) .int() - .min(0), + .min(min), );