import { Body, Controller, Get, Post, Query, Req, UseGuards } from '@nestjs/common';
import type { z } from 'zod';
import { AuthGuard } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard } from '../../../common/auth/organization-context.guard';
import { LocationContextGuard, type LocationScopedRequest } from '../../../common/auth/location-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { FloorService } from '../application/floor.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { floorAreaSchema,floorLinkSchema,floorTableSchema } from '../../../common/validation/critical-write.schemas';
type FloorAreaBody = z.infer<typeof floorAreaSchema>;
type FloorTableBody = z.infer<typeof floorTableSchema>;
type FloorLinkBody = z.infer<typeof floorLinkSchema>;
import { FloorReadModelService } from '../read-models/floor-read-model.service';
import { FloorLiveReadModelService } from '../read-models/floor-live-read-model.service';
@Controller('/floor')
@UseGuards(AuthGuard, OrganizationContextGuard, LocationContextGuard, PermissionGuard)
export class FloorController {
constructor(
private readonly floor: FloorService,
private readonly readModel: FloorReadModelService,
private readonly liveReadModel: FloorLiveReadModelService,
) {}
@Get()
@RequirePermissions('floor.read')
get(
@Req() req: LocationScopedRequest,
@Query('at') at: string,
@Query('locale') locale?: string,
) {
return this.readModel.get({
organizationId: req.organizationId!,
locationId: req.locationId!,
at,
locale: locale ?? req.auth?.locale ?? 'en-GB',
});
}
@Get('/live')
@RequirePermissions('floor.read')
live(
@Req() req: LocationScopedRequest,
@Query('at') at: string,
@Query('locale') locale?: string,
) {
return this.liveReadModel.get({
organizationId: req.organizationId!,
locationId: req.locationId!,
at,
locale: locale ?? req.auth?.locale ?? 'en-GB',
});
}
@Post('/areas')
@RequirePermissions('floor.manage')
createArea(@Req() req: LocationScopedRequest, @Body(new ZodValidationPipe(floorAreaSchema)) body:FloorAreaBody) {
return this.floor.createArea({
organizationId: req.organizationId!,
locationId: req.locationId!,
name: body.name,
sortOrder: body.sortOrder,
actorUserId: req.auth?.userId,
});
}
@Post('/tables')
@RequirePermissions('floor.manage')
createTable(@Req() req: LocationScopedRequest, @Body(new ZodValidationPipe(floorTableSchema)) body:FloorTableBody) {
return this.floor.createTable({
organizationId: req.organizationId!,
locationId: req.locationId!,
areaId: body.areaId,
tableNumber: body.tableNumber,
displayName: body.displayName,
minCapacity: body.minCapacity,
maxCapacity: body.maxCapacity,
actorUserId: req.auth?.userId,
});
}
@Post('/tables/link')
@RequirePermissions('floor.manage')
linkTables(@Req() req: LocationScopedRequest, @Body(new ZodValidationPipe(floorLinkSchema)) body:FloorLinkBody) {
return this.floor.linkTables({
organizationId: req.organizationId!,
locationId: req.locationId!,
tableIds: body.tableIds ?? [],
actorUserId: req.auth?.userId,
});
}
}
