resolve todos in website and api
This commit is contained in:
@@ -60,6 +60,7 @@ import { TransferLeagueOwnershipUseCase } from '@core/racing/application/use-cas
|
||||
import { UpdateLeagueMemberRoleUseCase } from '@core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase';
|
||||
import { GetLeagueWalletUseCase } from '@core/racing/application/use-cases/GetLeagueWalletUseCase';
|
||||
import { WithdrawFromLeagueWalletUseCase } from '@core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase';
|
||||
import { GetSeasonSponsorshipsUseCase } from '@core/racing/application/use-cases/GetSeasonSponsorshipsUseCase';
|
||||
|
||||
// API Presenters
|
||||
import { AllLeaguesWithCapacityPresenter } from './presenters/AllLeaguesWithCapacityPresenter';
|
||||
@@ -70,7 +71,7 @@ import { mapApproveLeagueJoinRequestPortToDTO } from './presenters/ApproveLeague
|
||||
import { GetLeagueAdminPermissionsPresenter } from './presenters/GetLeagueAdminPermissionsPresenter';
|
||||
import { mapGetLeagueOwnerSummaryOutputPortToDTO } from './presenters/GetLeagueOwnerSummaryPresenter';
|
||||
import { LeagueJoinRequestsPresenter } from './presenters/LeagueJoinRequestsPresenter';
|
||||
import { mapGetLeagueScheduleOutputPortToDTO } from './presenters/LeagueSchedulePresenter';
|
||||
import { mapGetLeagueScheduleOutputPortToDTO, mapGetLeagueScheduleOutputPortToRaceDTOs } from './presenters/LeagueSchedulePresenter';
|
||||
import { LeagueStatsPresenter } from './presenters/LeagueStatsPresenter';
|
||||
import { mapRejectLeagueJoinRequestOutputPortToDTO } from './presenters/RejectLeagueJoinRequestPresenter';
|
||||
import { mapRemoveLeagueMemberOutputPortToDTO } from './presenters/RemoveLeagueMemberPresenter';
|
||||
@@ -112,6 +113,7 @@ export class LeagueService {
|
||||
private readonly getLeagueAdminPermissionsUseCase: GetLeagueAdminPermissionsUseCase,
|
||||
private readonly getLeagueWalletUseCase: GetLeagueWalletUseCase,
|
||||
private readonly withdrawFromLeagueWalletUseCase: WithdrawFromLeagueWalletUseCase,
|
||||
private readonly getSeasonSponsorshipsUseCase: GetSeasonSponsorshipsUseCase,
|
||||
@Inject(LOGGER_TOKEN) private readonly logger: Logger,
|
||||
) {}
|
||||
|
||||
@@ -263,11 +265,21 @@ export class LeagueService {
|
||||
|
||||
async getLeagueSchedule(leagueId: string): Promise<LeagueScheduleDTO> {
|
||||
this.logger.debug('Getting league schedule', { leagueId });
|
||||
const result = await this.getLeagueScheduleUseCase.execute({ leagueId });
|
||||
if (result.isErr()) {
|
||||
throw new Error(result.unwrapErr().code);
|
||||
|
||||
const [scheduleResult, leagueConfigResult] = await Promise.all([
|
||||
this.getLeagueScheduleUseCase.execute({ leagueId }),
|
||||
this.getLeagueFullConfigUseCase.execute({ leagueId }),
|
||||
]);
|
||||
|
||||
if (scheduleResult.isErr()) {
|
||||
throw new Error(scheduleResult.unwrapErr().code);
|
||||
}
|
||||
return mapGetLeagueScheduleOutputPortToDTO(result.unwrap());
|
||||
|
||||
const leagueName = leagueConfigResult.isOk()
|
||||
? leagueConfigResult.unwrap().league.name.toString()
|
||||
: undefined;
|
||||
|
||||
return mapGetLeagueScheduleOutputPortToDTO(scheduleResult.unwrap(), leagueName);
|
||||
}
|
||||
|
||||
async getLeagueStats(leagueId: string): Promise<LeagueStatsDTO> {
|
||||
@@ -281,64 +293,49 @@ export class LeagueService {
|
||||
return presenter.getViewModel()!;
|
||||
}
|
||||
|
||||
async getLeagueAdmin(leagueId: string): Promise<LeagueAdminDTO> {
|
||||
this.logger.debug('Getting league admin data', { leagueId });
|
||||
// For now, we'll keep the orchestration in the service since it combines multiple use cases
|
||||
// TODO: Create a composite use case that handles all the admin data fetching
|
||||
const joinRequests = await this.getLeagueJoinRequests(leagueId);
|
||||
const config = await this.getLeagueFullConfig({ leagueId });
|
||||
const protests = await this.getLeagueProtests({ leagueId });
|
||||
const seasons = await this.getLeagueSeasons({ leagueId });
|
||||
private async getLeagueAdminComposite(leagueId: string): Promise<LeagueAdminDTO> {
|
||||
this.logger.debug('Fetching composite league admin data', { leagueId });
|
||||
|
||||
// Get owner summary - we need the ownerId, so we use a simple approach for now
|
||||
// In a full implementation, we'd have a use case that gets league basic info
|
||||
const ownerSummary = config ? await this.getLeagueOwnerSummary({ ownerId: 'placeholder', leagueId }) : null;
|
||||
const [fullConfigResult, joinRequests, protests, seasons] = await Promise.all([
|
||||
this.getLeagueFullConfigUseCase.execute({ leagueId }),
|
||||
this.getLeagueJoinRequests(leagueId),
|
||||
this.getLeagueProtests({ leagueId }),
|
||||
this.getLeagueSeasons({ leagueId }),
|
||||
]);
|
||||
|
||||
// Convert config from view model to DTO format manually with proper types
|
||||
const configForm = config ? {
|
||||
leagueId: config.leagueId,
|
||||
basics: {
|
||||
name: config.basics.name,
|
||||
description: config.basics.description,
|
||||
visibility: config.basics.visibility as 'public' | 'private',
|
||||
},
|
||||
structure: {
|
||||
mode: config.structure.mode as 'solo' | 'team',
|
||||
},
|
||||
championships: [], // TODO: Map championships from view model
|
||||
scoring: {
|
||||
type: 'standard' as const, // TODO: Map from view model
|
||||
points: 25, // TODO: Map from view model
|
||||
},
|
||||
dropPolicy: {
|
||||
strategy: config.dropPolicy.strategy as 'none' | 'worst_n',
|
||||
n: config.dropPolicy.n ?? 0,
|
||||
},
|
||||
timings: {
|
||||
raceDayOfWeek: 'sunday' as const, // TODO: Map from view model
|
||||
raceTimeHour: 20, // TODO: Map from view model
|
||||
raceTimeMinute: 0, // TODO: Map from view model
|
||||
},
|
||||
stewarding: {
|
||||
decisionMode: config.stewarding.decisionMode === 'steward_vote' ? 'committee_vote' as const : 'single_steward' as const,
|
||||
requireDefense: config.stewarding.requireDefense,
|
||||
defenseTimeLimit: config.stewarding.defenseTimeLimit,
|
||||
voteTimeLimit: config.stewarding.voteTimeLimit,
|
||||
protestDeadlineHours: config.stewarding.protestDeadlineHours,
|
||||
stewardingClosesHours: config.stewarding.stewardingClosesHours,
|
||||
notifyAccusedOnProtest: config.stewarding.notifyAccusedOnProtest,
|
||||
notifyOnVoteRequired: config.stewarding.notifyOnVoteRequired,
|
||||
requiredVotes: config.stewarding.requiredVotes ?? 0,
|
||||
},
|
||||
} : null;
|
||||
if (fullConfigResult.isErr()) {
|
||||
throw new Error(fullConfigResult.unwrapErr().code);
|
||||
}
|
||||
|
||||
return {
|
||||
const fullConfig = fullConfigResult.unwrap();
|
||||
const league = fullConfig.league;
|
||||
|
||||
const ownerSummaryResult = await this.getLeagueOwnerSummaryUseCase.execute({ ownerId: league.ownerId.toString() });
|
||||
if (ownerSummaryResult.isErr()) {
|
||||
throw new Error(ownerSummaryResult.unwrapErr().code);
|
||||
}
|
||||
|
||||
const ownerSummary = mapGetLeagueOwnerSummaryOutputPortToDTO(ownerSummaryResult.unwrap());
|
||||
|
||||
const configPresenter = new LeagueConfigPresenter();
|
||||
configPresenter.present(fullConfig);
|
||||
const configForm = configPresenter.getViewModel();
|
||||
|
||||
const adminPresenter = new LeagueAdminPresenter();
|
||||
adminPresenter.present({
|
||||
joinRequests: joinRequests.joinRequests,
|
||||
ownerSummary: ownerSummary?.summary || null,
|
||||
config: { form: configForm },
|
||||
ownerSummary,
|
||||
config: configForm,
|
||||
protests,
|
||||
seasons,
|
||||
};
|
||||
});
|
||||
|
||||
return adminPresenter.getViewModel();
|
||||
}
|
||||
|
||||
async getLeagueAdmin(leagueId: string): Promise<LeagueAdminDTO> {
|
||||
this.logger.debug('Getting league admin data', { leagueId });
|
||||
return this.getLeagueAdminComposite(leagueId);
|
||||
}
|
||||
|
||||
async createLeague(input: CreateLeagueInputDTO): Promise<CreateLeagueViewModel> {
|
||||
@@ -426,20 +423,30 @@ export class LeagueService {
|
||||
async getSeasonSponsorships(seasonId: string): Promise<GetSeasonSponsorshipsOutputDTO> {
|
||||
this.logger.debug('Getting season sponsorships', { seasonId });
|
||||
|
||||
// TODO: Implement actual logic to fetch season sponsorships
|
||||
// For now, return empty array as placeholder
|
||||
const result = await this.getSeasonSponsorshipsUseCase.execute({ seasonId });
|
||||
if (result.isErr()) {
|
||||
throw new Error(result.unwrapErr().code);
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
|
||||
return {
|
||||
sponsorships: [],
|
||||
sponsorships: value?.sponsorships ?? [],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
async getRaces(leagueId: string): Promise<GetLeagueRacesOutputDTO> {
|
||||
this.logger.debug('Getting league races', { leagueId });
|
||||
|
||||
// TODO: Implement actual logic to fetch league races
|
||||
// For now, return empty array as placeholder
|
||||
const result = await this.getLeagueScheduleUseCase.execute({ leagueId });
|
||||
if (result.isErr()) {
|
||||
throw new Error(result.unwrapErr().code);
|
||||
}
|
||||
|
||||
const races = mapGetLeagueScheduleOutputPortToRaceDTOs(result.unwrap());
|
||||
|
||||
return {
|
||||
races: [],
|
||||
races,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user