SeasonHub
WebSocket hub for season operations. Read operations are available to all authenticated users; management operations require Admin role.
Endpoint: /seasonHub
Authorization: All methods require authentication. Admin methods require Admin role.
Methods
Subscriptions
JoinSeasonGroup
Join a season group to receive updates for that season.
public async Task JoinSeasonGroup(string seasonId)
LeaveSeasonGroup
Leave a season group.
public async Task LeaveSeasonGroup(string seasonId)
JoinAllSeasonsGroup
Join the global seasons group to receive all season events.
public async Task JoinAllSeasonsGroup()
LeaveAllSeasonsGroup
Leave the global seasons group.
public async Task LeaveAllSeasonsGroup()
Read Operations
GetAllSeasons
Get all seasons (permanent and temporary).
public async Task<IReadOnlyList<Season>> GetAllSeasons()
Returns: Season[]
{
seasonId: string;
name: string;
description?: string;
status: SeasonStatus;
isPermanent: boolean;
targetSeasonId?: string; // Where characters migrate to
startedAt?: string;
endsAt?: string;
}
GetCurrentSeason
Get the currently active temporary season.
public async Task<Season?> GetCurrentSeason()
GetSeason
Get a specific season by ID.
public async Task<Season?> GetSeason(string seasonId)
Admin Operations
CreateSeason
Create a new season. Broadcasts to all season subscribers.
[Authorize(Roles = "Admin")]
public async Task<Season> CreateSeason(
string seasonId,
string name,
string? description,
bool isPermanent,
string? targetSeasonId,
DateTimeOffset? endsAt)
Parameters:
| Name | Type | Description |
|---|---|---|
seasonId | string | Unique season identifier |
name | string | Display name |
description | string? | Optional description |
isPermanent | boolean | Permanent league (no end date) |
targetSeasonId | string? | Migration target when season ends |
endsAt | DateTimeOffset? | End date (for temp seasons) |
EndSeason
End a season and trigger migration.
[Authorize(Roles = "Admin")]
public async Task EndSeason(string seasonId)
UpdateSeasonStatus
Update a season's status.
[Authorize(Roles = "Admin")]
public async Task UpdateSeasonStatus(string seasonId, SeasonStatus status)
Migration Operations
GetMigrationStatus
Get migration status for a season.
public async Task<MigrationStatus> GetMigrationStatus(string seasonId)
StartMigration
Start migration for a season.
[Authorize(Roles = "Admin")]
public async Task StartMigration(string seasonId)
MigrateCharacter
Migrate a specific character.
public async Task MigrateCharacter(Guid characterId, string fromSeasonId)
CancelMigration
Cancel an in-progress migration.
[Authorize(Roles = "Admin")]
public async Task CancelMigration(string seasonId)
SeasonStatus Enum
enum SeasonStatus {
Upcoming = 0, // Not yet started
Active = 1, // Characters can be created
Ending = 2, // Ending soon, no new characters
Ended = 3, // Finished, migration in progress
Migrated = 4 // All characters migrated
}
Season Lifecycle
Event Notifications
Subscribe to season events:
connection.on("SeasonEvent", (event) => {
console.log(`Season ${event.seasonId}: ${event.eventType}`);
});
await connection.invoke("JoinAllSeasonsGroup");
Event Types:
| Event | Description |
|---|---|
SeasonCreated | New season created |
SeasonStatusChanged | Season status updated |
SeasonEnded | Season ended, migration starting |
MigrationStarted | Character migration began |
MigrationCompleted | All characters migrated |