Files
gridpilot.gg/apps/api/src/domain/sponsor/SponsorProviders.ts
2026-01-17 00:03:47 +01:00

218 lines
9.0 KiB
TypeScript

import { Provider } from '@nestjs/common';
import { SponsorService } from './SponsorService';
// Import core interfaces
import type { NotificationService } from '@core/notifications/application/ports/NotificationService';
import type { PaymentRepository } from '@core/payments/domain/repositories/PaymentRepository';
import type { WalletRepository } from '@core/payments/domain/repositories/WalletRepository';
import { LeagueMembershipRepository } from '@core/racing/domain/repositories/LeagueMembershipRepository';
import { LeagueRepository } from '@core/racing/domain/repositories/LeagueRepository';
import { LeagueWalletRepository } from '@core/racing/domain/repositories/LeagueWalletRepository';
import { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository';
import { SeasonSponsorshipRepository } from '@core/racing/domain/repositories/SeasonSponsorshipRepository';
import { SponsorRepository } from '@core/racing/domain/repositories/SponsorRepository';
import { SponsorshipPricingRepository } from '@core/racing/domain/repositories/SponsorshipPricingRepository';
import { SponsorshipRequestRepository } from '@core/racing/domain/repositories/SponsorshipRequestRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { GetSponsorBillingUseCase } from '@core/payments/application/use-cases/GetSponsorBillingUseCase';
import { AcceptSponsorshipRequestUseCase } from '@core/racing/application/use-cases/AcceptSponsorshipRequestUseCase';
import { CreateSponsorUseCase } from '@core/racing/application/use-cases/CreateSponsorUseCase';
import { GetEntitySponsorshipPricingUseCase } from '@core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase';
import { GetPendingSponsorshipRequestsUseCase } from '@core/racing/application/use-cases/GetPendingSponsorshipRequestsUseCase';
import { GetSponsorDashboardUseCase } from '@core/racing/application/use-cases/GetSponsorDashboardUseCase';
import { GetSponsorSponsorshipsUseCase } from '@core/racing/application/use-cases/GetSponsorSponsorshipsUseCase';
import { GetSponsorsUseCase } from '@core/racing/application/use-cases/GetSponsorsUseCase';
import { GetSponsorUseCase } from '@core/racing/application/use-cases/GetSponsorUseCase';
import { RejectSponsorshipRequestUseCase } from '@core/racing/application/use-cases/RejectSponsorshipRequestUseCase';
// Import concrete in-memory implementations
import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
import { InMemoryPaymentRepository } from '@adapters/payments/persistence/inmemory/InMemoryPaymentRepository';
import { InMemoryWalletRepository } from '@adapters/payments/persistence/inmemory/InMemoryWalletRepository';
import {
SPONSOR_REPOSITORY_TOKEN,
SEASON_SPONSORSHIP_REPOSITORY_TOKEN,
SEASON_REPOSITORY_TOKEN,
LEAGUE_REPOSITORY_TOKEN,
LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
RACE_REPOSITORY_TOKEN,
SPONSORSHIP_PRICING_REPOSITORY_TOKEN,
SPONSORSHIP_REQUEST_REPOSITORY_TOKEN,
LOGGER_TOKEN,
GET_SPONSORS_USE_CASE_TOKEN,
CREATE_SPONSOR_USE_CASE_TOKEN,
GET_SPONSOR_DASHBOARD_USE_CASE_TOKEN,
GET_SPONSOR_SPONSORSHIPS_USE_CASE_TOKEN,
GET_ENTITY_SPONSORSHIP_PRICING_USE_CASE_TOKEN,
GET_SPONSOR_USE_CASE_TOKEN,
GET_PENDING_SPONSORSHIP_REQUESTS_USE_CASE_TOKEN,
ACCEPT_SPONSORSHIP_REQUEST_USE_CASE_TOKEN,
REJECT_SPONSORSHIP_REQUEST_USE_CASE_TOKEN,
GET_SPONSOR_BILLING_USE_CASE_TOKEN
} from './SponsorTokens';
// Define local injection tokens
export const PAYMENT_REPOSITORY_TOKEN = 'PaymentRepository';
export const WALLET_REPOSITORY_TOKEN = 'WalletRepository';
export const LEAGUE_WALLET_REPOSITORY_TOKEN = 'ILeagueWalletRepository';
export const NOTIFICATION_SERVICE_TOKEN = 'NotificationService';
export const SponsorProviders: Provider[] = [
SponsorService,
// Repositories (payments repos are local to this module; racing repos come from InMemoryRacingPersistenceModule)
{
provide: PAYMENT_REPOSITORY_TOKEN,
useFactory: (logger: Logger) => new InMemoryPaymentRepository(logger),
inject: [LOGGER_TOKEN],
},
{
provide: WALLET_REPOSITORY_TOKEN,
useFactory: (logger: Logger) => new InMemoryWalletRepository(logger),
inject: [LOGGER_TOKEN],
},
{
provide: NOTIFICATION_SERVICE_TOKEN,
useFactory: (logger: Logger): NotificationService => ({
async sendNotification(command: Parameters<NotificationService['sendNotification']>[0]): Promise<void> {
logger.info('[InMemoryNotificationService] sendNotification', { command });
},
}),
inject: [LOGGER_TOKEN],
},
{
provide: LOGGER_TOKEN,
useClass: ConsoleLogger,
},
// Use cases
{
provide: GET_SPONSORS_USE_CASE_TOKEN,
useFactory: (sponsorRepo: SponsorRepository) => new GetSponsorsUseCase(sponsorRepo),
inject: [SPONSOR_REPOSITORY_TOKEN],
},
{
provide: CREATE_SPONSOR_USE_CASE_TOKEN,
useFactory: (sponsorRepo: SponsorRepository, logger: Logger) => new CreateSponsorUseCase(sponsorRepo, logger),
inject: [SPONSOR_REPOSITORY_TOKEN, LOGGER_TOKEN],
},
{
provide: GET_SPONSOR_DASHBOARD_USE_CASE_TOKEN,
useFactory: (
sponsorRepo: SponsorRepository,
seasonSponsorshipRepo: SeasonSponsorshipRepository,
seasonRepo: SeasonRepository,
leagueRepo: LeagueRepository,
leagueMembershipRepo: LeagueMembershipRepository,
raceRepo: RaceRepository,
) => new GetSponsorDashboardUseCase(sponsorRepo, seasonSponsorshipRepo, seasonRepo, leagueRepo, leagueMembershipRepo, raceRepo),
inject: [
SPONSOR_REPOSITORY_TOKEN,
SEASON_SPONSORSHIP_REPOSITORY_TOKEN,
SEASON_REPOSITORY_TOKEN,
LEAGUE_REPOSITORY_TOKEN,
LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
RACE_REPOSITORY_TOKEN,
],
},
{
provide: GET_SPONSOR_SPONSORSHIPS_USE_CASE_TOKEN,
useFactory: (
sponsorRepo: SponsorRepository,
seasonSponsorshipRepo: SeasonSponsorshipRepository,
seasonRepo: SeasonRepository,
leagueRepo: LeagueRepository,
leagueMembershipRepo: LeagueMembershipRepository,
raceRepo: RaceRepository,
) => new GetSponsorSponsorshipsUseCase(sponsorRepo, seasonSponsorshipRepo, seasonRepo, leagueRepo, leagueMembershipRepo, raceRepo),
inject: [
SPONSOR_REPOSITORY_TOKEN,
SEASON_SPONSORSHIP_REPOSITORY_TOKEN,
SEASON_REPOSITORY_TOKEN,
LEAGUE_REPOSITORY_TOKEN,
LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
RACE_REPOSITORY_TOKEN,
],
},
{
provide: GET_SPONSOR_BILLING_USE_CASE_TOKEN,
useFactory: (
paymentRepo: PaymentRepository,
seasonSponsorshipRepo: SeasonSponsorshipRepository,
) => {
return new GetSponsorBillingUseCase(paymentRepo, seasonSponsorshipRepo);
},
inject: [PAYMENT_REPOSITORY_TOKEN, SEASON_SPONSORSHIP_REPOSITORY_TOKEN],
},
{
provide: GET_ENTITY_SPONSORSHIP_PRICING_USE_CASE_TOKEN,
useFactory: (
sponsorshipPricingRepo: SponsorshipPricingRepository,
logger: Logger,
) => new GetEntitySponsorshipPricingUseCase(sponsorshipPricingRepo, logger),
inject: [
SPONSORSHIP_PRICING_REPOSITORY_TOKEN,
LOGGER_TOKEN,
],
},
{
provide: GET_SPONSOR_USE_CASE_TOKEN,
useFactory: (sponsorRepo: SponsorRepository) => new GetSponsorUseCase(sponsorRepo),
inject: [SPONSOR_REPOSITORY_TOKEN],
},
{
provide: GET_PENDING_SPONSORSHIP_REQUESTS_USE_CASE_TOKEN,
useFactory: (
sponsorshipRequestRepo: SponsorshipRequestRepository,
sponsorRepo: SponsorRepository,
) => new GetPendingSponsorshipRequestsUseCase(sponsorshipRequestRepo, sponsorRepo),
inject: [SPONSORSHIP_REQUEST_REPOSITORY_TOKEN, SPONSOR_REPOSITORY_TOKEN],
},
{
provide: ACCEPT_SPONSORSHIP_REQUEST_USE_CASE_TOKEN,
useFactory: (
sponsorshipRequestRepo: SponsorshipRequestRepository,
seasonSponsorshipRepo: SeasonSponsorshipRepository,
seasonRepo: SeasonRepository,
notificationService: NotificationService,
walletRepository: WalletRepository,
leagueWalletRepository: LeagueWalletRepository,
logger: Logger,
) => {
// Create a mock payment processor function
const paymentProcessor = async (input: unknown) => {
void input;
return { success: true, transactionId: `txn_${Date.now()}` };
};
return new AcceptSponsorshipRequestUseCase(
sponsorshipRequestRepo,
seasonSponsorshipRepo,
seasonRepo,
notificationService,
paymentProcessor,
walletRepository,
leagueWalletRepository,
logger
);
},
inject: [
SPONSORSHIP_REQUEST_REPOSITORY_TOKEN,
SEASON_SPONSORSHIP_REPOSITORY_TOKEN,
SEASON_REPOSITORY_TOKEN,
NOTIFICATION_SERVICE_TOKEN,
WALLET_REPOSITORY_TOKEN,
LEAGUE_WALLET_REPOSITORY_TOKEN,
LOGGER_TOKEN,
],
},
{
provide: REJECT_SPONSORSHIP_REQUEST_USE_CASE_TOKEN,
useFactory: (
sponsorshipRequestRepo: SponsorshipRequestRepository,
logger: Logger,
) => new RejectSponsorshipRequestUseCase(sponsorshipRequestRepo, logger),
inject: [SPONSORSHIP_REQUEST_REPOSITORY_TOKEN, LOGGER_TOKEN],
},
];