import { Body,Controller,Get,Param,Post,Req,UseGuards } from '@nestjs/common';
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 { FiscalIntegrationService } from '../application/fiscal-integration.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { fiscalConnectionSchema,fiscalConnectionTestSchema } from '../../../common/validation/critical-write.schemas';
import { FiscalProviderRegistry } from '../providers/fiscal-provider.registry';
import { FiscalIntegrationReadModelService } from '../application/fiscal-integration-read-model.service';
import type { z } from 'zod';
@Controller('/integrations/fiscal')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class FiscalIntegrationsController {
constructor(
private readonly integrations:FiscalIntegrationService,
private readonly providers:FiscalProviderRegistry,
private readonly read:FiscalIntegrationReadModelService,
) {}
@Get('/providers')
@RequirePermissions('integrations.fiscal.read')
providersList(){return this.providers.list();}
@Post()
@RequirePermissions('integrations.fiscal.manage')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(fiscalConnectionSchema)) body:z.infer<typeof fiscalConnectionSchema>) {
return this.integrations.createConnection({
organizationId:req.organizationId!,locationId:req.locationId!,
userId:req.auth?.userId,...body,
});
}
@Post('/:id/devices')
@RequirePermissions('integrations.fiscal.manage')
map(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(fiscalConnectionTestSchema)) body:z.infer<typeof fiscalConnectionTestSchema>) {
return this.integrations.mapDevice({
organizationId:req.organizationId!,locationId:req.locationId!,
connectionId:id,...body,
});
}
@Post('/:id/test')
@RequirePermissions('integrations.fiscal.manage')
test(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(fiscalConnectionTestSchema)) body:z.infer<typeof fiscalConnectionTestSchema>) {
return this.integrations.test({
organizationId:req.organizationId!,connectionId:id,mappingId:body.mappingId,
});
}
@Post('/:id/enable-production')
@RequirePermissions('integrations.fiscal.manage')
enable(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.integrations.enableProduction({organizationId:req.organizationId!,connectionId:id});
}
@Get('/overview')
@RequirePermissions('integrations.fiscal.read')
overview(@Req() req:LocationScopedRequest) {
return this.read.overview({organizationId:req.organizationId!,locationId:req.locationId!});
}
}
