import { AuthenticatableType } from "@common/enums/authenticatable-type.enum"; import { FitnessGoal } from "@common/enums/fitness-goal.enum"; import { FitnessLevel } from "@common/enums/fitness-level.enum"; import { Gender } from "@common/enums/gender.enum"; import { Injury } from "@common/enums/injury.enum"; import { PreferredDay } from "@common/enums/preferred-day.enum"; import { PreferredEquipment } from "@common/enums/preferred-equipment.enum"; import { WorkoutPlace } from "@common/enums/workout-place.enum"; import * as joi from "joi"; import { createSchema } from "@helpers/create-schema"; export interface IUserRegister { name: string; email: string; password: string; confirmPassword: string; image?: { url: string; public_id: string; }; gender: string; height: number; weight: number; fitness_level: string; preferences?: { fitness_goal: string; target_weight: number; workout_frequency: number; preferred_days: string[]; workout_place: string; preferred_equipment: string[]; }; injuries: string[]; dob?: Date; } export const userRegisterKeys = { name: joi.string().empty().required().messages({ "string.base": "please enter a valid name", "any.required": "name is required", "string.empty": "name can not be empty", }), email: joi .string() .required() .email({ minDomainSegments: 2, tlds: { allow: ["com", "net", "org", "eg", "io"] }, }) .empty() .messages({ "string.email": "please enter a valid email", "any.required": "email must be entered", "string.empty": "email can not be empty", }), password: joi.string().empty().min(8).required().messages({ "string.base": "please enter a valid password", "any.required": "password must be entered", "string.empty": "password cannot be empty", "string.min": "password must be at least 8 characters", }), confirmPassword: joi.string().empty().min(8).required().messages({ "string.base": "please enter a valid password", "any.required": "password must be entered", "string.empty": "password cannot be empty", "string.min": "password must be at least 8 characters", }), image: joi .object() .optional() .keys({ url: joi.string().optional().messages({ "string.base": "please enter a valid url", }), public_id: joi.string().optional().messages({ "string.base": "please enter a valid public_id", }), }), gender: joi .string() .valid(...Object.values(Gender)) .empty() .required() .messages({ "string.base": "please enter a valid gender", "any.required": "gender must be entered", "string.empty": "gender cannot be empty", }), height: joi.number().empty().required().messages({ "number.base": "please enter a valid height number", "any.required": "height must be entered", "number.empty": "height cannot be empty", }), weight: joi.number().empty().required().messages({ "number.base": "please enter a valid weight number", "any.required": "weight must be entered", "number.empty": "weight cannot be empty", }), fitness_level: joi .string() .valid(...Object.values(FitnessLevel)) .empty() .required() .messages({ "string.base": "please enter a valid fitness_level", "any.required": "fitness_level must be entered", "string.empty": "fitness_level cannot be empty", }), preferences: joi .object() .optional() .keys({ fitness_goal: joi .string() .valid(...Object.values(FitnessGoal)) .empty() .required() .messages({ "string.base": "please enter a valid fitness_goal", "any.required": "fitness_goal must be entered", "string.empty": "fitness_goal cannot be empty", }), target_weight: joi.number().empty().required().messages({ "number.base": "please enter a valid target_weight number", "any.required": "target_weight must be entered", "number.empty": "target_weight cannot be empty", }), workout_frequency: joi.number().empty().optional().messages({ "number.base": "please enter a valid workout_frequency number", "number.empty": "workout_frequency cannot be empty", }), preferred_days: joi .array() .empty() .optional() .items( joi.string().valid(...Object.values(PreferredDay)) .empty().required().messages({ "string.base": "please enter a valid preferred_days", "any.required": "preferred_days must be entered", "string.empty": "preferred_days cannot be empty", }) ), workout_place: joi .string() .valid(...Object.values(WorkoutPlace)) .empty() .required() .messages({ "string.base": "please enter a valid workout_place", "any.required": "workout_place must be entered", "string.empty": "workout_place cannot be empty", }), preferred_equipment: joi .array() .empty() .required() .items( joi.string().valid(...Object.values(PreferredEquipment)) .empty().required().messages({ "string.base": "please enter a valid preferred_equipment", "any.required": "preferred_equipment must be entered", "string.empty": "preferred_equipment cannot be empty", }) ), }), injuries: joi .array() .empty() .required() .items( joi.string().valid(...Object.values(Injury)) .empty().optional().messages({ "string.base": "please enter a valid injuries", "any.required": "injuries must be entered", "string.empty": "injuries cannot be empty", }) ), dob: joi.date().empty().optional().messages({ "date.base": "please enter a valid date", }), role: joi .string() .valid(...Object.values(AuthenticatableType)) .optional() .messages({ "string.base": "please enter a valid role", "string.empty": "role cannot be empty", }), }; export const userRegisterSchema = createSchema(userRegisterKeys);