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 => { 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], }, ];