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

84 lines
2.4 KiB
TypeScript

import { Body, Controller, Logger, Post } from '@nestjs/common';
import {
ImageDeleteRequest,
ImageDeleteResponse,
ImageListRequest,
ImageListResponse,
ImageUploadResponse
} from 'picsur-shared/dist/dto/api/image-manage.dto';
import { Permission } from 'picsur-shared/dist/dto/permissions.enum';
import { ThrowIfFailed } from 'picsur-shared/dist/types';
import { MultiPart } from '../../decorators/multipart/multipart.decorator';
import {
HasPermission,
RequiredPermissions
} from '../../decorators/permissions.decorator';
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 {
private readonly logger = new Logger(ImageManageController.name);
constructor(private readonly imagesService: ImageManagerService) {}
@Post('upload')
@Returns(ImageUploadResponse)
async uploadImage(
@MultiPart() multipart: ImageUploadDto,
@ReqUserID() userid: string,
): Promise<ImageUploadResponse> {
const image = ThrowIfFailed(
await this.imagesService.upload(
userid,
multipart.image.filename,
multipart.image.buffer,
),
);
return image;
}
@Post('list')
@RequiredPermissions(Permission.ImageManage)
@Returns(ImageListResponse)
async listMyImagesPaged(
@Body() body: ImageListRequest,
@ReqUserID() userid: string,
@HasPermission(Permission.ImageAdmin) isImageAdmin: boolean,
): Promise<ImageListResponse> {
if (!isImageAdmin) {
body.user_id = userid;
}
const found = ThrowIfFailed(
await this.imagesService.findMany(body.count, body.page, body.user_id),
);
return found;
}
@Post('delete')
@RequiredPermissions(Permission.ImageManage)
@Returns(ImageDeleteResponse)
async deleteImage(
@Body() body: ImageDeleteRequest,
@ReqUserID() userid: string,
@HasPermission(Permission.ImageAdmin) isImageAdmin: boolean,
): Promise<ImageDeleteResponse> {
const deletedImages = ThrowIfFailed(
await this.imagesService.deleteMany(
body.ids,
isImageAdmin ? undefined : userid,
),
);
return {
images: deletedImages,
};
}
}