111 lines
3.2 KiB
TypeScript
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,
|
|
);
|
|
}
|
|
}
|