ActivitySessionSpotMap
Spot-map layout, occupancy, and viewer-relative state for one session.
soldSpotIds is the union of confirmed registrations. heldSpotIds is every spot currently held by somebody else's in-flight checkout (expired holds are filtered out on read, so a lapsed hold stops blocking immediately). viewerHeldSpotIds and viewerSpotIds are the viewer's own holds and confirmed spots; both are empty for unauthenticated requests.
Fields
mapSpotMap!sections[SpotSectionAvailability!]!Per-section availability — counts only, no spot data. This is what paints the section-first overview a 21,000-spot house opens on, in about seventy rows rather than twenty-one thousand.
unavailable[SpotRowRuns!]!The spots that cannot be picked — sold, held by another checkout, or withheld — run-length encoded per block row.
Because a rule-generated spot's id is <blockId>-<rowIndex>-<spotIndex>, a client holding the block rules can name any spot itself, so the server only has to say which positions are gone. A sold-out 24-spot row is two integers here, not 24 identifiers.
Pass section when the buyer opens one — the overview needs only sections above, and scoping keeps even a pathologically fragmented house bounded by one section's size.
Arguments (1)
sectionEntityRefviewerHeldSpotIds[ID!]!Spot ids the caller currently holds. Sent in full rather than encoded: a buyer holds a handful of spots, and the client needs them exactly.
viewerSpotIds[ID!]!Spot ids the caller has already bought on this session.
viewerHoldExpiresAtDateTimeWhen the viewer's own holds lapse, so the sheet can run a countdown and release the spots itself rather than letting them silently expire.
availableSpotCountInt!Spots on sale and not currently sold or held, across the whole map. Includes remaining general-assignment capacity.
spotsTogether[SpotsTogetherSuggestion!]!Contiguous runs of unsold, unheld spots in a single row, best first — nearest the stage, then most central. Never spans an aisle, a sold spot, or a house spot. Empty when the party will not fit.