harden media
This commit is contained in:
@@ -4,52 +4,92 @@ import type {
|
||||
AllLeaguesWithCapacityAndScoringDTO,
|
||||
LeagueWithCapacityAndScoringDTO,
|
||||
} from '../dtos/AllLeaguesWithCapacityAndScoringDTO';
|
||||
import type { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
|
||||
import { MediaReference } from '@core/domain/media/MediaReference';
|
||||
|
||||
export class AllLeaguesWithCapacityAndScoringPresenter
|
||||
implements UseCaseOutputPort<GetAllLeaguesWithCapacityAndScoringResult>
|
||||
{
|
||||
private result: AllLeaguesWithCapacityAndScoringDTO | null = null;
|
||||
private mediaResolver?: MediaResolverPort;
|
||||
|
||||
present(result: GetAllLeaguesWithCapacityAndScoringResult): void {
|
||||
const leagues: LeagueWithCapacityAndScoringDTO[] = result.leagues.map((summary) => {
|
||||
const timingSummary = summary.preset
|
||||
? formatTimingSummary(summary.preset.defaultTimings.mainRaceMinutes)
|
||||
: undefined;
|
||||
setMediaResolver(resolver: MediaResolverPort): void {
|
||||
this.mediaResolver = resolver;
|
||||
}
|
||||
|
||||
return {
|
||||
id: summary.league.id.toString(),
|
||||
name: summary.league.name.toString(),
|
||||
description: summary.league.description?.toString() || '',
|
||||
ownerId: summary.league.ownerId.toString(),
|
||||
createdAt: summary.league.createdAt.toDate().toISOString(),
|
||||
settings: {
|
||||
maxDrivers: summary.maxDrivers,
|
||||
...(summary.league.settings.sessionDuration !== undefined
|
||||
? { sessionDuration: summary.league.settings.sessionDuration }
|
||||
: {}),
|
||||
...(summary.league.settings.qualifyingFormat !== undefined
|
||||
? { qualifyingFormat: summary.league.settings.qualifyingFormat.toString() }
|
||||
: {}),
|
||||
},
|
||||
usedSlots: summary.currentDrivers,
|
||||
...(summary.league.category ? { category: summary.league.category } : {}),
|
||||
...mapSocialLinks(summary.league.socialLinks),
|
||||
...(summary.scoringConfig && summary.game && summary.preset
|
||||
? {
|
||||
scoring: {
|
||||
gameId: summary.game.id.toString(),
|
||||
gameName: summary.game.name.toString(),
|
||||
primaryChampionshipType: summary.preset.primaryChampionshipType,
|
||||
scoringPresetId: summary.scoringConfig.scoringPresetId?.toString() ?? 'custom',
|
||||
scoringPresetName: summary.preset.name,
|
||||
dropPolicySummary: summary.preset.dropPolicySummary,
|
||||
scoringPatternSummary: summary.preset.sessionSummary,
|
||||
},
|
||||
async present(result: GetAllLeaguesWithCapacityAndScoringResult): Promise<void> {
|
||||
const leagues: LeagueWithCapacityAndScoringDTO[] = await Promise.all(
|
||||
result.leagues.map(async (summary) => {
|
||||
const timingSummary = summary.preset
|
||||
? formatTimingSummary(summary.preset.defaultTimings.mainRaceMinutes)
|
||||
: undefined;
|
||||
|
||||
// Resolve logo URL
|
||||
let logoUrl: string | null | undefined;
|
||||
if (summary.league.logoRef) {
|
||||
const ref = summary.league.logoRef instanceof MediaReference
|
||||
? summary.league.logoRef
|
||||
: MediaReference.fromJSON(summary.league.logoRef);
|
||||
|
||||
if (this.mediaResolver) {
|
||||
logoUrl = await this.mediaResolver.resolve(ref);
|
||||
} else {
|
||||
// Fallback to manual construction
|
||||
if (ref.type === 'generated' && ref.generationRequestId) {
|
||||
const requestId = ref.generationRequestId;
|
||||
const firstHyphenIndex = requestId.indexOf('-');
|
||||
if (firstHyphenIndex !== -1) {
|
||||
const type = requestId.substring(0, firstHyphenIndex);
|
||||
const id = requestId.substring(firstHyphenIndex + 1);
|
||||
|
||||
if (type === 'league') {
|
||||
logoUrl = `/media/leagues/${id}/logo`;
|
||||
}
|
||||
}
|
||||
} else if (ref.type === 'uploaded' && ref.mediaId) {
|
||||
logoUrl = `/media/uploaded/${ref.mediaId}`;
|
||||
} else if (ref.type === 'system-default') {
|
||||
logoUrl = null;
|
||||
}
|
||||
: {}),
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
id: summary.league.id.toString(),
|
||||
name: summary.league.name.toString(),
|
||||
description: summary.league.description?.toString() || '',
|
||||
ownerId: summary.league.ownerId.toString(),
|
||||
createdAt: summary.league.createdAt.toDate().toISOString(),
|
||||
settings: {
|
||||
maxDrivers: summary.maxDrivers,
|
||||
...(summary.league.settings.sessionDuration !== undefined
|
||||
? { sessionDuration: summary.league.settings.sessionDuration }
|
||||
: {}),
|
||||
...(summary.league.settings.qualifyingFormat !== undefined
|
||||
? { qualifyingFormat: summary.league.settings.qualifyingFormat.toString() }
|
||||
: {}),
|
||||
},
|
||||
usedSlots: summary.currentDrivers,
|
||||
...(summary.league.category ? { category: summary.league.category } : {}),
|
||||
...mapSocialLinks(summary.league.socialLinks),
|
||||
...(summary.scoringConfig && summary.game && summary.preset
|
||||
? {
|
||||
scoring: {
|
||||
gameId: summary.game.id.toString(),
|
||||
gameName: summary.game.name.toString(),
|
||||
primaryChampionshipType: summary.preset.primaryChampionshipType,
|
||||
scoringPresetId: summary.scoringConfig.scoringPresetId?.toString() ?? 'custom',
|
||||
scoringPresetName: summary.preset.name,
|
||||
dropPolicySummary: summary.preset.dropPolicySummary,
|
||||
scoringPatternSummary: summary.preset.sessionSummary,
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
...(timingSummary ? { timingSummary } : {}),
|
||||
};
|
||||
});
|
||||
...(logoUrl !== undefined ? { logoUrl } : {}),
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
this.result = {
|
||||
leagues,
|
||||
|
||||
Reference in New Issue
Block a user