Picsur/backend/src/routes/image/image-manage.controller.ts

125 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-09-03 18:03:28 +00:00
import {
Body,
Controller,
Get,
Logger,
Param,
Post,
2022-09-06 14:32:16 +00:00
Res,
2022-09-03 18:03:28 +00:00
} from '@nestjs/common';
import type { FastifyReply } from 'fastify';
import {
2022-05-04 19:50:11 +00:00
ImageDeleteRequest,
ImageDeleteResponse,
2022-09-03 18:03:28 +00:00
ImageDeleteWithKeyRequest,
ImageDeleteWithKeyResponse,
ImageListRequest,
ImageListResponse,
2022-09-06 14:32:16 +00:00
ImageUploadResponse,
} from 'picsur-shared/dist/dto/api/image-manage.dto';
2022-06-27 13:23:06 +00:00
import { Permission } from 'picsur-shared/dist/dto/permissions.enum';
2022-09-03 18:03:28 +00:00
import { HasFailed, ThrowIfFailed } from 'picsur-shared/dist/types';
2022-05-03 19:37:20 +00:00
import { MultiPart } from '../../decorators/multipart/multipart.decorator';
import {
HasPermission,
2022-09-06 14:32:16 +00:00
RequiredPermissions,
} from '../../decorators/permissions.decorator';
2022-05-03 19:37:20 +00:00
import { ReqUserID } from '../../decorators/request-user.decorator';
import { Returns } from '../../decorators/returns.decorator';
import { ImageManagerService } from '../../managers/image/image.service';
import { ImageUploadDto } from '../../models/dto/image-upload.dto';
@Controller('api/image')
@RequiredPermissions(Permission.ImageUpload)
export class ImageManageController {
2022-09-02 15:18:22 +00:00
private readonly logger = new Logger(ImageManageController.name);
2022-05-03 19:37:20 +00:00
constructor(private readonly imagesService: ImageManagerService) {}
@Post('upload')
@Returns(ImageUploadResponse)
async uploadImage(
@MultiPart() multipart: ImageUploadDto,
@ReqUserID() userid: string,
2022-09-03 18:03:28 +00:00
@HasPermission(Permission.ImageDeleteKey) withDeleteKey: boolean,
2022-05-03 19:37:20 +00:00
): Promise<ImageUploadResponse> {
2022-08-26 18:40:16 +00:00
const image = ThrowIfFailed(
2022-09-01 11:16:23 +00:00
await this.imagesService.upload(
userid,
multipart.image.filename,
multipart.image.buffer,
2022-09-03 18:03:28 +00:00
withDeleteKey,
2022-09-01 11:16:23 +00:00
),
2022-05-03 19:37:20 +00:00
);
return image;
}
@Post('list')
2022-09-03 17:18:53 +00:00
@RequiredPermissions(Permission.ImageManage)
2022-05-03 19:37:20 +00:00
@Returns(ImageListResponse)
async listMyImagesPaged(
@Body() body: ImageListRequest,
2022-05-03 19:37:20 +00:00
@ReqUserID() userid: string,
@HasPermission(Permission.ImageAdmin) isImageAdmin: boolean,
2022-05-03 19:37:20 +00:00
): Promise<ImageListResponse> {
if (!isImageAdmin) {
body.user_id = userid;
}
2022-08-26 18:40:16 +00:00
const found = ThrowIfFailed(
await this.imagesService.findMany(body.count, body.page, body.user_id),
2022-05-03 19:37:20 +00:00
);
2022-06-27 13:23:06 +00:00
return found;
2022-05-03 19:37:20 +00:00
}
2022-05-04 19:50:11 +00:00
@Post('delete')
2022-09-03 17:18:53 +00:00
@RequiredPermissions(Permission.ImageManage)
2022-05-04 19:50:11 +00:00
@Returns(ImageDeleteResponse)
async deleteImage(
@Body() body: ImageDeleteRequest,
@ReqUserID() userid: string,
@HasPermission(Permission.ImageAdmin) isImageAdmin: boolean,
): Promise<ImageDeleteResponse> {
2022-08-26 18:40:16 +00:00
const deletedImages = ThrowIfFailed(
await this.imagesService.deleteMany(
body.ids,
isImageAdmin ? undefined : userid,
),
2022-05-04 19:50:11 +00:00
);
return {
images: deletedImages,
};
}
2022-09-03 18:03:28 +00:00
@Post('delete/key')
@RequiredPermissions(Permission.ImageDeleteKey)
@Returns(ImageDeleteWithKeyResponse)
async deleteImageWithKeyGet(
@Body() body: ImageDeleteWithKeyRequest,
): Promise<ImageDeleteWithKeyResponse> {
return ThrowIfFailed(
await this.imagesService.deleteWithKey(body.id, body.key),
);
}
@Get('delete/:id/:key')
@RequiredPermissions(Permission.ImageDeleteKey)
async deleteImageWithKeyPost(
@Param() params: ImageDeleteWithKeyRequest,
@Res({ passthrough: true }) res: FastifyReply,
): Promise<string> {
const image = await this.imagesService.deleteWithKey(params.id, params.key);
if (HasFailed(image)) {
2022-09-04 13:19:23 +00:00
res.header('Location', '/error/delete-failure');
res.code(302);
return 'Failed to delete image';
2022-09-03 18:03:28 +00:00
}
2022-09-04 13:19:23 +00:00
res.header('Location', '/error/delete-success');
res.code(302);
return 'Successsfully deleted image';
2022-09-03 18:03:28 +00:00
}
2022-05-03 19:37:20 +00:00
}