165 lines
6.3 KiB
TypeScript
165 lines
6.3 KiB
TypeScript
import { z } from 'zod';
|
||
|
||
/* ================= MEDIA ================= */
|
||
export const MediaDto = z.object({
|
||
mediaType: z.string().optional(), // "image/jpeg", "video/mp4", etc.
|
||
mediaFileName: z.string(), // S3 file URL
|
||
});
|
||
|
||
/* ================= PRICE =================
|
||
* ❌ No tax info here; root-level only
|
||
*/
|
||
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),
|
||
sellPrice: z.number().int(), // required
|
||
});
|
||
|
||
/* ================= VENUE ================= */
|
||
export const VenueDto = z.object({
|
||
venueName: 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(),
|
||
|
||
// ✅ new: media per venue (for ActivityVenueArtifacts)
|
||
media: z.array(MediaDto).optional().default([]),
|
||
|
||
// price list per venue
|
||
prices: z.array(PriceDto).optional().default([]),
|
||
});
|
||
|
||
/* ================= PICKUP / DROP ================= */
|
||
export const PickupDetailDto = z.object({
|
||
isPickUp: z.boolean().optional().default(false),
|
||
locationLat: z.number().nullable().optional(),
|
||
locationLong: z.number().nullable().optional(),
|
||
locationAddress: z.string().nullable().optional(),
|
||
transportBasePrice: z.number().int().optional().default(0),
|
||
transportTotalPrice: z.number().int().optional().default(0),
|
||
});
|
||
|
||
export const PickupTransportDto = z.object({
|
||
transportModeXid: z.number().int(),
|
||
isTransportModeChargeable: z.boolean().optional().default(false),
|
||
pickupDetails: z.array(PickupDetailDto).optional().default([]),
|
||
});
|
||
|
||
/* ================= 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),
|
||
});
|
||
|
||
/* ================= ELIGIBILITY ================= */
|
||
export const EligibilityDto = z.object({
|
||
isAgeRestriction: z.boolean().optional().default(false),
|
||
ageRestrictionXid: z.number().int().nullable().optional(),
|
||
|
||
isWeightRestriction: z.boolean().optional().default(false),
|
||
weightRestrictionName: z.string().nullable().optional(),
|
||
weightEntered: z.number().int().nullable().optional(),
|
||
weightIn: z.string().nullable().optional(),
|
||
minWeight: z.number().int().nullable().optional(),
|
||
maxWeight: z.number().int().nullable().optional(),
|
||
|
||
isHeightRestriction: z.boolean().optional().default(false),
|
||
heightRestrictionName: z.string().nullable().optional(),
|
||
heightEntered: z.number().int().nullable().optional(),
|
||
heightIn: z.string().nullable().optional(),
|
||
minHeight: z.number().int().nullable().optional(),
|
||
maxHeight: z.number().int().nullable().optional(),
|
||
});
|
||
|
||
/* ================= 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(),
|
||
});
|
||
|
||
/* ================= CREATE ACTIVITY ================= */
|
||
export const CreateActivityDto = z.object({
|
||
/* 🔑 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(),
|
||
|
||
/* LOCATION */
|
||
checkInLat: z.number().nullable().optional(),
|
||
checkInLong: z.number().nullable().optional(),
|
||
checkInAddress: z.string().nullable().optional(),
|
||
isCheckOutSame: z.boolean().optional().default(true),
|
||
checkOutLat: z.number().nullable().optional(),
|
||
checkOutLong: z.number().nullable().optional(),
|
||
checkOutAddress: z.string().nullable().optional(),
|
||
|
||
/* DURATION / ENERGY */
|
||
energyLevelXid: z.number().int().nullable().optional(),
|
||
activityDurationMins: z.number().int().nullable().optional(),
|
||
durationHours: z.number().int().optional(),
|
||
durationMins: z.number().int().optional(),
|
||
|
||
/* FLAGS */
|
||
foodAvailable: z.boolean().optional().default(false),
|
||
foodIsChargeable: z.boolean().optional().default(false),
|
||
alcoholAvailable: z.boolean().optional().default(false),
|
||
|
||
trainerAvailable: z.boolean().optional().default(false),
|
||
trainerIsChargeable: z.boolean().optional().default(false),
|
||
|
||
pickUpDropAvailable: z.boolean().optional().default(false),
|
||
pickUpDropIsChargeable: z.boolean().optional().default(false),
|
||
|
||
inActivityAvailable: z.boolean().optional().default(false),
|
||
inActivityIsChargeable: z.boolean().optional().default(false),
|
||
|
||
equipmentAvailable: z.boolean().optional().default(false),
|
||
equipmentIsChargeable: z.boolean().optional().default(false),
|
||
|
||
cancellationAvailable: z.boolean().optional().default(false),
|
||
|
||
/* MONEY / CURRENCY */
|
||
currencyXid: z.number().int().nullable().optional(),
|
||
sustainabilityScore: z.number().int().nullable().optional(),
|
||
safetyScore: z.number().int().nullable().optional(),
|
||
isInstantBooking: z.boolean().optional().default(false),
|
||
|
||
/* 🔥 ROOT-LEVEL TAX (SINGLE SOURCE OF TRUTH) */
|
||
taxXids: z.array(z.number().int()).optional().default([]),
|
||
|
||
/* 🔥 MEDIA ARRAYS */
|
||
media: z.array(MediaDto).optional().default([]), // Activity-level media
|
||
venues: z.array(VenueDto).optional().default([]), // Each venue’s media + prices
|
||
|
||
/* RELATION ARRAYS */
|
||
foodTypeIds: z.array(z.number().int()).optional().default([]),
|
||
cuisineIds: z.array(z.number().int()).optional().default([]),
|
||
pickupTransports: z.array(PickupTransportDto).optional().default([]),
|
||
navigationModes: z.array(z.number().int()).optional().default([]),
|
||
equipments: z.array(EquipmentDto).optional().default([]),
|
||
amenitiesIds: z.array(z.number().int()).optional().default([]),
|
||
|
||
/* EXTRA OBJECTS */
|
||
eligibility: EligibilityDto.optional(),
|
||
otherDetails: OtherDetailsDto.optional(),
|
||
|
||
allowedEntryTypes: z.array(z.number().int()).optional().default([]),
|
||
});
|
||
|
||
export type CreateActivityInput = z.infer<typeof CreateActivityDto>;
|