This commit is contained in:
2025-12-10 12:38:55 +01:00
parent 0f7fe67d3c
commit fbbcf414a4
87 changed files with 11972 additions and 390 deletions

View File

@@ -7,6 +7,9 @@ import { Penalty } from '@gridpilot/racing/domain/entities/Penalty';
import { Protest } from '@gridpilot/racing/domain/entities/Protest';
import { Game } from '@gridpilot/racing/domain/entities/Game';
import { Season } from '@gridpilot/racing/domain/entities/Season';
import { Sponsor } from '@gridpilot/racing/domain/entities/Sponsor';
import { SeasonSponsorship } from '@gridpilot/racing/domain/entities/SeasonSponsorship';
import { Money } from '@gridpilot/racing/domain/value-objects/Money';
import type { LeagueMembership, JoinRequest } from '@gridpilot/racing/domain/entities/LeagueMembership';
import type { IDriverRepository } from '@gridpilot/racing/domain/repositories/IDriverRepository';
@@ -25,6 +28,10 @@ import type {
ITeamRepository,
ITeamMembershipRepository,
IRaceRegistrationRepository,
ISponsorRepository,
ISeasonSponsorshipRepository,
ISponsorshipRequestRepository,
ISponsorshipPricingRepository,
} from '@gridpilot/racing';
import type { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository';
import type { IFeedRepository } from '@gridpilot/social/domain/repositories/IFeedRepository';
@@ -62,6 +69,10 @@ import {
getLeagueScoringPresetById,
} from '@gridpilot/racing/infrastructure/repositories/InMemoryScoringRepositories';
import { InMemoryLeagueScoringPresetProvider } from '@gridpilot/racing/infrastructure/repositories/InMemoryLeagueScoringPresetProvider';
import { InMemorySponsorRepository } from '@gridpilot/racing/infrastructure/repositories/InMemorySponsorRepository';
import { InMemorySeasonSponsorshipRepository } from '@gridpilot/racing/infrastructure/repositories/InMemorySeasonSponsorshipRepository';
import { InMemorySponsorshipRequestRepository } from '@gridpilot/racing/infrastructure/repositories/InMemorySponsorshipRequestRepository';
import { InMemorySponsorshipPricingRepository } from '@gridpilot/racing/infrastructure/repositories/InMemorySponsorshipPricingRepository';
import { InMemoryTeamRepository } from '@gridpilot/racing/infrastructure/repositories/InMemoryTeamRepository';
import { InMemoryTeamMembershipRepository } from '@gridpilot/racing/infrastructure/repositories/InMemoryTeamMembershipRepository';
import { InMemoryRaceRegistrationRepository } from '@gridpilot/racing/infrastructure/repositories/InMemoryRaceRegistrationRepository';
@@ -107,6 +118,13 @@ import {
GetRacePenaltiesQuery,
RequestProtestDefenseUseCase,
SubmitProtestDefenseUseCase,
GetSponsorDashboardQuery,
GetSponsorSponsorshipsQuery,
GetPendingSponsorshipRequestsQuery,
GetEntitySponsorshipPricingQuery,
ApplyForSponsorshipUseCase,
AcceptSponsorshipRequestUseCase,
RejectSponsorshipRequestUseCase,
} from '@gridpilot/racing/application';
import { TransferLeagueOwnershipUseCase } from '@gridpilot/racing/application/use-cases/TransferLeagueOwnershipUseCase';
import type { DriverRatingProvider } from '@gridpilot/racing/application';
@@ -571,6 +589,74 @@ export function configureDIContainer(): void {
new InMemoryCarRepository(DEMO_CARS)
);
// Sponsor repositories - seed with demo sponsors
const seededSponsors = seedData.sponsors.map(s =>
Sponsor.create({
id: s.id,
name: s.name,
contactEmail: s.contactEmail,
logoUrl: s.logoUrl,
websiteUrl: s.websiteUrl,
})
);
const sponsorRepo = new InMemorySponsorRepository();
// Use synchronous seeding via internal method
seededSponsors.forEach(sponsor => {
(sponsorRepo as any).sponsors.set(sponsor.id, sponsor);
});
container.registerInstance<ISponsorRepository>(
DI_TOKENS.SponsorRepository,
sponsorRepo
);
const seededSponsorships = seedData.seasonSponsorships.map(ss =>
SeasonSponsorship.create({
id: ss.id,
seasonId: ss.seasonId,
sponsorId: ss.sponsorId,
tier: ss.tier,
pricing: Money.create(ss.pricingAmount, ss.pricingCurrency),
status: ss.status,
description: ss.description,
})
);
const seasonSponsorshipRepo = new InMemorySeasonSponsorshipRepository();
// Use synchronous seeding via internal method
seededSponsorships.forEach(sponsorship => {
(seasonSponsorshipRepo as any).sponsorships.set(sponsorship.id, sponsorship);
});
container.registerInstance<ISeasonSponsorshipRepository>(
DI_TOKENS.SeasonSponsorshipRepository,
seasonSponsorshipRepo
);
// Sponsorship Request and Pricing repositories
const sponsorshipRequestRepo = new InMemorySponsorshipRequestRepository();
container.registerInstance<ISponsorshipRequestRepository>(
DI_TOKENS.SponsorshipRequestRepository,
sponsorshipRequestRepo
);
const sponsorshipPricingRepo = new InMemorySponsorshipPricingRepository();
// Seed sponsorship pricings from demo data
seedData.sponsorshipPricings?.forEach(pricing => {
(sponsorshipPricingRepo as any).pricings.set(
`${pricing.entityType}-${pricing.entityId}`,
pricing
);
});
container.registerInstance<ISponsorshipPricingRepository>(
DI_TOKENS.SponsorshipPricingRepository,
sponsorshipPricingRepo
);
// Seed sponsorship requests from demo data
seedData.sponsorshipRequests?.forEach(request => {
(sponsorshipRequestRepo as any).requests.set(request.id, request);
});
// Social repositories
container.registerInstance<IFeedRepository>(
DI_TOKENS.FeedRepository,
@@ -908,6 +994,74 @@ export function configureDIContainer(): void {
DI_TOKENS.GetUnreadNotificationsQuery,
new GetUnreadNotificationsQuery(notificationRepository)
);
// Register queries - Sponsors
const sponsorRepository = container.resolve<ISponsorRepository>(DI_TOKENS.SponsorRepository);
const seasonSponsorshipRepository = container.resolve<ISeasonSponsorshipRepository>(DI_TOKENS.SeasonSponsorshipRepository);
container.registerInstance(
DI_TOKENS.GetSponsorDashboardQuery,
new GetSponsorDashboardQuery(
sponsorRepository,
seasonSponsorshipRepository,
seasonRepository,
leagueRepository,
leagueMembershipRepository,
raceRepository
)
);
container.registerInstance(
DI_TOKENS.GetSponsorSponsorshipsQuery,
new GetSponsorSponsorshipsQuery(
sponsorRepository,
seasonSponsorshipRepository,
seasonRepository,
leagueRepository,
leagueMembershipRepository,
raceRepository
)
);
// Sponsorship request repositories and use cases
const sponsorshipRequestRepository = container.resolve<ISponsorshipRequestRepository>(DI_TOKENS.SponsorshipRequestRepository);
const sponsorshipPricingRepository = container.resolve<ISponsorshipPricingRepository>(DI_TOKENS.SponsorshipPricingRepository);
container.registerInstance(
DI_TOKENS.GetPendingSponsorshipRequestsQuery,
new GetPendingSponsorshipRequestsQuery(
sponsorshipRequestRepository,
sponsorRepository
)
);
container.registerInstance(
DI_TOKENS.GetEntitySponsorshipPricingQuery,
new GetEntitySponsorshipPricingQuery(
sponsorshipPricingRepository,
sponsorshipRequestRepository,
seasonSponsorshipRepository
)
);
container.registerInstance(
DI_TOKENS.ApplyForSponsorshipUseCase,
new ApplyForSponsorshipUseCase(
sponsorshipRequestRepository,
sponsorshipPricingRepository,
sponsorRepository
)
);
container.registerInstance(
DI_TOKENS.AcceptSponsorshipRequestUseCase,
new AcceptSponsorshipRequestUseCase(sponsorshipRequestRepository, seasonSponsorshipRepository)
);
container.registerInstance(
DI_TOKENS.RejectSponsorshipRequestUseCase,
new RejectSponsorshipRequestUseCase(sponsorshipRequestRepository)
);
}
/**