view models

This commit is contained in:
2025-12-18 01:20:23 +01:00
parent 7c449af311
commit cc2553876a
216 changed files with 485 additions and 10179 deletions

View File

@@ -29,42 +29,12 @@ import { MembershipFeeService } from './payments/MembershipFeeService';
import { AuthService } from './auth/AuthService';
import { SessionService } from './auth/SessionService';
// Presenters
import { RaceDetailPresenter } from '../presenters/RaceDetailPresenter';
import { RaceResultsDetailPresenter } from '../presenters/RaceResultsDetailPresenter';
import { RaceWithSOFPresenter } from '../presenters/RaceWithSOFPresenter';
import { ImportRaceResultsPresenter } from '../presenters/ImportRaceResultsPresenter';
import { DriversLeaderboardPresenter } from '../presenters/DriversLeaderboardPresenter';
import { DriverPresenter } from '../presenters/DriverPresenter';
import { CompleteOnboardingPresenter } from '../presenters/CompleteOnboardingPresenter';
import { DriverRegistrationStatusPresenter } from '../presenters/DriverRegistrationStatusPresenter';
import { TeamDetailsPresenter } from '../presenters/TeamDetailsPresenter';
import { TeamListPresenter } from '../presenters/TeamListPresenter';
import { TeamMembersPresenter } from '../presenters/TeamMembersPresenter';
import { TeamJoinRequestPresenter } from '../presenters/TeamJoinRequestPresenter';
import { LeagueSummaryPresenter } from '../presenters/LeagueSummaryPresenter';
import { LeagueStandingsPresenter } from '../presenters/LeagueStandingsPresenter';
import { LeagueMembersPresenter } from '../presenters/LeagueMembersPresenter';
import { SponsorListPresenter } from '../presenters/SponsorListPresenter';
import { SponsorDashboardPresenter } from '../presenters/SponsorDashboardPresenter';
import { SponsorSponsorshipsPresenter } from '../presenters/SponsorSponsorshipsPresenter';
import { SponsorshipPricingPresenter } from '../presenters/SponsorshipPricingPresenter';
import { PaymentListPresenter } from '../presenters/PaymentListPresenter';
import { presentPayment } from '../presenters/PaymentPresenter';
import { presentMembershipFee } from '../presenters/MembershipFeePresenter';
import { presentPrize } from '../presenters/PrizePresenter';
import { presentWallet } from '../presenters/WalletPresenter';
import { AnalyticsDashboardPresenter } from '../presenters/AnalyticsDashboardPresenter';
import { AnalyticsMetricsPresenter } from '../presenters/AnalyticsMetricsPresenter';
import { MediaPresenter } from '../presenters/MediaPresenter';
import { AvatarPresenter } from '../presenters/AvatarPresenter';
import { SessionPresenter } from '../presenters/SessionPresenter';
/**
* ServiceFactory - Composition root for all services
*
* Centralizes service creation and dependency injection wiring.
* Each factory method creates fresh instances with proper dependencies.
* Services now directly instantiate View Models instead of using Presenters.
*/
export class ServiceFactory {
private readonly apiClients: {
@@ -79,34 +49,6 @@ export class ServiceFactory {
media: MediaApiClient;
};
private readonly presenters: {
raceDetail: RaceDetailPresenter;
raceResultsDetail: RaceResultsDetailPresenter;
raceWithSOF: RaceWithSOFPresenter;
importRaceResults: ImportRaceResultsPresenter;
driversLeaderboard: DriversLeaderboardPresenter;
driver: DriverPresenter;
completeOnboarding: CompleteOnboardingPresenter;
driverRegistrationStatus: DriverRegistrationStatusPresenter;
teamDetails: TeamDetailsPresenter;
teamList: TeamListPresenter;
teamMembers: TeamMembersPresenter;
teamJoinRequest: TeamJoinRequestPresenter;
leagueSummary: LeagueSummaryPresenter;
leagueStandings: LeagueStandingsPresenter;
leagueMembers: LeagueMembersPresenter;
sponsorList: SponsorListPresenter;
sponsorDashboard: SponsorDashboardPresenter;
sponsorSponsorships: SponsorSponsorshipsPresenter;
sponsorshipPricing: SponsorshipPricingPresenter;
paymentList: PaymentListPresenter;
analyticsDashboard: AnalyticsDashboardPresenter;
analyticsMetrics: AnalyticsMetricsPresenter;
media: MediaPresenter;
avatar: AvatarPresenter;
session: SessionPresenter;
};
constructor(baseUrl: string) {
// Initialize API clients
this.apiClients = {
@@ -120,159 +62,83 @@ export class ServiceFactory {
analytics: new AnalyticsApiClient(baseUrl),
media: new MediaApiClient(baseUrl),
};
// Initialize presenters
this.presenters = {
raceDetail: new RaceDetailPresenter(),
raceResultsDetail: new RaceResultsDetailPresenter(),
raceWithSOF: new RaceWithSOFPresenter(),
importRaceResults: new ImportRaceResultsPresenter(),
driversLeaderboard: new DriversLeaderboardPresenter(),
driver: new DriverPresenter(),
completeOnboarding: new CompleteOnboardingPresenter(),
driverRegistrationStatus: new DriverRegistrationStatusPresenter(),
teamDetails: new TeamDetailsPresenter(),
teamList: new TeamListPresenter(),
teamMembers: new TeamMembersPresenter(),
teamJoinRequest: new TeamJoinRequestPresenter(),
leagueSummary: new LeagueSummaryPresenter(),
leagueStandings: new LeagueStandingsPresenter(),
leagueMembers: new LeagueMembersPresenter(),
sponsorList: new SponsorListPresenter(),
sponsorDashboard: new SponsorDashboardPresenter(),
sponsorSponsorships: new SponsorSponsorshipsPresenter(),
sponsorshipPricing: new SponsorshipPricingPresenter(),
paymentList: new PaymentListPresenter(),
analyticsDashboard: new AnalyticsDashboardPresenter(),
analyticsMetrics: new AnalyticsMetricsPresenter(),
media: new MediaPresenter(),
avatar: new AvatarPresenter(),
session: new SessionPresenter(),
};
}
/**
* Create RaceService instance
*/
createRaceService(): RaceService {
return new RaceService(
this.apiClients.races,
this.presenters.raceDetail
);
return new RaceService(this.apiClients.races);
}
/**
* Create RaceResultsService instance
*/
createRaceResultsService(): RaceResultsService {
return new RaceResultsService(
this.apiClients.races,
this.presenters.raceResultsDetail,
this.presenters.raceWithSOF,
this.presenters.importRaceResults
);
return new RaceResultsService(this.apiClients.races);
}
/**
* Create DriverService instance
*/
createDriverService(): DriverService {
return new DriverService(
this.apiClients.drivers,
this.presenters.driversLeaderboard,
this.presenters.driver,
this.presenters.completeOnboarding
);
return new DriverService(this.apiClients.drivers);
}
/**
* Create DriverRegistrationService instance
*/
createDriverRegistrationService(): DriverRegistrationService {
return new DriverRegistrationService(
this.apiClients.drivers,
this.presenters.driverRegistrationStatus
);
return new DriverRegistrationService(this.apiClients.drivers);
}
/**
* Create TeamService instance
*/
createTeamService(): TeamService {
return new TeamService(
this.apiClients.teams,
this.presenters.teamList,
this.presenters.teamDetails,
this.presenters.teamMembers
);
return new TeamService(this.apiClients.teams);
}
/**
* Create TeamJoinService instance
*/
createTeamJoinService(): TeamJoinService {
return new TeamJoinService(
this.apiClients.teams,
this.presenters.teamJoinRequest
);
return new TeamJoinService(this.apiClients.teams);
}
/**
* Create LeagueService instance
*/
createLeagueService(): LeagueService {
return new LeagueService(
this.apiClients.leagues,
this.presenters.leagueSummary,
this.presenters.leagueStandings
);
return new LeagueService(this.apiClients.leagues);
}
/**
* Create LeagueMembershipService instance
*/
createLeagueMembershipService(): LeagueMembershipService {
return new LeagueMembershipService(
this.apiClients.leagues,
this.presenters.leagueMembers
);
return new LeagueMembershipService(this.apiClients.leagues);
}
/**
* Create SponsorService instance
*/
createSponsorService(): SponsorService {
return new SponsorService(
this.apiClients.sponsors,
this.presenters.sponsorList,
this.presenters.sponsorDashboard,
this.presenters.sponsorSponsorships
);
return new SponsorService(this.apiClients.sponsors);
}
/**
* Create SponsorshipService instance
*/
createSponsorshipService(): SponsorshipService {
return new SponsorshipService(
this.apiClients.sponsors,
this.presenters.sponsorshipPricing,
this.presenters.sponsorSponsorships
);
return new SponsorshipService(this.apiClients.sponsors);
}
/**
* Create PaymentService instance
*/
createPaymentService(): PaymentService {
return new PaymentService(
this.apiClients.payments,
this.presenters.paymentList,
presentPayment,
presentMembershipFee,
presentPrize,
presentWallet
);
return new PaymentService(this.apiClients.payments);
}
/**
@@ -286,31 +152,21 @@ export class ServiceFactory {
* Create DashboardService instance
*/
createDashboardService(): DashboardService {
return new DashboardService(
this.apiClients.analytics,
this.presenters.analyticsDashboard,
this.presenters.analyticsMetrics
);
return new DashboardService(this.apiClients.analytics);
}
/**
* Create MediaService instance
*/
createMediaService(): MediaService {
return new MediaService(
this.apiClients.media,
this.presenters.media
);
return new MediaService(this.apiClients.media);
}
/**
* Create AvatarService instance
*/
createAvatarService(): AvatarService {
return new AvatarService(
this.apiClients.media,
this.presenters.avatar
);
return new AvatarService(this.apiClients.media);
}
/**
@@ -338,9 +194,6 @@ export class ServiceFactory {
* Create SessionService instance
*/
createSessionService(): SessionService {
return new SessionService(
this.apiClients.auth,
this.presenters.session
);
return new SessionService(this.apiClients.auth);
}
}