Files
MinglarBackendNestJS/src/modules/host/dto/createActivity.schema.ts

174 lines
6.7 KiB
TypeScript
Raw Normal View History

import { z } from 'zod';
2025-12-21 17:28:08 +05:30
/* ================= MEDIA ================= */
export const MediaDto = z.object({
2025-12-24 15:11:37 +05:30
mediaType: z.string().optional(), // "image/jpeg", "video/mp4", etc.
mediaFileName: z.string(), // S3 file URL
});
2025-12-21 17:28:08 +05:30
/* ================= PRICE =================
2025-12-22 13:30:55 +05:30
* No tax info here; root-level only
2025-12-21 17:28:08 +05:30
*/
export const PriceDto = z.object({
noOfSession: z.number().int().optional().default(1),
isPackage: z.boolean().optional().default(false),
sessionValidity: z.number().int().optional().default(0),
sessionValidityFrequency: z.string().optional().default('Days'),
basePrice: z.number().int().optional().default(0),
2025-12-22 13:30:55 +05:30
sellPrice: z.number().int(), // required
});
2025-12-21 17:28:08 +05:30
/* ================= VENUE ================= */
export const VenueDto = z.object({
venueName: z.string(),
2025-12-31 13:03:23 +05:30
venueLabel: z.string(),
venueCapacity: z.number().int().optional().default(0),
availableSeats: z.number().int().optional().default(0),
isMinPeopleReqMandatory: z.boolean().optional().default(false),
minPeopleRequired: z.number().int().nullable().optional(),
minReqfullfilledBeforeMins: z.number().int().nullable().optional(),
venueDescription: z.string().optional(),
2025-12-22 13:30:55 +05:30
// ✅ new: media per venue (for ActivityVenueArtifacts)
media: z.array(MediaDto).optional().default([]),
// price list per venue
prices: z.array(PriceDto).optional().default([]),
});
2025-12-21 17:28:08 +05:30
/* ================= PICKUP / DROP ================= */
export const PickupDetailDto = z.object({
isPickUp: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
locationLat: z.number().nullable().optional(),
locationLong: z.number().nullable().optional(),
locationAddress: z.string().nullable().optional(),
2025-12-30 14:22:18 +05:30
transportTotalPrice: z.number().int().min(1),
});
export const PickupTransportDto = z.object({
transportModeXid: z.number().int(),
pickupDetails: z.array(PickupDetailDto).optional().default([]),
});
2025-12-21 17:28:08 +05:30
/* ================= EQUIPMENT ================= */
export const EquipmentDto = z.object({
equipmentName: z.string(),
isEquipmentChargeable: z.boolean().optional().default(false),
equipmentBasePrice: z.number().int().optional().default(0),
equipmentTotalPrice: z.number().int().optional().default(0),
});
2025-12-21 17:28:08 +05:30
/* ================= ELIGIBILITY ================= */
export const EligibilityDto = z.object({
isAgeRestriction: z.boolean().optional().default(false),
ageRestrictionName: z.string().nullable().optional(),
ageEntered: z.number().int().nullable().optional(),
ageIn: z.string().nullable().optional(),
minAge: z.number().int().nullable().optional(),
maxAge: z.number().int().nullable().optional(),
2025-12-21 17:28:08 +05:30
isWeightRestriction: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
weightRestrictionName: z.string().nullable().optional(),
weightEntered: z.number().int().nullable().optional(),
2025-12-21 17:28:08 +05:30
weightIn: z.string().nullable().optional(),
minWeight: z.number().int().nullable().optional(),
maxWeight: z.number().int().nullable().optional(),
2025-12-21 17:28:08 +05:30
isHeightRestriction: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
heightRestrictionName: z.string().nullable().optional(),
heightEntered: z.number().int().nullable().optional(),
2025-12-22 13:30:55 +05:30
heightIn: z.string().nullable().optional(),
minHeight: z.number().int().nullable().optional(),
maxHeight: z.number().int().nullable().optional(),
});
2025-12-21 17:28:08 +05:30
/* ================= OTHER DETAILS ================= */
export const OtherDetailsDto = z.object({
exclusiveNotes: z.string().optional(),
dosNotes: z.string().optional(),
dontsNotes: z.string().optional(),
tipsNotes: z.string().optional(),
termsAndCondition: z.string().optional(),
});
2025-12-21 17:28:08 +05:30
/* ================= CREATE ACTIVITY ================= */
export const CreateActivityDto = z.object({
2025-12-21 17:28:08 +05:30
/* 🔑 REQUIRED */
activityXid: z.number().int(),
/* OPTIONAL CORE */
activityTypeXid: z.number().int().optional(),
frequenciesXid: z.number().int().nullable().optional(),
activityTitle: z.string().optional(),
activityDescription: z.string().optional(),
2025-12-21 17:28:08 +05:30
/* LOCATION */
checkInLat: z.number().nullable().optional(),
checkInLong: z.number().nullable().optional(),
checkInAddress: z.string().nullable().optional(),
isCheckOutSame: z.boolean().optional().default(true),
2025-12-21 17:28:08 +05:30
checkOutLat: z.number().nullable().optional(),
checkOutLong: z.number().nullable().optional(),
checkOutAddress: z.string().nullable().optional(),
/* DURATION / ENERGY */
energyLevelXid: z.number().int().nullable().optional(),
2025-12-24 19:04:51 +05:30
durationDays: z.number().int().optional(),
durationHours: z.number().int().optional(),
durationMins: z.number().int().optional(),
2025-12-21 17:28:08 +05:30
/* FLAGS */
foodAvailable: z.boolean().optional().default(false),
foodIsChargeable: z.boolean().optional().default(false),
alcoholAvailable: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
trainerAvailable: z.boolean().optional().default(false),
trainerIsChargeable: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
pickUpDropAvailable: z.boolean().optional().default(false),
pickUpDropIsChargeable: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
inActivityAvailable: z.boolean().optional().default(false),
inActivityIsChargeable: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
equipmentAvailable: z.boolean().optional().default(false),
equipmentIsChargeable: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
cancellationAvailable: z.boolean().optional().default(false),
2025-12-31 13:03:23 +05:30
cancellationAllowedBeforeMins: z.number().int().nullable().optional(),
2025-12-21 17:28:08 +05:30
2025-12-22 13:30:55 +05:30
/* MONEY / CURRENCY */
currencyXid: z.number().int().nullable().optional(),
2025-12-21 17:28:08 +05:30
sustainabilityScore: z.number().int().nullable().optional(),
safetyScore: z.number().int().nullable().optional(),
isInstantBooking: z.boolean().optional().default(false),
2025-12-21 17:28:08 +05:30
/* 🔥 ROOT-LEVEL TAX (SINGLE SOURCE OF TRUTH) */
taxXids: z.array(z.number().int()).optional().default([]),
2025-12-22 13:30:55 +05:30
/* 🔥 MEDIA ARRAYS */
2025-12-24 15:11:37 +05:30
media: z.array(MediaDto).optional().default([]), // Activity-level media
venues: z.array(VenueDto).optional().default([]), // Each venues media + prices
2025-12-21 17:28:08 +05:30
2025-12-22 13:30:55 +05:30
/* RELATION ARRAYS */
foodTypeIds: z.array(z.number().int()).optional().default([]),
cuisineIds: z.array(z.number().int()).optional().default([]),
pickupTransports: z.array(PickupTransportDto).optional().default([]),
2025-12-21 17:28:08 +05:30
navigationModes: z.array(z.number().int()).optional().default([]),
equipments: z.array(EquipmentDto).optional().default([]),
amenitiesIds: z.array(z.number().int()).optional().default([]),
2025-12-21 17:28:08 +05:30
2025-12-24 19:04:51 +05:30
foodTotalAmount: z.number().int().optional().default(0),
2025-12-22 13:30:55 +05:30
/* EXTRA OBJECTS */
eligibility: EligibilityDto.optional(),
otherDetails: OtherDetailsDto.optional(),
2025-12-24 15:11:37 +05:30
allowedEntryTypes: z.array(z.number().int()).optional().default([]),
navigationModeIsChargeable: z.boolean().optional().default(false),
trainerTotalAmount: z.number().int().optional().default(0),
navigationModeTotalPrice: z.number().int().optional().default(0),
});
export type CreateActivityInput = z.infer<typeof CreateActivityDto>;