/** * Company Request Mapper * * Transforms Company domain objects to API request schemas (CreateCompanyRequest, UpdateCompanyRequest). * This mapper handles the domain → request schema transformation for company operations. * * @layer Infrastructure - API Client * @module Company Request Mapper */ import { type CreateCompanyRequest, type UpdateCompanyRequest, createCompanyRequestSchema, updateCompanyRequestSchema, } from '@archer/api-interface'; import { Company, CompanyType } from '@domain/entities/Company'; /** * Maps CompanyType enum values between dashboard domain and API interface * * Dashboard: INDIVIDUAL, CORPORATE * API: platform_admin, client */ const mapCompanyTypeToApi = (type: CompanyType): 'platform_admin' | 'client' => { switch (type) { case CompanyType.INDIVIDUAL: return 'client'; case CompanyType.CORPORATE: return 'platform_admin'; default: return 'client'; } }; /** * Company Request Mapper * * Handles transformation from Company domain objects to API request schemas. * Uses Zod validation to ensure request data matches API contract. */ export class CompanyRequestMapper { /** * Transforms Company domain object to CreateCompanyRequest schema * * @param company - Company domain entity * @returns Validated CreateCompanyRequest schema * @throws ZodError if validation fails * * @example * ```typescript * const company = Company.create({ * id: '123', * name: 'Acme Corp', * type: CompanyType.CORPORATE * }); * * const request = CompanyRequestMapper.toCreateRequest(company); * // { name: 'Acme Corp', type: 'platform_admin' } * ``` */ static toCreateRequest(company: Company): CreateCompanyRequest { const requestData = { name: company.name, type: mapCompanyTypeToApi(company.type), }; // Validate with Zod schema return createCompanyRequestSchema.parse(requestData); } /** * Transforms partial Company domain object to UpdateCompanyRequest schema * * @param updates - Partial Company domain data * @returns Validated UpdateCompanyRequest schema * @throws ZodError if validation fails * * @example * ```typescript * const updates = { name: 'New Company Name' }; * const request = CompanyRequestMapper.toUpdateRequest(updates); * // { name: 'New Company Name' } * ``` * * @note * Company type is immutable and cannot be updated. * The API only allows updating the company name. */ static toUpdateRequest(updates: Partial>): UpdateCompanyRequest { const requestData: UpdateCompanyRequest = {}; if (updates.name !== undefined) requestData.name = updates.name; if (updates.address !== undefined) requestData.address = updates.address; if (updates.vatId !== undefined) requestData.vatId = updates.vatId; if (updates.website !== undefined) requestData.website = updates.website; if (updates.industry !== undefined) requestData.industry = updates.industry; if (updates.size !== undefined) requestData.size = updates.size; if (updates.billingEmail !== undefined) requestData.billingEmail = updates.billingEmail; if (updates.legalForm !== undefined) requestData.legalForm = updates.legalForm as UpdateCompanyRequest['legalForm']; if (updates.taxNumber !== undefined) requestData.taxNumber = updates.taxNumber; if (updates.registerCourt !== undefined) requestData.registerCourt = updates.registerCourt; if (updates.registerNumber !== undefined) requestData.registerNumber = updates.registerNumber; if (updates.directorName !== undefined) requestData.directorName = updates.directorName; return updateCompanyRequestSchema.parse(requestData); } }