harden media
This commit is contained in:
@@ -2,16 +2,26 @@ import { Result } from '@core/shared/application/Result';
|
||||
import type { Driver } from '@core/racing/domain/entities/Driver';
|
||||
import type { GetDriverOutputDTO } from '../dtos/GetDriverOutputDTO';
|
||||
import type { IDriverStatsRepository } from '@core/racing/domain/repositories/IDriverStatsRepository';
|
||||
import type { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
|
||||
import { MediaReference } from '@core/domain/media/MediaReference';
|
||||
|
||||
export class DriverPresenter {
|
||||
private responseModel: GetDriverOutputDTO | null = null;
|
||||
private mediaResolver: MediaResolverPort | undefined;
|
||||
|
||||
constructor(
|
||||
private readonly driverStatsRepository: IDriverStatsRepository
|
||||
) {}
|
||||
private readonly driverStatsRepository: IDriverStatsRepository,
|
||||
mediaResolver?: MediaResolverPort
|
||||
) {
|
||||
this.mediaResolver = mediaResolver;
|
||||
}
|
||||
|
||||
setMediaResolver(resolver: MediaResolverPort | undefined): void {
|
||||
this.mediaResolver = resolver;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
present(result: Result<Driver | null, any>): void {
|
||||
async present(result: Result<Driver | null, any>): Promise<void> {
|
||||
if (result.isErr()) {
|
||||
const error = result.unwrapErr();
|
||||
throw new Error(error.details?.message ?? 'Failed to get driver');
|
||||
@@ -26,12 +36,22 @@ export class DriverPresenter {
|
||||
// Get stats from repository (synchronously for now, could be async)
|
||||
const stats = this.driverStatsRepository.getDriverStatsSync(driver.id);
|
||||
|
||||
this.responseModel = {
|
||||
// Resolve avatar URL using MediaResolverPort
|
||||
let avatarUrl: string | null = null;
|
||||
if (this.mediaResolver) {
|
||||
const ref = driver.avatarRef ?? MediaReference.createNone();
|
||||
const resolvedRef = ref instanceof MediaReference ? ref : MediaReference.fromJSON(ref);
|
||||
const resolvedUrl = await this.mediaResolver.resolve(resolvedRef);
|
||||
avatarUrl = resolvedUrl ?? null;
|
||||
}
|
||||
|
||||
const dto: GetDriverOutputDTO = {
|
||||
id: driver.id,
|
||||
iracingId: driver.iracingId.toString(),
|
||||
name: driver.name.toString(),
|
||||
country: driver.country.toString(),
|
||||
joinedAt: driver.joinedAt.toDate().toISOString(),
|
||||
avatarUrl,
|
||||
...(driver.bio ? { bio: driver.bio.toString() } : {}),
|
||||
...(driver.category ? { category: driver.category } : {}),
|
||||
// Add stats fields
|
||||
@@ -43,6 +63,8 @@ export class DriverPresenter {
|
||||
experienceLevel: this.getExperienceLevel(stats.rating),
|
||||
} : {}),
|
||||
};
|
||||
|
||||
this.responseModel = dto;
|
||||
}
|
||||
|
||||
getResponseModel(): GetDriverOutputDTO | null {
|
||||
@@ -55,4 +77,4 @@ export class DriverPresenter {
|
||||
if (rating >= 1000) return 'intermediate';
|
||||
return 'beginner';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user