128 lines
2.7 KiB
TypeScript
128 lines
2.7 KiB
TypeScript
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<string, string | number | boolean>;
|
|
}
|
|
|
|
export class RecordEngagementOutput {
|
|
@ApiProperty()
|
|
@IsString()
|
|
eventId!: string;
|
|
|
|
@ApiProperty()
|
|
@IsNumber()
|
|
engagementWeight!: number;
|
|
}
|