OMDSCloud/dictation_server/src/features/workflows/workflows.controller.ts
makabe.t d48afdbffd Merged PR 468: API実装(ワークフロー削除API)
## 概要
[Task2785: API実装(ワークフロー削除API)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2785)

- ワークフロー削除APIとテストを実装しました。

## レビューポイント
- リポジトリの削除ロジックは適切か
- テストケースは適切か

## UIの変更
- なし

## 動作確認状況
- ローカルで確認
2023-10-11 09:14:41 +00:00

219 lines
6.0 KiB
TypeScript

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<GetWorkflowsResponse> {
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<CreateWorkflowsResponse> {
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<UpdateWorkflowResponse> {
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<DeleteWorkflowResponse> {
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 {};
}
}