import { Body, Controller, Get, HttpStatus, Param, Post, Req, UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags, } from '@nestjs/swagger'; import jwt from 'jsonwebtoken'; import { AccessToken } from '../../common/token'; import { ErrorResponse } from '../../common/error/types/types'; import { GetWorkflowsResponse, CreateWorkflowsRequest, CreateWorkflowsResponse, UpdateWorkflowResponse, UpdateWorkflowRequest, UpdateWorkflowRequestParam, DeleteWorkflowRequestParam, DeleteWorkflowResponse, } from './types/types'; import { AuthGuard } from '../../common/guards/auth/authguards'; import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES } from '../../constants'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { Request } from 'express'; import { makeContext } from '../../common/log'; import { WorkflowsService } from './workflows.service'; @ApiTags('workflows') @Controller('workflows') export class WorkflowsController { constructor(private readonly workflowsService: WorkflowsService) {} @ApiResponse({ status: HttpStatus.OK, type: GetWorkflowsResponse, description: '成功時のレスポンス', }) @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: '認証エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.INTERNAL_SERVER_ERROR, description: '想定外のサーバーエラー', type: ErrorResponse, }) @ApiOperation({ operationId: 'getWorkflows', description: 'アカウント内のワークフローの一覧を取得します', }) @ApiBearerAuth() @UseGuards(AuthGuard) @UseGuards(RoleGuard.requireds({ roles: [ADMIN_ROLES.ADMIN] })) @Get() async getWorkflows(@Req() req: Request): Promise { const token = retrieveAuthorizationToken(req); const { userId } = jwt.decode(token, { json: true }) as AccessToken; const context = makeContext(userId); const workflows = await this.workflowsService.getWorkflows(context, userId); return { workflows }; } @ApiResponse({ status: HttpStatus.OK, type: CreateWorkflowsResponse, description: '成功時のレスポンス', }) @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'パラメータ不正エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: '認証エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.INTERNAL_SERVER_ERROR, description: '想定外のサーバーエラー', type: ErrorResponse, }) @ApiOperation({ operationId: 'createWorkflows', description: 'アカウント内にワークフローを新規作成します', }) @ApiBearerAuth() @UseGuards(AuthGuard) @UseGuards(RoleGuard.requireds({ roles: [ADMIN_ROLES.ADMIN] })) @Post() async createWorkflows( @Req() req: Request, @Body() body: CreateWorkflowsRequest, ): Promise { const { authorId, worktypeId, templateId, typists } = body; const token = retrieveAuthorizationToken(req); const { userId } = jwt.decode(token, { json: true }) as AccessToken; const context = makeContext(userId); await this.workflowsService.createWorkflow( context, userId, authorId, worktypeId, templateId, typists, ); return {}; } @ApiResponse({ status: HttpStatus.OK, type: UpdateWorkflowResponse, description: '成功時のレスポンス', }) @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'パラメータ不正エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: '認証エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.INTERNAL_SERVER_ERROR, description: '想定外のサーバーエラー', type: ErrorResponse, }) @ApiOperation({ operationId: 'updateWorkflow', description: 'アカウント内のワークフローを編集します', }) @ApiBearerAuth() @UseGuards(AuthGuard) @UseGuards(RoleGuard.requireds({ roles: [ADMIN_ROLES.ADMIN] })) @Post('/:workflowId') async updateWorkflow( @Req() req: Request, @Param() param: UpdateWorkflowRequestParam, @Body() body: UpdateWorkflowRequest, ): Promise { const { authorId, worktypeId, templateId, typists } = body; const { workflowId } = param; const token = retrieveAuthorizationToken(req); const { userId } = jwt.decode(token, { json: true }) as AccessToken; const context = makeContext(userId); await this.workflowsService.updateWorkflow( context, userId, workflowId, authorId, worktypeId, templateId, typists, ); return {}; } @ApiResponse({ status: HttpStatus.OK, type: DeleteWorkflowResponse, description: '成功時のレスポンス', }) @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'パラメータ不正エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: '認証エラー', type: ErrorResponse, }) @ApiResponse({ status: HttpStatus.INTERNAL_SERVER_ERROR, description: '想定外のサーバーエラー', type: ErrorResponse, }) @ApiOperation({ operationId: 'deleteWorkflow', description: 'アカウント内のワークフローを削除します', }) @ApiBearerAuth() @UseGuards(AuthGuard) @UseGuards(RoleGuard.requireds({ roles: [ADMIN_ROLES.ADMIN] })) @Post('/:workflowId/delete') async deleteWorkflow( @Req() req: Request, @Param() param: DeleteWorkflowRequestParam, ): Promise { const { workflowId } = param; const token = retrieveAuthorizationToken(req); const { userId } = jwt.decode(token, { json: true }) as AccessToken; const context = makeContext(userId); await this.workflowsService.deleteWorkflow(context, userId, workflowId); return {}; } }