import { Body,Controller,Param,Post,Req,UseGuards } from '@nestjs/common';
import type { z } from 'zod';
import { AuthGuard } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard,type TenantScopedRequest } from '../../../common/auth/organization-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { membershipInviteSchema } from '../../../common/validation/critical-write.schemas';
type MembershipInviteBody = z.infer<typeof membershipInviteSchema>;
import { MembershipsService } from '../application/memberships.service';
@Controller('/memberships')
@UseGuards(AuthGuard,OrganizationContextGuard,PermissionGuard)
export class MembershipsController {
constructor(private readonly memberships:MembershipsService) {}
@Post('/invite')
@RequirePermissions('memberships.invite')
invite(
@Req() req:TenantScopedRequest,
@Body(new ZodValidationPipe(membershipInviteSchema)) body:MembershipInviteBody,
) {
return this.memberships.invite({
organizationId:req.organizationId!,
userAccountId:body.userAccountId,employeeId:body.employeeId,
actorUserId:req.auth?.userId,correlationId:req.correlationId,
});
}
@Post('/:id/activate')
@RequirePermissions('memberships.activate')
activate(@Req() req:TenantScopedRequest,@Param('id') id:string) {
return this.memberships.activate(req.organizationId!,id);
}
@Post('/:id/suspend')
@RequirePermissions('memberships.suspend')
suspend(@Req() req:TenantScopedRequest,@Param('id') id:string) {
return this.memberships.suspend(req.organizationId!,id);
}
@Post('/:id/revoke')
@RequirePermissions('memberships.revoke')
revoke(@Req() req:TenantScopedRequest,@Param('id') id:string) {
return this.memberships.revoke(req.organizationId!,id);
}
}
