الملفات
back_end_oudelaa/src/modules/posts/dto/update-post.dto.ts

184 أسطر
4.7 KiB
TypeScript

import { ApiPropertyOptional } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import {
ArrayMaxSize,
IsArray,
IsEnum,
IsMongoId,
IsNumber,
IsOptional,
IsBoolean,
IsString,
IsUrl,
Length,
Max,
Min,
} from 'class-validator';
import { PostVisibility } from '../../../common/enums/post-visibility.enum';
import { toNumberArray, toStringArray } from '../../../common/utils/array-transform.util';
export class UpdatePostDto {
@ApiPropertyOptional({ maxLength: 2200 })
@IsOptional()
@IsString()
@Length(1, 2200)
content?: string;
@ApiPropertyOptional({ maxLength: 2200, description: 'Text displayed above post media' })
@IsOptional()
@IsString()
@Length(0, 2200)
contentTop?: string;
@ApiPropertyOptional({ maxLength: 2200, description: 'Text displayed below post media' })
@IsOptional()
@IsString()
@Length(0, 2200)
contentBottom?: string;
@ApiPropertyOptional({ description: 'Set video URL. If provided, audioUrl will be cleared.' })
@IsOptional()
@IsUrl({ require_tld: false })
videoUrl?: string;
@ApiPropertyOptional({ description: 'Set audio URL. If provided, videoUrl will be cleared.' })
@IsOptional()
@IsUrl({ require_tld: false })
audioUrl?: string;
@ApiPropertyOptional({ description: 'Media duration in seconds for audio/video posts' })
@IsOptional()
@IsNumber()
@Min(1)
@Max(7200)
durationSeconds?: number;
@ApiPropertyOptional({ description: 'Cover/thumbnail URL for audio/video posts' })
@IsOptional()
@IsUrl({ require_tld: false })
thumbnailUrl?: string;
@ApiPropertyOptional({ description: 'Music style or genre for audio/video posts', maxLength: 80 })
@IsOptional()
@IsString()
@Length(0, 80)
style?: string;
@ApiPropertyOptional({ description: 'Maqam name for audio/video posts', maxLength: 80 })
@IsOptional()
@IsString()
@Length(0, 80)
maqam?: string;
@ApiPropertyOptional({ description: 'Rhythm signature like 6/8 for audio/video posts', maxLength: 40 })
@IsOptional()
@IsString()
@Length(0, 40)
rhythmSignature?: string;
@ApiPropertyOptional({
type: [Number],
description: 'Optional waveform samples for audio posts only',
})
@IsOptional()
@Transform(toNumberArray)
@IsArray()
@ArrayMaxSize(512)
@IsNumber({}, { each: true })
waveformPeaks?: number[];
@ApiPropertyOptional({ type: [String], description: 'Set image carousel URLs (max 10)' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(10)
@IsUrl({ require_tld: false }, { each: true })
imageUrls?: string[];
@ApiPropertyOptional({ type: [String], description: 'Caption per carousel image, matched by order' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(10)
@IsString({ each: true })
@Length(0, 300, { each: true })
imageCaptions?: string[];
@ApiPropertyOptional({ type: [String], description: 'Alt text per carousel image, matched by order' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(10)
@IsString({ each: true })
@Length(0, 300, { each: true })
imageAltTexts?: string[];
@ApiPropertyOptional({ type: [String], description: 'Set tagged user ids (max 20)' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(20)
@IsMongoId({ each: true })
taggedUserIds?: string[];
@ApiPropertyOptional({ type: [String], description: 'Collaborator user ids (max 5)' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(5)
@IsMongoId({ each: true })
collaboratorIds?: string[];
@ApiPropertyOptional({ type: [String], description: 'Set mention usernames like rami_sabry (max 30)' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(30)
@IsString({ each: true })
@Length(1, 30, { each: true })
mentionUsernames?: string[];
@ApiPropertyOptional({ type: [String], description: 'Set mentioned user ids (max 30)' })
@IsOptional()
@Transform(toStringArray)
@IsArray()
@ArrayMaxSize(30)
@IsMongoId({ each: true })
mentionedUserIds?: string[];
@ApiPropertyOptional({ description: 'Post location text' })
@IsOptional()
@IsString()
@Length(0, 120)
location?: string;
@ApiPropertyOptional({ description: 'Post latitude' })
@IsOptional()
@IsNumber()
@Min(-90)
@Max(90)
latitude?: number;
@ApiPropertyOptional({ description: 'Post longitude' })
@IsOptional()
@IsNumber()
@Min(-180)
@Max(180)
longitude?: number;
@ApiPropertyOptional({ enum: PostVisibility })
@IsOptional()
@IsEnum(PostVisibility)
visibility?: PostVisibility;
@ApiPropertyOptional()
@IsOptional()
@IsBoolean()
commentsDisabled?: boolean;
@ApiPropertyOptional()
@IsOptional()
@IsBoolean()
commentsFollowersOnly?: boolean;
}