import { Body, Controller, Get, Param, Post, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { TenantId } from '../common/tenant-id.decorator'; import { RequireRecentAuthentication } from '../auth/require-recent-authentication.decorator'; import { CurrentSessionUserId } from '../auth/current-session-user.decorator'; import { DeleteTargetDto, DeletionGovernanceService } from '../deletion-governance/deletion-governance.service'; import { CreateSignatureMaterialDto, CreateSmsApplicationDto, CreateSmsDrainageInfoDto, CreateSmsSignatureDto, CreateSmsTemplateDto, StatusChangeDto, UpdateSmsTemplateDto, UpdateSmsDrainageInfoDto, UpdateSmsSignatureDto, } from './sms-config.contracts'; import { SmsConfigService } from './sms-config.service'; @ApiTags('client-sms-config') @Controller('client') export class ClientSmsConfigController { constructor(private readonly smsConfig: SmsConfigService, private readonly deletions: DeletionGovernanceService) {} @Get('applications') listApplications(@TenantId() tenantId?: string, @Query('page') page?: string, @Query('pageSize') pageSize?: string) { return page || pageSize ? this.smsConfig.listApplicationsPage({ tenantId, page: Number(page), pageSize: Number(pageSize) }) : this.smsConfig.listApplications(tenantId); } @Get('application-options') listApplicationOptions(@TenantId() tenantId?: string) { return this.smsConfig.listApplicationOptions(tenantId); } @Post('applications') createApplication(@Body() body: CreateSmsApplicationDto) { return this.smsConfig.createApplication(body); } @Get('applications/:id/cmpp-params') getApplicationCmppParams(@Param('id') applicationId: string, @TenantId() tenantId?: string) { return this.smsConfig.getApplicationCmppParams(applicationId, tenantId); } @Get('applications/:id/report-fields') getApplicationReportFields(@Param('id') applicationId: string, @Query('reportType') reportType: 'signature' | 'drainage' = 'drainage', @TenantId() tenantId?: string) { return this.smsConfig.getApplication(applicationId, tenantId).then(() => this.smsConfig.getClientApplicationReportFields(applicationId, reportType)); } @Get('report-fields/common') getCommonReportFields(@Query('reportType') reportType: 'signature' | 'drainage' = 'drainage') { return this.smsConfig.getClientApplicationReportFields(undefined, reportType); } @Post('applications/:id/secret/reset') @RequireRecentAuthentication() resetApplicationSecret(@Param('id') applicationId: string, @Body() body: StatusChangeDto) { return this.smsConfig.resetApplicationSecret(applicationId, body); } @Post('applications/:id/status') @RequireRecentAuthentication() changeApplicationStatus(@Param('id') applicationId: string, @Body() body: StatusChangeDto) { return this.smsConfig.changeApplicationStatus(applicationId, body); } @Get('signatures') listSignatures(@TenantId() tenantId?: string) { return this.smsConfig.listClientSignatures(tenantId); } @Get('signature-options') listSignatureOptions(@TenantId() tenantId?: string) { return this.smsConfig.listSignatureOptions(tenantId); } @Get('signatures-workspace') getSignatureWorkspace(@TenantId() tenantId?: string, @Query('keyword') keyword?: string, @Query('applicationId') applicationId?: string, @Query('status') status?: string, @Query('page') page?: string, @Query('pageSize') pageSize?: string) { return this.smsConfig.getClientSignatureWorkspace(tenantId, { keyword, applicationId, status, page: Number(page), pageSize: Number(pageSize) }); } @Post('signatures') async createSignature(@Body() body: CreateSmsSignatureDto, @TenantId() tenantId?: string) { const signature = await this.smsConfig.createSignature({ ...body, tenantId: tenantId ?? body.tenantId }); return this.smsConfig.getClientSignatureView(signature.id, tenantId ?? body.tenantId); } @Put('signatures/:id') async updateSignature(@Param('id') signatureId: string, @Body() body: UpdateSmsSignatureDto, @TenantId() tenantId?: string) { await this.smsConfig.updateClientSignature(signatureId, body, tenantId); return this.smsConfig.getClientSignatureView(signatureId, tenantId); } @Post('signatures/:id/materials') createSignatureMaterial(@Param('id') signatureId: string, @Body() body: Omit) { return this.smsConfig.createSignatureMaterial({ ...body, signatureId }); } @Get('drainage-infos') listDrainageInfos(@TenantId() tenantId?: string) { return this.smsConfig.listClientDrainageInfos(tenantId); } @Post('signatures/:id/drainage-infos') async createDrainageInfo(@Param('id') signatureId: string, @Body() body: CreateSmsDrainageInfoDto, @TenantId() tenantId?: string) { const item = await this.smsConfig.createDrainageInfo(signatureId, body, {}, tenantId); return this.smsConfig.getClientDrainageInfoView(item.id, tenantId); } @Put('drainage-infos/:id') async updateDrainageInfo(@Param('id') itemId: string, @Body() body: UpdateSmsDrainageInfoDto, @TenantId() tenantId?: string) { await this.smsConfig.updateDrainageInfo(itemId, body, {}, tenantId); return this.smsConfig.getClientDrainageInfoView(itemId, tenantId); } @Post('drainage-infos/:id/status') async changeDrainageInfoStatus(@Param('id') itemId: string, @Body() body: StatusChangeDto, @TenantId() tenantId?: string) { await this.smsConfig.changeDrainageInfoStatus(itemId, body, tenantId); if (body.status === 'deleted') return { id: itemId, status: 'deleted' }; return this.smsConfig.getClientDrainageInfoView(itemId, tenantId); } @Post('signatures/:id/submit') async submitSignature(@Param('id') signatureId: string, @TenantId() tenantId?: string) { await this.smsConfig.submitSignature(signatureId, tenantId); return this.smsConfig.getClientSignatureView(signatureId, tenantId); } @Post('signatures/:id/status') async changeSignatureStatus(@Param('id') signatureId: string, @Body() body: StatusChangeDto & DeleteTargetDto, @TenantId() tenantId?: string, @CurrentSessionUserId() operatorId?: string) { if (body.status === 'deleted') return this.deletions.delete('signature', signatureId, { ...body, operatorId }, tenantId); await this.smsConfig.changeSignatureStatus(signatureId, body, tenantId); return this.smsConfig.getClientSignatureView(signatureId, tenantId); } @Get('templates') listTemplates(@TenantId() tenantId?: string, @Query('includeHistory') includeHistory?: string, @Query('keyword') keyword?: string, @Query('page') page?: string, @Query('pageSize') pageSize?: string) { return page || pageSize ? this.smsConfig.listTemplatesPage({ tenantId, status: includeHistory === 'true' ? 'all' : 'approved', keyword, page: Number(page), pageSize: Number(pageSize) }) : this.smsConfig.listClientTemplates(tenantId, includeHistory === 'true'); } @Post('templates') createTemplate(@Body() body: CreateSmsTemplateDto, @TenantId() tenantId?: string) { return this.smsConfig.createTemplate({ ...body, tenantId: tenantId ?? body.tenantId }); } @Put('templates/:id') updateTemplate(@Param('id') templateId: string, @Body() body: UpdateSmsTemplateDto, @TenantId() tenantId?: string) { return this.smsConfig.updateClientTemplate(templateId, body, tenantId); } @Post('templates/:id/submit') submitTemplate(@Param('id') templateId: string, @TenantId() tenantId?: string) { return this.smsConfig.submitTemplate(templateId, tenantId); } @Post('templates/:id/status') changeTemplateStatus(@Param('id') templateId: string, @Body() body: StatusChangeDto & DeleteTargetDto, @TenantId() tenantId?: string, @CurrentSessionUserId() operatorId?: string) { if (body.status === 'deleted') return this.deletions.delete('template', templateId, { ...body, operatorId }, tenantId); return this.smsConfig.changeTemplateStatus(templateId, body, tenantId); } }