All files / src/modules/listings/dto create-listing.dto.ts

100% Statements 27/27
100% Branches 0/0
100% Functions 0/0
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 6911x 11x   11x     11x       11x       11x       11x         11x       11x         11x             11x           11x           11x     11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x  
import { IsString, IsNumber, IsArray, IsInt, IsOptional, IsEnum, IsBoolean } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
 
export class CreateListingDto {
  @ApiProperty({ type: String })
  @IsString()
  title!: string;
 
  @ApiProperty({ type: String })
  @IsString()
  description!: string;
 
  @ApiProperty({ type: Number })
  @IsNumber()
  price!: number;
 
  @ApiProperty({ type: Number })
  @IsInt()
  addressId!: number;
 
  // Enforce required enums for quota & publish policies
  @ApiProperty({ enum: ['SALE', 'RENT', 'DAILY'] })
  @IsEnum(['SALE', 'RENT', 'DAILY'])
  transactionType!: 'SALE'|'RENT'|'DAILY';
 
  @ApiProperty({ enum: ['APARTMENT', 'HOUSE', 'COMMERCIAL', 'LAND', 'VILLA', 'STUDIO'] })
  @IsEnum(['APARTMENT', 'HOUSE', 'COMMERCIAL', 'LAND', 'VILLA', 'STUDIO'])
  type!: 'APARTMENT'|'HOUSE'|'COMMERCIAL'|'LAND'|'VILLA'|'STUDIO';
 
  @ApiProperty({ type: [String] })
  @IsArray()
  @IsString({ each: true })
  photoUrls!: string[];
 
  // New media relations
  @ApiPropertyOptional({ type: [Number] })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  imageIds?: number[];
 
  @ApiPropertyOptional({ type: [Number] })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  videoIds?: number[];
 
  @ApiPropertyOptional({ type: [Number] })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  floorPlanIds?: number[];
 
  // Optional property details
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsNumber() area?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsInt() rooms?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsInt() floor?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsInt() totalFloors?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsInt() bathrooms?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsNumber() ceilingHeight?: number;
  @ApiPropertyOptional({ type: Number }) @IsOptional() @IsInt() yearBuilt?: number;
  @ApiPropertyOptional({ type: Boolean }) @IsOptional() @IsBoolean() furnished?: boolean;
  @ApiPropertyOptional({ type: Boolean }) @IsOptional() @IsBoolean() renovated?: boolean;
  @ApiPropertyOptional({ type: Boolean }) @IsOptional() @IsBoolean() balcony?: boolean;
  @ApiPropertyOptional({ type: Boolean }) @IsOptional() @IsBoolean() elevator?: boolean;
  @ApiPropertyOptional({ type: Boolean }) @IsOptional() @IsBoolean() internet?: boolean;
  @ApiPropertyOptional({ type: String }) @IsOptional() @IsString() facingSide?: string;
  @ApiPropertyOptional({ enum: ['CENTRAL', 'GAS', 'ELECTRIC', 'OTHER'] }) @IsOptional() @IsString() heating?: 'CENTRAL'|'GAS'|'ELECTRIC'|'OTHER';
}