import { ApiProperty } from '@nestjs/swagger'; import { IsString, IsOptional, IsEnum, IsBoolean, IsNumber, IsObject } from 'class-validator'; // From core/analytics/domain/types/PageView.ts export enum EntityType { LEAGUE = 'league', DRIVER = 'driver', TEAM = 'team', RACE = 'race', SPONSOR = 'sponsor', } // From core/analytics/domain/types/PageView.ts export enum VisitorType { ANONYMOUS = 'anonymous', DRIVER = 'driver', SPONSOR = 'sponsor', } export class RecordPageViewInput { @ApiProperty({ enum: EntityType }) @IsEnum(EntityType) entityType!: EntityType; @ApiProperty() @IsString() entityId!: string; @ApiProperty({ required: false }) @IsOptional() @IsString() visitorId?: string; @ApiProperty({ enum: VisitorType }) @IsEnum(VisitorType) visitorType!: VisitorType; @ApiProperty() @IsString() sessionId!: string; @ApiProperty({ required: false }) @IsOptional() @IsString() referrer?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() userAgent?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() country?: string; } export class RecordPageViewOutput { @ApiProperty() @IsString() pageViewId!: string; } // From core/analytics/domain/types/EngagementEvent.ts export enum EngagementAction { CLICK_SPONSOR_LOGO = 'click_sponsor_logo', CLICK_SPONSOR_URL = 'click_sponsor_url', DOWNLOAD_LIVERY_PACK = 'download_livery_pack', JOIN_LEAGUE = 'join_league', REGISTER_RACE = 'register_race', VIEW_STANDINGS = 'view_standings', VIEW_SCHEDULE = 'view_schedule', SHARE_SOCIAL = 'share_social', CONTACT_SPONSOR = 'contact_sponsor', } // From core/analytics/domain/types/EngagementEvent.ts export enum EngagementEntityType { LEAGUE = 'league', DRIVER = 'driver', TEAM = 'team', RACE = 'race', SPONSOR = 'sponsor', SPONSORSHIP = 'sponsorship', } export class RecordEngagementInput { @ApiProperty({ enum: EngagementAction }) @IsEnum(EngagementAction) action!: EngagementAction; @ApiProperty({ enum: EngagementEntityType }) @IsEnum(EngagementEntityType) entityType!: EngagementEntityType; @ApiProperty() @IsString() entityId!: string; @ApiProperty({ required: false }) @IsOptional() @IsString() actorId?: string; @ApiProperty({ enum: ['anonymous', 'driver', 'sponsor'] }) @IsEnum(['anonymous', 'driver', 'sponsor']) actorType!: 'anonymous' | 'driver' | 'sponsor'; @ApiProperty() @IsString() sessionId!: string; @ApiProperty({ required: false, type: Object }) @IsOptional() @IsObject() metadata?: Record; } export class RecordEngagementOutput { @ApiProperty() @IsString() eventId!: string; @ApiProperty() @IsNumber() engagementWeight!: number; }