@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,130 @@
|
|
|
1
|
+
import type { HonoExtension } from "@voyant-travel/hono/module";
|
|
2
|
+
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
/**
|
|
5
|
+
* MICE booking extension — a 1:1 sidecar that links a booking to its program +
|
|
6
|
+
* delegate, following the established HonoExtension pattern (precedent:
|
|
7
|
+
* inventory's booking-extension). `booking_id` is a loose text PK (no
|
|
8
|
+
* cross-package FK), so this package doesn't depend on bookings. See RFC
|
|
9
|
+
* voyant#1489 (Phase 3) §4.2.
|
|
10
|
+
*/
|
|
11
|
+
export declare const bookingMiceDetails: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
12
|
+
name: "booking_mice_details";
|
|
13
|
+
schema: undefined;
|
|
14
|
+
columns: {
|
|
15
|
+
bookingId: import("drizzle-orm/pg-core").PgColumn<{
|
|
16
|
+
name: "booking_id";
|
|
17
|
+
tableName: "booking_mice_details";
|
|
18
|
+
dataType: "string";
|
|
19
|
+
columnType: "PgText";
|
|
20
|
+
data: string;
|
|
21
|
+
driverParam: string;
|
|
22
|
+
notNull: true;
|
|
23
|
+
hasDefault: false;
|
|
24
|
+
isPrimaryKey: true;
|
|
25
|
+
isAutoincrement: false;
|
|
26
|
+
hasRuntimeDefault: false;
|
|
27
|
+
enumValues: [string, ...string[]];
|
|
28
|
+
baseColumn: never;
|
|
29
|
+
identity: undefined;
|
|
30
|
+
generated: undefined;
|
|
31
|
+
}, {}, {}>;
|
|
32
|
+
programId: import("drizzle-orm/pg-core").PgColumn<{
|
|
33
|
+
name: "program_id";
|
|
34
|
+
tableName: "booking_mice_details";
|
|
35
|
+
dataType: "string";
|
|
36
|
+
columnType: "PgText";
|
|
37
|
+
data: string;
|
|
38
|
+
driverParam: string;
|
|
39
|
+
notNull: false;
|
|
40
|
+
hasDefault: false;
|
|
41
|
+
isPrimaryKey: false;
|
|
42
|
+
isAutoincrement: false;
|
|
43
|
+
hasRuntimeDefault: false;
|
|
44
|
+
enumValues: [string, ...string[]];
|
|
45
|
+
baseColumn: never;
|
|
46
|
+
identity: undefined;
|
|
47
|
+
generated: undefined;
|
|
48
|
+
}, {}, {}>;
|
|
49
|
+
delegateId: import("drizzle-orm/pg-core").PgColumn<{
|
|
50
|
+
name: "delegate_id";
|
|
51
|
+
tableName: "booking_mice_details";
|
|
52
|
+
dataType: "string";
|
|
53
|
+
columnType: "PgText";
|
|
54
|
+
data: string;
|
|
55
|
+
driverParam: string;
|
|
56
|
+
notNull: false;
|
|
57
|
+
hasDefault: false;
|
|
58
|
+
isPrimaryKey: false;
|
|
59
|
+
isAutoincrement: false;
|
|
60
|
+
hasRuntimeDefault: false;
|
|
61
|
+
enumValues: [string, ...string[]];
|
|
62
|
+
baseColumn: never;
|
|
63
|
+
identity: undefined;
|
|
64
|
+
generated: undefined;
|
|
65
|
+
}, {}, {}>;
|
|
66
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
67
|
+
name: "created_at";
|
|
68
|
+
tableName: "booking_mice_details";
|
|
69
|
+
dataType: "date";
|
|
70
|
+
columnType: "PgTimestamp";
|
|
71
|
+
data: Date;
|
|
72
|
+
driverParam: string;
|
|
73
|
+
notNull: true;
|
|
74
|
+
hasDefault: true;
|
|
75
|
+
isPrimaryKey: false;
|
|
76
|
+
isAutoincrement: false;
|
|
77
|
+
hasRuntimeDefault: false;
|
|
78
|
+
enumValues: undefined;
|
|
79
|
+
baseColumn: never;
|
|
80
|
+
identity: undefined;
|
|
81
|
+
generated: undefined;
|
|
82
|
+
}, {}, {}>;
|
|
83
|
+
updatedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
84
|
+
name: "updated_at";
|
|
85
|
+
tableName: "booking_mice_details";
|
|
86
|
+
dataType: "date";
|
|
87
|
+
columnType: "PgTimestamp";
|
|
88
|
+
data: Date;
|
|
89
|
+
driverParam: string;
|
|
90
|
+
notNull: true;
|
|
91
|
+
hasDefault: true;
|
|
92
|
+
isPrimaryKey: false;
|
|
93
|
+
isAutoincrement: false;
|
|
94
|
+
hasRuntimeDefault: false;
|
|
95
|
+
enumValues: undefined;
|
|
96
|
+
baseColumn: never;
|
|
97
|
+
identity: undefined;
|
|
98
|
+
generated: undefined;
|
|
99
|
+
}, {}, {}>;
|
|
100
|
+
};
|
|
101
|
+
dialect: "pg";
|
|
102
|
+
}>;
|
|
103
|
+
export type BookingMiceDetail = typeof bookingMiceDetails.$inferSelect;
|
|
104
|
+
export type NewBookingMiceDetail = typeof bookingMiceDetails.$inferInsert;
|
|
105
|
+
declare const bookingMiceDetailSchema: z.ZodObject<{
|
|
106
|
+
programId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
107
|
+
delegateId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
108
|
+
}, z.core.$strip>;
|
|
109
|
+
export declare const miceBookingExtensionService: {
|
|
110
|
+
getDetails(db: PostgresJsDatabase, bookingId: string): Promise<{
|
|
111
|
+
bookingId: string;
|
|
112
|
+
programId: string | null;
|
|
113
|
+
delegateId: string | null;
|
|
114
|
+
createdAt: Date;
|
|
115
|
+
updatedAt: Date;
|
|
116
|
+
} | null>;
|
|
117
|
+
upsertDetails(db: PostgresJsDatabase, bookingId: string, data: z.infer<typeof bookingMiceDetailSchema>): Promise<{
|
|
118
|
+
createdAt: Date;
|
|
119
|
+
updatedAt: Date;
|
|
120
|
+
bookingId: string;
|
|
121
|
+
programId: string | null;
|
|
122
|
+
delegateId: string | null;
|
|
123
|
+
} | null>;
|
|
124
|
+
removeDetails(db: PostgresJsDatabase, bookingId: string): Promise<{
|
|
125
|
+
bookingId: string;
|
|
126
|
+
} | null>;
|
|
127
|
+
};
|
|
128
|
+
export declare const miceBookingExtension: HonoExtension;
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=booking-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-extension.d.ts","sourceRoot":"","sources":["../src/booking-extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA;AACtE,MAAM,MAAM,oBAAoB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA;AAEzE,QAAA,MAAM,uBAAuB;;;iBAG3B,CAAA;AAEF,eAAO,MAAM,2BAA2B;mBACjB,kBAAkB,aAAa,MAAM;;;;;;;sBAUpD,kBAAkB,aACX,MAAM,QACX,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC;;;;;;;sBAqBvB,kBAAkB,aAAa,MAAM;;;CAO9D,CAAA;AAqCD,eAAO,MAAM,oBAAoB,EAAE,aAGlC,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { parseJsonBody } from "@voyant-travel/hono";
|
|
2
|
+
import { eq } from "drizzle-orm";
|
|
3
|
+
import { index, pgTable, text, timestamp } from "drizzle-orm/pg-core";
|
|
4
|
+
import { Hono } from "hono";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
/**
|
|
7
|
+
* MICE booking extension — a 1:1 sidecar that links a booking to its program +
|
|
8
|
+
* delegate, following the established HonoExtension pattern (precedent:
|
|
9
|
+
* inventory's booking-extension). `booking_id` is a loose text PK (no
|
|
10
|
+
* cross-package FK), so this package doesn't depend on bookings. See RFC
|
|
11
|
+
* voyant#1489 (Phase 3) §4.2.
|
|
12
|
+
*/
|
|
13
|
+
export const bookingMiceDetails = pgTable("booking_mice_details", {
|
|
14
|
+
bookingId: text("booking_id").primaryKey(),
|
|
15
|
+
programId: text("program_id"),
|
|
16
|
+
delegateId: text("delegate_id"),
|
|
17
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
18
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
19
|
+
}, (t) => [index("idx_bkmd_program").on(t.programId), index("idx_bkmd_delegate").on(t.delegateId)]);
|
|
20
|
+
const bookingMiceDetailSchema = z.object({
|
|
21
|
+
programId: z.string().optional().nullable(),
|
|
22
|
+
delegateId: z.string().optional().nullable(),
|
|
23
|
+
});
|
|
24
|
+
export const miceBookingExtensionService = {
|
|
25
|
+
async getDetails(db, bookingId) {
|
|
26
|
+
const [row] = await db
|
|
27
|
+
.select()
|
|
28
|
+
.from(bookingMiceDetails)
|
|
29
|
+
.where(eq(bookingMiceDetails.bookingId, bookingId))
|
|
30
|
+
.limit(1);
|
|
31
|
+
return row ?? null;
|
|
32
|
+
},
|
|
33
|
+
async upsertDetails(db, bookingId, data) {
|
|
34
|
+
const [row] = await db
|
|
35
|
+
.insert(bookingMiceDetails)
|
|
36
|
+
.values({
|
|
37
|
+
bookingId,
|
|
38
|
+
programId: data.programId ?? null,
|
|
39
|
+
delegateId: data.delegateId ?? null,
|
|
40
|
+
})
|
|
41
|
+
.onConflictDoUpdate({
|
|
42
|
+
target: bookingMiceDetails.bookingId,
|
|
43
|
+
set: {
|
|
44
|
+
programId: data.programId ?? null,
|
|
45
|
+
delegateId: data.delegateId ?? null,
|
|
46
|
+
updatedAt: new Date(),
|
|
47
|
+
},
|
|
48
|
+
})
|
|
49
|
+
.returning();
|
|
50
|
+
return row ?? null;
|
|
51
|
+
},
|
|
52
|
+
async removeDetails(db, bookingId) {
|
|
53
|
+
const [row] = await db
|
|
54
|
+
.delete(bookingMiceDetails)
|
|
55
|
+
.where(eq(bookingMiceDetails.bookingId, bookingId))
|
|
56
|
+
.returning({ bookingId: bookingMiceDetails.bookingId });
|
|
57
|
+
return row ?? null;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const miceBookingExtensionRoutes = new Hono()
|
|
61
|
+
.get("/:bookingId/mice-details", async (c) => {
|
|
62
|
+
const row = await miceBookingExtensionService.getDetails(c.get("db"), c.req.param("bookingId"));
|
|
63
|
+
return c.json({ data: row });
|
|
64
|
+
})
|
|
65
|
+
.put("/:bookingId/mice-details", async (c) => {
|
|
66
|
+
const data = await parseJsonBody(c, bookingMiceDetailSchema);
|
|
67
|
+
const row = await miceBookingExtensionService.upsertDetails(c.get("db"), c.req.param("bookingId"), data);
|
|
68
|
+
return c.json({ data: row });
|
|
69
|
+
})
|
|
70
|
+
.delete("/:bookingId/mice-details", async (c) => {
|
|
71
|
+
const row = await miceBookingExtensionService.removeDetails(c.get("db"), c.req.param("bookingId"));
|
|
72
|
+
if (!row)
|
|
73
|
+
return c.json({ error: "Not found" }, 404);
|
|
74
|
+
return c.json({ success: true });
|
|
75
|
+
});
|
|
76
|
+
const miceBookingExtensionDef = {
|
|
77
|
+
name: "mice-booking",
|
|
78
|
+
module: "bookings",
|
|
79
|
+
};
|
|
80
|
+
export const miceBookingExtension = {
|
|
81
|
+
extension: miceBookingExtensionDef,
|
|
82
|
+
routes: miceBookingExtensionRoutes,
|
|
83
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -7,9 +7,13 @@ import type { HonoModule } from "@voyant-travel/hono/module";
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const programLinkable: LinkableDefinition;
|
|
9
9
|
export declare const sessionLinkable: LinkableDefinition;
|
|
10
|
+
export declare const delegateLinkable: LinkableDefinition;
|
|
11
|
+
export declare const roomingAssignmentLinkable: LinkableDefinition;
|
|
10
12
|
export declare const miceLinkable: {
|
|
11
13
|
program: LinkableDefinition;
|
|
12
14
|
session: LinkableDefinition;
|
|
15
|
+
delegate: LinkableDefinition;
|
|
16
|
+
roomingAssignment: LinkableDefinition;
|
|
13
17
|
};
|
|
14
18
|
export declare const miceModule: Module;
|
|
15
19
|
export declare const miceHonoModule: HonoModule;
|
|
@@ -18,7 +22,11 @@ export type { MiceAdminRoutes } from "./routes.js";
|
|
|
18
22
|
export { miceAdminRoutes } from "./routes.js";
|
|
19
23
|
export * from "./schema.js";
|
|
20
24
|
export * from "./service.js";
|
|
25
|
+
export * from "./service-delegates.js";
|
|
26
|
+
export * from "./service-rooming.js";
|
|
21
27
|
export * from "./service-sessions.js";
|
|
22
28
|
export * from "./validation.js";
|
|
29
|
+
export * from "./validation-delegates.js";
|
|
30
|
+
export * from "./validation-rooming.js";
|
|
23
31
|
export * from "./validation-sessions.js";
|
|
24
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAI5D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAI5D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,kBAK9B,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,kBAKvC,CAAA;AAED,eAAO,MAAM,YAAY;;;;;CAKxB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,MAMxB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,UAG5B,CAAA;AAED,eAAO,MAAM,eAAe,uBAA4B,CAAA;AAExD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -16,12 +16,29 @@ export const sessionLinkable = {
|
|
|
16
16
|
table: "mice_program_sessions",
|
|
17
17
|
idPrefix: "mpss",
|
|
18
18
|
};
|
|
19
|
+
export const delegateLinkable = {
|
|
20
|
+
module: "mice",
|
|
21
|
+
entity: "delegate",
|
|
22
|
+
table: "mice_program_delegates",
|
|
23
|
+
idPrefix: "mpdl",
|
|
24
|
+
};
|
|
25
|
+
export const roomingAssignmentLinkable = {
|
|
26
|
+
module: "mice",
|
|
27
|
+
entity: "roomingAssignment",
|
|
28
|
+
table: "mice_rooming_assignments",
|
|
29
|
+
idPrefix: "mrma",
|
|
30
|
+
};
|
|
19
31
|
export const miceLinkable = {
|
|
20
32
|
program: programLinkable,
|
|
21
33
|
session: sessionLinkable,
|
|
34
|
+
delegate: delegateLinkable,
|
|
35
|
+
roomingAssignment: roomingAssignmentLinkable,
|
|
22
36
|
};
|
|
23
37
|
export const miceModule = {
|
|
24
38
|
name: "mice",
|
|
39
|
+
// Enrollment, rooming-delegate replace, and session-inclusion set run inside
|
|
40
|
+
// db.transaction(...) — route /v1/admin/mice/* to the transactional DB.
|
|
41
|
+
requiresTransactionalDb: true,
|
|
25
42
|
linkable: miceLinkable,
|
|
26
43
|
};
|
|
27
44
|
export const miceHonoModule = {
|
|
@@ -32,6 +49,10 @@ export const miceHonoModules = [miceHonoModule];
|
|
|
32
49
|
export { miceAdminRoutes } from "./routes.js";
|
|
33
50
|
export * from "./schema.js";
|
|
34
51
|
export * from "./service.js";
|
|
52
|
+
export * from "./service-delegates.js";
|
|
53
|
+
export * from "./service-rooming.js";
|
|
35
54
|
export * from "./service-sessions.js";
|
|
36
55
|
export * from "./validation.js";
|
|
56
|
+
export * from "./validation-delegates.js";
|
|
57
|
+
export * from "./validation-rooming.js";
|
|
37
58
|
export * from "./validation-sessions.js";
|