140 lines
3.2 KiB
TypeScript
140 lines
3.2 KiB
TypeScript
/**
|
|
* 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;
|
|
}
|