From aa539aa6f4c7e9aa6a53aeb85b19e2cd5c9cb1ac Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sat, 4 Apr 2026 23:57:42 -0700 Subject: [PATCH] =?UTF-8?q?refactor(collector):=20=E2=99=BB=EF=B8=8F=20Imp?= =?UTF-8?q?rove=20attribution=20tracking=20DTOs=20with=20new=20properties?= =?UTF-8?q?=20for=20sources=20and=20client=20device=20info?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- services/collector/src/dto/attribution.dto.ts | 12 +++++++++++- services/collector/src/dto/client-device.dto.ts | 13 +++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/services/collector/src/dto/attribution.dto.ts b/services/collector/src/dto/attribution.dto.ts index 323a8b1..d6ff3b9 100644 --- a/services/collector/src/dto/attribution.dto.ts +++ b/services/collector/src/dto/attribution.dto.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsOptional, IsString } from 'class-validator'; +import { IsNumber, IsOptional, IsString } from 'class-validator'; /** * UTM attribution parameters (first-touch) @@ -34,4 +34,14 @@ export class AttributionDto { @IsOptional() @IsString() referrer?: string; + + @ApiProperty({ description: 'Landing page URL at time of attribution capture', required: false }) + @IsOptional() + @IsString() + landingPage?: string; + + @ApiProperty({ description: 'Timestamp when attribution was captured (ms since epoch)', required: false }) + @IsOptional() + @IsNumber() + capturedAt?: number; } diff --git a/services/collector/src/dto/client-device.dto.ts b/services/collector/src/dto/client-device.dto.ts index 27bfb8d..69a9a68 100644 --- a/services/collector/src/dto/client-device.dto.ts +++ b/services/collector/src/dto/client-device.dto.ts @@ -76,8 +76,17 @@ export class ClientDeviceDto { @IsBoolean() cookiesEnabled?: boolean; - @ApiProperty({ description: 'Do Not Track header set', required: false }) + @ApiProperty({ description: 'Do Not Track header value', required: false }) + @IsOptional() + doNotTrack?: string | boolean | null; + + @ApiProperty({ description: 'Navigator platform string', required: false }) + @IsOptional() + @IsString() + platform?: string; + + @ApiProperty({ description: 'Browser online status', required: false }) @IsOptional() @IsBoolean() - doNotTrack?: boolean; + onLine?: boolean; }