Skip to content

feat: prepare server 1.6.0 - #79

Merged
Priveetee merged 69 commits into
mainfrom
release/1.6.0
Aug 22, 2026
Merged

feat: prepare server 1.6.0#79
Priveetee merged 69 commits into
mainfrom
release/1.6.0

Conversation

@Priveetee

Copy link
Copy Markdown
Collaborator

Summary

  • add the complete Server API and persistence contract for subscription groups
  • preserve group memberships in TypeType backups and stable grouped feed pagination
  • classify scheduled, active and finished live streams consistently in subscription feeds
  • support authenticated YouTube SABR sessions and account-bound token pairs
  • add members-only visibility and notification popup preferences
  • proxy marked internal download artifacts through Server
  • prepare Server version 1.6.0

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-daemon
  • git diff --check

Rollback

Restore Server revision 8eae4607.

noreply and others added 28 commits August 17, 2026 15:34
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
@Priveetee
Priveetee merged commit 4717181 into main Aug 22, 2026
3 checks passed
@Priveetee
Priveetee deleted the release/1.6.0 branch August 22, 2026 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants