Files
Taekwondo-Admin/packages/api/src/controllers/membersController.ts
T
2026-01-03 01:17:40 +01:00

111 lines
3.2 KiB
TypeScript

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<MemberDto[]> {
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<MemberDto> {
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<MemberDto> {
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<void> {
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,
);
}
}