import { Body, Controller, Delete, Get, Path, Post, Put, Query, Request, Response, Route, Security, SuccessResponse, } from "@tsoa/runtime"; import express from "express"; import { Claim } from "../dtos/claim.js"; import type { MemberCreateArgs, MemberDto } from "../dtos/member.js"; import { inject } from "../infrastructure/di/index.js"; import { ErrorStates } from "../infrastructure/errorStates.js"; import { KC_SECURITY_NAME } from "../services/keycloak/user/index.js"; import { MembersService } from "../services/membersService.js"; @Route("members") export class MembersContoller extends Controller { private readonly membersService = inject(MembersService); @Security(KC_SECURITY_NAME, [Claim.MemberAdmin]) @SuccessResponse("200", "OK") @Get() public async getMembers( @Request() request: express.Request, ): Promise { return await this.membersService.getMembers(request); } @Security(KC_SECURITY_NAME, [Claim.MemberAdmin]) @SuccessResponse("200", "OK") @Response(404, "Member not found") @Get("{memberId}") public async getMember( @Path() memberId: string, @Request() request: express.Request, ): Promise { try { const foundMember = await this.membersService.getMemberById( memberId, request, ); return foundMember; } catch (error) { if ( error instanceof Error && error.cause === ErrorStates.ENTITY_NOT_FOUND ) { this.setStatus(404); throw new Error(`Member with id ${memberId} not found`); } throw error; } } @Security(KC_SECURITY_NAME, [Claim.MemberAdmin]) @SuccessResponse("201", "Created") @Post() public async createMember( @Body() createArgs: MemberCreateArgs, @Request() request: express.Request, ): Promise { return await this.membersService.createMember(createArgs, request); } @Security(KC_SECURITY_NAME, [Claim.MemberAdmin]) @SuccessResponse("200", "OK") @Response(400, "Bad Request") @Response(404, "Member not found") @Put() public async updateMember( @Body() member: MemberDto, @Request() request: express.Request, ): Promise { try { await this.membersService.updateMember(member, request); } catch (error) { if ( error instanceof Error && error.cause === ErrorStates.BAD_REQUEST ) { this.setStatus(400); throw new Error(`Member id is required for update`); } throw error; } } @Security(KC_SECURITY_NAME, [Claim.MemberAdmin]) @SuccessResponse("200", "OK") @Response(404, "Member not found") @Delete("{memberId}") public async scheduleDeletion( @Path() memberId: string, @Query() cancelDate: Date, @Request() request: express.Request, ) { await this.membersService.scheduleDeletion( memberId, cancelDate ? cancelDate : null, request, ); } }