/** * Cookie Consent DTOs * GDPR compliant consent management */ import { IsBoolean, IsOptional, IsString, IsEnum, IsDateString, IsIP } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; /** * Request DTO for recording/updating cookie consent */ export class UpdateConsentDto { @ApiProperty({ example: true, description: 'Essential cookies consent (always true, required for functionality)', default: true, }) @IsBoolean() essential: boolean; @ApiProperty({ example: false, description: 'Functional cookies consent (preferences, language, etc.)', default: false, }) @IsBoolean() functional: boolean; @ApiProperty({ example: false, description: 'Analytics cookies consent (Google Analytics, Sentry, etc.)', default: false, }) @IsBoolean() analytics: boolean; @ApiProperty({ example: false, description: 'Marketing cookies consent (ads, tracking, remarketing)', default: false, }) @IsBoolean() marketing: boolean; @ApiPropertyOptional({ example: '192.168.1.1', description: 'IP address at time of consent (for GDPR audit trail)', }) @IsOptional() @IsString() ipAddress?: string; @ApiPropertyOptional({ example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', description: 'User agent at time of consent', }) @IsOptional() @IsString() userAgent?: string; } /** * Response DTO for consent status */ export class ConsentResponseDto { @ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000', description: 'User ID', }) userId: string; @ApiProperty({ example: true, description: 'Essential cookies consent (always true)', }) essential: boolean; @ApiProperty({ example: false, description: 'Functional cookies consent', }) functional: boolean; @ApiProperty({ example: false, description: 'Analytics cookies consent', }) analytics: boolean; @ApiProperty({ example: false, description: 'Marketing cookies consent', }) marketing: boolean; @ApiProperty({ example: '2025-01-27T10:30:00.000Z', description: 'Date when consent was recorded', }) consentDate: Date; @ApiProperty({ example: '2025-01-27T10:30:00.000Z', description: 'Last update timestamp', }) updatedAt: Date; } /** * Request DTO for withdrawing specific consent */ export class WithdrawConsentDto { @ApiProperty({ example: 'marketing', description: 'Type of consent to withdraw', enum: ['functional', 'analytics', 'marketing'], }) @IsEnum(['functional', 'analytics', 'marketing'], { message: 'Consent type must be functional, analytics, or marketing', }) consentType: 'functional' | 'analytics' | 'marketing'; } /** * Success response DTO */ export class ConsentSuccessDto { @ApiProperty({ example: true, description: 'Operation success status', }) success: boolean; @ApiProperty({ example: 'Consent preferences saved successfully', description: 'Response message', }) message: string; }