Repository navigation
[0.9.0] Season seats: setAsideSeasonBlock, retrieveSeasonBlock, releaseSeasonBlock, inventoryMode - #14
Merged
Conversation
…nt sales, and event series
… settings, all 56 webhook names, events seriesKey
…he p2a-api review
…tle (2.16c) createEventSeries takes fromEventKey: an event already set up becomes the first date under its own key and every other date is a copy of it; name and chartKey are then left out. Every date of a series carries the series' plain name. Matches seatmap slice 2.16c.
Adds releaseSeasonLapsedOffers (POST /v1/seasons/{key}/renewal-offers/release-lapsed, no body, header replay, 202 with the job). retrieveSeasonHostedRenewals pages with cursor and limit (1-500) and answers nextCursor, and listSeasonRenewalOffers pages the same way (1-100). createSeasonRenewalOffers answers 201 {offers} for 100 contracts or fewer and 202 {job, batchId} above that. The bring-across (createSeasonHolderImportFromSeason) answers 202 with a holder_import job above 100 holders. Renewal emails take up to 20,000 offer ids; above that, 422 too_many_offer_ids.
…e_abandoned (p2b) The public API changes in p2b (b88ed794e..ee7df2921): SeasonBulkJobKind adds date_cancel_void and seasonDateCancelVoidJobId names that job; seasonHolderImportRowsPerCall sizes an import call by its dates (a call over it answers 422 invalid_rows with maxRows); SeasonSingleTicketDates.jobRefused; createEventSeries documents 409 create_abandoned.
…b audit) updateEventSeries sends only the prices that change: each date keeps its own price for every category or tier left out. A season's null transfer or return cut-off means the club default from Settings > Ticket site, or until the date starts when the club has none. Holder transfers and returns through the secret key are not stopped by the club's customer switches; cut-offs still apply.
…part C) A date its season cancelled never opens again: moving its sales to testable or live, or reopening it, answers 409 season_date_cancelled, and an event series "sales on" leaves it closed as a failed item of the job (season_date_cancelled; not in failedDates). A cancelled date can't be moved, postponed, replaced or marked as taken place: 409 performance_cancelled.
pietechsolution
force-pushed
the
navin/season-block-0.10.0
branch
3 times, most recently
from
November 10, 2026 02:29
b9e42ec to
d18db11
Compare
…seSeasonBlock; season.block.ready/released webhook names; the 202 date-leave answer guard. No version bump: publish only once the phase 4 API is on production
pietechsolution
force-pushed
the
navin/season-block-0.10.0
branch
from
November 10, 2026 05:48
d18db11 to
baf1ee4
Compare
Merged
pietechsolution
marked this pull request as ready for review
November 11, 2026 10:14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Season seats for
@seatlayer/server, part of the 0.9.0 release. One release, 0.9.0, carries season 2a (#13) and this PR (decided 10 Nov).latestis 0.8.0, checked 10 Nov).season-2a-serverso it builds on the season-2a methods. Its name still says 0.10.0, from before the decision: renaming a head branch would close the PR.package.jsonstays at 0.8.0.What it adds
Built to
docs/season-block-2026-11-08/contract.mdin the app repo, §2, §5, §6 and §8 "Amendments, 9 Nov".Methods, named by operationId (the repo's rule):
seasons.setAsideSeasonBlock(seasonKey, { expectedRevision, keepForSingleTickets? }, { idempotencyKey? })→{ job, block };seasons.retrieveSeasonBlock(seasonKey)→{ block };seasons.releaseSeasonBlock(seasonKey, { expectedRevision, scope, eventKeys?, at?, reason? }, { idempotencyKey? })→{ job, block }.Both writes use header replay, so an Idempotency-Key is generated when none is given, as on
refundSeasonPerformance.inventoryMode(block|per_hold) oncreateSeasonandupdateSeason, sent only when given.blockopts the season into season seats; the default staysper_hold. Every Season answer carries it. Type:SeasonInventoryMode.Types:
SeasonBlock,SeasonBlockCounts,SeasonBlockJobAnswer,SetAsideSeasonBlockParams,ReleaseSeasonBlockParams,SeasonBlockReleaseScope,SeasonSeatSelection;SeasonBulkJobKind+season_block_set_aside,season_block_release;WebhookEventName+season.block.ready,season.block.released.The 202 while a date leaves every season seat (
createSeasonAmendmentcancel,markSeasonPerformancePast):SeasonDateLeavePendingand the guardisSeasonDateLeavePending(result).Errors: no new classes or constants. The new codes come through
SeatLayerErrorwithcode(§8 item 4). The CHANGELOG lists them, now including every code the 3 calls andinventoryModecan send (SEASON_BLOCK_API_BUSINESS_ERRORSin the app repo).Docs: a "Season seats" section at the end of the README's "Fixed Renewable Seasons": opt in with
inventoryMode, set the seats aside, follow the job, read the block, release to single sale (now or at a set time), the two webhook names, the 202 guard, refusals throughSeatLayerErrorwithcode, and partner seats staying out of the block.CHANGELOG: the "Next: 0.9.0" section. The version PR joins it with the season-2a section under
## 0.9.0.Files changed
CHANGELOG.md,README.md,src/index.ts,src/resources/seasons.ts,src/types.ts,test/sales-operations.test.ts,test/seasons.test.ts(7 files, +440 −5).Checks
pnpm validate(typecheck, vitest, build, publint, attw), re-run 10 Nov on this commit: green, 123/123 tests in 4 files. Sinceseason-2a-server, the season tests added:inventoryModeon create and update;sales-operations.test.tslists the two new webhook names (56 → 58), and the season operation count goes 87 → 90.Mutation check (run before this amend; the code is unchanged since): 6/6 killed (paths, the caller key, the body, the guard).
The README sample isn't compiled by the repo. It was typechecked once (
tsc --strict) against this commit'sdist/types.Compat matrix (
season-phase4-node-compat.mjs, in the app session's notes). The same fixtures, shaped as the phase 4 API answers, go through the stub transport; nothing is sent.npm pack @seatlayer/server@0.8.0, re-run 10 Nov)409 date_leave_in_progressand the202 block_date_leave_pendingoncreateSeasonAmendment(through the generic error and as the result), a Season answer carryinginventoryMode, and409 season_block_packagesonupdateSeason. The other 8 are n/a: 0.8.0 has neither the season-2a calls nor theseseason-2a-serverhead409 season_block_set_aside,season_inventory_lockedanddate_leave_in_progress, the 202 returned as the result,inventoryModeand409 season_block_packagesdist/), including the 3 new calls and409 season_block_not_enabledRelease steps for the owner
The season-2a PR (Season 2a server operations (part A) #13) merges to
main, with no tag.Rebase this PR onto
mainand retarget it tomain;pnpm validategreen; merge.Compat matrix again, once the phase 4 API is on dev:
main's build: both all PASS;completed, read, release withat, read the release job.Version PR:
npm version 0.9.0 --no-git-tag-version, and join the CHANGELOG's season-2a section ("Unreleased") and "Next: 0.9.0" under## 0.9.0. Merge tomain.Publish: only after the phase 4 API (paiteq/seatmap #2059 → #2086 → #2061 → #2062 → #2063 → #2066 → #2092) is live on production and the owner says yes:
git tag v0.9.0 && git push origin v0.9.0.release.ymlpublishes to npm with provenance; the tag must equal the package version.Live re-check:
npm view @seatlayer/server@0.9.0 versionandnpm view @seatlayer/server dist-tags, then install 0.9.0 in a scratch project and run the dev smoke again.Rollback (0.9.0 only adds; nothing in 0.8.0 changes):
npm dist-tag add @seatlayer/server@0.8.0 latest;npm deprecate @seatlayer/server@0.9.0 "Use 0.8.0; 0.9.0 withdrawn".0.8.0 stays installable throughout. A rollback also withdraws season-2a: both ship in 0.9.0.
Failure modes
inventoryModewould be ignored. Step 5 waits for production.isSeasonDateLeavePending: it would read the 202 body as an amendment or performance list. The result types stay as they were, so the README and the doc comments point at the guard.inventoryMode(compat matrix). It can't call the 3 new routes.Open risks
/server-api/seasons/#season-seats), which goes live with paiteq/seatmap #2063. Until then the link lands on the top of the Seasons page.0.7.0and doesn't name the new calls; it was left as it was.