import type { Logger } from '@core/shared/application'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import { PageView } from '../../domain/entities/PageView'; import type { EntityType, VisitorType } from '../../domain/types/PageView'; export interface RecordPageViewInput { entityType: EntityType; entityId: string; visitorId?: string; visitorType: VisitorType; sessionId: string; referrer?: string; userAgent?: string; country?: string; } export interface RecordPageViewOutput { pageViewId: string; } export class RecordPageViewUseCase { constructor( private readonly pageViewRepository: IPageViewRepository, private readonly logger: Logger, ) {} async execute(input: RecordPageViewInput): Promise { try { const pageView = PageView.create({ id: crypto.randomUUID(), entityType: input.entityType, entityId: input.entityId, visitorId: input.visitorId, visitorType: input.visitorType, sessionId: input.sessionId, referrer: input.referrer, userAgent: input.userAgent, country: input.country, }); await this.pageViewRepository.save(pageView); this.logger.info('Page view recorded', { pageViewId: pageView.id, entityId: input.entityId, entityType: input.entityType, }); return { pageViewId: pageView.id, }; } catch (error) { this.logger.error('Failed to record page view', { error, input }); throw error; } } }