Files
cal.diy/apps/api/v2/src/modules/users/inputs/create-user.input.ts
T
Lauris Skraucis 3be7fb9dd8 fix: v2 create org user with time zone (#24133)
* fix: tzdata undefined import

* refactor: capitalize org user timezone

* test: org user creation with time zone
2025-09-29 11:12:18 +00:00

168 lines
4.4 KiB
TypeScript

import { CapitalizeTimeZone } from "@/lib/inputs/capitalize-timezone";
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { Expose, Transform } from "class-transformer";
import {
IsBoolean,
IsEmail,
IsHexColor,
IsNumber,
IsOptional,
IsString,
Validate,
Min,
IsObject,
} from "class-validator";
import { ValidateMetadata } from "@calcom/platform-types";
import { AvatarValidator } from "../validators/avatarValidator";
import { LocaleValidator } from "../validators/localeValidator";
import { ThemeValidator } from "../validators/themeValidator";
import { TimeFormatValidator } from "../validators/timeFormatValidator";
import { TimeZoneValidator } from "../validators/timeZoneValidator";
import { WeekdayValidator } from "../validators/weekdayValidator";
export class CreateUserInput {
@ApiProperty({ type: String, description: "User email address", example: "user@example.com" })
@IsEmail()
@Transform(({ value }) => {
if (typeof value === "string") {
return value.toLowerCase();
}
})
@Expose()
email!: string;
@ApiProperty({ type: String, required: false, description: "Username", example: "user123" })
@IsOptional()
@IsString()
@Transform(({ value }) => {
if (typeof value === "string") {
return value.toLowerCase();
}
})
@Expose()
username?: string;
@ApiProperty({ type: String, required: false, description: "Preferred weekday", example: "Monday" })
@IsOptional()
@IsString()
@Validate(WeekdayValidator)
@Expose()
weekday?: string;
@ApiProperty({
type: String,
required: false,
description: "Brand color in HEX format",
example: "#FFFFFF",
})
@IsOptional()
@IsHexColor()
@Expose()
brandColor?: string;
@ApiPropertyOptional({
type: String,
description: "Bio",
example: "I am a bio",
})
@IsOptional()
@IsString()
@Expose()
bio?: string;
@ApiPropertyOptional({
type: Object,
description:
"You can store any additional data you want here. Metadata must have at most 50 keys, each key up to 40 characters, and values up to 500 characters.",
example: { key: "value" },
})
@IsObject()
@IsOptional()
@ValidateMetadata({
message:
"Metadata must have at most 50 keys, each key up to 40 characters, and values up to 500 characters.",
})
@Expose()
@Transform(
// note(Lauris): added this transform because without it metadata is removed for some reason
({ obj }: { obj: { metadata: Record<string, unknown> | null | undefined } }) => {
return obj.metadata || undefined;
}
)
metadata?: Record<string, string | boolean | number>;
@ApiProperty({
type: String,
required: false,
description: "Dark brand color in HEX format",
example: "#000000",
})
@IsOptional()
@IsHexColor()
@Expose()
darkBrandColor?: string;
@ApiProperty({ type: Boolean, required: false, description: "Hide branding", example: false })
@IsOptional()
@IsBoolean()
@Expose()
hideBranding?: boolean;
@ApiProperty({ type: String, required: false, description: "Time zone", example: "America/New_York" })
@IsOptional()
@IsString()
@CapitalizeTimeZone()
@Validate(TimeZoneValidator)
@Expose()
timeZone?: string;
@ApiProperty({ type: String, required: false, description: "Theme", example: "dark" })
@IsOptional()
@IsString()
@Validate(ThemeValidator)
@Expose()
theme?: string | null;
@ApiProperty({ type: String, required: false, description: "Application theme", example: "light" })
@IsOptional()
@IsString()
@Validate(ThemeValidator)
@Expose()
appTheme?: string | null;
@ApiProperty({ type: Number, required: false, description: "Time format", example: 24 })
@IsOptional()
@IsNumber()
@Validate(TimeFormatValidator)
@Expose()
timeFormat?: number;
@ApiProperty({ type: Number, required: false, description: "Default schedule ID", example: 1, minimum: 0 })
@IsOptional()
@IsNumber()
@Min(0)
@Expose()
defaultScheduleId?: number;
@ApiProperty({ type: String, required: false, description: "Locale", example: "en", default: "en" })
@IsOptional()
@IsString()
@Validate(LocaleValidator)
@Expose()
locale?: string | null = "en";
@ApiProperty({
type: String,
required: false,
description: "Avatar URL",
example: "https://example.com/avatar.jpg",
})
@IsOptional()
@IsString()
@Validate(AvatarValidator)
@Expose()
avatarUrl?: string;
}