diff --git a/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart b/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart index f36105f59..e7111771b 100644 Binary files a/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart and b/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart differ diff --git a/mobile/openapi/lib/model/system_config_generated_image_dto.dart b/mobile/openapi/lib/model/system_config_generated_image_dto.dart index 7dd5b2be7..a46fc13d2 100644 Binary files a/mobile/openapi/lib/model/system_config_generated_image_dto.dart and b/mobile/openapi/lib/model/system_config_generated_image_dto.dart differ diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 1129dd486..5f133b4f8 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -22625,6 +22625,7 @@ ] }, "progressive": { + "default": false, "type": "boolean" }, "quality": { @@ -22636,7 +22637,6 @@ "required": [ "enabled", "format", - "progressive", "quality" ], "type": "object" @@ -22651,6 +22651,7 @@ ] }, "progressive": { + "default": false, "type": "boolean" }, "quality": { @@ -22665,7 +22666,6 @@ }, "required": [ "format", - "progressive", "quality", "size" ], diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index a6bbf5cdd..52f6621d9 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1538,12 +1538,12 @@ export type SystemConfigFFmpegDto = { export type SystemConfigGeneratedFullsizeImageDto = { enabled: boolean; format: ImageFormat; - progressive: boolean; + progressive?: boolean; quality: number; }; export type SystemConfigGeneratedImageDto = { format: ImageFormat; - progressive: boolean; + progressive?: boolean; quality: number; size: number; }; diff --git a/server/src/controllers/system-config.controller.spec.ts b/server/src/controllers/system-config.controller.spec.ts index 48b8c1bcf..bbd1241dc 100644 --- a/server/src/controllers/system-config.controller.spec.ts +++ b/server/src/controllers/system-config.controller.spec.ts @@ -70,5 +70,33 @@ describe(SystemConfigController.name, () => { expect(body).toEqual(errorDto.badRequest(['nightlyTasks.databaseCleanup must be a boolean value'])); }); }); + + describe('image', () => { + it('should accept config without optional progressive property', async () => { + const config = _.cloneDeep(defaults); + delete config.image.thumbnail.progressive; + delete config.image.preview.progressive; + delete config.image.fullsize.progressive; + const { status } = await request(ctx.getHttpServer()).put('/system-config').send(config); + expect(status).toBe(200); + }); + + it('should accept config with progressive set to true', async () => { + const config = _.cloneDeep(defaults); + config.image.thumbnail.progressive = true; + config.image.preview.progressive = true; + config.image.fullsize.progressive = true; + const { status } = await request(ctx.getHttpServer()).put('/system-config').send(config); + expect(status).toBe(200); + }); + + it('should reject invalid progressive value', async () => { + const config = _.cloneDeep(defaults); + (config.image.thumbnail.progressive as any) = 'invalid'; + const { status, body } = await request(ctx.getHttpServer()).put('/system-config').send(config); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['image.thumbnail.progressive must be a boolean value'])); + }); + }); }); }); diff --git a/server/src/dtos/system-config.dto.ts b/server/src/dtos/system-config.dto.ts index 4301d7193..b0d5a0646 100644 --- a/server/src/dtos/system-config.dto.ts +++ b/server/src/dtos/system-config.dto.ts @@ -586,8 +586,8 @@ class SystemConfigGeneratedImageDto { @ApiProperty({ type: 'integer' }) size!: number; - @ValidateBoolean() - progressive!: boolean; + @ValidateBoolean({ optional: true, default: false }) + progressive?: boolean; } class SystemConfigGeneratedFullsizeImageDto { @@ -604,8 +604,8 @@ class SystemConfigGeneratedFullsizeImageDto { @ApiProperty({ type: 'integer' }) quality!: number; - @ValidateBoolean() - progressive!: boolean; + @ValidateBoolean({ optional: true, default: false }) + progressive?: boolean; } export class SystemConfigImageDto { diff --git a/server/src/types.ts b/server/src/types.ts index 9f8c8011e..f851ebd99 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -36,14 +36,14 @@ export type FullsizeImageOptions = { format: ImageFormat; quality: number; enabled: boolean; - progressive: boolean; + progressive?: boolean; }; export type ImageOptions = { format: ImageFormat; quality: number; size: number; - progressive: boolean; + progressive?: boolean; }; export type RawImageInfo = {