Skip to main content

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's itemIds filter targets (Broadcast), and what a wishlist/registry entry actually is (Gift & Giftstore). EventSections.MiniShop and EventSections.GiftRegistry both 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/login takes 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: POST create item, PUT/PATCH update, DELETE, plus archive/restore (soft-delete pattern rather than hard delete), bulk creation, category changes, and AI-assisted description generation (generate-description).
  • Guest/public side: GET items (public by default — the route comment notes this is deliberately unauthenticated "for now"), with a separate /auth variant for the planner's own view that requires EventSections.GiftRegistry access.
  • 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) and GET /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 for archived as 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.

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.

  • src/modules/drinkStore/ — routes/controller/service
  • src/modules/minishop/minishop.routes.ts, minishop.controllers.ts, minishop.validation.ts
  • src/modules/point-of-sale/point-of-sale.routes.ts, point-of-sale.controller.ts, point-of-sale.service.ts
  • src/shared/enum/event.enum.ts — EventSections.MiniShop, EventSections.GiftRegistry