Files
gridpilot.gg/adapters/media/resolvers/DefaultMediaResolverAdapter.ts
2026-01-16 21:40:26 +01:00

80 lines
2.4 KiB
TypeScript

/**
* DefaultMediaResolverAdapter
*
* Resolves system-default media references to public asset URLs.
* Part of the adapters layer, implementing the MediaResolverPort interface.
*/
import { MediaReference } from '@core/domain/media/MediaReference';
import { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
/**
* Configuration for the DefaultMediaResolverAdapter
*/
export interface DefaultMediaResolverConfig {
/**
* Base path for default assets (defaults to '/media/default')
*/
basePath?: string | undefined;
}
/**
* DefaultMediaResolverAdapter
*
* Resolves system-default media references to public asset URLs.
*
* URL format: /media/default/{variant}
* Examples:
* - /media/default/male-default-avatar
* - /media/default/female-default-avatar
* - /media/default/neutral-default-avatar
* - /media/default/team-logo.png
* - /media/default/league-logo.png
*/
export class DefaultMediaResolverAdapter implements MediaResolverPort {
private readonly basePath: string;
constructor(config: DefaultMediaResolverConfig = {}) {
this.basePath = config.basePath || '/media/default';
}
/**
* Resolve a system-default media reference to a path-only URL
* Returns paths like /media/default/{variant} (no baseUrl)
*/
async resolve(ref: MediaReference): Promise<string | null> {
// Only handle system-default references
if (ref.type !== 'system-default') {
return null;
}
// Determine the filename based on variant and avatarVariant
let filename: string;
if (ref.variant === 'avatar' && ref.avatarVariant) {
// Driver avatars must use website public assets:
// apps/website/public/images/avatars/{male|female|neutral}-default-avatar.(jpg|jpeg)
// We intentionally keep the URL extension-less; MediaController maps it to the real file.
filename = `${ref.avatarVariant}-default-avatar`;
} else if (ref.variant === 'avatar') {
// Avatar without specific variant (fallback to neutral)
filename = `neutral-default-avatar`;
} else {
// Other variants (team, league, etc.)
filename = `${ref.variant}.png`;
}
// Return path-only URL
return `${this.basePath}/${filename}`;
}
}
/**
* Factory function for creating DefaultMediaResolverAdapter instances
*/
export function createDefaultMediaResolver(
config: DefaultMediaResolverConfig = {}
): DefaultMediaResolverAdapter {
return new DefaultMediaResolverAdapter(config);
}