528 lines
16 KiB
TypeScript
528 lines
16 KiB
TypeScript
import type { Provider } from '@nestjs/common';
|
|
|
|
// Import core interfaces
|
|
import type { DriverRatingProvider } from '@core/racing/application/ports/DriverRatingProvider';
|
|
import type { IDriverRepository } from '@core/racing/domain/repositories/DriverRepository';
|
|
import type { ILeagueMembershipRepository } from '@core/racing/domain/repositories/LeagueMembershipRepository';
|
|
import type { ILeagueRepository } from '@core/racing/domain/repositories/LeagueRepository';
|
|
import type { IPenaltyRepository } from '@core/racing/domain/repositories/PenaltyRepository';
|
|
import type { IProtestRepository } from '@core/racing/domain/repositories/ProtestRepository';
|
|
import type { IRaceRegistrationRepository } from '@core/racing/domain/repositories/RaceRegistrationRepository';
|
|
import type { IRaceRepository } from '@core/racing/domain/repositories/RaceRepository';
|
|
import type { IResultRepository } from '@core/racing/domain/repositories/ResultRepository';
|
|
import type { IStandingRepository } from '@core/racing/domain/repositories/StandingRepository';
|
|
import type { Logger } from '@core/shared/application/Logger';
|
|
|
|
// Import concrete in-memory implementations
|
|
import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
|
|
import { InMemoryImageServiceAdapter } from '@adapters/media/ports/InMemoryImageServiceAdapter';
|
|
import { InMemoryDriverRatingProvider } from '@adapters/racing/ports/InMemoryDriverRatingProvider';
|
|
|
|
// Import use cases
|
|
import { ApplyPenaltyUseCase } from '@core/racing/application/use-cases/ApplyPenaltyUseCase';
|
|
import { CancelRaceUseCase } from '@core/racing/application/use-cases/CancelRaceUseCase';
|
|
import { CompleteRaceUseCase } from '@core/racing/application/use-cases/CompleteRaceUseCase';
|
|
import { FileProtestUseCase } from '@core/racing/application/use-cases/FileProtestUseCase';
|
|
import { GetAllRacesPageDataUseCase } from '@core/racing/application/use-cases/GetAllRacesPageDataUseCase';
|
|
import { GetAllRacesUseCase } from '@core/racing/application/use-cases/GetAllRacesUseCase';
|
|
import { GetRaceDetailUseCase } from '@core/racing/application/use-cases/GetRaceDetailUseCase';
|
|
import { GetRacePenaltiesUseCase } from '@core/racing/application/use-cases/GetRacePenaltiesUseCase';
|
|
import { GetRaceProtestsUseCase } from '@core/racing/application/use-cases/GetRaceProtestsUseCase';
|
|
import { GetRaceResultsDetailUseCase } from '@core/racing/application/use-cases/GetRaceResultsDetailUseCase';
|
|
import { GetRacesPageDataUseCase } from '@core/racing/application/use-cases/GetRacesPageDataUseCase';
|
|
import { GetRaceWithSOFUseCase } from '@core/racing/application/use-cases/GetRaceWithSOFUseCase';
|
|
import { GetTotalRacesUseCase } from '@core/racing/application/use-cases/GetTotalRacesUseCase';
|
|
import { ImportRaceResultsApiUseCase } from '@core/racing/application/use-cases/ImportRaceResultsApiUseCase';
|
|
import { ImportRaceResultsUseCase } from '@core/racing/application/use-cases/ImportRaceResultsUseCase';
|
|
import { QuickPenaltyUseCase } from '@core/racing/application/use-cases/QuickPenaltyUseCase';
|
|
import { RegisterForRaceUseCase } from '@core/racing/application/use-cases/RegisterForRaceUseCase';
|
|
import { ReopenRaceUseCase } from '@core/racing/application/use-cases/ReopenRaceUseCase';
|
|
import { RequestProtestDefenseUseCase } from '@core/racing/application/use-cases/RequestProtestDefenseUseCase';
|
|
import { ReviewProtestUseCase } from '@core/racing/application/use-cases/ReviewProtestUseCase';
|
|
import { WithdrawFromRaceUseCase } from '@core/racing/application/use-cases/WithdrawFromRaceUseCase';
|
|
|
|
// Import presenters
|
|
import { AllRacesPageDataPresenter } from './presenters/AllRacesPageDataPresenter';
|
|
import { CommandResultPresenter } from './presenters/CommandResultPresenter';
|
|
import { GetAllRacesPresenter } from './presenters/GetAllRacesPresenter';
|
|
import { GetTotalRacesPresenter } from './presenters/GetTotalRacesPresenter';
|
|
import { ImportRaceResultsApiPresenter } from './presenters/ImportRaceResultsApiPresenter';
|
|
import { RaceDetailPresenter } from './presenters/RaceDetailPresenter';
|
|
import { RacePenaltiesPresenter } from './presenters/RacePenaltiesPresenter';
|
|
import { RaceProtestsPresenter } from './presenters/RaceProtestsPresenter';
|
|
import { RaceResultsDetailPresenter } from './presenters/RaceResultsDetailPresenter';
|
|
import { RacesPageDataPresenter } from './presenters/RacesPageDataPresenter';
|
|
import { RaceWithSOFPresenter } from './presenters/RaceWithSOFPresenter';
|
|
|
|
import {
|
|
RACE_REPOSITORY_TOKEN,
|
|
LEAGUE_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
RACE_REGISTRATION_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
|
|
PENALTY_REPOSITORY_TOKEN,
|
|
PROTEST_REPOSITORY_TOKEN,
|
|
STANDING_REPOSITORY_TOKEN,
|
|
DRIVER_RATING_PROVIDER_TOKEN,
|
|
IMAGE_SERVICE_TOKEN,
|
|
LOGGER_TOKEN,
|
|
GET_ALL_RACES_PRESENTER_TOKEN,
|
|
GET_TOTAL_RACES_PRESENTER_TOKEN,
|
|
IMPORT_RACE_RESULTS_API_PRESENTER_TOKEN,
|
|
RACE_DETAIL_PRESENTER_TOKEN,
|
|
RACES_PAGE_DATA_PRESENTER_TOKEN,
|
|
ALL_RACES_PAGE_DATA_PRESENTER_TOKEN,
|
|
RACE_RESULTS_DETAIL_PRESENTER_TOKEN,
|
|
RACE_WITH_SOF_PRESENTER_TOKEN,
|
|
RACE_PROTESTS_PRESENTER_TOKEN,
|
|
RACE_PENALTIES_PRESENTER_TOKEN,
|
|
COMMAND_RESULT_PRESENTER_TOKEN,
|
|
} from './RaceTokens';
|
|
|
|
export * from './RaceTokens';
|
|
|
|
export const RaceProviders: Provider[] = [
|
|
{
|
|
provide: DRIVER_RATING_PROVIDER_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryDriverRatingProvider(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: IMAGE_SERVICE_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: LOGGER_TOKEN,
|
|
useClass: ConsoleLogger,
|
|
},
|
|
// Presenters
|
|
{
|
|
provide: GET_ALL_RACES_PRESENTER_TOKEN,
|
|
useClass: GetAllRacesPresenter,
|
|
},
|
|
{
|
|
provide: GET_TOTAL_RACES_PRESENTER_TOKEN,
|
|
useClass: GetTotalRacesPresenter,
|
|
},
|
|
{
|
|
provide: IMPORT_RACE_RESULTS_API_PRESENTER_TOKEN,
|
|
useClass: ImportRaceResultsApiPresenter,
|
|
},
|
|
{
|
|
provide: RACE_DETAIL_PRESENTER_TOKEN,
|
|
useFactory: (driverRatingProvider: DriverRatingProvider, imageService: InMemoryImageServiceAdapter) =>
|
|
new RaceDetailPresenter(driverRatingProvider, imageService, { raceId: '', driverId: '' }),
|
|
inject: [DRIVER_RATING_PROVIDER_TOKEN, IMAGE_SERVICE_TOKEN],
|
|
},
|
|
{
|
|
provide: RACES_PAGE_DATA_PRESENTER_TOKEN,
|
|
useClass: RacesPageDataPresenter,
|
|
},
|
|
{
|
|
provide: ALL_RACES_PAGE_DATA_PRESENTER_TOKEN,
|
|
useClass: AllRacesPageDataPresenter,
|
|
},
|
|
{
|
|
provide: RACE_RESULTS_DETAIL_PRESENTER_TOKEN,
|
|
useFactory: (imageService: InMemoryImageServiceAdapter) => new RaceResultsDetailPresenter(imageService),
|
|
inject: [IMAGE_SERVICE_TOKEN],
|
|
},
|
|
{
|
|
provide: RACE_WITH_SOF_PRESENTER_TOKEN,
|
|
useClass: RaceWithSOFPresenter,
|
|
},
|
|
{
|
|
provide: RACE_PROTESTS_PRESENTER_TOKEN,
|
|
useClass: RaceProtestsPresenter,
|
|
},
|
|
{
|
|
provide: RACE_PENALTIES_PRESENTER_TOKEN,
|
|
useClass: RacePenaltiesPresenter,
|
|
},
|
|
{
|
|
provide: COMMAND_RESULT_PRESENTER_TOKEN,
|
|
useClass: CommandResultPresenter,
|
|
},
|
|
// Use cases
|
|
{
|
|
provide: GetAllRacesUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new GetAllRacesUseCase(raceRepo, leagueRepo, logger);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, LEAGUE_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GetTotalRacesUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
) => {
|
|
return new GetTotalRacesUseCase(raceRepo);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: ImportRaceResultsApiUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
resultRepo: IResultRepository,
|
|
driverRepo: IDriverRepository,
|
|
standingRepo: IStandingRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new ImportRaceResultsApiUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
resultRepo,
|
|
driverRepo,
|
|
standingRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
LEAGUE_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
STANDING_REPOSITORY_TOKEN,
|
|
LOGGER_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: GetRaceDetailUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
driverRepo: IDriverRepository,
|
|
raceRegRepo: IRaceRegistrationRepository,
|
|
resultRepo: IResultRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
) => {
|
|
return new GetRaceDetailUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
driverRepo,
|
|
raceRegRepo,
|
|
resultRepo,
|
|
leagueMembershipRepo,
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
LEAGUE_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
RACE_REGISTRATION_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: GetRacesPageDataUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new GetRacesPageDataUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, LEAGUE_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GetAllRacesPageDataUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new GetAllRacesPageDataUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, LEAGUE_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: GetRaceResultsDetailUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
resultRepo: IResultRepository,
|
|
driverRepo: IDriverRepository,
|
|
penaltyRepo: IPenaltyRepository,
|
|
) => {
|
|
return new GetRaceResultsDetailUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
resultRepo,
|
|
driverRepo,
|
|
penaltyRepo,
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
LEAGUE_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
PENALTY_REPOSITORY_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: GetRaceWithSOFUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
raceRegRepo: IRaceRegistrationRepository,
|
|
resultRepo: IResultRepository,
|
|
driverRatingProvider: DriverRatingProvider,
|
|
) => {
|
|
return new GetRaceWithSOFUseCase(
|
|
raceRepo,
|
|
raceRegRepo,
|
|
resultRepo,
|
|
async (input: { driverId: string }) => {
|
|
const rating = driverRatingProvider.getRating(input.driverId);
|
|
return { rating };
|
|
},
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
RACE_REGISTRATION_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
DRIVER_RATING_PROVIDER_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: GetRaceProtestsUseCase,
|
|
useFactory: (
|
|
protestRepo: IProtestRepository,
|
|
driverRepo: IDriverRepository,
|
|
) => {
|
|
return new GetRaceProtestsUseCase(
|
|
protestRepo,
|
|
driverRepo,
|
|
);
|
|
},
|
|
inject: [PROTEST_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: GetRacePenaltiesUseCase,
|
|
useFactory: (
|
|
penaltyRepo: IPenaltyRepository,
|
|
driverRepo: IDriverRepository,
|
|
) => {
|
|
return new GetRacePenaltiesUseCase(
|
|
penaltyRepo,
|
|
driverRepo,
|
|
);
|
|
},
|
|
inject: [PENALTY_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: RegisterForRaceUseCase,
|
|
useFactory: (
|
|
raceRegRepo: IRaceRegistrationRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new RegisterForRaceUseCase(
|
|
raceRegRepo,
|
|
leagueMembershipRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REGISTRATION_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: WithdrawFromRaceUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
raceRegRepo: IRaceRegistrationRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new WithdrawFromRaceUseCase(
|
|
raceRepo,
|
|
raceRegRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, RACE_REGISTRATION_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: CancelRaceUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new CancelRaceUseCase(
|
|
raceRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: CompleteRaceUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
raceRegRepo: IRaceRegistrationRepository,
|
|
resultRepo: IResultRepository,
|
|
standingRepo: IStandingRepository,
|
|
driverRatingProvider: DriverRatingProvider,
|
|
) => {
|
|
return new CompleteRaceUseCase(
|
|
raceRepo,
|
|
raceRegRepo,
|
|
resultRepo,
|
|
standingRepo,
|
|
async (input: { driverId: string }) => {
|
|
const rating = driverRatingProvider.getRating(input.driverId);
|
|
return { rating, ratingChange: null };
|
|
},
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
RACE_REGISTRATION_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
STANDING_REPOSITORY_TOKEN,
|
|
DRIVER_RATING_PROVIDER_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: ReopenRaceUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new ReopenRaceUseCase(
|
|
raceRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [RACE_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: ImportRaceResultsUseCase,
|
|
useFactory: (
|
|
raceRepo: IRaceRepository,
|
|
leagueRepo: ILeagueRepository,
|
|
resultRepo: IResultRepository,
|
|
driverRepo: IDriverRepository,
|
|
standingRepo: IStandingRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new ImportRaceResultsUseCase(
|
|
raceRepo,
|
|
leagueRepo,
|
|
resultRepo,
|
|
driverRepo,
|
|
standingRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [
|
|
RACE_REPOSITORY_TOKEN,
|
|
LEAGUE_REPOSITORY_TOKEN,
|
|
RESULT_REPOSITORY_TOKEN,
|
|
DRIVER_REPOSITORY_TOKEN,
|
|
STANDING_REPOSITORY_TOKEN,
|
|
LOGGER_TOKEN,
|
|
],
|
|
},
|
|
{
|
|
provide: FileProtestUseCase,
|
|
useFactory: (
|
|
protestRepo: IProtestRepository,
|
|
raceRepo: IRaceRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
) => {
|
|
return new FileProtestUseCase(
|
|
protestRepo,
|
|
raceRepo,
|
|
leagueMembershipRepo,
|
|
);
|
|
},
|
|
inject: [PROTEST_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN],
|
|
},
|
|
{
|
|
provide: QuickPenaltyUseCase,
|
|
useFactory: (
|
|
penaltyRepo: IPenaltyRepository,
|
|
raceRepo: IRaceRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new QuickPenaltyUseCase(
|
|
penaltyRepo,
|
|
raceRepo,
|
|
leagueMembershipRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [PENALTY_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: ApplyPenaltyUseCase,
|
|
useFactory: (
|
|
penaltyRepo: IPenaltyRepository,
|
|
protestRepo: IProtestRepository,
|
|
raceRepo: IRaceRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new ApplyPenaltyUseCase(
|
|
penaltyRepo,
|
|
protestRepo,
|
|
raceRepo,
|
|
leagueMembershipRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [PENALTY_REPOSITORY_TOKEN, PROTEST_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: RequestProtestDefenseUseCase,
|
|
useFactory: (
|
|
protestRepo: IProtestRepository,
|
|
raceRepo: IRaceRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new RequestProtestDefenseUseCase(
|
|
protestRepo,
|
|
raceRepo,
|
|
leagueMembershipRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [PROTEST_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: ReviewProtestUseCase,
|
|
useFactory: (
|
|
protestRepo: IProtestRepository,
|
|
raceRepo: IRaceRepository,
|
|
leagueMembershipRepo: ILeagueMembershipRepository,
|
|
logger: Logger,
|
|
) => {
|
|
return new ReviewProtestUseCase(
|
|
protestRepo,
|
|
raceRepo,
|
|
leagueMembershipRepo,
|
|
logger,
|
|
);
|
|
},
|
|
inject: [PROTEST_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
|
},
|
|
]; |