services refactor

This commit is contained in:
2025-12-17 22:17:02 +01:00
parent 26f7a2b6aa
commit 055a7f67b5
93 changed files with 7434 additions and 659 deletions

View File

@@ -1,12 +1,31 @@
import { api as api } from '../../api';
import { presentLeagueMember } from '../../presenters';
import { LeagueMemberViewModel } from '../../view-models';
import type { LeaguesApiClient } from '../../api/leagues/LeaguesApiClient';
import type { LeagueMemberViewModel } from '../../view-models';
import type { LeagueMembersPresenter } from '../../presenters/LeagueMembersPresenter';
export async function getLeagueMemberships(leagueId: string, currentUserId: string): Promise<LeagueMemberViewModel[]> {
const dto = await api.leagues.getMemberships(leagueId);
return dto.members.map(m => presentLeagueMember(m, currentUserId));
}
/**
* League Membership Service
*
* Orchestrates league membership operations by coordinating API calls and presentation logic.
* All dependencies are injected via constructor.
*/
export class LeagueMembershipService {
constructor(
private readonly apiClient: LeaguesApiClient,
private readonly leagueMembersPresenter: LeagueMembersPresenter
) {}
export async function removeLeagueMember(leagueId: string, performerDriverId: string, targetDriverId: string): Promise<void> {
await api.leagues.removeMember(leagueId, performerDriverId, targetDriverId);
/**
* Get league memberships with presentation transformation
*/
async getLeagueMemberships(leagueId: string, currentUserId: string): Promise<LeagueMemberViewModel[]> {
const dto = await this.apiClient.getMemberships(leagueId);
return this.leagueMembersPresenter.present(dto, currentUserId);
}
/**
* Remove a member from league
*/
async removeMember(leagueId: string, performerDriverId: string, targetDriverId: string): Promise<{ success: boolean }> {
return await this.apiClient.removeMember(leagueId, performerDriverId, targetDriverId);
}
}