161 lines
6.8 KiB
TypeScript
161 lines
6.8 KiB
TypeScript
import { Provider } from '@nestjs/common';
|
|
|
|
import {
|
|
IMAGE_SERVICE_TOKEN,
|
|
LOGGER_TOKEN,
|
|
MEDIA_REPOSITORY_TOKEN,
|
|
MEDIA_RESOLVER_TOKEN,
|
|
TEAM_REPOSITORY_TOKEN,
|
|
TEAM_MEMBERSHIP_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
TEAM_STATS_REPOSITORY_TOKEN,
|
|
GET_ALL_TEAMS_USE_CASE_TOKEN,
|
|
GET_TEAM_DETAILS_USE_CASE_TOKEN,
|
|
GET_TEAM_MEMBERS_USE_CASE_TOKEN,
|
|
GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN,
|
|
CREATE_TEAM_USE_CASE_TOKEN,
|
|
UPDATE_TEAM_USE_CASE_TOKEN,
|
|
GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
|
GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN,
|
|
JOIN_TEAM_USE_CASE_TOKEN,
|
|
} from './TeamTokens';
|
|
|
|
export {
|
|
TEAM_REPOSITORY_TOKEN,
|
|
TEAM_MEMBERSHIP_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
IMAGE_SERVICE_TOKEN,
|
|
LOGGER_TOKEN,
|
|
MEDIA_REPOSITORY_TOKEN,
|
|
MEDIA_RESOLVER_TOKEN,
|
|
} from './TeamTokens';
|
|
|
|
// Import core interfaces
|
|
import type { Logger } from '@core/shared/application/Logger';
|
|
import type { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
|
|
import type { ITeamRepository } from '@core/racing/domain/repositories/TeamRepository';
|
|
import type { ITeamMembershipRepository } from '@core/racing/domain/repositories/TeamMembershipRepository';
|
|
import type { IDriverRepository } from '@core/racing/domain/repositories/DriverRepository';
|
|
import type { ITeamStatsRepository } from '@core/racing/domain/repositories/TeamStatsRepository';
|
|
|
|
// Import concrete implementations
|
|
import { InMemoryImageServiceAdapter } from '@adapters/media/ports/InMemoryImageServiceAdapter';
|
|
import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
|
|
import { InMemoryMediaRepository } from '@adapters/racing/persistence/media/InMemoryMediaRepository';
|
|
import { MediaResolverAdapter } from '@adapters/media/MediaResolverAdapter';
|
|
|
|
// Import use cases
|
|
import { GetAllTeamsUseCase } from '@core/racing/application/use-cases/GetAllTeamsUseCase';
|
|
import { GetTeamDetailsUseCase } from '@core/racing/application/use-cases/GetTeamDetailsUseCase';
|
|
import { GetTeamMembersUseCase } from '@core/racing/application/use-cases/GetTeamMembersUseCase';
|
|
import { GetTeamJoinRequestsUseCase } from '@core/racing/application/use-cases/GetTeamJoinRequestsUseCase';
|
|
import { CreateTeamUseCase } from '@core/racing/application/use-cases/CreateTeamUseCase';
|
|
import { UpdateTeamUseCase } from '@core/racing/application/use-cases/UpdateTeamUseCase';
|
|
import { GetDriverTeamUseCase } from '@core/racing/application/use-cases/GetDriverTeamUseCase';
|
|
import { GetTeamMembershipUseCase } from '@core/racing/application/use-cases/GetTeamMembershipUseCase';
|
|
import { JoinTeamUseCase } from '@core/racing/application/use-cases/JoinTeamUseCase';
|
|
|
|
// Import presenters
|
|
import { AllTeamsPresenter } from './presenters/AllTeamsPresenter';
|
|
|
|
export const TeamProviders: Provider[] = [
|
|
{
|
|
provide: IMAGE_SERVICE_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: LOGGER_TOKEN,
|
|
useClass: ConsoleLogger,
|
|
},
|
|
{
|
|
provide: MEDIA_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => {
|
|
const mediaRepo = new InMemoryMediaRepository(logger);
|
|
|
|
// Override getTeamLogo to provide fallback URLs
|
|
const originalGetTeamLogo = mediaRepo.getTeamLogo.bind(mediaRepo);
|
|
mediaRepo.getTeamLogo = async (teamId: string): Promise<string | null> => {
|
|
const logo = await originalGetTeamLogo(teamId);
|
|
if (logo) return logo;
|
|
|
|
// Fallback: generate deterministic team logo URL
|
|
// Use API port (3001) for media generation
|
|
const baseUrl = process.env.NODE_ENV === 'development' ? 'http://localhost:3001' : 'https://api.gridpilot.io';
|
|
return `${baseUrl}/media/teams/${teamId}/logo`;
|
|
};
|
|
|
|
return mediaRepo;
|
|
},
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: MEDIA_RESOLVER_TOKEN,
|
|
useFactory: () => new MediaResolverAdapter({}),
|
|
},
|
|
{
|
|
provide: AllTeamsPresenter,
|
|
useFactory: (mediaResolver: MediaResolverPort) => {
|
|
const presenter = new AllTeamsPresenter();
|
|
presenter.setMediaResolver(mediaResolver);
|
|
return presenter;
|
|
},
|
|
inject: [MEDIA_RESOLVER_TOKEN],
|
|
},
|
|
// Use Cases
|
|
{
|
|
provide: GET_ALL_TEAMS_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, statsRepo: ITeamStatsRepository, logger: Logger) =>
|
|
new GetAllTeamsUseCase(teamRepo, membershipRepo, statsRepo, logger),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, TEAM_STATS_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_TEAM_DETAILS_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
|
new GetTeamDetailsUseCase(teamRepo, membershipRepo),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_TEAM_MEMBERS_USE_CASE_TOKEN,
|
|
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, teamRepo: ITeamRepository, logger: Logger) =>
|
|
new GetTeamMembersUseCase(membershipRepo, driverRepo, teamRepo, logger),
|
|
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, TEAM_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN,
|
|
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, teamRepo: ITeamRepository) =>
|
|
new GetTeamJoinRequestsUseCase(membershipRepo, driverRepo, teamRepo),
|
|
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, TEAM_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: CREATE_TEAM_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
|
new CreateTeamUseCase(teamRepo, membershipRepo, logger),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: UPDATE_TEAM_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
|
new UpdateTeamUseCase(teamRepo, membershipRepo),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
|
new GetDriverTeamUseCase(teamRepo, membershipRepo, logger),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN,
|
|
useFactory: (membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
|
new GetTeamMembershipUseCase(membershipRepo, logger),
|
|
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: JOIN_TEAM_USE_CASE_TOKEN,
|
|
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
|
new JoinTeamUseCase(teamRepo, membershipRepo, logger),
|
|
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
];
|