95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
import { LeaguesApiClient } from "@/lib/api/leagues/LeaguesApiClient";
|
|
import { DriversApiClient } from "@/lib/api/drivers/DriversApiClient";
|
|
import type { LeagueConfigFormModel } from "@/lib/types/LeagueConfigFormModel";
|
|
import type { LeagueScoringPresetDTO } from "@/lib/types/LeagueScoringPresetDTO";
|
|
import type { DriverDTO } from "@/lib/types/DriverDTO";
|
|
import { LeagueSettingsViewModel } from "@/lib/view-models/LeagueSettingsViewModel";
|
|
import { DriverSummaryViewModel } from "@/lib/view-models/DriverSummaryViewModel";
|
|
|
|
/**
|
|
* League Settings Service
|
|
*
|
|
* Orchestrates league settings operations by coordinating API calls and view model creation.
|
|
* All dependencies are injected via constructor.
|
|
*/
|
|
export class LeagueSettingsService {
|
|
constructor(
|
|
private readonly leaguesApiClient: LeaguesApiClient,
|
|
private readonly driversApiClient: DriversApiClient
|
|
) {}
|
|
|
|
/**
|
|
* Get league settings with view model transformation
|
|
*/
|
|
async getLeagueSettings(leagueId: string): Promise<LeagueSettingsViewModel | null> {
|
|
try {
|
|
// Get league basic info
|
|
const allLeagues = await this.leaguesApiClient.getAllWithCapacity();
|
|
const leagueDto = allLeagues.leagues.find(l => l.id === leagueId);
|
|
if (!leagueDto) return null;
|
|
|
|
// Assume league has ownerId - need to update API
|
|
const league = {
|
|
id: leagueDto.id,
|
|
name: leagueDto.name,
|
|
ownerId: 'owner-id', // TODO: add to API
|
|
};
|
|
|
|
// Get config
|
|
const configDto = await this.leaguesApiClient.getLeagueConfig(leagueId);
|
|
const config: LeagueConfigFormModel = configDto.config;
|
|
|
|
// Get presets
|
|
const presetsDto = await this.leaguesApiClient.getScoringPresets();
|
|
const presets: LeagueScoringPresetDTO[] = presetsDto.presets;
|
|
|
|
// Get owner
|
|
const ownerDriver = await this.driversApiClient.getDriver(league.ownerId);
|
|
let owner: DriverSummaryViewModel | null = null;
|
|
if (ownerDriver) {
|
|
// TODO: get rating and rank from API
|
|
owner = new DriverSummaryViewModel({
|
|
driver: ownerDriver,
|
|
rating: ownerDriver.rating ?? null,
|
|
rank: null, // TODO: get from API
|
|
});
|
|
}
|
|
|
|
// Get members
|
|
const membershipsDto = await this.leaguesApiClient.getMemberships(leagueId);
|
|
const members: DriverDTO[] = [];
|
|
for (const member of membershipsDto.members) {
|
|
if (member.driverId !== league.ownerId && member.role !== 'owner') {
|
|
const driver = await this.driversApiClient.getDriver(member.driverId);
|
|
if (driver) {
|
|
members.push(driver);
|
|
}
|
|
}
|
|
}
|
|
|
|
return new LeagueSettingsViewModel({
|
|
league,
|
|
config,
|
|
presets,
|
|
owner,
|
|
members,
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to load league settings:', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Transfer league ownership
|
|
*/
|
|
async transferOwnership(leagueId: string, currentOwnerId: string, newOwnerId: string): Promise<boolean> {
|
|
try {
|
|
const result = await this.leaguesApiClient.transferOwnership(leagueId, currentOwnerId, newOwnerId);
|
|
return result.success;
|
|
} catch (error) {
|
|
console.error('Failed to transfer ownership:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
} |