feat: prepare server 1.6.0 - #79
Merged
Merged
Conversation
Project group and ungrouped feeds from the shared global snapshot while retaining each cursor's account-scoped membership selection in cache for the full pagination session.
Export named groups with their channel memberships and restore them transactionally with subscriptions. Validate names and membership references before replacing account-owned group data.
Describe group management and filtered list/feed operations, and make subscription creation use a request schema without the server-generated subscribedAt field.
Verify account isolation, normalized unique names, many-to-many membership, ungrouped selection, and cleanup after subscription replacement or deletion.
Exercise authenticated group CRUD, membership updates, filter validation, and cross-account access through the HTTP routing surface.
Verify shared-snapshot projection, source-channel attribution, filter-bound cursors, and unchanged membership snapshots across paginated group reads.
Filtered pagination needs a stable membership view without creating an unbounded cache entry for every initial request. Allocate a fixed set of account-scoped slots atomically, reuse content-derived tokens, and reject a new distinct session at capacity without evicting any issued cursor. Strengthen observable compatibility coverage for legacy backups and server timestamps. Constraint: Every issued cursor must retain its membership snapshot for the full cache TTL Rejected: Evict the oldest snapshot after eight sessions | invalidates a still-live cursor Rejected: Store all snapshots in one read-modify-write value | loses concurrent writes across server instances Rejected: Put channel URLs directly in the cursor | produces oversized client-controlled cursor payloads Confidence: high Scope-risk: moderate Reversibility: clean Directive: Never overwrite an occupied selection slot; reject new sessions before weakening issued cursors Tested: Focused feed, concurrent selection-store, subscription route, backup, and OpenAPI tests on JDK 25 Not-tested: Live Dragonfly slot saturation before the final runtime gate
Subscription group assignment checked subscription ownership without coordinating with unsubscribe or replacement restores. Take an account-keyed transaction advisory lock across membership assignment and every subscription removal or replacement path so the check and insert cannot straddle a committed deletion. Constraint: Replacement imports must retain memberships whose subscriptions survive the import Rejected: Composite foreign key with cascading deletes | cascade semantics would discard memberships before retained subscriptions are reinserted Confidence: high Scope-risk: narrow Directive: Any new path that removes or replaces an account's subscriptions must acquire SubscriptionMutationLock in the same transaction Tested: Focused PostgreSQL concurrency regression on JDK 25 Not-tested: Full suite and live HTTP concurrency gate run after both fix commits
Subscription and group sections were read in separate transactions, so a membership committed between them could reference a subscription absent from the exported list. Capture subscriptions once and export only group memberships belonging to that captured set, preserving the restore validator's referential invariant. Constraint: Subscription groups remain coupled to the subscriptions backup category Rejected: Add a cross-service export transaction | existing service reads open their own transactions and captured-set filtering is the smaller accepted repair Confidence: high Scope-risk: narrow Directive: Exported group memberships must remain a subset of the subscriptions captured for the same backup Tested: Focused mixed-read export and restore regression on JDK 25 Not-tested: Full suite and live HTTP concurrency gate run after this commit
The previous decimal constant encoded an undocumented product tag. Use the
precomputed PostgreSQL hashtext value for the literal subscriptions namespace
and document its origin while retaining numeric lock lookup at runtime.
Constraint: Do not evaluate hashtext on every lock acquisition
Rejected: Runtime hashtext('subscriptions') | repeats derivation on every lock lookup
Confidence: high
Scope-risk: narrow
Directive: Keep the production and concurrency-test namespace constants identical
Tested: Focused PostgreSQL subscription mutation concurrency regression on JDK 25
Not-tested: Full suite because the change only replaces one fixed namespace key consistently
feat: add subscription groups server contract
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.
Summary
Production behavior
Subscription groups are available through the Server API only in this release. The web management interface remains tracked in TypeType issue #172.
Connected YouTube accounts are now preserved through SABR preparation and recovery. Subscription feeds keep scheduled live ordering, hide the configured live categories and remove stale finished entries.
Deployment requirements
Server creates the new subscription-group tables through its normal schema initialization. No manual database migration or configuration change is required.
Tests
./gradlew test --no-daemon./gradlew check --no-daemon./gradlew shadowJar --no-daemongit diff --checkRollback
Restore Server revision
8eae4607.