From efeab77a4e24c4c366ccb620047cd8f5b8ff984c Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Fri, 11 Feb 2022 00:00:35 -0600 Subject: [PATCH] added delete assets endpoint --- server/src/api-v1/asset/asset.controller.ts | 16 +++++----- server/src/api-v1/asset/asset.service.ts | 29 ++++++++++++++++++- .../src/api-v1/asset/dto/delete-asset.dto.ts | 6 ++++ 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 server/src/api-v1/asset/dto/delete-asset.dto.ts diff --git a/server/src/api-v1/asset/asset.controller.ts b/server/src/api-v1/asset/asset.controller.ts index 9fe5cbc913..6410a3716a 100644 --- a/server/src/api-v1/asset/asset.controller.ts +++ b/server/src/api-v1/asset/asset.controller.ts @@ -12,27 +12,22 @@ import { Query, Response, Headers, - BadRequestException, + Delete, } from '@nestjs/common'; import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; import { AssetService } from './asset.service'; -import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; +import { FilesInterceptor } from '@nestjs/platform-express'; import { multerOption } from '../../config/multer-option.config'; import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; import { CreateAssetDto } from './dto/create-asset.dto'; -import { createReadStream } from 'fs'; import { ServeFileDto } from './dto/serve-file.dto'; import { AssetOptimizeService } from '../../modules/image-optimize/image-optimize.service'; import { AssetType } from './entities/asset.entity'; import { GetAllAssetQueryDto } from './dto/get-all-asset-query.dto'; import { Response as Res } from 'express'; -import { promisify } from 'util'; -import { stat } from 'fs'; -import { pipeline } from 'stream'; import { GetNewAssetQueryDto } from './dto/get-new-asset-query.dto'; import { BackgroundTaskService } from '../../modules/background-task/background-task.service'; - -const fileInfo = promisify(stat); +import { DeleteAssetDto } from './dto/delete-asset.dto'; @UseGuards(JwtAuthGuard) @Controller('asset') @@ -95,4 +90,9 @@ export class AssetController { async getAssetById(@GetAuthUser() authUser: AuthUserDto, @Param('assetId') assetId) { return this.assetService.getAssetById(authUser, assetId); } + + @Delete('/') + async deleteAssetById(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) assetIds: DeleteAssetDto) { + return this.assetService.deleteAssetById(authUser, assetIds); + } } diff --git a/server/src/api-v1/asset/asset.service.ts b/server/src/api-v1/asset/asset.service.ts index 33d33145a2..f1faf0214d 100644 --- a/server/src/api-v1/asset/asset.service.ts +++ b/server/src/api-v1/asset/asset.service.ts @@ -5,13 +5,14 @@ import { AuthUserDto } from '../../decorators/auth-user.decorator'; import { CreateAssetDto } from './dto/create-asset.dto'; import { UpdateAssetDto } from './dto/update-asset.dto'; import { AssetEntity, AssetType } from './entities/asset.entity'; -import _ from 'lodash'; +import _, { result } from 'lodash'; import { GetAllAssetQueryDto } from './dto/get-all-asset-query.dto'; import { GetAllAssetReponseDto } from './dto/get-all-asset-response.dto'; import { createReadStream, stat } from 'fs'; import { ServeFileDto } from './dto/serve-file.dto'; import { Response as Res } from 'express'; import { promisify } from 'util'; +import { DeleteAssetDto } from './dto/delete-asset.dto'; const fileInfo = promisify(stat); @@ -198,4 +199,30 @@ export class AssetService { } } } + + public async deleteAssetById(authUser: AuthUserDto, assetIds: DeleteAssetDto) { + let result = []; + + const target = assetIds.ids; + for (let assetId of target) { + const res = await this.assetRepository.delete({ + id: assetId, + userId: authUser.id, + }); + + if (res.affected) { + result.push({ + id: assetId, + status: 'success', + }); + } else { + result.push({ + id: assetId, + status: 'failed', + }); + } + } + + return result; + } } diff --git a/server/src/api-v1/asset/dto/delete-asset.dto.ts b/server/src/api-v1/asset/dto/delete-asset.dto.ts new file mode 100644 index 0000000000..0304dd5a21 --- /dev/null +++ b/server/src/api-v1/asset/dto/delete-asset.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty } from 'class-validator'; + +export class DeleteAssetDto { + @IsNotEmpty() + ids: string[]; +}