implement members controller

This commit is contained in:
tw-blue
2025-11-30 16:39:24 +01:00
parent ea2b04d6a0
commit 987a380758
9 changed files with 251 additions and 27 deletions
@@ -1,13 +1,90 @@
import { Controller, Route } from "@tsoa/runtime";
import {
Body,
Controller,
Delete,
Get,
Path,
Post,
Put,
Response,
Route,
Security,
SuccessResponse,
} from "@tsoa/runtime";
import { inject } from "../infrastructure/di/index.js";
import { ErrorStates } from "../infrastructure/errorStates.js";
import { Claim } from "../models/claim.js";
import type { Member, MemberCreateArgs } from "../models/member.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)
// @Get()
// public async getMembers(): Promise<Member[]> {
// return await this.membersService.getMembers();
// }
@Security(KC_SECURITY_NAME, [Claim.MemberAdmin])
@Get()
public async getMembers(): Promise<Member[]> {
return await this.membersService.getMembers();
}
@Security(KC_SECURITY_NAME, [Claim.MemberAdmin])
@SuccessResponse("200", "OK")
@Response(404, "Member not found")
@Get("{memberId}")
public async getMember(@Path() memberId: string): Promise<Member> {
try {
const foundMember =
await this.membersService.getMemberById(memberId);
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,
): Promise<Member> {
return await this.membersService.createMember(createArgs);
}
@Security(KC_SECURITY_NAME, [Claim.MemberAdmin])
@SuccessResponse("200", "OK")
@Response(400, "Bad Request")
@Response(404, "Member not found")
@Put()
public async updateMember(@Body() member: Member): Promise<void> {
try {
await this.membersService.updateMember(member);
} 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,
@Body() cancelDate: Date
){
await this.membersService.scheduleDeletion(memberId, cancelDate);
}
}