import { Body, Controller, Get, Param, Patch, 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 { EmployeesService } from '../application/employees.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { employeeCreateSchema,employeeUpdateSchema } from '../../../common/validation/critical-write.schemas';
type EmployeeCreateBody = z.infer<typeof employeeCreateSchema>;
type EmployeeUpdateBody = z.infer<typeof employeeUpdateSchema>;
import { TeamReadModelService } from '../read-models/team-read-model.service';
@Controller('/employees')
@UseGuards(AuthGuard, OrganizationContextGuard, PermissionGuard)
export class EmployeesController {
constructor(
private readonly employees: EmployeesService,
private readonly teamReadModel: TeamReadModelService,
) {}
@Get()
@RequirePermissions('employees.read')
list(@Req() req: TenantScopedRequest) {
return this.teamReadModel.list(req.organizationId!);
}
@Get('/:id')
@RequirePermissions('employees.read')
get(@Req() req: TenantScopedRequest, @Param('id') id: string) {
return this.teamReadModel.get(req.organizationId!, id);
}
@Post()
@RequirePermissions('employees.create')
create(@Req() req: TenantScopedRequest, @Body(new ZodValidationPipe(employeeCreateSchema)) body:EmployeeCreateBody) {
return this.employees.create({
organizationId: req.organizationId!,
firstName: body.firstName,
lastName: body.lastName,
displayName: body.displayName,
employeeNumber: body.employeeNumber,
preferredLocale: body.preferredLocale,
});
}
@Patch('/:id')
@RequirePermissions('employees.update')
update(@Req() req: TenantScopedRequest, @Param('id') id: string, @Body(new ZodValidationPipe(employeeUpdateSchema)) body:EmployeeUpdateBody) {
return this.employees.update(req.organizationId!, id, body);
}
@Post('/:id/terminate')
@RequirePermissions('employees.terminate')
terminate(@Req() req: TenantScopedRequest, @Param('id') id: string) {
return this.employees.terminate(req.organizationId!, id, req.auth?.userId);
}
}
