/** * Page Request Mapper * * Maps domain DiscoveredPage objects to API request schemas. * Handles transformation from dashboard domain → @archer/api-interface schemas. * * @layer Infrastructure - API Client */ import type { UpdatePageRequest, TriggerAnalysisRequest, RetriggerAnalysisRequest, } from '@archer/api-interface'; import { DiscoveredPage } from '@/domain/entities/DiscoveredPage'; /** * PageRequestMapper * * Transforms DiscoveredPage domain objects to request DTOs. * All mappings are internal - not exposed to application layer. */ export class PageRequestMapper { /** * Maps partial domain DiscoveredPage to UpdatePageRequest schema * * Used for correcting page metadata after crawler discovery. * * @param updates - Partial DiscoveredPage domain object with changes * @returns UpdatePageRequest DTO for API */ static toUpdateRequest(updates: Partial): UpdatePageRequest { const request: UpdatePageRequest = {}; if (updates.title !== undefined) { request.title = updates.title; } if (updates.status !== undefined) { request.status = updates.status as UpdatePageRequest['status']; } if (updates.analysisStatus !== undefined) { request.analysisStatus = updates.analysisStatus as UpdatePageRequest['analysisStatus']; } if (updates.pageType !== undefined) { request.pageType = updates.pageType; } if (updates.semanticLabel !== undefined) { request.semanticLabel = updates.semanticLabel; } if (updates.httpStatus !== undefined) { request.httpStatus = updates.httpStatus; } if (updates.addedToTraining !== undefined) { request.addedToTraining = updates.addedToTraining; } return request; } /** * Maps trigger analysis params to TriggerAnalysisRequest schema * * Used when user clicks "Analyze this page" button. * Schema has defaults: priority defaults to NORMAL, forceRescan defaults to false. * * @param priority - Job priority (LOW, NORMAL, HIGH) - optional, defaults to NORMAL * @param forceRescan - Override cache/existing scan - optional, defaults to false * @returns TriggerAnalysisRequest DTO for API (partial object with optional fields) */ static toTriggerAnalysisRequest( priority?: 'LOW' | 'NORMAL' | 'HIGH', forceRescan?: boolean ): Partial { const request: Partial = {}; if (priority !== undefined) { request.priority = priority; } if (forceRescan !== undefined) { request.forceRescan = forceRescan; } return request; } /** * Maps retrigger analysis params to RetriggerAnalysisRequest schema * * Used when user clicks "Re-analyze" button to create new analysis version. * Schema has defaults: priority defaults to NORMAL, createNewVersion defaults to true. * * @param priority - Job priority (LOW, NORMAL, HIGH) - optional, defaults to NORMAL * @param createNewVersion - Create new analysis version - optional, defaults to true * @returns RetriggerAnalysisRequest DTO for API (partial object with optional fields) */ static toRetriggerAnalysisRequest( priority?: 'LOW' | 'NORMAL' | 'HIGH', createNewVersion?: boolean ): Partial { const request: Partial = {}; if (priority !== undefined) { request.priority = priority; } if (createNewVersion !== undefined) { request.createNewVersion = createNewVersion; } return request; } }