@voyant-travel/mice 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/booking-extension.d.ts +130 -0
- package/dist/booking-extension.d.ts.map +1 -0
- package/dist/booking-extension.js +83 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/routes.d.ts +398 -5
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +85 -0
- package/dist/schema-delegates.d.ts +340 -0
- package/dist/schema-delegates.d.ts.map +1 -0
- package/dist/schema-delegates.js +76 -0
- package/dist/schema-rooming.d.ts +333 -0
- package/dist/schema-rooming.d.ts.map +1 -0
- package/dist/schema-rooming.js +47 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +3 -0
- package/dist/service-delegates.d.ts +40 -0
- package/dist/service-delegates.d.ts.map +1 -0
- package/dist/service-delegates.js +107 -0
- package/dist/service-rooming.d.ts +50 -0
- package/dist/service-rooming.d.ts.map +1 -0
- package/dist/service-rooming.js +102 -0
- package/dist/validation-delegates.d.ts +109 -0
- package/dist/validation-delegates.d.ts.map +1 -0
- package/dist/validation-delegates.js +41 -0
- package/dist/validation-rooming.d.ts +37 -0
- package/dist/validation-rooming.d.ts.map +1 -0
- package/dist/validation-rooming.js +28 -0
- package/dist/validation-sessions.d.ts +1 -1
- package/migrations/0002_mice_baseline.sql +86 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +8 -3
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { asc, eq, inArray } from "drizzle-orm";
|
|
2
|
+
import { programs } from "./schema.js";
|
|
3
|
+
import { programDelegates } from "./schema-delegates.js";
|
|
4
|
+
import { roomingAssignmentDelegates, roomingAssignments, } from "./schema-rooming.js";
|
|
5
|
+
export async function createRoomingAssignment(db, input) {
|
|
6
|
+
const [program] = await db
|
|
7
|
+
.select({ id: programs.id })
|
|
8
|
+
.from(programs)
|
|
9
|
+
.where(eq(programs.id, input.programId))
|
|
10
|
+
.limit(1);
|
|
11
|
+
if (!program)
|
|
12
|
+
return { status: "program_not_found" };
|
|
13
|
+
const [assignment] = await db.insert(roomingAssignments).values(input).returning();
|
|
14
|
+
if (!assignment)
|
|
15
|
+
throw new Error("createRoomingAssignment: insert returned no rows");
|
|
16
|
+
return { status: "ok", assignment };
|
|
17
|
+
}
|
|
18
|
+
export async function getRoomingAssignment(db, id) {
|
|
19
|
+
const [assignment] = await db
|
|
20
|
+
.select()
|
|
21
|
+
.from(roomingAssignments)
|
|
22
|
+
.where(eq(roomingAssignments.id, id))
|
|
23
|
+
.limit(1);
|
|
24
|
+
if (!assignment)
|
|
25
|
+
return null;
|
|
26
|
+
const delegates = await db
|
|
27
|
+
.select()
|
|
28
|
+
.from(roomingAssignmentDelegates)
|
|
29
|
+
.where(eq(roomingAssignmentDelegates.roomingAssignmentId, id));
|
|
30
|
+
return { ...assignment, delegates };
|
|
31
|
+
}
|
|
32
|
+
export async function listRoomingAssignments(db, query) {
|
|
33
|
+
const data = await db
|
|
34
|
+
.select()
|
|
35
|
+
.from(roomingAssignments)
|
|
36
|
+
.where(eq(roomingAssignments.programId, query.programId))
|
|
37
|
+
.orderBy(asc(roomingAssignments.createdAt))
|
|
38
|
+
.limit(query.limit)
|
|
39
|
+
.offset(query.offset);
|
|
40
|
+
return { data, limit: query.limit, offset: query.offset };
|
|
41
|
+
}
|
|
42
|
+
export async function updateRoomingAssignment(db, id, input) {
|
|
43
|
+
const [assignment] = await db
|
|
44
|
+
.update(roomingAssignments)
|
|
45
|
+
.set({ ...input, updatedAt: new Date() })
|
|
46
|
+
.where(eq(roomingAssignments.id, id))
|
|
47
|
+
.returning();
|
|
48
|
+
return assignment ?? null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Replace the occupants of a rooming assignment (full replace). Validates the
|
|
52
|
+
* assignment and that every delegate exists AND belongs to the assignment's
|
|
53
|
+
* program before touching the join — a stale id is a 4xx (not an FK 500) and a
|
|
54
|
+
* cross-program delegate can't corrupt the program-scoped manifest.
|
|
55
|
+
*/
|
|
56
|
+
export async function setRoomingDelegates(db, assignmentId, delegates) {
|
|
57
|
+
return db.transaction(async (tx) => {
|
|
58
|
+
const [assignment] = await tx
|
|
59
|
+
.select({ id: roomingAssignments.id, programId: roomingAssignments.programId })
|
|
60
|
+
.from(roomingAssignments)
|
|
61
|
+
.where(eq(roomingAssignments.id, assignmentId))
|
|
62
|
+
.limit(1);
|
|
63
|
+
if (!assignment)
|
|
64
|
+
return { status: "assignment_not_found" };
|
|
65
|
+
const ids = delegates.map((d) => d.delegateId);
|
|
66
|
+
if (ids.length) {
|
|
67
|
+
const found = await tx
|
|
68
|
+
.select({ id: programDelegates.id, programId: programDelegates.programId })
|
|
69
|
+
.from(programDelegates)
|
|
70
|
+
.where(inArray(programDelegates.id, ids));
|
|
71
|
+
const byId = new Map(found.map((r) => [r.id, r.programId]));
|
|
72
|
+
const missing = ids.filter((id) => !byId.has(id));
|
|
73
|
+
if (missing.length)
|
|
74
|
+
return { status: "delegate_not_found", missing };
|
|
75
|
+
const offending = ids.filter((id) => byId.get(id) !== assignment.programId);
|
|
76
|
+
if (offending.length)
|
|
77
|
+
return { status: "program_mismatch", offending };
|
|
78
|
+
}
|
|
79
|
+
await tx
|
|
80
|
+
.delete(roomingAssignmentDelegates)
|
|
81
|
+
.where(eq(roomingAssignmentDelegates.roomingAssignmentId, assignmentId));
|
|
82
|
+
if (delegates.length === 0)
|
|
83
|
+
return { status: "ok", delegates: [] };
|
|
84
|
+
const rows = await tx
|
|
85
|
+
.insert(roomingAssignmentDelegates)
|
|
86
|
+
.values(delegates.map((d) => ({
|
|
87
|
+
roomingAssignmentId: assignmentId,
|
|
88
|
+
delegateId: d.delegateId,
|
|
89
|
+
isPrimary: d.isPrimary ?? false,
|
|
90
|
+
bedLabel: d.bedLabel,
|
|
91
|
+
})))
|
|
92
|
+
.returning();
|
|
93
|
+
return { status: "ok", delegates: rows };
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export const roomingService = {
|
|
97
|
+
createRoomingAssignment,
|
|
98
|
+
getRoomingAssignment,
|
|
99
|
+
listRoomingAssignments,
|
|
100
|
+
updateRoomingAssignment,
|
|
101
|
+
setRoomingDelegates,
|
|
102
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const delegateRoleSchema: z.ZodEnum<{
|
|
3
|
+
staff: "staff";
|
|
4
|
+
attendee: "attendee";
|
|
5
|
+
speaker: "speaker";
|
|
6
|
+
sponsor: "sponsor";
|
|
7
|
+
vip: "vip";
|
|
8
|
+
exhibitor: "exhibitor";
|
|
9
|
+
organizer: "organizer";
|
|
10
|
+
}>;
|
|
11
|
+
export declare const delegateStatusSchema: z.ZodEnum<{
|
|
12
|
+
cancelled: "cancelled";
|
|
13
|
+
invited: "invited";
|
|
14
|
+
registered: "registered";
|
|
15
|
+
confirmed: "confirmed";
|
|
16
|
+
checked_in: "checked_in";
|
|
17
|
+
no_show: "no_show";
|
|
18
|
+
}>;
|
|
19
|
+
export declare const enrollmentStatusSchema: z.ZodEnum<{
|
|
20
|
+
cancelled: "cancelled";
|
|
21
|
+
registered: "registered";
|
|
22
|
+
waitlisted: "waitlisted";
|
|
23
|
+
attended: "attended";
|
|
24
|
+
}>;
|
|
25
|
+
export declare const createDelegateSchema: z.ZodObject<{
|
|
26
|
+
programId: z.ZodString;
|
|
27
|
+
personId: z.ZodOptional<z.ZodString>;
|
|
28
|
+
bookingId: z.ZodOptional<z.ZodString>;
|
|
29
|
+
role: z.ZodDefault<z.ZodEnum<{
|
|
30
|
+
staff: "staff";
|
|
31
|
+
attendee: "attendee";
|
|
32
|
+
speaker: "speaker";
|
|
33
|
+
sponsor: "sponsor";
|
|
34
|
+
vip: "vip";
|
|
35
|
+
exhibitor: "exhibitor";
|
|
36
|
+
organizer: "organizer";
|
|
37
|
+
}>>;
|
|
38
|
+
status: z.ZodDefault<z.ZodEnum<{
|
|
39
|
+
cancelled: "cancelled";
|
|
40
|
+
invited: "invited";
|
|
41
|
+
registered: "registered";
|
|
42
|
+
confirmed: "confirmed";
|
|
43
|
+
checked_in: "checked_in";
|
|
44
|
+
no_show: "no_show";
|
|
45
|
+
}>>;
|
|
46
|
+
arrivalAt: z.ZodOptional<z.ZodString>;
|
|
47
|
+
departureAt: z.ZodOptional<z.ZodString>;
|
|
48
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
export declare const updateDelegateSchema: z.ZodObject<{
|
|
51
|
+
status: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
52
|
+
cancelled: "cancelled";
|
|
53
|
+
invited: "invited";
|
|
54
|
+
registered: "registered";
|
|
55
|
+
confirmed: "confirmed";
|
|
56
|
+
checked_in: "checked_in";
|
|
57
|
+
no_show: "no_show";
|
|
58
|
+
}>>>;
|
|
59
|
+
role: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
60
|
+
staff: "staff";
|
|
61
|
+
attendee: "attendee";
|
|
62
|
+
speaker: "speaker";
|
|
63
|
+
sponsor: "sponsor";
|
|
64
|
+
vip: "vip";
|
|
65
|
+
exhibitor: "exhibitor";
|
|
66
|
+
organizer: "organizer";
|
|
67
|
+
}>>>;
|
|
68
|
+
notes: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
69
|
+
bookingId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
70
|
+
personId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
71
|
+
arrivalAt: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
72
|
+
departureAt: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export declare const delegateListQuerySchema: z.ZodObject<{
|
|
75
|
+
programId: z.ZodString;
|
|
76
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
77
|
+
cancelled: "cancelled";
|
|
78
|
+
invited: "invited";
|
|
79
|
+
registered: "registered";
|
|
80
|
+
confirmed: "confirmed";
|
|
81
|
+
checked_in: "checked_in";
|
|
82
|
+
no_show: "no_show";
|
|
83
|
+
}>>;
|
|
84
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
85
|
+
staff: "staff";
|
|
86
|
+
attendee: "attendee";
|
|
87
|
+
speaker: "speaker";
|
|
88
|
+
sponsor: "sponsor";
|
|
89
|
+
vip: "vip";
|
|
90
|
+
exhibitor: "exhibitor";
|
|
91
|
+
organizer: "organizer";
|
|
92
|
+
}>>;
|
|
93
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
94
|
+
offset: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
export declare const enrollDelegateSchema: z.ZodObject<{
|
|
97
|
+
sessionId: z.ZodString;
|
|
98
|
+
status: z.ZodDefault<z.ZodEnum<{
|
|
99
|
+
cancelled: "cancelled";
|
|
100
|
+
registered: "registered";
|
|
101
|
+
waitlisted: "waitlisted";
|
|
102
|
+
attended: "attended";
|
|
103
|
+
}>>;
|
|
104
|
+
}, z.core.$strip>;
|
|
105
|
+
export type CreateDelegateBody = z.infer<typeof createDelegateSchema>;
|
|
106
|
+
export type UpdateDelegateBody = z.infer<typeof updateDelegateSchema>;
|
|
107
|
+
export type DelegateListQuery = z.infer<typeof delegateListQuerySchema>;
|
|
108
|
+
export type EnrollDelegateBody = z.infer<typeof enrollDelegateSchema>;
|
|
109
|
+
//# sourceMappingURL=validation-delegates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-delegates.d.ts","sourceRoot":"","sources":["../src/validation-delegates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,kBAAkB;;;;;;;;EAQ7B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;EAO/B,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;EAAgE,CAAA;AAEnG,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAS/B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;iBAA2D,CAAA;AAE5F,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;iBAMlC,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;iBAG/B,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACrE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AACvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const delegateRoleSchema = z.enum([
|
|
3
|
+
"attendee",
|
|
4
|
+
"speaker",
|
|
5
|
+
"sponsor",
|
|
6
|
+
"vip",
|
|
7
|
+
"staff",
|
|
8
|
+
"exhibitor",
|
|
9
|
+
"organizer",
|
|
10
|
+
]);
|
|
11
|
+
export const delegateStatusSchema = z.enum([
|
|
12
|
+
"invited",
|
|
13
|
+
"registered",
|
|
14
|
+
"confirmed",
|
|
15
|
+
"checked_in",
|
|
16
|
+
"no_show",
|
|
17
|
+
"cancelled",
|
|
18
|
+
]);
|
|
19
|
+
export const enrollmentStatusSchema = z.enum(["registered", "waitlisted", "attended", "cancelled"]);
|
|
20
|
+
export const createDelegateSchema = z.object({
|
|
21
|
+
programId: z.string().min(1),
|
|
22
|
+
personId: z.string().min(1).optional(),
|
|
23
|
+
bookingId: z.string().min(1).optional(),
|
|
24
|
+
role: delegateRoleSchema.default("attendee"),
|
|
25
|
+
status: delegateStatusSchema.default("invited"),
|
|
26
|
+
arrivalAt: z.string().datetime().optional(),
|
|
27
|
+
departureAt: z.string().datetime().optional(),
|
|
28
|
+
notes: z.string().optional(),
|
|
29
|
+
});
|
|
30
|
+
export const updateDelegateSchema = createDelegateSchema.partial().omit({ programId: true });
|
|
31
|
+
export const delegateListQuerySchema = z.object({
|
|
32
|
+
programId: z.string().min(1),
|
|
33
|
+
status: delegateStatusSchema.optional(),
|
|
34
|
+
role: delegateRoleSchema.optional(),
|
|
35
|
+
limit: z.coerce.number().int().min(1).max(500).default(100),
|
|
36
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
37
|
+
});
|
|
38
|
+
export const enrollDelegateSchema = z.object({
|
|
39
|
+
sessionId: z.string().min(1),
|
|
40
|
+
status: enrollmentStatusSchema.default("registered"),
|
|
41
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const createRoomingAssignmentSchema: z.ZodObject<{
|
|
3
|
+
programId: z.ZodString;
|
|
4
|
+
roomBlockId: z.ZodOptional<z.ZodString>;
|
|
5
|
+
roomTypeId: z.ZodOptional<z.ZodString>;
|
|
6
|
+
bedConfig: z.ZodOptional<z.ZodString>;
|
|
7
|
+
sharingGroupId: z.ZodOptional<z.ZodString>;
|
|
8
|
+
checkIn: z.ZodOptional<z.ZodString>;
|
|
9
|
+
checkOut: z.ZodOptional<z.ZodString>;
|
|
10
|
+
specialRequests: z.ZodOptional<z.ZodString>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export declare const updateRoomingAssignmentSchema: z.ZodObject<{
|
|
13
|
+
roomBlockId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
14
|
+
roomTypeId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
15
|
+
bedConfig: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
16
|
+
sharingGroupId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
17
|
+
checkIn: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
18
|
+
checkOut: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
19
|
+
specialRequests: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export declare const roomingListQuerySchema: z.ZodObject<{
|
|
22
|
+
programId: z.ZodString;
|
|
23
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
24
|
+
offset: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export declare const setRoomingDelegatesSchema: z.ZodObject<{
|
|
27
|
+
delegates: z.ZodArray<z.ZodObject<{
|
|
28
|
+
delegateId: z.ZodString;
|
|
29
|
+
isPrimary: z.ZodOptional<z.ZodBoolean>;
|
|
30
|
+
bedLabel: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type CreateRoomingAssignmentBody = z.infer<typeof createRoomingAssignmentSchema>;
|
|
34
|
+
export type UpdateRoomingAssignmentBody = z.infer<typeof updateRoomingAssignmentSchema>;
|
|
35
|
+
export type RoomingListQuery = z.infer<typeof roomingListQuerySchema>;
|
|
36
|
+
export type RoomingDelegateInput = z.infer<typeof setRoomingDelegatesSchema>["delegates"][number];
|
|
37
|
+
//# sourceMappingURL=validation-rooming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-rooming.d.ts","sourceRoot":"","sources":["../src/validation-rooming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,6BAA6B;;;;;;;;;iBASxC,CAAA;AAEF,eAAO,MAAM,6BAA6B;;;;;;;;iBAEd,CAAA;AAE5B,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;iBASpC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAA;AACvF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAA;AACvF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const isoDate = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "expected YYYY-MM-DD");
|
|
3
|
+
export const createRoomingAssignmentSchema = z.object({
|
|
4
|
+
programId: z.string().min(1),
|
|
5
|
+
roomBlockId: z.string().min(1).optional(),
|
|
6
|
+
roomTypeId: z.string().min(1).optional(),
|
|
7
|
+
bedConfig: z.string().optional(),
|
|
8
|
+
sharingGroupId: z.string().optional(),
|
|
9
|
+
checkIn: isoDate.optional(),
|
|
10
|
+
checkOut: isoDate.optional(),
|
|
11
|
+
specialRequests: z.string().optional(),
|
|
12
|
+
});
|
|
13
|
+
export const updateRoomingAssignmentSchema = createRoomingAssignmentSchema
|
|
14
|
+
.partial()
|
|
15
|
+
.omit({ programId: true });
|
|
16
|
+
export const roomingListQuerySchema = z.object({
|
|
17
|
+
programId: z.string().min(1),
|
|
18
|
+
limit: z.coerce.number().int().min(1).max(500).default(100),
|
|
19
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
20
|
+
});
|
|
21
|
+
export const setRoomingDelegatesSchema = z.object({
|
|
22
|
+
// Full replace of occupants; an empty array clears the room.
|
|
23
|
+
delegates: z.array(z.object({
|
|
24
|
+
delegateId: z.string().min(1),
|
|
25
|
+
isPrimary: z.boolean().optional(),
|
|
26
|
+
bedLabel: z.string().optional(),
|
|
27
|
+
})),
|
|
28
|
+
});
|
|
@@ -39,8 +39,8 @@ export declare const createSessionSchema: z.ZodObject<{
|
|
|
39
39
|
export declare const updateSessionSchema: z.ZodObject<{
|
|
40
40
|
notes: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
41
41
|
capacity: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
42
|
-
functionSpaceId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
43
42
|
title: z.ZodOptional<z.ZodString>;
|
|
43
|
+
functionSpaceId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
44
44
|
sessionType: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
45
45
|
keynote: "keynote";
|
|
46
46
|
breakout: "breakout";
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
DO $$ BEGIN
|
|
2
|
+
CREATE TYPE "public"."mice_delegate_role" AS ENUM('attendee', 'speaker', 'sponsor', 'vip', 'staff', 'exhibitor', 'organizer');
|
|
3
|
+
EXCEPTION WHEN duplicate_object THEN null;
|
|
4
|
+
END $$;--> statement-breakpoint
|
|
5
|
+
DO $$ BEGIN
|
|
6
|
+
CREATE TYPE "public"."mice_delegate_status" AS ENUM('invited', 'registered', 'confirmed', 'checked_in', 'no_show', 'cancelled');
|
|
7
|
+
EXCEPTION WHEN duplicate_object THEN null;
|
|
8
|
+
END $$;--> statement-breakpoint
|
|
9
|
+
DO $$ BEGIN
|
|
10
|
+
CREATE TYPE "public"."mice_enrollment_status" AS ENUM('registered', 'waitlisted', 'attended', 'cancelled');
|
|
11
|
+
EXCEPTION WHEN duplicate_object THEN null;
|
|
12
|
+
END $$;--> statement-breakpoint
|
|
13
|
+
CREATE TABLE "booking_mice_details" (
|
|
14
|
+
"booking_id" text PRIMARY KEY NOT NULL,
|
|
15
|
+
"program_id" text,
|
|
16
|
+
"delegate_id" text,
|
|
17
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
18
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
19
|
+
);
|
|
20
|
+
--> statement-breakpoint
|
|
21
|
+
CREATE TABLE "mice_delegate_session_enrollments" (
|
|
22
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
23
|
+
"delegate_id" text NOT NULL,
|
|
24
|
+
"session_id" text NOT NULL,
|
|
25
|
+
"status" "mice_enrollment_status" DEFAULT 'registered' NOT NULL,
|
|
26
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
27
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
28
|
+
);
|
|
29
|
+
--> statement-breakpoint
|
|
30
|
+
CREATE TABLE "mice_program_delegates" (
|
|
31
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
32
|
+
"program_id" text NOT NULL,
|
|
33
|
+
"person_id" text,
|
|
34
|
+
"booking_id" text,
|
|
35
|
+
"role" "mice_delegate_role" DEFAULT 'attendee' NOT NULL,
|
|
36
|
+
"status" "mice_delegate_status" DEFAULT 'invited' NOT NULL,
|
|
37
|
+
"arrival_at" timestamp with time zone,
|
|
38
|
+
"departure_at" timestamp with time zone,
|
|
39
|
+
"notes" text,
|
|
40
|
+
"metadata" jsonb,
|
|
41
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
42
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
43
|
+
);
|
|
44
|
+
--> statement-breakpoint
|
|
45
|
+
CREATE TABLE "mice_rooming_assignment_delegates" (
|
|
46
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
47
|
+
"rooming_assignment_id" text NOT NULL,
|
|
48
|
+
"delegate_id" text NOT NULL,
|
|
49
|
+
"is_primary" boolean DEFAULT false NOT NULL,
|
|
50
|
+
"bed_label" text,
|
|
51
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
52
|
+
);
|
|
53
|
+
--> statement-breakpoint
|
|
54
|
+
CREATE TABLE "mice_rooming_assignments" (
|
|
55
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
56
|
+
"program_id" text NOT NULL,
|
|
57
|
+
"room_block_id" text,
|
|
58
|
+
"room_type_id" text,
|
|
59
|
+
"bed_config" text,
|
|
60
|
+
"sharing_group_id" text,
|
|
61
|
+
"check_in" date,
|
|
62
|
+
"check_out" date,
|
|
63
|
+
"special_requests" text,
|
|
64
|
+
"metadata" jsonb,
|
|
65
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
66
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
67
|
+
);
|
|
68
|
+
--> statement-breakpoint
|
|
69
|
+
ALTER TABLE "mice_delegate_session_enrollments" ADD CONSTRAINT "mice_delegate_session_enrollments_delegate_id_mice_program_delegates_id_fk" FOREIGN KEY ("delegate_id") REFERENCES "public"."mice_program_delegates"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
70
|
+
ALTER TABLE "mice_delegate_session_enrollments" ADD CONSTRAINT "mice_delegate_session_enrollments_session_id_mice_program_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."mice_program_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
71
|
+
ALTER TABLE "mice_program_delegates" ADD CONSTRAINT "mice_program_delegates_program_id_mice_programs_id_fk" FOREIGN KEY ("program_id") REFERENCES "public"."mice_programs"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
72
|
+
ALTER TABLE "mice_rooming_assignment_delegates" ADD CONSTRAINT "mice_rooming_assignment_delegates_rooming_assignment_id_mice_rooming_assignments_id_fk" FOREIGN KEY ("rooming_assignment_id") REFERENCES "public"."mice_rooming_assignments"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
73
|
+
ALTER TABLE "mice_rooming_assignment_delegates" ADD CONSTRAINT "mice_rooming_assignment_delegates_delegate_id_mice_program_delegates_id_fk" FOREIGN KEY ("delegate_id") REFERENCES "public"."mice_program_delegates"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
74
|
+
ALTER TABLE "mice_rooming_assignments" ADD CONSTRAINT "mice_rooming_assignments_program_id_mice_programs_id_fk" FOREIGN KEY ("program_id") REFERENCES "public"."mice_programs"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
75
|
+
CREATE INDEX "idx_bkmd_program" ON "booking_mice_details" USING btree ("program_id");--> statement-breakpoint
|
|
76
|
+
CREATE INDEX "idx_bkmd_delegate" ON "booking_mice_details" USING btree ("delegate_id");--> statement-breakpoint
|
|
77
|
+
CREATE INDEX "idx_mice_enrollments_session" ON "mice_delegate_session_enrollments" USING btree ("session_id");--> statement-breakpoint
|
|
78
|
+
CREATE UNIQUE INDEX "uidx_mice_enrollments_delegate_session" ON "mice_delegate_session_enrollments" USING btree ("delegate_id","session_id");--> statement-breakpoint
|
|
79
|
+
CREATE INDEX "idx_mice_program_delegates_program" ON "mice_program_delegates" USING btree ("program_id");--> statement-breakpoint
|
|
80
|
+
CREATE INDEX "idx_mice_program_delegates_program_status" ON "mice_program_delegates" USING btree ("program_id","status");--> statement-breakpoint
|
|
81
|
+
CREATE INDEX "idx_mice_program_delegates_person" ON "mice_program_delegates" USING btree ("person_id");--> statement-breakpoint
|
|
82
|
+
CREATE INDEX "idx_mice_program_delegates_booking" ON "mice_program_delegates" USING btree ("booking_id");--> statement-breakpoint
|
|
83
|
+
CREATE INDEX "idx_mice_rooming_assignment_delegates_assignment" ON "mice_rooming_assignment_delegates" USING btree ("rooming_assignment_id");--> statement-breakpoint
|
|
84
|
+
CREATE UNIQUE INDEX "uidx_mice_rooming_assignment_delegates_pair" ON "mice_rooming_assignment_delegates" USING btree ("rooming_assignment_id","delegate_id");--> statement-breakpoint
|
|
85
|
+
CREATE INDEX "idx_mice_rooming_assignments_program" ON "mice_rooming_assignments" USING btree ("program_id");--> statement-breakpoint
|
|
86
|
+
CREATE INDEX "idx_mice_rooming_assignments_room_block" ON "mice_rooming_assignments" USING btree ("room_block_id");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyant-travel/mice",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"types": "./dist/routes.d.ts",
|
|
24
24
|
"import": "./dist/routes.js",
|
|
25
25
|
"default": "./dist/routes.js"
|
|
26
|
+
},
|
|
27
|
+
"./booking-extension": {
|
|
28
|
+
"types": "./dist/booking-extension.d.ts",
|
|
29
|
+
"import": "./dist/booking-extension.js",
|
|
30
|
+
"default": "./dist/booking-extension.js"
|
|
26
31
|
}
|
|
27
32
|
},
|
|
28
33
|
"dependencies": {
|
|
@@ -30,8 +35,8 @@
|
|
|
30
35
|
"hono": "^4.12.10",
|
|
31
36
|
"zod": "^4.3.6",
|
|
32
37
|
"@voyant-travel/core": "^0.111.0",
|
|
33
|
-
"@voyant-travel/
|
|
34
|
-
"@voyant-travel/
|
|
38
|
+
"@voyant-travel/hono": "^0.116.1",
|
|
39
|
+
"@voyant-travel/db": "^0.109.3"
|
|
35
40
|
},
|
|
36
41
|
"devDependencies": {
|
|
37
42
|
"drizzle-kit": "^0.31.10",
|