import { ApiProperty, ApiPropertyOptional, PartialType } from "@nestjs/swagger"; import { EXTERNAL_INQUIRY_TYPES, ExternalInquiryFlags, mergeExternalInquiryFlags, } from "src/common/types/external-inquiry.types"; import { IsBoolean, IsMongoId, IsOptional, ValidateNested } from "class-validator"; import { Type } from "class-transformer"; export class ExternalInquiryFlagsDto implements ExternalInquiryFlags { @ApiProperty({ description: "Third-party plate / policy block inquiry (Tejarat or ESG policyByPlate).", example: false, }) @IsBoolean() thirdPartyPlate: boolean; @ApiProperty({ description: "CAR_BODY (badane) plate inquiry.", example: false, }) @IsBoolean() carBodyPlate: boolean; @ApiProperty({ description: "Personal identity inquiry (national code + birth date).", example: false, }) @IsBoolean() personalIdentity: boolean; @ApiProperty({ description: "Sheba account validation.", example: false, }) @IsBoolean() sheba: boolean; @ApiProperty({ description: "Driving licence check.", example: false, }) @IsBoolean() drivingLicense: boolean; @ApiProperty({ description: "Vehicle ownership validation.", example: false, }) @IsBoolean() carOwnership: boolean; @ApiProperty({ description: "ESG VIN/chassis-number inquiry (`/inquiry/policyByChassis`). Required for the VIN initial-form path.", example: false, }) @IsBoolean() vinChassis: boolean; } export class UpdateClientExternalInquiriesDto extends PartialType( ExternalInquiryFlagsDto, ) {} export class ClientExternalInquiriesViewDto { @ApiProperty({ example: "664a1b2c3d4e5f6789012345" }) clientId: string; @ApiProperty({ example: 8 }) clientCode: number; @ApiProperty({ example: "بیمه پارسیان" }) clientName: string; @ApiProperty({ description: "Global master switch from `system_settings.externalApis.sandHubUseLiveApi`. When false, all inquiries use mocks regardless of these flags.", }) globalSandHubLiveEnabled: boolean; @ApiProperty({ type: ExternalInquiryFlagsDto }) externalInquiries: ExternalInquiryFlags; @ApiProperty({ description: "Effective live flags after applying the global master switch.", type: ExternalInquiryFlagsDto, }) effectiveLive: ExternalInquiryFlags; } export class ClientExternalInquiriesListDto { @ApiProperty({ type: [ClientExternalInquiriesViewDto] }) items: ClientExternalInquiriesViewDto[]; } export class ClientExternalInquiriesCatalogDto { @ApiProperty({ enum: EXTERNAL_INQUIRY_TYPES, isArray: true, description: "Supported inquiry kinds stored on each client document.", }) inquiryTypes: readonly string[]; @ApiProperty({ description: "Global master switch path: PATCH /system-settings or PATCH /client/external-inquiries-live", }) globalSettingPath: string; @ApiProperty({ description: "Per-insurer CRUD base path (public for now).", example: "/client/{clientId}/external-inquiries", }) perClientSettingPath: string; } /** Build a view DTO from a lean client document. */ export function toClientExternalInquiriesView( client: { _id?: unknown; clientCode?: number; clientName?: { persian?: string; english?: string } | string; settings?: { externalInquiries?: Partial }; }, globalSandHubLiveEnabled: boolean, ): ClientExternalInquiriesViewDto { const flags = mergeExternalInquiryFlags(client.settings?.externalInquiries); const effectiveLive = {} as ExternalInquiryFlags; for (const key of EXTERNAL_INQUIRY_TYPES) { effectiveLive[key] = globalSandHubLiveEnabled && flags[key] === true; } const name = typeof client.clientName === "string" ? client.clientName : client.clientName?.persian || client.clientName?.english || String(client.clientCode ?? ""); return { clientId: String(client._id ?? ""), clientCode: Number(client.clientCode ?? 0), clientName: name, globalSandHubLiveEnabled, externalInquiries: flags, effectiveLive, }; } export class ClientIdParamDto { @ApiProperty({ description: "Mongo ObjectId of the insurer client document" }) @IsMongoId() clientId: string; } /** Optional nested patch used internally when validating partial bodies. */ export class ExternalInquiryFlagsPatchDto { @IsOptional() @ValidateNested() @Type(() => UpdateClientExternalInquiriesDto) externalInquiries?: UpdateClientExternalInquiriesDto; }