Drink Store, Minishop & Point of Sale
What it is
Three commerce surfaces for buying things tied to an event: drinkStore (a beverage catalog), minishop ("Event Shop Items" — the actual mechanism behind ticket/product purchases and gift-registry items across the platform), and point-of-sale (an in-person checkout terminal at the event, keyed by event code rather than a staff login).
Core concepts
- Minishop's "shop items" are the shared backbone for several things covered elsewhere: they're what a guest buys via
rsvp-with-items(RSVP & Guests), what a broadcast'sitemIdsfilter targets (Broadcast), and what a wishlist/registry entry actually is (Gift & Giftstore).EventSections.MiniShopandEventSections.GiftRegistryboth gate parts of this module — the same underlying item type serves both "things guests buy" and "things guests can gift toward." - Point of Sale has no staff account model —
GET /point-of-sale/events/:eventCode/logintakes only the event code and returns a login payload; there's no username/password/PIN for the terminal operator. The event code itself is the credential. This is a deliberate simplicity tradeoff for physical check-in desks, not an oversight, but it means anyone with the event code can access the POS view for that event.
How it works
Drink Store
Straightforward catalog CRUD: POST /drinkstore/ (create a store), GET /drinkstore/:id, POST /drinkstore/:id/products (add a product, with image upload), GET /drinkstore/:id/products.
Minishop (event shop items)
- Planner side:
POSTcreate item,PUT/PATCHupdate,DELETE, plusarchive/restore(soft-delete pattern rather than hard delete), bulk creation, category changes, and AI-assisted description generation (generate-description). - Guest/public side:
GETitems (public by default — the route comment notes this is deliberately unauthenticated "for now"), with a separate/authvariant for the planner's own view that requiresEventSections.GiftRegistryaccess. - Orders:
POST /minishop/orders— a guest creates an order (public, no auth — this is the checkout action itself);GET /minishop/orders(planner view,EventSections.MiniShop) andGET /minishop/items/:itemId/orders(orders for one specific item) are how a planner sees what's sold.
Point of Sale
Built around eventCode (not eventId) as the URL key throughout, matching how a physical terminal would be configured once per event:
GET /point-of-sale/events/:eventCode/login— terminal "login" (event-code-as-credential, see above).POST /point-of-sale/events/:eventCode/rsvp-free/.../rsvp-with-items— the same free/paid RSVP creation flows as the guest-facing self-RSVP endpoints, but operated by staff at the door rather than the guest themselves.POST /point-of-sale/events/:eventCode/transactions+.../transactions/:reference/confirm— record and confirm a POS transaction (e.g. a cash or in-person card payment) separately from the online payment flow.GET /point-of-sale/events/:eventCode/summary,.../transactions— a running summary/list for the terminal operator.
Key business rules & edge cases
- Minishop items being public by default is called out in the code as provisional (
// Keep public for now?) — don't assume this is a permanent design decision if you're building against it; check whether it's since been locked down. - The archive/restore pattern on shop items means a "deleted" item may still exist and be restorable — a query that only filters
deleted_at IS NULL-style logic needs to account forarchivedas a distinct state from truly gone. - Because POS auth is just the event code, treat the event code itself as sensitive for events using POS — don't display/log it anywhere a non-staff person could pick it up and get terminal-level access.
Related endpoints
Not yet in the generated OpenAPI spec. POST /v1/drinkstore/, GET /v1/minishop/items, POST /v1/minishop/orders, GET /v1/point-of-sale/events/{eventCode}/login, POST /v1/point-of-sale/events/{eventCode}/transactions.
Related code
src/modules/drinkStore/— routes/controller/servicesrc/modules/minishop/minishop.routes.ts,minishop.controllers.ts,minishop.validation.tssrc/modules/point-of-sale/point-of-sale.routes.ts,point-of-sale.controller.ts,point-of-sale.service.tssrc/shared/enum/event.enum.ts—EventSections.MiniShop,EventSections.GiftRegistry