diff --git a/server/src/immich/api-v1/asset/asset.controller.ts b/server/src/immich/api-v1/asset/asset.controller.ts index bc59e2dfef..37b5614908 100644 --- a/server/src/immich/api-v1/asset/asset.controller.ts +++ b/server/src/immich/api-v1/asset/asset.controller.ts @@ -13,7 +13,6 @@ import { Res, UploadedFiles, UseInterceptors, - ValidationPipe, } from '@nestjs/common'; import { ApiBody, ApiConsumes, ApiHeader, ApiTags } from '@nestjs/swagger'; import { NextFunction, Response } from 'express'; @@ -58,7 +57,7 @@ export class AssetController { async uploadFile( @Auth() auth: AuthDto, @UploadedFiles(new ParseFilePipe({ validators: [new FileNotEmptyValidator(['assetData'])] })) files: UploadFiles, - @Body(new ValidationPipe({ transform: true })) dto: CreateAssetDto, + @Body() dto: CreateAssetDto, @Res({ passthrough: true }) res: Response, ): Promise { const file = mapToUploadFile(files.assetData[0]); @@ -90,7 +89,7 @@ export class AssetController { @Next() next: NextFunction, @Auth() auth: AuthDto, @Param() { id }: UUIDParamDto, - @Query(new ValidationPipe({ transform: true })) dto: ServeFileDto, + @Query() dto: ServeFileDto, ) { await sendFile(res, next, () => this.serviceV1.serveFile(auth, id, dto)); } @@ -103,7 +102,7 @@ export class AssetController { @Next() next: NextFunction, @Auth() auth: AuthDto, @Param() { id }: UUIDParamDto, - @Query(new ValidationPipe({ transform: true })) dto: GetAssetThumbnailDto, + @Query() dto: GetAssetThumbnailDto, ) { await sendFile(res, next, () => this.serviceV1.serveThumbnail(auth, id, dto)); } @@ -133,10 +132,7 @@ export class AssetController { required: false, schema: { type: 'string' }, }) - getAllAssets( - @Auth() auth: AuthDto, - @Query(new ValidationPipe({ transform: true })) dto: AssetSearchDto, - ): Promise { + getAllAssets(@Auth() auth: AuthDto, @Query() dto: AssetSearchDto): Promise { return this.serviceV1.getAllAssets(auth, dto); } @@ -147,7 +143,7 @@ export class AssetController { @HttpCode(HttpStatus.OK) checkExistingAssets( @Auth() auth: AuthDto, - @Body(ValidationPipe) dto: CheckExistingAssetsDto, + @Body() dto: CheckExistingAssetsDto, ): Promise { return this.serviceV1.checkExistingAssets(auth, dto); } @@ -159,7 +155,7 @@ export class AssetController { @HttpCode(HttpStatus.OK) checkBulkUpload( @Auth() auth: AuthDto, - @Body(ValidationPipe) dto: AssetBulkUploadCheckDto, + @Body() dto: AssetBulkUploadCheckDto, ): Promise { return this.serviceV1.bulkUploadCheck(auth, dto); } diff --git a/server/src/immich/app.module.ts b/server/src/immich/app.module.ts index 8d02a44a91..662f45f7c8 100644 --- a/server/src/immich/app.module.ts +++ b/server/src/immich/app.module.ts @@ -1,8 +1,8 @@ import { DomainModule } from '@app/domain'; import { InfraModule } from '@app/infra'; import { AssetEntity, ExifEntity } from '@app/infra/entities'; -import { Module, OnModuleInit } from '@nestjs/common'; -import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core'; +import { Module, OnModuleInit, ValidationPipe } from '@nestjs/common'; +import { APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core'; import { ScheduleModule } from '@nestjs/schedule'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AssetRepositoryV1, IAssetRepositoryV1 } from './api-v1/asset/asset-repository'; @@ -70,6 +70,7 @@ import { ErrorInterceptor, FileUploadInterceptor } from './interceptors'; PersonController, ], providers: [ + { provide: APP_PIPE, useValue: new ValidationPipe({ transform: true, whitelist: true }) }, { provide: APP_INTERCEPTOR, useClass: ErrorInterceptor }, { provide: APP_GUARD, useClass: AppGuard }, { provide: IAssetRepositoryV1, useClass: AssetRepositoryV1 }, diff --git a/server/src/immich/app.utils.ts b/server/src/immich/app.utils.ts index 938f6f4708..26aca2a9bb 100644 --- a/server/src/immich/app.utils.ts +++ b/server/src/immich/app.utils.ts @@ -17,28 +17,15 @@ import { SwaggerDocumentOptions, SwaggerModule, } from '@nestjs/swagger'; +import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { NextFunction, Response } from 'express'; import _ from 'lodash'; import { writeFileSync } from 'node:fs'; import { access, constants } from 'node:fs/promises'; import path, { isAbsolute } from 'node:path'; import { promisify } from 'node:util'; - -import { applyDecorators, UsePipes, ValidationPipe } from '@nestjs/common'; -import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Metadata } from './app.guard'; -export function UseValidation() { - return applyDecorators( - UsePipes( - new ValidationPipe({ - transform: true, - whitelist: true, - }), - ), - ); -} - type SendFile = Parameters; type SendFileOptions = SendFile[1]; diff --git a/server/src/immich/controllers/activity.controller.ts b/server/src/immich/controllers/activity.controller.ts index d01d4e903a..0808c7d4d4 100644 --- a/server/src/immich/controllers/activity.controller.ts +++ b/server/src/immich/controllers/activity.controller.ts @@ -11,13 +11,11 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query import { ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Activity') @Controller('activity') @Authenticated() -@UseValidation() export class ActivityController { constructor(private service: ActivityService) {} diff --git a/server/src/immich/controllers/album.controller.ts b/server/src/immich/controllers/album.controller.ts index d388dba771..ea1c5a428b 100644 --- a/server/src/immich/controllers/album.controller.ts +++ b/server/src/immich/controllers/album.controller.ts @@ -15,13 +15,11 @@ import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@ import { ApiTags } from '@nestjs/swagger'; import { ParseMeUUIDPipe } from '../api-v1/validation/parse-me-uuid-pipe'; import { Auth, Authenticated, SharedLinkRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Album') @Controller('album') @Authenticated() -@UseValidation() export class AlbumController { constructor(private service: AlbumService) {} diff --git a/server/src/immich/controllers/api-key.controller.ts b/server/src/immich/controllers/api-key.controller.ts index ba0aaf661a..5b50725334 100644 --- a/server/src/immich/controllers/api-key.controller.ts +++ b/server/src/immich/controllers/api-key.controller.ts @@ -9,13 +9,11 @@ import { import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('API Key') @Controller('api-key') @Authenticated() -@UseValidation() export class APIKeyController { constructor(private service: APIKeyService) {} diff --git a/server/src/immich/controllers/asset.controller.ts b/server/src/immich/controllers/asset.controller.ts index 57a67d33fe..39a36b1759 100644 --- a/server/src/immich/controllers/asset.controller.ts +++ b/server/src/immich/controllers/asset.controller.ts @@ -8,7 +8,6 @@ import { AssetStatsResponseDto, AuthDto, DeviceIdDto, - DownloadService, MapMarkerDto, MapMarkerResponseDto, MemoryLaneDto, @@ -19,21 +18,18 @@ import { TimeBucketAssetDto, TimeBucketDto, TimeBucketResponseDto, - TrashService, UpdateAssetDto as UpdateDto, UpdateStackParentDto, } from '@app/domain'; import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated, SharedLinkRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { Route } from '../interceptors'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Asset') @Controller('assets') @Authenticated() -@UseValidation() export class AssetsController { constructor(private searchService: SearchService) {} @@ -50,13 +46,8 @@ export class AssetsController { @ApiTags('Asset') @Controller(Route.ASSET) @Authenticated() -@UseValidation() export class AssetController { - constructor( - private service: AssetService, - private downloadService: DownloadService, - private trashService: TrashService, - ) {} + constructor(private service: AssetService) {} @Get('map-marker') getMapMarkers(@Auth() auth: AuthDto, @Query() options: MapMarkerDto): Promise { diff --git a/server/src/immich/controllers/audit.controller.ts b/server/src/immich/controllers/audit.controller.ts index 785d48bd25..09b707b8a7 100644 --- a/server/src/immich/controllers/audit.controller.ts +++ b/server/src/immich/controllers/audit.controller.ts @@ -11,12 +11,10 @@ import { import { Body, Controller, Get, Post, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { AdminRoute, Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('Audit') @Controller('audit') @Authenticated() -@UseValidation() export class AuditController { constructor(private service: AuditService) {} diff --git a/server/src/immich/controllers/auth.controller.ts b/server/src/immich/controllers/auth.controller.ts index c8ffd52fd1..ac1fea2bcb 100644 --- a/server/src/immich/controllers/auth.controller.ts +++ b/server/src/immich/controllers/auth.controller.ts @@ -19,13 +19,11 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Req, import { ApiTags } from '@nestjs/swagger'; import { Request, Response } from 'express'; import { Auth, Authenticated, GetLoginDetails, PublicRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Authentication') @Controller('auth') @Authenticated() -@UseValidation() export class AuthController { constructor(private service: AuthService) {} diff --git a/server/src/immich/controllers/download.controller.ts b/server/src/immich/controllers/download.controller.ts index fcddac53d8..743797f745 100644 --- a/server/src/immich/controllers/download.controller.ts +++ b/server/src/immich/controllers/download.controller.ts @@ -3,13 +3,12 @@ import { Body, Controller, HttpCode, HttpStatus, Next, Param, Post, Res, Streama import { ApiTags } from '@nestjs/swagger'; import { NextFunction, Response } from 'express'; import { Auth, Authenticated, FileResponse, SharedLinkRoute } from '../app.guard'; -import { UseValidation, asStreamableFile, sendFile } from '../app.utils'; +import { asStreamableFile, sendFile } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Download') @Controller('download') @Authenticated() -@UseValidation() export class DownloadController { constructor(private service: DownloadService) {} diff --git a/server/src/immich/controllers/face.controller.ts b/server/src/immich/controllers/face.controller.ts index 59473950c1..f4014713b4 100644 --- a/server/src/immich/controllers/face.controller.ts +++ b/server/src/immich/controllers/face.controller.ts @@ -2,13 +2,11 @@ import { AssetFaceResponseDto, AuthDto, FaceDto, PersonResponseDto, PersonServic import { Body, Controller, Get, Param, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Face') @Controller('face') @Authenticated() -@UseValidation() export class FaceController { constructor(private service: PersonService) {} diff --git a/server/src/immich/controllers/job.controller.ts b/server/src/immich/controllers/job.controller.ts index 243b7537d2..413af44de2 100644 --- a/server/src/immich/controllers/job.controller.ts +++ b/server/src/immich/controllers/job.controller.ts @@ -2,12 +2,10 @@ import { AllJobStatusResponseDto, JobCommandDto, JobIdParamDto, JobService, JobS import { Body, Controller, Get, Param, Put } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('Job') @Controller('jobs') @Authenticated({ admin: true }) -@UseValidation() export class JobController { constructor(private service: JobService) {} diff --git a/server/src/immich/controllers/library.controller.ts b/server/src/immich/controllers/library.controller.ts index 9ad7119799..801dc173d9 100644 --- a/server/src/immich/controllers/library.controller.ts +++ b/server/src/immich/controllers/library.controller.ts @@ -13,13 +13,11 @@ import { import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { AdminRoute, Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Library') @Controller('library') @Authenticated() -@UseValidation() @AdminRoute() export class LibraryController { constructor(private service: LibraryService) {} diff --git a/server/src/immich/controllers/oauth.controller.ts b/server/src/immich/controllers/oauth.controller.ts index a62458715b..c7a5717af4 100644 --- a/server/src/immich/controllers/oauth.controller.ts +++ b/server/src/immich/controllers/oauth.controller.ts @@ -12,12 +12,10 @@ import { Body, Controller, Get, HttpStatus, Post, Redirect, Req, Res } from '@ne import { ApiTags } from '@nestjs/swagger'; import { Request, Response } from 'express'; import { Auth, Authenticated, GetLoginDetails, PublicRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('OAuth') @Controller('oauth') @Authenticated() -@UseValidation() export class OAuthController { constructor(private service: AuthService) {} diff --git a/server/src/immich/controllers/partner.controller.ts b/server/src/immich/controllers/partner.controller.ts index 6370d8e718..65d95438d7 100644 --- a/server/src/immich/controllers/partner.controller.ts +++ b/server/src/immich/controllers/partner.controller.ts @@ -3,13 +3,11 @@ import { PartnerResponseDto, UpdatePartnerDto } from '@app/domain/partner/partne import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common'; import { ApiQuery, ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Partner') @Controller('partner') @Authenticated() -@UseValidation() export class PartnerController { constructor(private service: PartnerService) {} diff --git a/server/src/immich/controllers/person.controller.ts b/server/src/immich/controllers/person.controller.ts index 2447f982b4..3408aa6ec0 100644 --- a/server/src/immich/controllers/person.controller.ts +++ b/server/src/immich/controllers/person.controller.ts @@ -17,13 +17,12 @@ import { Body, Controller, Get, Next, Param, Post, Put, Query, Res } from '@nest import { ApiTags } from '@nestjs/swagger'; import { NextFunction, Response } from 'express'; import { Auth, Authenticated, FileResponse } from '../app.guard'; -import { UseValidation, sendFile } from '../app.utils'; +import { sendFile } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Person') @Controller('person') @Authenticated() -@UseValidation() export class PersonController { constructor(private service: PersonService) {} diff --git a/server/src/immich/controllers/search.controller.ts b/server/src/immich/controllers/search.controller.ts index df1bec7c63..d508531ddd 100644 --- a/server/src/immich/controllers/search.controller.ts +++ b/server/src/immich/controllers/search.controller.ts @@ -15,12 +15,10 @@ import { SearchSuggestionRequestDto } from '@app/domain/search/dto/search-sugges import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query } from '@nestjs/common'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('Search') @Controller('search') @Authenticated() -@UseValidation() export class SearchController { constructor(private service: SearchService) {} diff --git a/server/src/immich/controllers/server-info.controller.ts b/server/src/immich/controllers/server-info.controller.ts index 66835501cc..4987a8984d 100644 --- a/server/src/immich/controllers/server-info.controller.ts +++ b/server/src/immich/controllers/server-info.controller.ts @@ -12,12 +12,10 @@ import { import { Controller, Get, HttpCode, HttpStatus, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { AdminRoute, Authenticated, PublicRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('Server Info') @Controller('server-info') @Authenticated() -@UseValidation() export class ServerInfoController { constructor(private service: ServerInfoService) {} diff --git a/server/src/immich/controllers/shared-link.controller.ts b/server/src/immich/controllers/shared-link.controller.ts index 86045433d5..d265d018d6 100644 --- a/server/src/immich/controllers/shared-link.controller.ts +++ b/server/src/immich/controllers/shared-link.controller.ts @@ -13,13 +13,11 @@ import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, Req, Res import { ApiTags } from '@nestjs/swagger'; import { Request, Response } from 'express'; import { Auth, Authenticated, SharedLinkRoute } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Shared Link') @Controller('shared-link') @Authenticated() -@UseValidation() export class SharedLinkController { constructor(private readonly service: SharedLinkService) {} diff --git a/server/src/immich/controllers/system-config.controller.ts b/server/src/immich/controllers/system-config.controller.ts index da2402efe9..73cf2c3c0a 100644 --- a/server/src/immich/controllers/system-config.controller.ts +++ b/server/src/immich/controllers/system-config.controller.ts @@ -3,12 +3,10 @@ import { MapThemeDto } from '@app/domain/system-config/system-config-map-theme.d import { Body, Controller, Get, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { AdminRoute, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('System Config') @Controller('system-config') @Authenticated({ admin: true }) -@UseValidation() export class SystemConfigController { constructor(private readonly service: SystemConfigService) {} diff --git a/server/src/immich/controllers/tag.controller.ts b/server/src/immich/controllers/tag.controller.ts index b9d3636008..0d0c563d4a 100644 --- a/server/src/immich/controllers/tag.controller.ts +++ b/server/src/immich/controllers/tag.controller.ts @@ -11,13 +11,11 @@ import { import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('Tag') @Controller('tag') @Authenticated() -@UseValidation() export class TagController { constructor(private service: TagService) {} diff --git a/server/src/immich/controllers/trash.controller.ts b/server/src/immich/controllers/trash.controller.ts index 9f7abe3116..b618938170 100644 --- a/server/src/immich/controllers/trash.controller.ts +++ b/server/src/immich/controllers/trash.controller.ts @@ -2,12 +2,10 @@ import { AuthDto, BulkIdsDto, TrashService } from '@app/domain'; import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Auth, Authenticated } from '../app.guard'; -import { UseValidation } from '../app.utils'; @ApiTags('Trash') @Controller('trash') @Authenticated() -@UseValidation() export class TrashController { constructor(private service: TrashService) {} diff --git a/server/src/immich/controllers/user.controller.ts b/server/src/immich/controllers/user.controller.ts index 7fa7ccd0fd..0b3828f5ca 100644 --- a/server/src/immich/controllers/user.controller.ts +++ b/server/src/immich/controllers/user.controller.ts @@ -27,14 +27,13 @@ import { import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger'; import { NextFunction, Response } from 'express'; import { AdminRoute, Auth, Authenticated, FileResponse } from '../app.guard'; -import { UseValidation, sendFile } from '../app.utils'; +import { sendFile } from '../app.utils'; import { FileUploadInterceptor, Route } from '../interceptors'; import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('User') @Controller(Route.USER) @Authenticated() -@UseValidation() export class UserController { constructor(private service: UserService) {}