From 095885544b62d063cb763f3f412b9d0f61612847 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Fri, 16 Jan 2026 18:21:06 +0100 Subject: [PATCH] website refactor --- .../use-cases/ListUsersUseCase.test.ts | 2 +- core/admin/domain/errors/AdminDomainError.ts | 4 +- .../GetLeagueEligibilityPreviewQuery.ts | 3 +- .../GetUserRatingsSummaryQuery.test.ts | 25 +++--- .../AdminVoteSessionUseCases.test.ts | 9 +- .../AppendRatingEventsUseCase.test.ts | 3 - .../use-cases/AppendRatingEventsUseCase.ts | 4 +- .../use-cases/CloseAdminVoteSessionUseCase.ts | 5 +- .../use-cases/GetCurrentSessionUseCase.ts | 3 +- .../use-cases/LoginWithEmailUseCase.ts | 3 +- ...aceRatingEventsUseCase.integration.test.ts | 2 - .../RecordRaceRatingEventsUseCase.test.ts | 7 +- .../RecordRaceRatingEventsUseCase.ts | 2 - .../use-cases/SignupWithEmailUseCase.ts | 3 +- ...ernalGameRatingUseCase.integration.test.ts | 19 ++-- .../UpsertExternalGameRatingUseCase.test.ts | 42 ++++++--- .../domain/errors/IdentityDomainError.ts | 3 +- .../ExternalGameRatingRepository.test.ts | 8 +- .../AdminTrustRatingCalculator.test.ts | 6 +- .../services/DrivingRatingCalculator.ts | 6 +- .../services/EligibilityEvaluator.test.ts | 2 +- .../domain/services/EligibilityEvaluator.ts | 9 +- .../services/RatingUpdateService.test.ts | 13 +-- core/identity/domain/types/Eligibility.ts | 55 ++++++++++++ .../AdminTrustReasonCode.test.ts | 19 ++-- .../value-objects/DrivingReasonCode.test.ts | 23 ++--- .../use-cases/DeleteMediaUseCase.ts | 2 + .../application/use-cases/GetAvatarUseCase.ts | 2 + .../application/use-cases/GetMediaUseCase.ts | 2 + .../RequestAvatarGenerationUseCase.ts | 3 +- .../use-cases/SelectAvatarUseCase.ts | 2 + .../use-cases/UpdateAvatarUseCase.ts | 3 +- .../use-cases/UploadMediaUseCase.ts | 2 + .../GetUnreadNotificationsUseCase.ts | 5 +- .../use-cases/MarkNotificationReadUseCase.ts | 6 +- .../NotificationPreferencesUseCases.ts | 4 +- .../use-cases/SendNotificationUseCase.ts | 6 +- .../domain/errors/NotificationDomainError.ts | 3 +- .../application/use-cases/index.test.ts | 28 ------ core/payments/domain/entities/index.test.ts | 7 -- .../errors/RacingApplicationError.ts | 3 +- .../queries/GetTeamRatingLedgerQuery.test.ts | 7 +- .../GetTeamRatingsSummaryQuery.test.ts | 12 +-- .../AcceptSponsorshipRequestUseCase.ts | 6 ++ .../AppendTeamRatingEventsUseCase.test.ts | 10 ++- .../use-cases/ApplyForSponsorshipUseCase.ts | 5 +- .../use-cases/ApplyPenaltyUseCase.test.ts | 79 ++++++++++------- .../use-cases/ApplyPenaltyUseCase.ts | 10 ++- .../ApproveLeagueJoinRequestUseCase.ts | 24 +++-- .../use-cases/CancelRaceUseCase.test.ts | 6 +- .../use-cases/CancelRaceUseCase.ts | 2 + .../CloseRaceEventStewardingUseCase.test.ts | 15 ++-- .../CloseRaceEventStewardingUseCase.ts | 5 +- .../CompleteDriverOnboardingUseCase.ts | 2 +- .../use-cases/CompleteRaceUseCase.test.ts | 12 +-- .../CreateLeagueSeasonScheduleRaceUseCase.ts | 12 +++ ...CreateLeagueWithSeasonAndScoringUseCase.ts | 5 +- .../CreateSeasonForLeagueUseCase.test.ts | 50 ++++++++--- .../use-cases/CreateSponsorUseCase.ts | 3 +- .../use-cases/CreateTeamUseCase.test.ts | 9 +- .../use-cases/CreateTeamUseCase.ts | 5 +- .../DeleteLeagueSeasonScheduleRaceUseCase.ts | 8 +- .../use-cases/FileProtestUseCase.test.ts | 37 +++++--- ...aguesWithCapacityAndScoringUseCase.test.ts | 10 +-- .../GetAllRacesPageDataUseCase.test.ts | 54 +++++++++--- .../use-cases/GetAllRacesPageDataUseCase.ts | 12 ++- .../use-cases/GetAllRacesUseCase.ts | 3 + .../use-cases/GetAllTeamsUseCase.ts | 8 +- .../use-cases/GetDriverLiveriesUseCase.ts | 3 +- .../use-cases/GetDriverTeamUseCase.ts | 4 +- .../use-cases/GetDriversLeaderboardUseCase.ts | 9 +- .../GetEntitySponsorshipPricingUseCase.ts | 2 + .../GetLeagueAdminPermissionsUseCase.ts | 6 ++ .../use-cases/GetLeagueAdminUseCase.test.ts | 16 +++- .../GetLeagueDriverSeasonStatsUseCase.test.ts | 87 ++++++++++++++++--- .../GetLeagueFullConfigUseCase.test.ts | 21 ++--- .../GetLeagueMembershipsUseCase.test.ts | 14 +-- .../GetLeagueOwnerSummaryUseCase.test.ts | 15 ++-- .../GetLeagueScheduleUseCase.test.ts | 9 +- .../use-cases/GetLeagueScheduleUseCase.ts | 7 +- .../GetLeagueScoringConfigUseCase.test.ts | 35 +++++--- .../use-cases/GetRaceDetailUseCase.test.ts | 1 - .../use-cases/GetRacePenaltiesUseCase.test.ts | 1 - .../use-cases/GetRaceProtestsUseCase.test.ts | 9 +- .../GetRaceRegistrationsUseCase.test.ts | 9 +- .../GetRaceResultsDetailUseCase.test.ts | 12 +-- .../use-cases/GetRaceWithSOFUseCase.test.ts | 14 +-- .../use-cases/GetRacesPageDataUseCase.ts | 14 ++- .../use-cases/GetSeasonDetailsUseCase.test.ts | 6 +- .../GetSeasonSponsorshipsUseCase.test.ts | 13 +-- .../use-cases/GetSponsorsUseCase.ts | 1 + .../GetTeamJoinRequestsUseCase.test.ts | 14 +-- .../use-cases/GetTeamMembersUseCase.test.ts | 14 ++- .../use-cases/GetTeamMembersUseCase.ts | 4 + .../GetTeamMembershipUseCase.test.ts | 22 +++-- .../use-cases/GetTeamMembershipUseCase.ts | 3 + .../GetTeamsLeaderboardUseCase.test.ts | 13 ++- .../use-cases/GetTeamsLeaderboardUseCase.ts | 6 +- .../use-cases/GetTotalDriversUseCase.ts | 1 + .../use-cases/GetTotalLeaguesUseCase.ts | 1 + .../use-cases/GetTotalRacesUseCase.ts | 1 + .../use-cases/ImportRaceResultsApiUseCase.ts | 6 ++ .../use-cases/ImportRaceResultsUseCase.ts | 6 ++ .../use-cases/JoinLeagueUseCase.ts | 3 +- .../application/use-cases/JoinTeamUseCase.ts | 4 +- ...gueSeasonScheduleMutationsUseCases.test.ts | 54 +++++++----- .../application/use-cases/LeaveTeamUseCase.ts | 4 +- .../PublishLeagueSeasonScheduleUseCase.ts | 6 +- .../use-cases/QuickPenaltyUseCase.ts | 9 +- ...RecalculateChampionshipStandingsUseCase.ts | 11 ++- ...RecomputeTeamRatingSnapshotUseCase.test.ts | 7 +- .../RecordTeamRaceRatingEventsUseCase.test.ts | 12 +-- .../RejectLeagueJoinRequestUseCase.test.ts | 7 +- .../RejectSponsorshipRequestUseCase.ts | 6 ++ .../RejectTeamJoinRequestUseCase.test.ts | 2 +- .../use-cases/RejectTeamJoinRequestUseCase.ts | 11 ++- .../use-cases/ReopenRaceUseCase.ts | 2 + .../use-cases/ReviewProtestUseCase.ts | 8 +- .../use-cases/SeasonUseCases.test.ts | 4 - .../use-cases/SendFinalResultsUseCase.ts | 6 +- .../SendPerformanceSummaryUseCase.ts | 9 +- .../use-cases/TeamRankingUseCase.test.ts | 1 - .../TeamRatingFactoryUseCase.test.ts | 2 +- .../use-cases/TeamRatingFactoryUseCase.ts | 3 +- .../TransferLeagueOwnershipUseCase.ts | 6 ++ .../UnpublishLeagueSeasonScheduleUseCase.ts | 6 +- .../use-cases/UpdateDriverProfileUseCase.ts | 2 +- .../UpdateLeagueMemberRoleUseCase.test.ts | 7 +- .../UpdateLeagueSeasonScheduleRaceUseCase.ts | 4 +- .../use-cases/UpdateTeamUseCase.test.ts | 18 ---- .../WithdrawFromLeagueWalletUseCase.test.ts | 23 +++-- .../WithdrawFromLeagueWalletUseCase.ts | 5 +- .../use-cases/WithdrawFromRaceUseCase.test.ts | 20 +++-- .../use-cases/WithdrawFromRaceUseCase.ts | 2 +- core/racing/domain/entities/Protest.ts | 3 +- .../domain/entities/TeamRatingEvent.test.ts | 10 +-- .../championship/ChampionshipStanding.ts | 4 +- .../racing/domain/entities/penalty/Penalty.ts | 6 +- .../domain/entities/season/Season.test.ts | 3 +- .../racing/domain/errors/RacingDomainError.ts | 3 +- .../value-objects/SeasonDropPolicy.test.ts | 2 +- core/shared/errors/DomainError.ts | 1 + .../GetCurrentUserSocialUseCase.test.ts | 23 +++-- .../use-cases/GetCurrentUserSocialUseCase.ts | 2 +- .../use-cases/GetUserFeedUseCase.ts | 2 +- .../social/domain/errors/SocialDomainError.ts | 3 +- 146 files changed, 970 insertions(+), 524 deletions(-) create mode 100644 core/identity/domain/types/Eligibility.ts delete mode 100644 core/payments/application/use-cases/index.test.ts delete mode 100644 core/payments/domain/entities/index.test.ts diff --git a/core/admin/application/use-cases/ListUsersUseCase.test.ts b/core/admin/application/use-cases/ListUsersUseCase.test.ts index 53522d098..6f1fcab24 100644 --- a/core/admin/application/use-cases/ListUsersUseCase.test.ts +++ b/core/admin/application/use-cases/ListUsersUseCase.test.ts @@ -1,5 +1,5 @@ import { vi, describe, it, expect, beforeEach } from 'vitest'; -import { ListUsersUseCase, ListUsersResult } from './ListUsersUseCase'; +import { ListUsersUseCase } from './ListUsersUseCase'; import { AdminUserRepository } from '../ports/AdminUserRepository'; import { AdminUser } from '../../domain/entities/AdminUser'; import { AuthorizationService } from '../../domain/services/AuthorizationService'; diff --git a/core/admin/domain/errors/AdminDomainError.ts b/core/admin/domain/errors/AdminDomainError.ts index f8dcc0367..eebde19a8 100644 --- a/core/admin/domain/errors/AdminDomainError.ts +++ b/core/admin/domain/errors/AdminDomainError.ts @@ -1,6 +1,6 @@ -import type { DomainErrorProps, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; +import type { DomainError, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; -export abstract class AdminDomainError extends Error implements DomainErrorProps { +export abstract class AdminDomainError extends Error implements DomainError { readonly type = 'domain' as const; readonly context = 'admin-domain'; abstract readonly kind: CommonDomainErrorKind; diff --git a/core/identity/application/queries/GetLeagueEligibilityPreviewQuery.ts b/core/identity/application/queries/GetLeagueEligibilityPreviewQuery.ts index ec370face..03f0c5728 100644 --- a/core/identity/application/queries/GetLeagueEligibilityPreviewQuery.ts +++ b/core/identity/application/queries/GetLeagueEligibilityPreviewQuery.ts @@ -5,8 +5,7 @@ * Uses EligibilityEvaluator to provide explainable results. */ -import { EvaluationResultDto } from '../dtos/EvaluationResultDto'; -import { EligibilityFilterDto } from '../dtos/EligibilityFilterDto'; +import { EvaluationResultDto, EligibilityFilterDto } from '../../domain/types/Eligibility'; import { EligibilityEvaluator, RatingData } from '../../domain/services/EligibilityEvaluator'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; import { ExternalGameRatingRepository } from '../../domain/repositories/ExternalGameRatingRepository'; diff --git a/core/identity/application/queries/GetUserRatingsSummaryQuery.test.ts b/core/identity/application/queries/GetUserRatingsSummaryQuery.test.ts index 3ec519939..2aa492c81 100644 --- a/core/identity/application/queries/GetUserRatingsSummaryQuery.test.ts +++ b/core/identity/application/queries/GetUserRatingsSummaryQuery.test.ts @@ -2,7 +2,7 @@ * Tests for GetUserRatingsSummaryQuery */ -import { describe, expect, it, beforeEach, vi } from 'vitest'; +import { describe, expect, it, beforeEach, vi, type Mock } from 'vitest'; import { GetUserRatingsSummaryQuery, GetUserRatingsSummaryQueryHandler } from './GetUserRatingsSummaryQuery'; import { UserRating } from '../../domain/value-objects/UserRating'; import { ExternalGameRatingProfile } from '../../domain/entities/ExternalGameRatingProfile'; @@ -13,11 +13,16 @@ import { RatingEvent } from '../../domain/entities/RatingEvent'; import { RatingEventId } from '../../domain/value-objects/RatingEventId'; import { RatingDimensionKey } from '../../domain/value-objects/RatingDimensionKey'; import { RatingDelta } from '../../domain/value-objects/RatingDelta'; +import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; +import { ExternalGameRatingRepository } from '../../domain/repositories/ExternalGameRatingRepository'; +import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository'; + +import { UserId } from '../../domain/value-objects/UserId'; describe('GetUserRatingsSummaryQuery', () => { - let mockUserRatingRepo: any; - let mockExternalRatingRepo: any; - let mockRatingEventRepo: any; + let mockUserRatingRepo: { findByUserId: Mock }; + let mockExternalRatingRepo: { findByUserId: Mock }; + let mockRatingEventRepo: { getAllByUserId: Mock }; let handler: GetUserRatingsSummaryQueryHandler; beforeEach(() => { @@ -32,9 +37,9 @@ describe('GetUserRatingsSummaryQuery', () => { }; handler = new GetUserRatingsSummaryQueryHandler( - mockUserRatingRepo, - mockExternalRatingRepo, - mockRatingEventRepo + mockUserRatingRepo as unknown as UserRatingRepository, + mockExternalRatingRepo as unknown as ExternalGameRatingRepository, + mockRatingEventRepo as unknown as RatingEventRepository ); }); @@ -49,7 +54,7 @@ describe('GetUserRatingsSummaryQuery', () => { // Mock external ratings const gameKey = GameKey.create('iracing'); const profile = ExternalGameRatingProfile.create({ - userId: { toString: () => userId } as any, + userId: UserId.fromString(userId), gameKey, ratings: new Map([ ['iRating', ExternalRating.create(gameKey, 'iRating', 2200)], @@ -109,7 +114,7 @@ describe('GetUserRatingsSummaryQuery', () => { // Multiple game profiles const iracingProfile = ExternalGameRatingProfile.create({ - userId: { toString: () => userId } as any, + userId: UserId.fromString(userId), gameKey: GameKey.create('iracing'), ratings: new Map([ ['iRating', ExternalRating.create(GameKey.create('iracing'), 'iRating', 2200)], @@ -118,7 +123,7 @@ describe('GetUserRatingsSummaryQuery', () => { }); const assettoProfile = ExternalGameRatingProfile.create({ - userId: { toString: () => userId } as any, + userId: UserId.fromString(userId), gameKey: GameKey.create('assetto'), ratings: new Map([ ['rating', ExternalRating.create(GameKey.create('assetto'), 'rating', 85)], diff --git a/core/identity/application/use-cases/AdminVoteSessionUseCases.test.ts b/core/identity/application/use-cases/AdminVoteSessionUseCases.test.ts index 283e8df70..5a39610c0 100644 --- a/core/identity/application/use-cases/AdminVoteSessionUseCases.test.ts +++ b/core/identity/application/use-cases/AdminVoteSessionUseCases.test.ts @@ -134,14 +134,16 @@ class MockUserRatingRepository { } } +import { CreateRatingEventDto } from '../dtos/CreateRatingEventDto'; + // Mock AppendRatingEventsUseCase class MockAppendRatingEventsUseCase { constructor( - private ratingEventRepository: any, - private userRatingRepository: any + private ratingEventRepository: MockRatingEventRepository, + private userRatingRepository: MockUserRatingRepository ) {} - async execute(input: any): Promise { + async execute(input: { userId: string; events: CreateRatingEventDto[] }): Promise<{ events: string[]; snapshotUpdated: boolean }> { const events: RatingEvent[] = []; // Create events from input @@ -195,7 +197,6 @@ describe('Admin Vote Session Use Cases', () => { // Use dates relative to current time so close() works const now = new Date(Date.now() - 86400000); // Yesterday const tomorrow = new Date(Date.now() + 86400000); // Tomorrow - const dayAfter = new Date(Date.now() + 86400000 * 2); // Day after tomorrow beforeEach(() => { mockSessionRepo = new MockAdminVoteSessionRepository(); diff --git a/core/identity/application/use-cases/AppendRatingEventsUseCase.test.ts b/core/identity/application/use-cases/AppendRatingEventsUseCase.test.ts index 65305f606..805954333 100644 --- a/core/identity/application/use-cases/AppendRatingEventsUseCase.test.ts +++ b/core/identity/application/use-cases/AppendRatingEventsUseCase.test.ts @@ -3,9 +3,6 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { AppendRatingEventsUseCase, AppendRatingEventsInput } from './AppendRatingEventsUseCase'; import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; -import { RatingEvent } from '../../domain/entities/RatingEvent'; -import { UserRating } from '../../domain/value-objects/UserRating'; -import { RatingEventId } from '../../domain/value-objects/RatingEventId'; describe('AppendRatingEventsUseCase', () => { let mockEventRepo: Partial; diff --git a/core/identity/application/use-cases/AppendRatingEventsUseCase.ts b/core/identity/application/use-cases/AppendRatingEventsUseCase.ts index 26f3e047c..4fa1b5ba7 100644 --- a/core/identity/application/use-cases/AppendRatingEventsUseCase.ts +++ b/core/identity/application/use-cases/AppendRatingEventsUseCase.ts @@ -2,7 +2,7 @@ import { RatingEventRepository } from '../../domain/repositories/RatingEventRepo import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; import { RatingEventFactory } from '../../domain/services/RatingEventFactory'; import { RatingSnapshotCalculator } from '../../domain/services/RatingSnapshotCalculator'; -import { RatingEvent } from '../../domain/entities/RatingEvent'; +import { RatingEvent, type RatingEventProps } from '../../domain/entities/RatingEvent'; import { RatingEventId } from '../../domain/value-objects/RatingEventId'; import { RatingDimensionKey } from '../../domain/value-objects/RatingDimensionKey'; import { RatingDelta } from '../../domain/value-objects/RatingDelta'; @@ -97,7 +97,7 @@ export class AppendRatingEventsUseCase { } private createEventFromDto(dto: CreateRatingEventDto) { - const props: any = { + const props: RatingEventProps = { id: RatingEventId.generate(), userId: dto.userId, dimension: RatingDimensionKey.create(dto.dimension), diff --git a/core/identity/application/use-cases/CloseAdminVoteSessionUseCase.ts b/core/identity/application/use-cases/CloseAdminVoteSessionUseCase.ts index 398a12365..1b83439b4 100644 --- a/core/identity/application/use-cases/CloseAdminVoteSessionUseCase.ts +++ b/core/identity/application/use-cases/CloseAdminVoteSessionUseCase.ts @@ -1,10 +1,10 @@ import { AdminVoteSessionRepository } from '../../domain/repositories/AdminVoteSessionRepository'; import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; -import { AdminTrustRatingCalculator } from '../../domain/services/AdminTrustRatingCalculator'; import { RatingSnapshotCalculator } from '../../domain/services/RatingSnapshotCalculator'; import { RatingEventFactory } from '../../domain/services/RatingEventFactory'; import { CloseAdminVoteSessionInput, CloseAdminVoteSessionOutput } from '../dtos/AdminVoteSessionDto'; +import { AdminVoteSession, AdminVoteOutcome } from '../../domain/entities/AdminVoteSession'; /** * Use Case: CloseAdminVoteSessionUseCase @@ -26,7 +26,6 @@ export class CloseAdminVoteSessionUseCase { private readonly adminVoteSessionRepository: AdminVoteSessionRepository, private readonly ratingEventRepository: RatingEventRepository, private readonly userRatingRepository: UserRatingRepository, - private readonly appendRatingEventsUseCase: any, // Will be typed properly in integration ) {} async execute(input: CloseAdminVoteSessionInput): Promise { @@ -117,7 +116,7 @@ export class CloseAdminVoteSessionUseCase { * Events are created for the admin being voted on * Per plans: no events are created for tie outcomes */ - private async createRatingEvents(session: any, outcome: any): Promise { + private async createRatingEvents(session: AdminVoteSession, outcome: AdminVoteOutcome): Promise { let eventsCreated = 0; // Don't create events for tie outcomes diff --git a/core/identity/application/use-cases/GetCurrentSessionUseCase.ts b/core/identity/application/use-cases/GetCurrentSessionUseCase.ts index afa32ae38..69b659e94 100644 --- a/core/identity/application/use-cases/GetCurrentSessionUseCase.ts +++ b/core/identity/application/use-cases/GetCurrentSessionUseCase.ts @@ -1,7 +1,8 @@ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { User } from '../../domain/entities/User'; +import { UserRepository } from '../../domain/repositories/UserRepository'; export type GetCurrentSessionInput = { userId: string; diff --git a/core/identity/application/use-cases/LoginWithEmailUseCase.ts b/core/identity/application/use-cases/LoginWithEmailUseCase.ts index 7b86d835e..48da514b8 100644 --- a/core/identity/application/use-cases/LoginWithEmailUseCase.ts +++ b/core/identity/application/use-cases/LoginWithEmailUseCase.ts @@ -4,11 +4,12 @@ * Authenticates a user with email and password. */ -import { PasswordHash } from '@/identity/domain/value-objects/PasswordHash'; +import { PasswordHash } from '../../domain/value-objects/PasswordHash'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { IdentitySessionPort } from '../ports/IdentitySessionPort'; +import { UserRepository } from '../../domain/repositories/UserRepository'; export type LoginWithEmailInput = { email: string; diff --git a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.integration.test.ts b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.integration.test.ts index 684f3e389..328f24e44 100644 --- a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.integration.test.ts +++ b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.integration.test.ts @@ -6,8 +6,6 @@ import { AppendRatingEventsUseCase } from './AppendRatingEventsUseCase'; import { UserRating } from '../../domain/value-objects/UserRating'; import { RatingEvent } from '../../domain/entities/RatingEvent'; import { RatingEventId } from '../../domain/value-objects/RatingEventId'; -import { RatingDimensionKey } from '../../domain/value-objects/RatingDimensionKey'; -import { RatingDelta } from '../../domain/value-objects/RatingDelta'; // In-memory implementations for integration testing class InMemoryRaceResultsProvider implements RaceResultsProvider { diff --git a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.test.ts b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.test.ts index 2914bc630..49deb219d 100644 --- a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.test.ts +++ b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.test.ts @@ -6,8 +6,7 @@ import { AppendRatingEventsUseCase } from './AppendRatingEventsUseCase'; import { UserRating } from '../../domain/value-objects/UserRating'; import { RatingEvent } from '../../domain/entities/RatingEvent'; import { RatingEventId } from '../../domain/value-objects/RatingEventId'; -import { RatingDimensionKey } from '../../domain/value-objects/RatingDimensionKey'; -import { RatingDelta } from '../../domain/value-objects/RatingDelta'; +import { describe, it, expect, beforeEach } from 'vitest'; // Mock implementations class MockRaceResultsProvider implements RaceResultsProvider { @@ -17,11 +16,11 @@ class MockRaceResultsProvider implements RaceResultsProvider { this.results = results; } - async getRaceResults(raceId: string): Promise { + async getRaceResults(_raceId: string): Promise { return this.results; } - async hasRaceResults(raceId: string): Promise { + async hasRaceResults(_raceId: string): Promise { return this.results !== null; } } diff --git a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.ts b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.ts index 0af95d08d..1f5eab634 100644 --- a/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.ts +++ b/core/identity/application/use-cases/RecordRaceRatingEventsUseCase.ts @@ -2,8 +2,6 @@ import { RaceResultsProvider } from '../ports/RaceResultsProvider'; import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; import { RatingEventFactory } from '../../domain/services/RatingEventFactory'; -import { DrivingRatingCalculator } from '../../domain/services/DrivingRatingCalculator'; -import { RatingSnapshotCalculator } from '../../domain/services/RatingSnapshotCalculator'; import { AppendRatingEventsUseCase } from './AppendRatingEventsUseCase'; import { RecordRaceRatingEventsInput, RecordRaceRatingEventsOutput } from '../dtos/RecordRaceRatingEventsDto'; diff --git a/core/identity/application/use-cases/SignupWithEmailUseCase.ts b/core/identity/application/use-cases/SignupWithEmailUseCase.ts index f8546f9bd..8c096e408 100644 --- a/core/identity/application/use-cases/SignupWithEmailUseCase.ts +++ b/core/identity/application/use-cases/SignupWithEmailUseCase.ts @@ -1,6 +1,7 @@ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import type { StoredUser } from '../../domain/repositories/UserRepository'; +import type { StoredUser, UserRepository } from '../../domain/repositories/UserRepository'; import type { AuthenticatedUser } from '../ports/IdentityProviderPort'; import type { IdentitySessionPort } from '../ports/IdentitySessionPort'; diff --git a/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.integration.test.ts b/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.integration.test.ts index 97e4141f0..a84f39f80 100644 --- a/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.integration.test.ts +++ b/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.integration.test.ts @@ -1,27 +1,30 @@ +import { describe, it, expect, beforeEach } from 'vitest'; import { UpsertExternalGameRatingUseCase } from './UpsertExternalGameRatingUseCase'; import { UpsertExternalGameRatingInput } from '../dtos/UpsertExternalGameRatingDto'; +import { ExternalGameRatingProfile } from '../../domain/entities/ExternalGameRatingProfile'; +import { ExternalGameRatingRepository } from '../../domain/repositories/ExternalGameRatingRepository'; // Mock repository for integration test class MockExternalGameRatingRepository { - private profiles = new Map(); + private profiles = new Map(); private getKey(userId: string, gameKey: string): string { return `${userId}|${gameKey}`; } - async findByUserIdAndGameKey(userId: string, gameKey: string): Promise { + async findByUserIdAndGameKey(userId: string, gameKey: string): Promise { return this.profiles.get(this.getKey(userId, gameKey)) || null; } - async findByUserId(userId: string): Promise { - return Array.from(this.profiles.values()).filter((p: any) => p.userId.toString() === userId); + async findByUserId(userId: string): Promise { + return Array.from(this.profiles.values()).filter((p: ExternalGameRatingProfile) => p.userId.toString() === userId); } - async findByGameKey(gameKey: string): Promise { - return Array.from(this.profiles.values()).filter((p: any) => p.gameKey.toString() === gameKey); + async findByGameKey(gameKey: string): Promise { + return Array.from(this.profiles.values()).filter((p: ExternalGameRatingProfile) => p.gameKey.toString() === gameKey); } - async save(profile: any): Promise { + async save(profile: ExternalGameRatingProfile): Promise { const key = this.getKey(profile.userId.toString(), profile.gameKey.toString()); this.profiles.set(key, profile); return profile; @@ -50,7 +53,7 @@ describe('UpsertExternalGameRatingUseCase - Integration', () => { beforeEach(() => { repository = new MockExternalGameRatingRepository(); - useCase = new UpsertExternalGameRatingUseCase(repository as any); + useCase = new UpsertExternalGameRatingUseCase(repository as unknown as ExternalGameRatingRepository); }); describe('Full upsert flow', () => { diff --git a/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.test.ts b/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.test.ts index 1a05c7f45..283029ae4 100644 --- a/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.test.ts +++ b/core/identity/application/use-cases/UpsertExternalGameRatingUseCase.test.ts @@ -6,11 +6,19 @@ import { GameKey } from '../../domain/value-objects/GameKey'; import { ExternalRating } from '../../domain/value-objects/ExternalRating'; import { ExternalRatingProvenance } from '../../domain/value-objects/ExternalRatingProvenance'; import { UpsertExternalGameRatingInput } from '../dtos/UpsertExternalGameRatingDto'; -import { vi, describe, it, expect, beforeEach } from 'vitest'; +import { vi, describe, it, expect, beforeEach, type Mock } from 'vitest'; describe('UpsertExternalGameRatingUseCase', () => { let useCase: UpsertExternalGameRatingUseCase; - let mockRepository: ExternalGameRatingRepository; + let mockRepository: { + findByUserIdAndGameKey: Mock; + findByUserId: Mock; + findByGameKey: Mock; + save: Mock; + saveMany: Mock; + delete: Mock; + exists: Mock; + }; beforeEach(() => { mockRepository = { @@ -21,9 +29,17 @@ describe('UpsertExternalGameRatingUseCase', () => { saveMany: vi.fn(), delete: vi.fn(), exists: vi.fn(), - } as any; + } as unknown as { + findByUserIdAndGameKey: Mock; + findByUserId: Mock; + findByGameKey: Mock; + save: Mock; + saveMany: Mock; + delete: Mock; + exists: Mock; + }; - useCase = new UpsertExternalGameRatingUseCase(mockRepository); + useCase = new UpsertExternalGameRatingUseCase(mockRepository as unknown as ExternalGameRatingRepository); }); describe('execute', () => { @@ -42,8 +58,8 @@ describe('UpsertExternalGameRatingUseCase', () => { }, }; - (mockRepository.findByUserIdAndGameKey as any).mockResolvedValue(null); - (mockRepository.save as any).mockImplementation(async (profile: any) => profile); + mockRepository.findByUserIdAndGameKey.mockResolvedValue(null); + mockRepository.save.mockImplementation(async (profile: ExternalGameRatingProfile) => profile); const result = await useCase.execute(input); @@ -61,8 +77,8 @@ describe('UpsertExternalGameRatingUseCase', () => { it('should update existing profile', async () => { const existingProfile = createTestProfile('user-123', 'iracing'); - (mockRepository.findByUserIdAndGameKey as any).mockResolvedValue(existingProfile); - (mockRepository.save as any).mockImplementation(async (profile: any) => profile); + mockRepository.findByUserIdAndGameKey.mockResolvedValue(existingProfile); + mockRepository.save.mockImplementation(async (profile: ExternalGameRatingProfile) => profile); const input: UpsertExternalGameRatingInput = { userId: 'user-123', @@ -211,7 +227,7 @@ describe('UpsertExternalGameRatingUseCase', () => { }, }; - (mockRepository.findByUserIdAndGameKey as any).mockRejectedValue(new Error('Database connection failed')); + mockRepository.findByUserIdAndGameKey.mockRejectedValue(new Error('Database connection failed')); const result = await useCase.execute(input); @@ -232,8 +248,8 @@ describe('UpsertExternalGameRatingUseCase', () => { }, }; - (mockRepository.findByUserIdAndGameKey as any).mockResolvedValue(null); - (mockRepository.save as any).mockImplementation(async (profile: any) => profile); + mockRepository.findByUserIdAndGameKey.mockResolvedValue(null); + mockRepository.save.mockImplementation(async (profile: ExternalGameRatingProfile) => profile); const result = await useCase.execute(input); @@ -254,8 +270,8 @@ describe('UpsertExternalGameRatingUseCase', () => { }, }; - (mockRepository.findByUserIdAndGameKey as any).mockResolvedValue(null); - (mockRepository.save as any).mockImplementation(async (profile: any) => profile); + mockRepository.findByUserIdAndGameKey.mockResolvedValue(null); + mockRepository.save.mockImplementation(async (profile: ExternalGameRatingProfile) => profile); const result = await useCase.execute(input); diff --git a/core/identity/domain/errors/IdentityDomainError.ts b/core/identity/domain/errors/IdentityDomainError.ts index a1ef8954c..c43b29546 100644 --- a/core/identity/domain/errors/IdentityDomainError.ts +++ b/core/identity/domain/errors/IdentityDomainError.ts @@ -1,5 +1,4 @@ -import type { DomainError } from '@core/shared/errors/DomainError'; -import type { CommonDomainErrorKind } from '@core/shared/errors/DomainError'; +import type { DomainError, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; export abstract class IdentityDomainError extends Error implements DomainError { readonly type = 'domain' as const; diff --git a/core/identity/domain/repositories/ExternalGameRatingRepository.test.ts b/core/identity/domain/repositories/ExternalGameRatingRepository.test.ts index 78c5398e0..8c4494cc3 100644 --- a/core/identity/domain/repositories/ExternalGameRatingRepository.test.ts +++ b/core/identity/domain/repositories/ExternalGameRatingRepository.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from 'vitest'; import { ExternalGameRatingRepository } from './ExternalGameRatingRepository'; import { ExternalGameRatingProfile } from '../entities/ExternalGameRatingProfile'; import { UserId } from '../value-objects/UserId'; @@ -182,11 +183,6 @@ describe('ExternalGameRatingRepository', () => { await repository.save(profile); // Update the profile - const updatedProvenance = ExternalRatingProvenance.create({ - source: 'iracing', - lastSyncedAt: new Date('2024-01-02'), - verified: true, - }); profile.updateLastSyncedAt(new Date('2024-01-02')); profile.markVerified(); @@ -290,7 +286,7 @@ describe('ExternalGameRatingRepository', () => { lastSyncedAt: new Date('2024-01-01'), verified: false, }); - profile2.updateRatings(profile2.ratings, profile2Provenance); + profile2.updateRatings(new Map(profile2.ratings), profile2Provenance); await repository.saveMany([profile1, profile2]); diff --git a/core/identity/domain/services/AdminTrustRatingCalculator.test.ts b/core/identity/domain/services/AdminTrustRatingCalculator.test.ts index beda5c04e..5a94a08be 100644 --- a/core/identity/domain/services/AdminTrustRatingCalculator.test.ts +++ b/core/identity/domain/services/AdminTrustRatingCalculator.test.ts @@ -3,7 +3,6 @@ import { RatingEvent } from '../entities/RatingEvent'; import { RatingEventId } from '../value-objects/RatingEventId'; import { RatingDimensionKey } from '../value-objects/RatingDimensionKey'; import { RatingDelta } from '../value-objects/RatingDelta'; -import { AdminVoteOutcome } from '../entities/AdminVoteSession'; describe('AdminTrustRatingCalculator', () => { describe('calculate', () => { @@ -316,13 +315,12 @@ describe('AdminTrustRatingCalculator', () => { it('should default to zero for unknown action type', () => { const input: SystemSignalInput = { - actionType: 'sla_response' as any, + actionType: 'unknown_type' as unknown as SystemSignalInput['actionType'], details: {}, }; - // Override for test const delta = AdminTrustRatingCalculator.calculateFromSystemSignal(input); - expect(delta.value).toBe(5); // Known type + expect(delta.value).toBe(0); }); }); diff --git a/core/identity/domain/services/DrivingRatingCalculator.ts b/core/identity/domain/services/DrivingRatingCalculator.ts index 4d2d192c9..b9792b55c 100644 --- a/core/identity/domain/services/DrivingRatingCalculator.ts +++ b/core/identity/domain/services/DrivingRatingCalculator.ts @@ -1,6 +1,4 @@ import { RatingEvent } from '../entities/RatingEvent'; -import { DrivingReasonCode } from '../value-objects/DrivingReasonCode'; -import { RatingDelta } from '../value-objects/RatingDelta'; /** * Input DTO for driving rating calculation from race facts @@ -71,7 +69,7 @@ export class DrivingRatingCalculator { const fieldStrength = facts.results.length > 0 ? (facts.results .filter(r => r.status === 'finished') - .reduce((sum, r) => sum + (r.sof || this.estimateDriverRating(r.userId)), 0) / + .reduce((sum, r) => sum + (r.sof || this.estimateDriverRating()), 0) / Math.max(1, facts.results.filter(r => r.status === 'finished').length)) : 0; @@ -297,7 +295,7 @@ export class DrivingRatingCalculator { * Estimate driver rating for SoF calculation * This is a placeholder - in real implementation, would query user rating snapshot */ - private static estimateDriverRating(userId: string): number { + private static estimateDriverRating(): number { // Default rating for new drivers return 50; } diff --git a/core/identity/domain/services/EligibilityEvaluator.test.ts b/core/identity/domain/services/EligibilityEvaluator.test.ts index b40379d41..38b684a72 100644 --- a/core/identity/domain/services/EligibilityEvaluator.test.ts +++ b/core/identity/domain/services/EligibilityEvaluator.test.ts @@ -3,7 +3,7 @@ */ import { EligibilityEvaluator, RatingData } from './EligibilityEvaluator'; -import { EligibilityFilterDto } from '../../application/dtos/EligibilityFilterDto'; +import { EligibilityFilterDto } from '../types/Eligibility'; describe('EligibilityEvaluator', () => { let evaluator: EligibilityEvaluator; diff --git a/core/identity/domain/services/EligibilityEvaluator.ts b/core/identity/domain/services/EligibilityEvaluator.ts index 6674e8c00..48ac6c3c6 100644 --- a/core/identity/domain/services/EligibilityEvaluator.ts +++ b/core/identity/domain/services/EligibilityEvaluator.ts @@ -6,8 +6,13 @@ * Provides explainable results with detailed reasons. */ -import { EvaluationResultDto, EvaluationReason } from '../../application/dtos/EvaluationResultDto'; -import { EligibilityFilterDto, ParsedEligibilityFilter, EligibilityCondition } from '../../application/dtos/EligibilityFilterDto'; +import { + EvaluationResultDto, + EvaluationReason, + EligibilityFilterDto, + ParsedEligibilityFilter, + EligibilityCondition +} from '../types/Eligibility'; export interface RatingData { platform: { diff --git a/core/identity/domain/services/RatingUpdateService.test.ts b/core/identity/domain/services/RatingUpdateService.test.ts index 550b83105..bba3c7406 100644 --- a/core/identity/domain/services/RatingUpdateService.test.ts +++ b/core/identity/domain/services/RatingUpdateService.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { RatingUpdateService } from './RatingUpdateService'; import type { UserRatingRepository } from '../repositories/UserRatingRepository'; import type { RatingEventRepository } from '../repositories/RatingEventRepository'; @@ -10,8 +10,8 @@ import { RatingDelta } from '../value-objects/RatingDelta'; describe('RatingUpdateService - Slice 7 Evolution', () => { let service: RatingUpdateService; - let userRatingRepository: any; - let ratingEventRepository: any; + let userRatingRepository: { findByUserId: Mock; save: Mock }; + let ratingEventRepository: { save: Mock; getAllByUserId: Mock }; beforeEach(() => { userRatingRepository = { @@ -24,7 +24,10 @@ describe('RatingUpdateService - Slice 7 Evolution', () => { getAllByUserId: vi.fn(), }; - service = new RatingUpdateService(userRatingRepository, ratingEventRepository); + service = new RatingUpdateService( + userRatingRepository as unknown as UserRatingRepository, + ratingEventRepository as unknown as RatingEventRepository + ); }); describe('recordRaceRatingEvents - Ledger-based approach', () => { @@ -150,7 +153,7 @@ describe('RatingUpdateService - Slice 7 Evolution', () => { // Verify DNF penalty event was created const savedEvents = ratingEventRepository.save.mock.calls.map(call => call[0]); - const hasDnfPenalty = savedEvents.some((event: any) => + const hasDnfPenalty = savedEvents.some((event: RatingEvent) => event.reason.code === 'DRIVING_DNF_PENALTY' ); expect(hasDnfPenalty).toBe(true); diff --git a/core/identity/domain/types/Eligibility.ts b/core/identity/domain/types/Eligibility.ts new file mode 100644 index 000000000..baf5c22f1 --- /dev/null +++ b/core/identity/domain/types/Eligibility.ts @@ -0,0 +1,55 @@ +/** + * Domain Types: Eligibility + * + * DSL-based eligibility filter and evaluation results. + */ + +export interface EligibilityFilterDto { + /** + * DSL expression for eligibility rules + */ + dsl: string; + + /** + * Optional context for evaluation + */ + context?: { + userId?: string; + leagueId?: string; + [key: string]: unknown; + }; +} + +export interface EligibilityCondition { + target: 'platform' | 'external'; + dimension?: string; + game?: string; + operator: string; + expected: number | [number, number]; +} + +export interface ParsedEligibilityFilter { + conditions: EligibilityCondition[]; + logicalOperator: 'AND' | 'OR'; +} + +export interface EvaluationReason { + target: string; + operator: string; + expected: number | [number, number]; + actual: number; + failed: boolean; + message?: string; +} + +export interface EvaluationResultDto { + eligible: boolean; + reasons: EvaluationReason[]; + summary: string; + evaluatedAt: string; + metadata?: { + userId?: string; + filter?: string; + [key: string]: unknown; + }; +} diff --git a/core/identity/domain/value-objects/AdminTrustReasonCode.test.ts b/core/identity/domain/value-objects/AdminTrustReasonCode.test.ts index da0aef32a..34b6f21f3 100644 --- a/core/identity/domain/value-objects/AdminTrustReasonCode.test.ts +++ b/core/identity/domain/value-objects/AdminTrustReasonCode.test.ts @@ -1,5 +1,6 @@ -import { AdminTrustReasonCode } from './AdminTrustReasonCode'; +import { AdminTrustReasonCode, type AdminTrustReasonCodeValue } from './AdminTrustReasonCode'; import { IdentityDomainValidationError } from '../errors/IdentityDomainError'; +import { describe, it, expect } from 'vitest'; describe('AdminTrustReasonCode', () => { describe('create', () => { @@ -71,7 +72,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_VOTE_OUTCOME_NEGATIVE', ]; voteCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isVoteOutcome()).toBe(true); }); }); @@ -82,7 +83,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_REVERSAL_PENALTY', ]; nonVoteCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isVoteOutcome()).toBe(false); }); }); @@ -97,7 +98,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_ABUSE_REPORT_PENALTY', ]; systemCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isSystemSignal()).toBe(true); }); }); @@ -108,7 +109,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_VOTE_OUTCOME_NEGATIVE', ]; nonSystemCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isSystemSignal()).toBe(false); }); }); @@ -122,7 +123,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_RULE_CLARITY_BONUS', ]; positiveCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isPositive()).toBe(true); }); }); @@ -134,7 +135,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_ABUSE_REPORT_PENALTY', ]; nonPositiveCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isPositive()).toBe(false); }); }); @@ -148,7 +149,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_ABUSE_REPORT_PENALTY', ]; negativeCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isNegative()).toBe(true); }); }); @@ -160,7 +161,7 @@ describe('AdminTrustReasonCode', () => { 'ADMIN_ACTION_RULE_CLARITY_BONUS', ]; nonNegativeCodes.forEach(codeStr => { - const code = AdminTrustReasonCode.fromValue(codeStr as any); + const code = AdminTrustReasonCode.fromValue(codeStr as AdminTrustReasonCodeValue); expect(code.isNegative()).toBe(false); }); }); diff --git a/core/identity/domain/value-objects/DrivingReasonCode.test.ts b/core/identity/domain/value-objects/DrivingReasonCode.test.ts index a0973dba2..da15ab909 100644 --- a/core/identity/domain/value-objects/DrivingReasonCode.test.ts +++ b/core/identity/domain/value-objects/DrivingReasonCode.test.ts @@ -1,5 +1,6 @@ -import { DrivingReasonCode } from './DrivingReasonCode'; +import { DrivingReasonCode, type DrivingReasonCodeValue } from './DrivingReasonCode'; import { IdentityDomainValidationError } from '../errors/IdentityDomainError'; +import { describe, it, expect } from 'vitest'; describe('DrivingReasonCode', () => { describe('create', () => { @@ -77,7 +78,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_PACE_RELATIVE_GAIN', ]; performanceCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isPerformance()).toBe(true); }); }); @@ -89,7 +90,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_SEASON_ATTENDANCE_BONUS', ]; nonPerformanceCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isPerformance()).toBe(false); }); }); @@ -103,7 +104,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_PENALTY_INVOLVEMENT_PENALTY', ]; cleanDrivingCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isCleanDriving()).toBe(true); }); }); @@ -115,7 +116,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_SEASON_ATTENDANCE_BONUS', ]; nonCleanDrivingCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isCleanDriving()).toBe(false); }); }); @@ -131,7 +132,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_SEASON_ATTENDANCE_BONUS', ]; reliabilityCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isReliability()).toBe(true); }); }); @@ -142,7 +143,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_INCIDENTS_PENALTY', ]; nonReliabilityCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isReliability()).toBe(false); }); }); @@ -160,7 +161,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_AFK_PENALTY', ]; penaltyCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isPenalty()).toBe(true); }); }); @@ -172,7 +173,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_SEASON_ATTENDANCE_BONUS', ]; nonPenaltyCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isPenalty()).toBe(false); }); }); @@ -187,7 +188,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_PACE_RELATIVE_GAIN', ]; bonusCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isBonus()).toBe(true); }); }); @@ -198,7 +199,7 @@ describe('DrivingReasonCode', () => { 'DRIVING_DNS_PENALTY', ]; nonBonusCodes.forEach(codeStr => { - const code = DrivingReasonCode.fromValue(codeStr as any); + const code = DrivingReasonCode.fromValue(codeStr as DrivingReasonCodeValue); expect(code.isBonus()).toBe(false); }); }); diff --git a/core/media/application/use-cases/DeleteMediaUseCase.ts b/core/media/application/use-cases/DeleteMediaUseCase.ts index 261a9ad4d..bb6519227 100644 --- a/core/media/application/use-cases/DeleteMediaUseCase.ts +++ b/core/media/application/use-cases/DeleteMediaUseCase.ts @@ -5,8 +5,10 @@ */ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { MediaStoragePort } from '../ports/MediaStoragePort'; +import { MediaRepository } from '../../domain/repositories/MediaRepository'; export interface DeleteMediaInput { mediaId: string; diff --git a/core/media/application/use-cases/GetAvatarUseCase.ts b/core/media/application/use-cases/GetAvatarUseCase.ts index 1271465bf..4a6538338 100644 --- a/core/media/application/use-cases/GetAvatarUseCase.ts +++ b/core/media/application/use-cases/GetAvatarUseCase.ts @@ -5,7 +5,9 @@ */ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { AvatarRepository } from '../../domain/repositories/AvatarRepository'; export interface GetAvatarInput { driverId: string; diff --git a/core/media/application/use-cases/GetMediaUseCase.ts b/core/media/application/use-cases/GetMediaUseCase.ts index eac5196ea..58a5be6c1 100644 --- a/core/media/application/use-cases/GetMediaUseCase.ts +++ b/core/media/application/use-cases/GetMediaUseCase.ts @@ -5,7 +5,9 @@ */ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { MediaRepository } from '../../domain/repositories/MediaRepository'; export interface GetMediaInput { mediaId: string; diff --git a/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts b/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts index cc51f3e1e..430fbe127 100644 --- a/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts +++ b/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts @@ -4,7 +4,7 @@ * Handles the business logic for requesting avatar generation from a face photo. */ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { v4 as uuidv4 } from 'uuid'; @@ -12,6 +12,7 @@ import { AvatarGenerationRequest } from '../../domain/entities/AvatarGenerationR import type { RacingSuitColor } from '../../domain/types/AvatarGenerationRequest'; import type { AvatarGenerationPort } from '../ports/AvatarGenerationPort'; import type { FaceValidationPort } from '../ports/FaceValidationPort'; +import { AvatarGenerationRepository } from '../../domain/repositories/AvatarGenerationRepository'; export interface RequestAvatarGenerationInput { userId: string; diff --git a/core/media/application/use-cases/SelectAvatarUseCase.ts b/core/media/application/use-cases/SelectAvatarUseCase.ts index 489cc6dfb..b373fe980 100644 --- a/core/media/application/use-cases/SelectAvatarUseCase.ts +++ b/core/media/application/use-cases/SelectAvatarUseCase.ts @@ -5,7 +5,9 @@ */ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { AvatarGenerationRepository } from '../../domain/repositories/AvatarGenerationRepository'; export interface SelectAvatarInput { requestId: string; diff --git a/core/media/application/use-cases/UpdateAvatarUseCase.ts b/core/media/application/use-cases/UpdateAvatarUseCase.ts index 2abdde85c..330f3607d 100644 --- a/core/media/application/use-cases/UpdateAvatarUseCase.ts +++ b/core/media/application/use-cases/UpdateAvatarUseCase.ts @@ -4,12 +4,13 @@ * Handles the business logic for updating a driver's avatar. */ -import { AvatarId } from '@/media/domain/value-objects/AvatarId'; +import { AvatarId } from '../../domain/value-objects/AvatarId'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { v4 as uuidv4 } from 'uuid'; import { Avatar } from '../../domain/entities/Avatar'; +import { AvatarRepository } from '../../domain/repositories/AvatarRepository'; export interface UpdateAvatarInput { driverId: string; diff --git a/core/media/application/use-cases/UploadMediaUseCase.ts b/core/media/application/use-cases/UploadMediaUseCase.ts index 1a7888509..cc474a445 100644 --- a/core/media/application/use-cases/UploadMediaUseCase.ts +++ b/core/media/application/use-cases/UploadMediaUseCase.ts @@ -5,10 +5,12 @@ */ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { v4 as uuidv4 } from 'uuid'; import { Media } from '../../domain/entities/Media'; import type { MediaStoragePort } from '../ports/MediaStoragePort'; +import { MediaRepository } from '../../domain/repositories/MediaRepository'; // Define Multer file type locally since @types/multer is not available export interface MulterFile { diff --git a/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts b/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts index d17dd99bc..56d010340 100644 --- a/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts +++ b/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts @@ -4,12 +4,15 @@ * Retrieves unread notifications for a recipient. */ -import { NotificationRepository } from '@/notifications/domain/repositories/NotificationRepository'; +import { NotificationRepository } from '../../domain/repositories/NotificationRepository'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Notification } from '../../domain/entities/Notification'; +export interface GetUnreadNotificationsInput { + recipientId: string; +} export interface GetUnreadNotificationsResult { notifications: Notification[]; diff --git a/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts b/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts index 78acae2f2..58d8f687c 100644 --- a/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts +++ b/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts @@ -4,11 +4,15 @@ * Marks a notification as read. */ -import { NotificationRepository } from '@/notifications/domain/repositories/NotificationRepository'; +import { NotificationRepository } from '../../domain/repositories/NotificationRepository'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +export interface MarkNotificationReadCommand { + notificationId: string; + recipientId: string; +} export interface MarkNotificationReadResult { notificationId: string; diff --git a/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts b/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts index 0af2351db..ddf0900e3 100644 --- a/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts +++ b/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts @@ -4,8 +4,8 @@ * Manages user notification preferences. */ -import { NotificationPreferenceRepository } from '@/notifications/domain/repositories/NotificationPreferenceRepository'; -import { NotificationChannel, NotificationType } from '@/notifications/domain/types/NotificationTypes'; +import { NotificationPreferenceRepository } from '../../domain/repositories/NotificationPreferenceRepository'; +import { NotificationChannel, NotificationType } from '../../domain/types/NotificationTypes'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; diff --git a/core/notifications/application/use-cases/SendNotificationUseCase.ts b/core/notifications/application/use-cases/SendNotificationUseCase.ts index a108e2593..64bdf51cf 100644 --- a/core/notifications/application/use-cases/SendNotificationUseCase.ts +++ b/core/notifications/application/use-cases/SendNotificationUseCase.ts @@ -5,7 +5,7 @@ * based on their preferences. */ -import { NotificationChannel, NotificationType } from '@/notifications/domain/types/NotificationTypes'; +import { NotificationChannel, NotificationType } from '../../domain/types/NotificationTypes'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -13,6 +13,8 @@ import { v4 as uuid } from 'uuid'; import type { NotificationData } from '../../domain/entities/Notification'; import { Notification } from '../../domain/entities/Notification'; import type { NotificationDeliveryResult, NotificationGatewayRegistry } from '../ports/NotificationGateway'; +import { NotificationRepository } from '../../domain/repositories/NotificationRepository'; +import { NotificationPreferenceRepository } from '../../domain/repositories/NotificationPreferenceRepository'; export interface SendNotificationCommand { recipientId: string; @@ -93,7 +95,7 @@ export class SendNotificationUseCase { // Check quiet hours (skip external channels during quiet hours) const effectiveChannels = preferences.isInQuietHours() - ? channels.filter(ch => ch === 'in_app') + ? channels.filter((ch: NotificationChannel) => ch === 'in_app') : channels; // Ensure at least in_app is used diff --git a/core/notifications/domain/errors/NotificationDomainError.ts b/core/notifications/domain/errors/NotificationDomainError.ts index a5898f17c..4c1169a80 100644 --- a/core/notifications/domain/errors/NotificationDomainError.ts +++ b/core/notifications/domain/errors/NotificationDomainError.ts @@ -1,5 +1,4 @@ -import type { DomainError } from '@core/shared/errors/DomainError'; -import type { CommonDomainErrorKind } from '@core/shared/errors/DomainError'; +import type { DomainError, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; /** * Domain Error: NotificationDomainError diff --git a/core/payments/application/use-cases/index.test.ts b/core/payments/application/use-cases/index.test.ts deleted file mode 100644 index 05563cf80..000000000 --- a/core/payments/application/use-cases/index.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import * as useCases from './index'; - -describe('payments use-cases barrel exports', () => { - it('re-exports all expected use cases', () => { - const exported = useCases as unknown as Record; - - const expectedExports = [ - 'AwardPrizeUseCase', - 'CreatePaymentUseCase', - 'CreatePrizeUseCase', - 'DeletePrizeUseCase', - 'GetMembershipFeesUseCase', - 'GetPaymentsUseCase', - 'GetPrizesUseCase', - 'GetSponsorBillingUseCase', - 'GetWalletUseCase', - 'ProcessWalletTransactionUseCase', - 'UpdateMemberPaymentUseCase', - 'UpdatePaymentStatusUseCase', - 'UpsertMembershipFeeUseCase', - ]; - - for (const name of expectedExports) { - expect(exported[name], `missing export: ${name}`).toBeDefined(); - } - }); -}); \ No newline at end of file diff --git a/core/payments/domain/entities/index.test.ts b/core/payments/domain/entities/index.test.ts deleted file mode 100644 index 3e3e6ccd2..000000000 --- a/core/payments/domain/entities/index.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as mod from '@core/payments/domain/entities/index'; - -describe('payments/domain/entities/index.ts', () => { - it('imports', () => { - expect(mod).toBeTruthy(); - }); -}); diff --git a/core/racing/application/errors/RacingApplicationError.ts b/core/racing/application/errors/RacingApplicationError.ts index b2b085691..fd6594706 100644 --- a/core/racing/application/errors/RacingApplicationError.ts +++ b/core/racing/application/errors/RacingApplicationError.ts @@ -1,5 +1,4 @@ -import type { ApplicationError } from '@core/shared/errors/ApplicationError'; -import type { CommonApplicationErrorKind } from '@core/shared/errors/ApplicationError'; +import type { ApplicationError, CommonApplicationErrorKind } from '@core/shared/errors/ApplicationError'; export abstract class RacingApplicationError extends Error diff --git a/core/racing/application/queries/GetTeamRatingLedgerQuery.test.ts b/core/racing/application/queries/GetTeamRatingLedgerQuery.test.ts index 701e29a45..f8b2d39c1 100644 --- a/core/racing/application/queries/GetTeamRatingLedgerQuery.test.ts +++ b/core/racing/application/queries/GetTeamRatingLedgerQuery.test.ts @@ -2,15 +2,16 @@ * Tests for GetTeamRatingLedgerQuery */ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetTeamRatingLedgerQuery, GetTeamRatingLedgerQueryHandler } from './GetTeamRatingLedgerQuery'; import { TeamRatingEvent } from '../../domain/entities/TeamRatingEvent'; import { TeamRatingEventId } from '../../domain/value-objects/TeamRatingEventId'; import { TeamRatingDimensionKey } from '../../domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDelta } from '../../domain/value-objects/TeamRatingDelta'; +import type { TeamRatingEventRepository } from '../../domain/repositories/TeamRatingEventRepository'; describe('GetTeamRatingLedgerQuery', () => { - let mockRatingEventRepo: any; + let mockRatingEventRepo: { findEventsPaginated: Mock }; let handler: GetTeamRatingLedgerQueryHandler; beforeEach(() => { @@ -18,7 +19,7 @@ describe('GetTeamRatingLedgerQuery', () => { findEventsPaginated: vi.fn(), }; - handler = new GetTeamRatingLedgerQueryHandler(mockRatingEventRepo); + handler = new GetTeamRatingLedgerQueryHandler(mockRatingEventRepo as unknown as TeamRatingEventRepository); }); describe('execute', () => { diff --git a/core/racing/application/queries/GetTeamRatingsSummaryQuery.test.ts b/core/racing/application/queries/GetTeamRatingsSummaryQuery.test.ts index aad83e3ec..8c922c396 100644 --- a/core/racing/application/queries/GetTeamRatingsSummaryQuery.test.ts +++ b/core/racing/application/queries/GetTeamRatingsSummaryQuery.test.ts @@ -2,7 +2,7 @@ * Tests for GetTeamRatingsSummaryQuery */ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetTeamRatingsSummaryQuery, GetTeamRatingsSummaryQueryHandler } from './GetTeamRatingsSummaryQuery'; import { TeamRatingSnapshot } from '../../domain/services/TeamRatingSnapshotCalculator'; import { TeamRatingValue } from '../../domain/value-objects/TeamRatingValue'; @@ -10,10 +10,12 @@ import { TeamRatingEvent } from '../../domain/entities/TeamRatingEvent'; import { TeamRatingEventId } from '../../domain/value-objects/TeamRatingEventId'; import { TeamRatingDimensionKey } from '../../domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDelta } from '../../domain/value-objects/TeamRatingDelta'; +import type { TeamRatingRepository } from '../../domain/repositories/TeamRatingRepository'; +import type { TeamRatingEventRepository } from '../../domain/repositories/TeamRatingEventRepository'; describe('GetTeamRatingsSummaryQuery', () => { - let mockTeamRatingRepo: any; - let mockRatingEventRepo: any; + let mockTeamRatingRepo: { findByTeamId: Mock }; + let mockRatingEventRepo: { getAllByTeamId: Mock }; let handler: GetTeamRatingsSummaryQueryHandler; beforeEach(() => { @@ -25,8 +27,8 @@ describe('GetTeamRatingsSummaryQuery', () => { }; handler = new GetTeamRatingsSummaryQueryHandler( - mockTeamRatingRepo, - mockRatingEventRepo + mockTeamRatingRepo as unknown as TeamRatingRepository, + mockRatingEventRepo as unknown as TeamRatingEventRepository ); }); diff --git a/core/racing/application/use-cases/AcceptSponsorshipRequestUseCase.ts b/core/racing/application/use-cases/AcceptSponsorshipRequestUseCase.ts index 14e07eadb..8cdfd5565 100644 --- a/core/racing/application/use-cases/AcceptSponsorshipRequestUseCase.ts +++ b/core/racing/application/use-cases/AcceptSponsorshipRequestUseCase.ts @@ -6,9 +6,15 @@ */ import type { NotificationService } from '@core/notifications/application/ports/NotificationService'; +import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { SeasonSponsorship } from '../../domain/entities/season/SeasonSponsorship'; +import { SponsorshipRequestRepository } from '../../domain/repositories/SponsorshipRequestRepository'; +import { SeasonSponsorshipRepository } from '../../domain/repositories/SeasonSponsorshipRepository'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { WalletRepository } from '@core/payments/domain/repositories/WalletRepository'; +import { LeagueWalletRepository } from '../../domain/repositories/LeagueWalletRepository'; export interface AcceptSponsorshipRequestInput { requestId: string; diff --git a/core/racing/application/use-cases/AppendTeamRatingEventsUseCase.test.ts b/core/racing/application/use-cases/AppendTeamRatingEventsUseCase.test.ts index ac23faf1e..8054b36ee 100644 --- a/core/racing/application/use-cases/AppendTeamRatingEventsUseCase.test.ts +++ b/core/racing/application/use-cases/AppendTeamRatingEventsUseCase.test.ts @@ -5,6 +5,8 @@ import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; +import { TeamRating } from '../../domain/entities/TeamRating'; +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; // Mock repositories class MockTeamRatingEventRepository implements TeamRatingEventRepository { @@ -27,7 +29,7 @@ class MockTeamRatingEventRepository implements TeamRatingEventRepository { return this.events.filter(e => e.teamId === teamId); } - async findEventsPaginated(teamId: string): Promise { + async findEventsPaginated(teamId: string): Promise> { const events = await this.getAllByTeamId(teamId); return { items: events, @@ -44,13 +46,13 @@ class MockTeamRatingEventRepository implements TeamRatingEventRepository { } class MockTeamRatingRepository implements TeamRatingRepository { - private snapshots: Map = new Map(); + private snapshots: Map = new Map(); - async findByTeamId(teamId: string): Promise { + async findByTeamId(teamId: string): Promise { return this.snapshots.get(teamId) || null; } - async save(snapshot: any): Promise { + async save(snapshot: TeamRating): Promise { this.snapshots.set(snapshot.teamId, snapshot); return snapshot; } diff --git a/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts b/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts index be50c82eb..ba171d162 100644 --- a/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts +++ b/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts @@ -5,11 +5,14 @@ * (driver, team, race, or season/league). */ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { SponsorshipRequest } from '../../domain/entities/SponsorshipRequest'; import { Money, isCurrency } from '../../domain/value-objects/Money'; +import { SponsorshipRequestRepository } from '../../domain/repositories/SponsorshipRequestRepository'; +import { SponsorshipPricingRepository } from '../../domain/repositories/SponsorshipPricingRepository'; +import { SponsorRepository } from '../../domain/repositories/SponsorRepository'; export interface ApplyForSponsorshipInput { sponsorId: string; diff --git a/core/racing/application/use-cases/ApplyPenaltyUseCase.test.ts b/core/racing/application/use-cases/ApplyPenaltyUseCase.test.ts index c4743097b..41f0dc1bc 100644 --- a/core/racing/application/use-cases/ApplyPenaltyUseCase.test.ts +++ b/core/racing/application/use-cases/ApplyPenaltyUseCase.test.ts @@ -1,5 +1,10 @@ import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; import { ApplyPenaltyUseCase } from './ApplyPenaltyUseCase'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; +import { ProtestRepository } from '../../domain/repositories/ProtestRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +import type { Logger } from '@core/shared/domain/Logger'; describe('ApplyPenaltyUseCase', () => { let mockPenaltyRepo: { @@ -43,11 +48,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should return error when race does not exist', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue(null); @@ -65,11 +72,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should return error when steward does not have authority', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -95,11 +104,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should return error when protest does not exist', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -127,11 +138,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should return error when protest is not upheld', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -159,11 +172,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should return error when protest is not for this race', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -191,11 +206,13 @@ describe('ApplyPenaltyUseCase', () => { }); it('should create penalty and return result on success', async () => { - const useCase = new ApplyPenaltyUseCase(mockPenaltyRepo as any, - mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any, - mockLogger as any); + const useCase = new ApplyPenaltyUseCase( + mockPenaltyRepo as unknown as PenaltyRepository, + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository, + mockLogger as unknown as Logger + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -223,7 +240,7 @@ describe('ApplyPenaltyUseCase', () => { expect(presented.penaltyId).toBeDefined(); expect(mockPenaltyRepo.create).toHaveBeenCalledTimes(1); - const createdPenalty = (mockPenaltyRepo.create as Mock).mock.calls[0]?.[0] as any; + const createdPenalty = (mockPenaltyRepo.create as Mock).mock.calls[0]?.[0] as Penalty; type ToStringable = { toString(): string }; const asString = (value: unknown): string => { diff --git a/core/racing/application/use-cases/ApplyPenaltyUseCase.ts b/core/racing/application/use-cases/ApplyPenaltyUseCase.ts index 96939ff9b..357d44039 100644 --- a/core/racing/application/use-cases/ApplyPenaltyUseCase.ts +++ b/core/racing/application/use-cases/ApplyPenaltyUseCase.ts @@ -5,11 +5,15 @@ * The penalty can be standalone or linked to an upheld protest. */ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { randomUUID } from 'crypto'; import { Penalty } from '../../domain/entities/penalty/Penalty'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; +import { ProtestRepository } from '../../domain/repositories/ProtestRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; export interface ApplyPenaltyInput { raceId: string; @@ -62,7 +66,7 @@ export class ApplyPenaltyUseCase { // Validate steward has authority (owner or admin of the league) const memberships = await this.leagueMembershipRepository.getLeagueMembers(race.leagueId); const stewardMembership = memberships.find( - m => m.driverId.toString() === command.stewardId && m.status.toString() === 'active' + (m) => m.driverId.toString() === command.stewardId && m.status.toString() === 'active' ); if (!stewardMembership || (stewardMembership.role.toString() !== 'owner' && stewardMembership.role.toString() !== 'admin')) { @@ -110,7 +114,7 @@ export class ApplyPenaltyUseCase { `ApplyPenaltyUseCase: Successfully applied penalty ${penalty.id} for driver ${command.driverId} in race ${command.raceId}.`, ); - const result: ApplyPenaltyResult = { penaltyId: penalty.id }; + const result: ApplyPenaltyResult = { penaltyId: penalty.id.toString() }; return Result.ok(result); } diff --git a/core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase.ts b/core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase.ts index 716957ea2..f5661155d 100644 --- a/core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase.ts +++ b/core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase.ts @@ -3,11 +3,7 @@ import type { LeagueRepository } from '../../domain/repositories/LeagueRepositor import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { randomUUID } from 'crypto'; -import { JoinedAt } from '../../domain/value-objects/JoinedAt'; -import { LeagueId } from '../../domain/entities/LeagueId'; -import { DriverId } from '../../domain/entities/DriverId'; -import { MembershipRole } from '../../domain/entities/MembershipRole'; -import { MembershipStatus } from '../../domain/entities/MembershipStatus'; +import { LeagueMembership } from '../../domain/entities/LeagueMembership'; export interface ApproveLeagueJoinRequestInput { leagueId: string; @@ -55,14 +51,16 @@ export class ApproveLeagueJoinRequestUseCase { } await this.leagueMembershipRepository.removeJoinRequest(input.joinRequestId); - await this.leagueMembershipRepository.saveMembership({ - id: randomUUID(), - leagueId: LeagueId.create(input.leagueId), - driverId: DriverId.create(request.driverId.toString()), - role: MembershipRole.create('member'), - status: MembershipStatus.create('active'), - joinedAt: JoinedAt.create(new Date()), - }); + await this.leagueMembershipRepository.saveMembership( + LeagueMembership.create({ + id: randomUUID(), + leagueId: input.leagueId, + driverId: request.driverId.toString(), + role: 'member', + status: 'active', + joinedAt: new Date(), + }) + ); const result: ApproveLeagueJoinRequestResult = { success: true, message: 'Join request approved.' }; diff --git a/core/racing/application/use-cases/CancelRaceUseCase.test.ts b/core/racing/application/use-cases/CancelRaceUseCase.test.ts index 4cb547c83..af71657f1 100644 --- a/core/racing/application/use-cases/CancelRaceUseCase.test.ts +++ b/core/racing/application/use-cases/CancelRaceUseCase.test.ts @@ -2,6 +2,8 @@ import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; import { Race } from '../../domain/entities/Race'; import { SessionType } from '../../domain/value-objects/SessionType'; import { CancelRaceUseCase } from './CancelRaceUseCase'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import type { Logger } from '@core/shared/domain/Logger'; describe('CancelRaceUseCase', () => { let useCase: CancelRaceUseCase; @@ -27,8 +29,8 @@ describe('CancelRaceUseCase', () => { info: vi.fn(), error: vi.fn(), }; - useCase = new CancelRaceUseCase(raceRepository as any, - logger as any); + useCase = new CancelRaceUseCase(raceRepository as unknown as RaceRepository, + logger as unknown as Logger); }); it('should cancel race successfully', async () => { diff --git a/core/racing/application/use-cases/CancelRaceUseCase.ts b/core/racing/application/use-cases/CancelRaceUseCase.ts index 10829ec60..cc0c83ca4 100644 --- a/core/racing/application/use-cases/CancelRaceUseCase.ts +++ b/core/racing/application/use-cases/CancelRaceUseCase.ts @@ -1,6 +1,8 @@ import { Result } from '@core/shared/domain/Result'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Race } from '../../domain/entities/Race'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; export type CancelRaceInput = { raceId: string; diff --git a/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.test.ts b/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.test.ts index f67788af4..865510df3 100644 --- a/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.test.ts +++ b/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.test.ts @@ -3,6 +3,11 @@ import { RaceEvent } from '../../domain/entities/RaceEvent'; import { Session } from '../../domain/entities/Session'; import { SessionType } from '../../domain/value-objects/SessionType'; import { CloseRaceEventStewardingUseCase } from './CloseRaceEventStewardingUseCase'; +import { RaceEventRepository } from '../../domain/repositories/RaceEventRepository'; +import { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; +import { DomainEventPublisher } from '@core/shared/domain/DomainEvent'; +import type { Logger } from '@core/shared/domain/Logger'; describe('CloseRaceEventStewardingUseCase', () => { let useCase: CloseRaceEventStewardingUseCase; @@ -42,11 +47,11 @@ describe('CloseRaceEventStewardingUseCase', () => { logger = { error: vi.fn(), }; - useCase = new CloseRaceEventStewardingUseCase(logger as any, - raceEventRepository as any, - raceRegistrationRepository as any, - penaltyRepository as any, - domainEventPublisher as any); + useCase = new CloseRaceEventStewardingUseCase(logger as unknown as Logger, + raceEventRepository as unknown as RaceEventRepository, + raceRegistrationRepository as unknown as RaceRegistrationRepository, + penaltyRepository as unknown as PenaltyRepository, + domainEventPublisher as unknown as DomainEventPublisher); }); it('should close stewarding for expired events successfully', async () => { diff --git a/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.ts b/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.ts index 91eed1a8b..118879e99 100644 --- a/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.ts +++ b/core/racing/application/use-cases/CloseRaceEventStewardingUseCase.ts @@ -1,9 +1,12 @@ -import { DomainEventPublisher } from '@/shared/domain/DomainEvent'; +import { DomainEventPublisher } from '@core/shared/domain/DomainEvent'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { RaceEvent } from '../../domain/entities/RaceEvent'; import { RaceEventStewardingClosedEvent } from '../../domain/events/RaceEventStewardingClosed'; +import { RaceEventRepository } from '../../domain/repositories/RaceEventRepository'; +import { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; export type CloseRaceEventStewardingInput = { raceId: string; diff --git a/core/racing/application/use-cases/CompleteDriverOnboardingUseCase.ts b/core/racing/application/use-cases/CompleteDriverOnboardingUseCase.ts index 96a511103..2accc8516 100644 --- a/core/racing/application/use-cases/CompleteDriverOnboardingUseCase.ts +++ b/core/racing/application/use-cases/CompleteDriverOnboardingUseCase.ts @@ -2,7 +2,7 @@ import type { DriverRepository } from '../../domain/repositories/DriverRepositor import { Driver } from '../../domain/entities/Driver'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import type { Logger } from '@core/shared/application/Logger'; +import type { Logger } from '@core/shared/domain/Logger'; export interface CompleteDriverOnboardingInput { userId: string; diff --git a/core/racing/application/use-cases/CompleteRaceUseCase.test.ts b/core/racing/application/use-cases/CompleteRaceUseCase.test.ts index ced15904d..dca7420a1 100644 --- a/core/racing/application/use-cases/CompleteRaceUseCase.test.ts +++ b/core/racing/application/use-cases/CompleteRaceUseCase.test.ts @@ -1,5 +1,5 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; -import { CompleteRaceUseCase, type CompleteRaceInput, type CompleteRaceResult } from './CompleteRaceUseCase'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; +import { CompleteRaceUseCase, type CompleteRaceInput } from './CompleteRaceUseCase'; import type { RaceRepository } from '../../domain/repositories/RaceRepository'; import type { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; import type { ResultRepository } from '../../domain/repositories/ResultRepository'; @@ -39,10 +39,10 @@ describe('CompleteRaceUseCase', () => { save: vi.fn(), }; getDriverRating = vi.fn(); - useCase = new CompleteRaceUseCase(raceRepository as any, - raceRegistrationRepository as any, - resultRepository as any, - standingRepository as any, + useCase = new CompleteRaceUseCase(raceRepository as unknown as RaceRepository, + raceRegistrationRepository as unknown as RaceRegistrationRepository, + resultRepository as unknown as ResultRepository, + standingRepository as unknown as StandingRepository, getDriverRating); }); diff --git a/core/racing/application/use-cases/CreateLeagueSeasonScheduleRaceUseCase.ts b/core/racing/application/use-cases/CreateLeagueSeasonScheduleRaceUseCase.ts index 8909cce99..d0e6f7e2c 100644 --- a/core/racing/application/use-cases/CreateLeagueSeasonScheduleRaceUseCase.ts +++ b/core/racing/application/use-cases/CreateLeagueSeasonScheduleRaceUseCase.ts @@ -4,7 +4,16 @@ import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorC import { Race } from '../../domain/entities/Race'; import type { Season } from '../../domain/entities/season/Season'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +export interface CreateLeagueSeasonScheduleRaceInput { + leagueId: string; + seasonId: string; + track: string; + car: string; + scheduledAt: Date; +} export type CreateLeagueSeasonScheduleRaceResult = { raceId: string; @@ -88,6 +97,9 @@ export class CreateLeagueSeasonScheduleRaceUseCase { } private isWithinSeasonWindow(season: Season, scheduledAt: Date): boolean { + if (!season.startDate || !season.endDate) { + return true; + } return scheduledAt >= season.startDate && scheduledAt <= season.endDate; } } \ No newline at end of file diff --git a/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts b/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts index cb36a5473..f23c15fbb 100644 --- a/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts +++ b/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts @@ -1,4 +1,4 @@ -import { League } from '@/racing/domain/entities/League'; +import { League } from '../../domain/entities/League'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -13,6 +13,9 @@ import { MIN_RANKED_LEAGUE_DRIVERS, } from '../../domain/value-objects/LeagueVisibility'; import { PointsTable } from '../../domain/value-objects/PointsTable'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { LeagueScoringConfigRepository } from '../../domain/repositories/LeagueScoringConfigRepository'; export type CreateLeagueWithSeasonAndScoringCommand = { name: string; diff --git a/core/racing/application/use-cases/CreateSeasonForLeagueUseCase.test.ts b/core/racing/application/use-cases/CreateSeasonForLeagueUseCase.test.ts index 1e6bcc4c6..ae27424d6 100644 --- a/core/racing/application/use-cases/CreateSeasonForLeagueUseCase.test.ts +++ b/core/racing/application/use-cases/CreateSeasonForLeagueUseCase.test.ts @@ -1,15 +1,12 @@ -import { describe, it, expect, vi, Mock, beforeEach } from 'vitest'; +import { describe, it, expect, vi, type Mock, beforeEach } from 'vitest'; import { Season } from '@core/racing/domain/entities/season/Season'; import type { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository'; import type { LeagueRepository } from '@core/racing/domain/repositories/LeagueRepository'; import { CreateSeasonForLeagueUseCase, type CreateSeasonForLeagueInput, - type CreateSeasonForLeagueResult, type LeagueConfigFormModel, } from '@core/racing/application/use-cases/CreateSeasonForLeagueUseCase'; -import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import { Result } from '@core/shared/domain/Result'; function createLeagueConfigFormModel(overrides?: Partial): LeagueConfigFormModel { return { @@ -68,13 +65,18 @@ function createLeagueConfigFormModel(overrides?: Partial) }; } -type CreateSeasonErrorCode = ApplicationErrorCode<'LEAGUE_NOT_FOUND' | 'VALIDATION_ERROR' | 'REPOSITORY_ERROR'> & { - details?: { message: string }; -}; - describe('CreateSeasonForLeagueUseCase', () => { const mockLeagueFindById = vi.fn(); - const mockLeagueRepo: any = { + const mockLeagueRepo: { + findById: Mock; + findAll: Mock; + findByOwnerId: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + searchByName: Mock; + } = { findById: mockLeagueFindById, findAll: vi.fn(), findByOwnerId: vi.fn(), @@ -87,7 +89,15 @@ describe('CreateSeasonForLeagueUseCase', () => { const mockSeasonFindById = vi.fn(); const mockSeasonAdd = vi.fn(); - const mockSeasonRepo: any = { + const mockSeasonRepo: { + findById: Mock; + findByLeagueId: Mock; + create: Mock; + add: Mock; + update: Mock; + listByLeague: Mock; + listActiveByLeague: Mock; + } = { findById: mockSeasonFindById, findByLeagueId: vi.fn(), create: vi.fn(), @@ -105,7 +115,10 @@ describe('CreateSeasonForLeagueUseCase', () => { mockLeagueFindById.mockResolvedValue({ id: 'league-1' }); mockSeasonAdd.mockResolvedValue(undefined); - const useCase = new CreateSeasonForLeagueUseCase(mockLeagueRepo, mockSeasonRepo); + const useCase = new CreateSeasonForLeagueUseCase( + mockLeagueRepo as unknown as LeagueRepository, + mockSeasonRepo as unknown as SeasonRepository + ); const config = createLeagueConfigFormModel({ basics: { @@ -157,7 +170,10 @@ describe('CreateSeasonForLeagueUseCase', () => { mockSeasonFindById.mockResolvedValue(sourceSeason); mockSeasonAdd.mockResolvedValue(undefined); - const useCase = new CreateSeasonForLeagueUseCase(mockLeagueRepo, mockSeasonRepo); + const useCase = new CreateSeasonForLeagueUseCase( + mockLeagueRepo as unknown as LeagueRepository, + mockSeasonRepo as unknown as SeasonRepository + ); const command: CreateSeasonForLeagueInput = { leagueId: 'league-1', @@ -177,7 +193,10 @@ describe('CreateSeasonForLeagueUseCase', () => { it('returns error when league not found', async () => { mockLeagueFindById.mockResolvedValue(null); - const useCase = new CreateSeasonForLeagueUseCase(mockLeagueRepo, mockSeasonRepo); + const useCase = new CreateSeasonForLeagueUseCase( + mockLeagueRepo as unknown as LeagueRepository, + mockSeasonRepo as unknown as SeasonRepository + ); const command: CreateSeasonForLeagueInput = { leagueId: 'missing-league', @@ -197,7 +216,10 @@ describe('CreateSeasonForLeagueUseCase', () => { mockLeagueFindById.mockResolvedValue({ id: 'league-1' }); mockSeasonFindById.mockResolvedValue(undefined); - const useCase = new CreateSeasonForLeagueUseCase(mockLeagueRepo, mockSeasonRepo); + const useCase = new CreateSeasonForLeagueUseCase( + mockLeagueRepo as unknown as LeagueRepository, + mockSeasonRepo as unknown as SeasonRepository + ); const command: CreateSeasonForLeagueInput = { leagueId: 'league-1', diff --git a/core/racing/application/use-cases/CreateSponsorUseCase.ts b/core/racing/application/use-cases/CreateSponsorUseCase.ts index 30b65ca6f..8136e9d20 100644 --- a/core/racing/application/use-cases/CreateSponsorUseCase.ts +++ b/core/racing/application/use-cases/CreateSponsorUseCase.ts @@ -3,11 +3,12 @@ * * Creates a new sponsor. */ -import { ApplicationErrorCode } from '@/shared/errors/ApplicationErrorCode'; +import { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import { v4 as uuidv4 } from 'uuid'; import { Sponsor } from '../../domain/entities/sponsor/Sponsor'; +import { SponsorRepository } from '../../domain/repositories/SponsorRepository'; export interface CreateSponsorInput { name: string; diff --git a/core/racing/application/use-cases/CreateTeamUseCase.test.ts b/core/racing/application/use-cases/CreateTeamUseCase.test.ts index 72768a467..17c9e77a2 100644 --- a/core/racing/application/use-cases/CreateTeamUseCase.test.ts +++ b/core/racing/application/use-cases/CreateTeamUseCase.test.ts @@ -3,6 +3,9 @@ import { CreateTeamUseCase, type CreateTeamInput } from './CreateTeamUseCase'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { Logger } from '@core/shared/domain/Logger'; describe('CreateTeamUseCase', () => { let useCase: CreateTeamUseCase; @@ -34,9 +37,9 @@ describe('CreateTeamUseCase', () => { warn: vi.fn(), error: vi.fn(), }; - useCase = new CreateTeamUseCase(teamRepository as any, - membershipRepository as any, - logger as any); + useCase = new CreateTeamUseCase(teamRepository as unknown as TeamRepository, + membershipRepository as unknown as TeamMembershipRepository, + logger as unknown as Logger); }); it('should create team successfully', async () => { diff --git a/core/racing/application/use-cases/CreateTeamUseCase.ts b/core/racing/application/use-cases/CreateTeamUseCase.ts index 3f7a05e1c..6457ccaeb 100644 --- a/core/racing/application/use-cases/CreateTeamUseCase.ts +++ b/core/racing/application/use-cases/CreateTeamUseCase.ts @@ -3,7 +3,7 @@ * * Creates a new team. */ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { v4 as uuidv4 } from 'uuid'; @@ -13,6 +13,9 @@ import type { TeamMembershipStatus, TeamRole, } from '../../domain/types/TeamMembership'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; + export interface CreateTeamInput { name: string; tag: string; diff --git a/core/racing/application/use-cases/DeleteLeagueSeasonScheduleRaceUseCase.ts b/core/racing/application/use-cases/DeleteLeagueSeasonScheduleRaceUseCase.ts index 8f0b13085..f7c2fc6d7 100644 --- a/core/racing/application/use-cases/DeleteLeagueSeasonScheduleRaceUseCase.ts +++ b/core/racing/application/use-cases/DeleteLeagueSeasonScheduleRaceUseCase.ts @@ -1,8 +1,14 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; - +export interface DeleteLeagueSeasonScheduleRaceInput { + leagueId: string; + seasonId: string; + raceId: string; +} export type DeleteLeagueSeasonScheduleRaceResult = { success: true; diff --git a/core/racing/application/use-cases/FileProtestUseCase.test.ts b/core/racing/application/use-cases/FileProtestUseCase.test.ts index 034eade99..c93f33682 100644 --- a/core/racing/application/use-cases/FileProtestUseCase.test.ts +++ b/core/racing/application/use-cases/FileProtestUseCase.test.ts @@ -3,7 +3,8 @@ import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; import type { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; import type { ProtestRepository } from '../../domain/repositories/ProtestRepository'; import type { RaceRepository } from '../../domain/repositories/RaceRepository'; -import { FileProtestUseCase, type FileProtestErrorCode, type FileProtestInput, type FileProtestResult } from './FileProtestUseCase'; +import { FileProtestUseCase, type FileProtestErrorCode, type FileProtestInput } from './FileProtestUseCase'; +import { Protest } from '../../domain/entities/Protest'; describe('FileProtestUseCase', () => { let mockProtestRepo: { @@ -29,9 +30,11 @@ describe('FileProtestUseCase', () => { }); it('should return error when race does not exist', async () => { - const useCase = new FileProtestUseCase(mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any); + const useCase = new FileProtestUseCase( + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository + ); mockRaceRepo.findById.mockResolvedValue(null); @@ -49,9 +52,11 @@ describe('FileProtestUseCase', () => { }); it('should return error when protesting against self', async () => { - const useCase = new FileProtestUseCase(mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any); + const useCase = new FileProtestUseCase( + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); @@ -69,9 +74,11 @@ describe('FileProtestUseCase', () => { }); it('should return error when protesting driver is not an active member', async () => { - const useCase = new FileProtestUseCase(mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any); + const useCase = new FileProtestUseCase( + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); mockLeagueMembershipRepo.getLeagueMembers.mockResolvedValue([ @@ -92,9 +99,11 @@ describe('FileProtestUseCase', () => { }); it('should create protest and return protestId on success', async () => { - const useCase = new FileProtestUseCase(mockProtestRepo as any, - mockRaceRepo as any, - mockLeagueMembershipRepo as any); + const useCase = new FileProtestUseCase( + mockProtestRepo as unknown as ProtestRepository, + mockRaceRepo as unknown as RaceRepository, + mockLeagueMembershipRepo as unknown as LeagueMembershipRepository + ); mockRaceRepo.findById.mockResolvedValue({ id: 'race1', leagueId: 'league1' }); mockLeagueMembershipRepo.getLeagueMembers.mockResolvedValue([ @@ -114,7 +123,7 @@ describe('FileProtestUseCase', () => { expect(result.isOk()).toBe(true); const presented = result.unwrap(); expect(mockProtestRepo.create).toHaveBeenCalledTimes(1); - const created = (mockProtestRepo.create as unknown as Mock).mock.calls[0]?.[0] as any; + const created = (mockProtestRepo.create as unknown as Mock).mock.calls[0]?.[0] as Protest; expect(created.raceId.toString()).toBe('race1'); expect(created.protestingDriverId.toString()).toBe('driver1'); diff --git a/core/racing/application/use-cases/GetAllLeaguesWithCapacityAndScoringUseCase.test.ts b/core/racing/application/use-cases/GetAllLeaguesWithCapacityAndScoringUseCase.test.ts index b7b5e505a..06b744280 100644 --- a/core/racing/application/use-cases/GetAllLeaguesWithCapacityAndScoringUseCase.test.ts +++ b/core/racing/application/use-cases/GetAllLeaguesWithCapacityAndScoringUseCase.test.ts @@ -27,11 +27,11 @@ describe('GetAllLeaguesWithCapacityAndScoringUseCase', () => { it('should return enriched leagues with capacity and scoring', async () => { const useCase = new GetAllLeaguesWithCapacityAndScoringUseCase( - mockLeagueRepo as any, - mockMembershipRepo as any, - mockSeasonRepo as any, - mockScoringConfigRepo as any, - mockGameRepo as any, + mockLeagueRepo as unknown as LeagueRepository, + mockMembershipRepo as unknown as LeagueMembershipRepository, + mockSeasonRepo as unknown as SeasonRepository, + mockScoringConfigRepo as unknown as LeagueScoringConfigRepository, + mockGameRepo as unknown as GameRepository, { getPresetById: vi.fn().mockReturnValue({ id: 'preset1', name: 'Default' }) } ); diff --git a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.test.ts b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.test.ts index cfe2e36ed..722e8b0fb 100644 --- a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.test.ts +++ b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.test.ts @@ -1,5 +1,5 @@ import type { Logger } from '@core/shared/domain/Logger'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest'; import { League } from '../../domain/entities/League'; import { Race } from '../../domain/entities/Race'; import { @@ -7,9 +7,24 @@ import { type GetAllRacesPageDataInput } from './GetAllRacesPageDataUseCase'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; + describe('GetAllRacesPageDataUseCase', () => { const mockRaceFindAll = vi.fn(); - const mockRaceRepo: any = { + const mockRaceRepo: { + findById: Mock; + findAll: Mock; + findByLeagueId: Mock; + findUpcomingByLeagueId: Mock; + findCompletedByLeagueId: Mock; + findByStatus: Mock; + findByDateRange: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + } = { findById: vi.fn(), findAll: mockRaceFindAll, findByLeagueId: vi.fn(), @@ -24,7 +39,16 @@ describe('GetAllRacesPageDataUseCase', () => { }; const mockLeagueFindAll = vi.fn(); - const mockLeagueRepo: any = { + const mockLeagueRepo: { + findById: Mock; + findAll: Mock; + findByOwnerId: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + searchByName: Mock; + } = { findById: vi.fn(), findAll: mockLeagueFindAll, findByOwnerId: vi.fn(), @@ -47,9 +71,11 @@ describe('GetAllRacesPageDataUseCase', () => { }); it('should return races and filters data', async () => { - const useCase = new GetAllRacesPageDataUseCase(mockRaceRepo, - mockLeagueRepo, - mockLogger); + const useCase = new GetAllRacesPageDataUseCase( + mockRaceRepo as unknown as RaceRepository, + mockLeagueRepo as unknown as LeagueRepository, + mockLogger + ); const race1 = Race.create({ id: 'race1', @@ -132,9 +158,11 @@ describe('GetAllRacesPageDataUseCase', () => { }); it('should return empty result when no races or leagues', async () => { - const useCase = new GetAllRacesPageDataUseCase(mockRaceRepo, - mockLeagueRepo, - mockLogger); + const useCase = new GetAllRacesPageDataUseCase( + mockRaceRepo as unknown as RaceRepository, + mockLeagueRepo as unknown as LeagueRepository, + mockLogger + ); mockRaceFindAll.mockResolvedValue([]); mockLeagueFindAll.mockResolvedValue([]); @@ -157,9 +185,11 @@ describe('GetAllRacesPageDataUseCase', () => { }); it('should return error when repository throws', async () => { - const useCase = new GetAllRacesPageDataUseCase(mockRaceRepo, - mockLeagueRepo, - mockLogger); + const useCase = new GetAllRacesPageDataUseCase( + mockRaceRepo as unknown as RaceRepository, + mockLeagueRepo as unknown as LeagueRepository, + mockLogger + ); const error = new Error('Repository error'); mockRaceFindAll.mockRejectedValue(error); diff --git a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts index 3b88e82c5..8639a6e12 100644 --- a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts +++ b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts @@ -1,6 +1,10 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import type { RaceStatusValue } from '../../domain/entities/Race'; +import type { Race, RaceStatusValue } from '../../domain/entities/Race'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import type { Logger } from '@core/shared/domain/Logger'; +import type { League } from '../../domain/entities/League'; export type GetAllRacesPageDataInput = {}; @@ -46,12 +50,12 @@ export class GetAllRacesPageDataUseCase { ]); this.logger.info(`Found ${allRaces.length} races and ${allLeagues.length} leagues.`); - const leagueMap = new Map(allLeagues.map(league => [league.id.toString(), league.name.toString()])); + const leagueMap = new Map(allLeagues.map((league: League) => [league.id.toString(), league.name.toString()])); const races: GetAllRacesPageRaceItem[] = allRaces .slice() - .sort((a, b) => b.scheduledAt.getTime() - a.scheduledAt.getTime()) - .map(race => ({ + .sort((a: Race, b: Race) => b.scheduledAt.getTime() - a.scheduledAt.getTime()) + .map((race: Race) => ({ id: race.id, track: race.track, car: race.car, diff --git a/core/racing/application/use-cases/GetAllRacesUseCase.ts b/core/racing/application/use-cases/GetAllRacesUseCase.ts index 414af5a3c..d3fd41c13 100644 --- a/core/racing/application/use-cases/GetAllRacesUseCase.ts +++ b/core/racing/application/use-cases/GetAllRacesUseCase.ts @@ -2,6 +2,9 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { League } from '../../domain/entities/League'; import type { Race } from '../../domain/entities/Race'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type GetAllRacesInput = {}; diff --git a/core/racing/application/use-cases/GetAllTeamsUseCase.ts b/core/racing/application/use-cases/GetAllTeamsUseCase.ts index 968de87fb..ed4f98a9b 100644 --- a/core/racing/application/use-cases/GetAllTeamsUseCase.ts +++ b/core/racing/application/use-cases/GetAllTeamsUseCase.ts @@ -1,7 +1,10 @@ -import { Team } from '@/racing/domain/entities/Team'; +import { Team } from '../../domain/entities/Team'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import { TeamStatsRepository } from '../../domain/repositories/TeamStatsRepository'; export interface GetAllTeamsInput {} @@ -39,6 +42,7 @@ export class GetAllTeamsUseCase { async execute( _input: GetAllTeamsInput, ): Promise>> { + void _input; this.logger.debug('GetAllTeamsUseCase: Fetching all teams'); try { @@ -71,7 +75,7 @@ export class GetAllTeamsUseCase { rating: stats?.rating ?? 0, logoUrl: logoUrl ?? null, description: team.description.toString(), - leagues: team.leagues.map(l => l.toString()), + leagues: team.leagues.map((l) => l.toString()), isRecruiting: team.isRecruiting, }); } diff --git a/core/racing/application/use-cases/GetDriverLiveriesUseCase.ts b/core/racing/application/use-cases/GetDriverLiveriesUseCase.ts index f80e35015..a5fadc175 100644 --- a/core/racing/application/use-cases/GetDriverLiveriesUseCase.ts +++ b/core/racing/application/use-cases/GetDriverLiveriesUseCase.ts @@ -4,11 +4,12 @@ * Retrieves all liveries for a specific driver. */ -import { DriverLivery } from '@/racing/domain/entities/DriverLivery'; +import { DriverLivery } from '../../domain/entities/DriverLivery'; import { UseCase } from '@core/shared/application/UseCase'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { LiveryRepository } from '../../domain/repositories/LiveryRepository'; export interface GetDriverLiveriesInput { driverId: string; diff --git a/core/racing/application/use-cases/GetDriverTeamUseCase.ts b/core/racing/application/use-cases/GetDriverTeamUseCase.ts index d52abbbe2..bc6cd20fe 100644 --- a/core/racing/application/use-cases/GetDriverTeamUseCase.ts +++ b/core/racing/application/use-cases/GetDriverTeamUseCase.ts @@ -1,8 +1,10 @@ -import { TeamMembership } from '@/racing/domain/types/TeamMembership'; +import { TeamMembership } from '../../domain/types/TeamMembership'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Team } from '../../domain/entities/Team'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; export interface GetDriverTeamInput { driverId: string; diff --git a/core/racing/application/use-cases/GetDriversLeaderboardUseCase.ts b/core/racing/application/use-cases/GetDriversLeaderboardUseCase.ts index e0adecd49..205a689dc 100644 --- a/core/racing/application/use-cases/GetDriversLeaderboardUseCase.ts +++ b/core/racing/application/use-cases/GetDriversLeaderboardUseCase.ts @@ -5,7 +5,7 @@ import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorC import type { Driver } from '../../domain/entities/Driver'; import type { Team } from '../../domain/entities/Team'; import type { DriverRepository } from '../../domain/repositories/DriverRepository'; -import type { DriverStatsUseCase } from './DriverStatsUseCase'; +import type { DriverStats, DriverStatsUseCase } from './DriverStatsUseCase'; import type { RankingUseCase } from './RankingUseCase'; import { SkillLevelService, type SkillLevel } from '../../domain/services/SkillLevelService'; import { MediaReference } from '@core/domain/media/MediaReference'; @@ -71,10 +71,11 @@ export class GetDriversLeaderboardUseCase implements UseCase(); + const statsMap = new Map(); drivers.forEach((driver, idx) => { - if (statsResults[idx]) { - statsMap.set(driver.id, statsResults[idx]); + const stats = statsResults[idx]; + if (stats) { + statsMap.set(driver.id, stats); } }); diff --git a/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts b/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts index bd528e39a..9da2ff788 100644 --- a/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts +++ b/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts @@ -8,6 +8,8 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { SponsorableEntityType } from '../../domain/entities/SponsorshipRequest'; +import { SponsorshipPricingRepository } from '../../domain/repositories/SponsorshipPricingRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type SponsorshipEntityType = SponsorableEntityType; diff --git a/core/racing/application/use-cases/GetLeagueAdminPermissionsUseCase.ts b/core/racing/application/use-cases/GetLeagueAdminPermissionsUseCase.ts index 6a6d05107..315ff2c6e 100644 --- a/core/racing/application/use-cases/GetLeagueAdminPermissionsUseCase.ts +++ b/core/racing/application/use-cases/GetLeagueAdminPermissionsUseCase.ts @@ -2,7 +2,13 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { League } from '../../domain/entities/League'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +export interface GetLeagueAdminPermissionsInput { + leagueId: string; + performerDriverId: string; +} export type LeagueAdminPermissions = { canManageSchedule: boolean; diff --git a/core/racing/application/use-cases/GetLeagueAdminUseCase.test.ts b/core/racing/application/use-cases/GetLeagueAdminUseCase.test.ts index 4656d4801..df58e2b54 100644 --- a/core/racing/application/use-cases/GetLeagueAdminUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueAdminUseCase.test.ts @@ -1,15 +1,23 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetLeagueAdminUseCase, type GetLeagueAdminInput, - type GetLeagueAdminResult, type GetLeagueAdminErrorCode, } from './GetLeagueAdminUseCase'; import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; describe('GetLeagueAdminUseCase', () => { - let mockLeagueRepo: any; + let mockLeagueRepo: { + findById: Mock; + findAll: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + findByOwnerId: Mock; + searchByName: Mock; + }; let mockFindById: Mock; beforeEach(() => { @@ -26,7 +34,7 @@ describe('GetLeagueAdminUseCase', () => { }; }); - const createUseCase = () => new GetLeagueAdminUseCase(mockLeagueRepo); + const createUseCase = () => new GetLeagueAdminUseCase(mockLeagueRepo as unknown as LeagueRepository); const params: GetLeagueAdminInput = { leagueId: 'league1', diff --git a/core/racing/application/use-cases/GetLeagueDriverSeasonStatsUseCase.test.ts b/core/racing/application/use-cases/GetLeagueDriverSeasonStatsUseCase.test.ts index c95d7a395..6e4b3a268 100644 --- a/core/racing/application/use-cases/GetLeagueDriverSeasonStatsUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueDriverSeasonStatsUseCase.test.ts @@ -1,9 +1,8 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetLeagueDriverSeasonStatsUseCase, type GetLeagueDriverSeasonStatsErrorCode, type GetLeagueDriverSeasonStatsInput, - type GetLeagueDriverSeasonStatsResult, } from './GetLeagueDriverSeasonStatsUseCase'; import type { StandingRepository } from '../../domain/repositories/StandingRepository'; import type { ResultRepository } from '../../domain/repositories/ResultRepository'; @@ -22,12 +21,70 @@ describe('GetLeagueDriverSeasonStatsUseCase', () => { const mockDriverFindById = vi.fn(); let useCase: GetLeagueDriverSeasonStatsUseCase; - let standingRepository: any; - let resultRepository: any; - let penaltyRepository: any; - let raceRepository: any; - let driverRepository: any; - let driverRatingPort: any; + let standingRepository: { + findByLeagueId: Mock; + findByDriverIdAndLeagueId: Mock; + findAll: Mock; + save: Mock; + saveMany: Mock; + delete: Mock; + deleteByLeagueId: Mock; + exists: Mock; + recalculate: Mock; + }; + let resultRepository: { + findById: Mock; + findAll: Mock; + findByRaceId: Mock; + findByDriverId: Mock; + findByDriverIdAndLeagueId: Mock; + create: Mock; + createMany: Mock; + update: Mock; + delete: Mock; + deleteByRaceId: Mock; + exists: Mock; + existsByRaceId: Mock; + }; + let penaltyRepository: { + findById: Mock; + findByDriverId: Mock; + findByProtestId: Mock; + findPending: Mock; + findByRaceId: Mock; + findIssuedBy: Mock; + create: Mock; + update: Mock; + exists: Mock; + }; + let raceRepository: { + findById: Mock; + findAll: Mock; + findByLeagueId: Mock; + findUpcomingByLeagueId: Mock; + findCompletedByLeagueId: Mock; + findByStatus: Mock; + findByDateRange: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + }; + let driverRepository: { + findById: Mock; + findByIRacingId: Mock; + findAll: Mock; + create: Mock; + update: Mock; + delete: Mock; + exists: Mock; + existsByIRacingId: Mock; + }; + let driverRatingPort: { + getDriverRating: Mock; + calculateRatingChange: Mock; + updateDriverRating: Mock; + }; beforeEach(() => { mockStandingFindByLeagueId.mockReset(); @@ -102,12 +159,14 @@ describe('GetLeagueDriverSeasonStatsUseCase', () => { updateDriverRating: vi.fn(), }; - useCase = new GetLeagueDriverSeasonStatsUseCase(standingRepository, - resultRepository, - penaltyRepository, - raceRepository, - driverRepository, - driverRatingPort); + useCase = new GetLeagueDriverSeasonStatsUseCase( + standingRepository as unknown as StandingRepository, + resultRepository as unknown as ResultRepository, + penaltyRepository as unknown as PenaltyRepository, + raceRepository as unknown as RaceRepository, + driverRepository as unknown as DriverRepository, + driverRatingPort as unknown as DriverRatingPort + ); }); it('should return league driver season stats for given league id', async () => { diff --git a/core/racing/application/use-cases/GetLeagueFullConfigUseCase.test.ts b/core/racing/application/use-cases/GetLeagueFullConfigUseCase.test.ts index e614a4f39..1cf3560b8 100644 --- a/core/racing/application/use-cases/GetLeagueFullConfigUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueFullConfigUseCase.test.ts @@ -1,8 +1,7 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; import { GetLeagueFullConfigUseCase, type GetLeagueFullConfigInput, - type GetLeagueFullConfigResult, type GetLeagueFullConfigErrorCode, } from './GetLeagueFullConfigUseCase'; import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; @@ -13,10 +12,10 @@ import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorC describe('GetLeagueFullConfigUseCase', () => { let useCase: GetLeagueFullConfigUseCase; - let leagueRepository: any; - let seasonRepository: any; - let leagueScoringConfigRepository: any; - let gameRepository: any; + let leagueRepository: { findById: Mock }; + let seasonRepository: { findByLeagueId: Mock }; + let leagueScoringConfigRepository: { findBySeasonId: Mock }; + let gameRepository: { findById: Mock }; beforeEach(() => { leagueRepository = { @@ -32,10 +31,12 @@ describe('GetLeagueFullConfigUseCase', () => { findById: vi.fn(), }; - useCase = new GetLeagueFullConfigUseCase(leagueRepository, - seasonRepository, - leagueScoringConfigRepository, - gameRepository); + useCase = new GetLeagueFullConfigUseCase( + leagueRepository as unknown as LeagueRepository, + seasonRepository as unknown as SeasonRepository, + leagueScoringConfigRepository as unknown as LeagueScoringConfigRepository, + gameRepository as unknown as GameRepository + ); }); it('should return league config when league exists', async () => { diff --git a/core/racing/application/use-cases/GetLeagueMembershipsUseCase.test.ts b/core/racing/application/use-cases/GetLeagueMembershipsUseCase.test.ts index 2cb37d0e5..45c7159fb 100644 --- a/core/racing/application/use-cases/GetLeagueMembershipsUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueMembershipsUseCase.test.ts @@ -1,14 +1,16 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetLeagueMembershipsUseCase, type GetLeagueMembershipsInput, - type GetLeagueMembershipsResult, type GetLeagueMembershipsErrorCode, } from './GetLeagueMembershipsUseCase'; import { LeagueMembership } from '../../domain/entities/LeagueMembership'; import { Driver } from '../../domain/entities/Driver'; import { League } from '../../domain/entities/League'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +import type { DriverRepository } from '../../domain/repositories/DriverRepository'; +import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; describe('GetLeagueMembershipsUseCase', () => { let useCase: GetLeagueMembershipsUseCase; @@ -32,9 +34,11 @@ describe('GetLeagueMembershipsUseCase', () => { leagueRepository = { findById: vi.fn(), }; - useCase = new GetLeagueMembershipsUseCase(leagueMembershipRepository as any, - driverRepository as any, - leagueRepository as any); + useCase = new GetLeagueMembershipsUseCase( + leagueMembershipRepository as unknown as LeagueMembershipRepository, + driverRepository as unknown as DriverRepository, + leagueRepository as unknown as LeagueRepository + ); }); it('should return league memberships with drivers', async () => { diff --git a/core/racing/application/use-cases/GetLeagueOwnerSummaryUseCase.test.ts b/core/racing/application/use-cases/GetLeagueOwnerSummaryUseCase.test.ts index efec2b2da..c85223c51 100644 --- a/core/racing/application/use-cases/GetLeagueOwnerSummaryUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueOwnerSummaryUseCase.test.ts @@ -1,13 +1,16 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetLeagueOwnerSummaryUseCase, type GetLeagueOwnerSummaryInput, - type GetLeagueOwnerSummaryResult, type GetLeagueOwnerSummaryErrorCode, } from './GetLeagueOwnerSummaryUseCase'; import { Driver } from '../../domain/entities/Driver'; import { League } from '../../domain/entities/League'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import type { DriverRepository } from '../../domain/repositories/DriverRepository'; +import type { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +import type { StandingRepository } from '../../domain/repositories/StandingRepository'; describe('GetLeagueOwnerSummaryUseCase', () => { let useCase: GetLeagueOwnerSummaryUseCase; @@ -40,10 +43,10 @@ describe('GetLeagueOwnerSummaryUseCase', () => { findByLeagueId: vi.fn(), }; useCase = new GetLeagueOwnerSummaryUseCase( - leagueRepository as any, - driverRepository as any, - leagueMembershipRepository as any, - standingRepository as any + leagueRepository as unknown as LeagueRepository, + driverRepository as unknown as DriverRepository, + leagueMembershipRepository as unknown as LeagueMembershipRepository, + standingRepository as unknown as StandingRepository ); }); diff --git a/core/racing/application/use-cases/GetLeagueScheduleUseCase.test.ts b/core/racing/application/use-cases/GetLeagueScheduleUseCase.test.ts index 7a483bd07..a84cdb31f 100644 --- a/core/racing/application/use-cases/GetLeagueScheduleUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueScheduleUseCase.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetLeagueScheduleUseCase, type GetLeagueScheduleInput, - type GetLeagueScheduleResult, type GetLeagueScheduleErrorCode, } from './GetLeagueScheduleUseCase'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -10,6 +9,8 @@ import type { League } from '../../domain/entities/League'; import { Race } from '../../domain/entities/Race'; import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; import type { RaceRepository } from '../../domain/repositories/RaceRepository'; +import type { Logger } from '@core/shared/domain/Logger'; +import type { SeasonRepository } from '../../domain/repositories/SeasonRepository'; describe('GetLeagueScheduleUseCase', () => { let useCase: GetLeagueScheduleUseCase; @@ -42,7 +43,7 @@ describe('GetLeagueScheduleUseCase', () => { error: vi.fn(), } as unknown as Logger; useCase = new GetLeagueScheduleUseCase(leagueRepository as unknown as LeagueRepository, - seasonRepository as any, + seasonRepository as unknown as SeasonRepository, raceRepository as unknown as RaceRepository, logger); }); @@ -109,7 +110,7 @@ describe('GetLeagueScheduleUseCase', () => { raceRepository.findByLeagueId.mockResolvedValue([janRace, febRace]); // Season 1 covers January - const resultSeason1 = await useCase.execute({ leagueId, seasonId: 'season-jan' } as any); + const resultSeason1 = await useCase.execute({ leagueId, seasonId: 'season-jan' }); expect(resultSeason1.isOk()).toBe(true); const resultValue1 = resultSeason1.unwrap(); expect(resultValue1.seasonId).toBe('season-jan'); @@ -117,7 +118,7 @@ describe('GetLeagueScheduleUseCase', () => { expect(resultValue1.races.map(r => r.race.id)).toEqual(['race-jan']); // Season 2 covers February - const resultSeason2 = await useCase.execute({ leagueId, seasonId: 'season-feb' } as any); + const resultSeason2 = await useCase.execute({ leagueId, seasonId: 'season-feb' }); expect(resultSeason2.isOk()).toBe(true); const resultValue2 = resultSeason2.unwrap(); expect(resultValue2.seasonId).toBe('season-feb'); diff --git a/core/racing/application/use-cases/GetLeagueScheduleUseCase.ts b/core/racing/application/use-cases/GetLeagueScheduleUseCase.ts index 9322a30fa..31ca161ef 100644 --- a/core/racing/application/use-cases/GetLeagueScheduleUseCase.ts +++ b/core/racing/application/use-cases/GetLeagueScheduleUseCase.ts @@ -1,10 +1,13 @@ -import { SeasonScheduleGenerator } from '@/racing/domain/services/SeasonScheduleGenerator'; +import { SeasonScheduleGenerator } from '../../domain/services/SeasonScheduleGenerator'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { League } from '../../domain/entities/League'; import type { Race } from '../../domain/entities/Race'; import type { Season } from '../../domain/entities/season/Season'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; export type GetLeagueScheduleErrorCode = | 'LEAGUE_NOT_FOUND' @@ -51,7 +54,7 @@ export class GetLeagueScheduleUseCase { } const seasons = await this.seasonRepository.findByLeagueId(params.leagueId); - const activeSeason = seasons.find(s => s.status.isActive()) ?? seasons[0]; + const activeSeason = seasons.find((s: Season) => s.status.isActive()) ?? seasons[0]; if (!activeSeason) { return Result.err({ code: 'SEASON_NOT_FOUND', diff --git a/core/racing/application/use-cases/GetLeagueScoringConfigUseCase.test.ts b/core/racing/application/use-cases/GetLeagueScoringConfigUseCase.test.ts index 5fe632b88..e9815357d 100644 --- a/core/racing/application/use-cases/GetLeagueScoringConfigUseCase.test.ts +++ b/core/racing/application/use-cases/GetLeagueScoringConfigUseCase.test.ts @@ -1,5 +1,4 @@ import { describe, it, expect, beforeEach, vi } from 'vitest'; -import { Result } from '@core/shared/domain/Result'; import { GetLeagueScoringConfigUseCase } from './GetLeagueScoringConfigUseCase'; import type { LeagueRepository } from '../../domain/repositories/LeagueRepository'; import type { SeasonRepository } from '../../domain/repositories/SeasonRepository'; @@ -13,10 +12,26 @@ import type { LeagueScoringPreset } from '../../domain/types/LeagueScoringPreset describe('GetLeagueScoringConfigUseCase', () => { let useCase: GetLeagueScoringConfigUseCase; - let mockLeagueRepository: any; - let mockSeasonRepository: any; - let mockLeagueScoringConfigRepository: any; - let mockGameRepository: any; + let mockLeagueRepository: { + findById: any; + exists: any; + save: any; + findAll: any; + }; + let mockSeasonRepository: { + findByLeagueId: any; + save: any; + findById: any; + }; + let mockLeagueScoringConfigRepository: { + findBySeasonId: any; + save: any; + }; + let mockGameRepository: { + findById: any; + save: any; + findAll: any; + }; let mockPresetProvider: { getPresetById: any }; beforeEach(() => { @@ -49,11 +64,11 @@ describe('GetLeagueScoringConfigUseCase', () => { }; useCase = new GetLeagueScoringConfigUseCase( - mockLeagueRepository, - mockSeasonRepository, - mockLeagueScoringConfigRepository, - mockGameRepository, - mockPresetProvider, + mockLeagueRepository as unknown as LeagueRepository, + mockSeasonRepository as unknown as SeasonRepository, + mockLeagueScoringConfigRepository as unknown as LeagueScoringConfigRepository, + mockGameRepository as unknown as GameRepository, + mockPresetProvider as any, ); }); diff --git a/core/racing/application/use-cases/GetRaceDetailUseCase.test.ts b/core/racing/application/use-cases/GetRaceDetailUseCase.test.ts index 5bc39f8f9..33c88d29e 100644 --- a/core/racing/application/use-cases/GetRaceDetailUseCase.test.ts +++ b/core/racing/application/use-cases/GetRaceDetailUseCase.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetRaceDetailUseCase, type GetRaceDetailInput, - type GetRaceDetailResult, type GetRaceDetailErrorCode, } from './GetRaceDetailUseCase'; import type { RaceRepository } from '../../domain/repositories/RaceRepository'; diff --git a/core/racing/application/use-cases/GetRacePenaltiesUseCase.test.ts b/core/racing/application/use-cases/GetRacePenaltiesUseCase.test.ts index 8dcc44ad0..a1e4b094f 100644 --- a/core/racing/application/use-cases/GetRacePenaltiesUseCase.test.ts +++ b/core/racing/application/use-cases/GetRacePenaltiesUseCase.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; import { GetRacePenaltiesUseCase, type GetRacePenaltiesInput, - type GetRacePenaltiesResult, type GetRacePenaltiesErrorCode, } from './GetRacePenaltiesUseCase'; import type { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; diff --git a/core/racing/application/use-cases/GetRaceProtestsUseCase.test.ts b/core/racing/application/use-cases/GetRaceProtestsUseCase.test.ts index ba279a9be..a4cb4c2f4 100644 --- a/core/racing/application/use-cases/GetRaceProtestsUseCase.test.ts +++ b/core/racing/application/use-cases/GetRaceProtestsUseCase.test.ts @@ -9,6 +9,9 @@ import { Protest } from '../../domain/entities/Protest'; import { Driver } from '../../domain/entities/Driver'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { ProtestRepository } from '../../domain/repositories/ProtestRepository'; +import type { DriverRepository } from '../../domain/repositories/DriverRepository'; + describe('GetRaceProtestsUseCase', () => { let useCase: GetRaceProtestsUseCase; let protestRepository: { findByRaceId: Mock }; @@ -17,8 +20,10 @@ describe('GetRaceProtestsUseCase', () => { beforeEach(() => { protestRepository = { findByRaceId: vi.fn() }; driverRepository = { findById: vi.fn() }; - useCase = new GetRaceProtestsUseCase(protestRepository as any, - driverRepository as any); + useCase = new GetRaceProtestsUseCase( + protestRepository as unknown as ProtestRepository, + driverRepository as unknown as DriverRepository + ); }); it('should return protests with drivers', async () => { diff --git a/core/racing/application/use-cases/GetRaceRegistrationsUseCase.test.ts b/core/racing/application/use-cases/GetRaceRegistrationsUseCase.test.ts index 39293b416..d1a1d5567 100644 --- a/core/racing/application/use-cases/GetRaceRegistrationsUseCase.test.ts +++ b/core/racing/application/use-cases/GetRaceRegistrationsUseCase.test.ts @@ -2,12 +2,13 @@ import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetRaceRegistrationsUseCase, type GetRaceRegistrationsInput, - type GetRaceRegistrationsResult, type GetRaceRegistrationsErrorCode, } from './GetRaceRegistrationsUseCase'; import { RaceRegistration } from '@core/racing/domain/entities/RaceRegistration'; import { Race } from '@core/racing/domain/entities/Race'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { RaceRepository } from '../../domain/repositories/RaceRepository'; +import type { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; describe('GetRaceRegistrationsUseCase', () => { let useCase: GetRaceRegistrationsUseCase; @@ -17,8 +18,10 @@ describe('GetRaceRegistrationsUseCase', () => { beforeEach(() => { raceRepository = { findById: vi.fn() }; registrationRepository = { findByRaceId: vi.fn() }; - useCase = new GetRaceRegistrationsUseCase(raceRepository as any, - registrationRepository as any); + useCase = new GetRaceRegistrationsUseCase( + raceRepository as unknown as RaceRepository, + registrationRepository as unknown as RaceRegistrationRepository + ); }); it('should return race and registrations on success', async () => { diff --git a/core/racing/application/use-cases/GetRaceResultsDetailUseCase.test.ts b/core/racing/application/use-cases/GetRaceResultsDetailUseCase.test.ts index 024d84d07..a96a6669c 100644 --- a/core/racing/application/use-cases/GetRaceResultsDetailUseCase.test.ts +++ b/core/racing/application/use-cases/GetRaceResultsDetailUseCase.test.ts @@ -27,11 +27,13 @@ describe('GetRaceResultsDetailUseCase', () => { driverRepository = { findAll: vi.fn() }; penaltyRepository = { findByRaceId: vi.fn() }; - useCase = new GetRaceResultsDetailUseCase(raceRepository as any, - leagueRepository as any, - resultRepository as any, - driverRepository as any, - penaltyRepository as any); + useCase = new GetRaceResultsDetailUseCase( + raceRepository as unknown as RaceRepository, + leagueRepository as unknown as LeagueRepository, + resultRepository as unknown as ResultRepository, + driverRepository as unknown as DriverRepository, + penaltyRepository as unknown as PenaltyRepository + ); }); it('presents race results detail when race exists', async () => { diff --git a/core/racing/application/use-cases/GetRaceWithSOFUseCase.test.ts b/core/racing/application/use-cases/GetRaceWithSOFUseCase.test.ts index 1c4e6d5ee..a7dd7a86c 100644 --- a/core/racing/application/use-cases/GetRaceWithSOFUseCase.test.ts +++ b/core/racing/application/use-cases/GetRaceWithSOFUseCase.test.ts @@ -1,13 +1,15 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetRaceWithSOFUseCase, type GetRaceWithSOFInput, - type GetRaceWithSOFResult, type GetRaceWithSOFErrorCode, } from './GetRaceWithSOFUseCase'; import { Race } from '../../domain/entities/Race'; import { SessionType } from '../../domain/value-objects/SessionType'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { RaceRepository } from '../../domain/repositories/RaceRepository'; +import type { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; +import type { ResultRepository } from '../../domain/repositories/ResultRepository'; describe('GetRaceWithSOFUseCase', () => { let useCase: GetRaceWithSOFUseCase; @@ -34,10 +36,10 @@ describe('GetRaceWithSOFUseCase', () => { }; getDriverRating = vi.fn(); useCase = new GetRaceWithSOFUseCase( - raceRepository as any, - registrationRepository as any, - resultRepository as any, - getDriverRating + raceRepository as unknown as RaceRepository, + registrationRepository as unknown as RaceRegistrationRepository, + resultRepository as unknown as ResultRepository, + getDriverRating as any ); }); diff --git a/core/racing/application/use-cases/GetRacesPageDataUseCase.ts b/core/racing/application/use-cases/GetRacesPageDataUseCase.ts index a020fa5ab..a5c3a58b2 100644 --- a/core/racing/application/use-cases/GetRacesPageDataUseCase.ts +++ b/core/racing/application/use-cases/GetRacesPageDataUseCase.ts @@ -2,7 +2,13 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Race } from '../../domain/entities/Race'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import type { League } from '../../domain/entities/League'; +export interface GetRacesPageDataInput { + leagueId: string; +} export type GetRacesPageRaceItem = { race: Race; @@ -35,16 +41,16 @@ export class GetRacesPageDataUseCase { ]); const leagueMap = new Map( - allLeagues.map(league => [league.id.toString(), league.name.toString()]), + allLeagues.map((league: League) => [league.id.toString(), league.name.toString()]), ); const filteredRaces = input.leagueId - ? allRaces.filter(race => race.leagueId === input.leagueId) + ? allRaces.filter((race: Race) => race.leagueId === input.leagueId) : allRaces; - filteredRaces.sort((a, b) => a.scheduledAt.getTime() - b.scheduledAt.getTime()); + filteredRaces.sort((a: Race, b: Race) => a.scheduledAt.getTime() - b.scheduledAt.getTime()); - const races: GetRacesPageRaceItem[] = filteredRaces.map(race => ({ + const races: GetRacesPageRaceItem[] = filteredRaces.map((race: Race) => ({ race, leagueName: leagueMap.get(race.leagueId) ?? 'Unknown League', })); diff --git a/core/racing/application/use-cases/GetSeasonDetailsUseCase.test.ts b/core/racing/application/use-cases/GetSeasonDetailsUseCase.test.ts index 7dce88eac..e64bdc5ce 100644 --- a/core/racing/application/use-cases/GetSeasonDetailsUseCase.test.ts +++ b/core/racing/application/use-cases/GetSeasonDetailsUseCase.test.ts @@ -1,12 +1,12 @@ -import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { GetSeasonDetailsUseCase, type GetSeasonDetailsInput, - type GetSeasonDetailsResult, type GetSeasonDetailsErrorCode, } from './GetSeasonDetailsUseCase'; import { Season } from '../../domain/entities/season/Season'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { SeasonRepository } from '../../domain/repositories/SeasonRepository'; describe('GetSeasonDetailsUseCase', () => { let useCase: GetSeasonDetailsUseCase; @@ -19,7 +19,7 @@ describe('GetSeasonDetailsUseCase', () => { findById: vi.fn(), }; - useCase = new GetSeasonDetailsUseCase(seasonRepository as any); + useCase = new GetSeasonDetailsUseCase(seasonRepository as unknown as SeasonRepository); }); it('returns full details for a season', async () => { diff --git a/core/racing/application/use-cases/GetSeasonSponsorshipsUseCase.test.ts b/core/racing/application/use-cases/GetSeasonSponsorshipsUseCase.test.ts index 37c065719..1b4a7dcc1 100644 --- a/core/racing/application/use-cases/GetSeasonSponsorshipsUseCase.test.ts +++ b/core/racing/application/use-cases/GetSeasonSponsorshipsUseCase.test.ts @@ -2,7 +2,6 @@ import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest'; import { GetSeasonSponsorshipsUseCase, type GetSeasonSponsorshipsInput, - type GetSeasonSponsorshipsResult, type GetSeasonSponsorshipsErrorCode, } from './GetSeasonSponsorshipsUseCase'; import type { SeasonSponsorshipRepository } from '../../domain/repositories/SeasonSponsorshipRepository'; @@ -52,11 +51,13 @@ describe('GetSeasonSponsorshipsUseCase', () => { findByLeagueId: vi.fn(), }; - useCase = new GetSeasonSponsorshipsUseCase(seasonSponsorshipRepository as any, - seasonRepository as any, - leagueRepository as any, - leagueMembershipRepository as any, - raceRepository as any); + useCase = new GetSeasonSponsorshipsUseCase( + seasonSponsorshipRepository as unknown as SeasonSponsorshipRepository, + seasonRepository as unknown as SeasonRepository, + leagueRepository as unknown as LeagueRepository, + leagueMembershipRepository as unknown as LeagueMembershipRepository, + raceRepository as unknown as RaceRepository + ); }); it('returns SEASON_NOT_FOUND when season does not exist', async () => { diff --git a/core/racing/application/use-cases/GetSponsorsUseCase.ts b/core/racing/application/use-cases/GetSponsorsUseCase.ts index 9624afac1..86016ee6f 100644 --- a/core/racing/application/use-cases/GetSponsorsUseCase.ts +++ b/core/racing/application/use-cases/GetSponsorsUseCase.ts @@ -15,6 +15,7 @@ export class GetSponsorsUseCase { constructor(private readonly sponsorRepository: SponsorRepository) {} async execute(_input: GetSponsorsInput): Promise>> { + void _input; try { const sponsors = await this.sponsorRepository.findAll(); return Result.ok({ sponsors }); diff --git a/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.test.ts b/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.test.ts index 592d1dd5c..93d24411b 100644 --- a/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.test.ts +++ b/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.test.ts @@ -5,9 +5,9 @@ import { type GetTeamJoinRequestsResult, type GetTeamJoinRequestsErrorCode, } from './GetTeamJoinRequestsUseCase'; -import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; -import { DriverRepository } from '../../domain/repositories/DriverRepository'; -import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import type { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { DriverRepository } from '../../domain/repositories/DriverRepository'; +import type { TeamRepository } from '../../domain/repositories/TeamRepository'; import { Driver } from '../../domain/entities/Driver'; import { Team } from '../../domain/entities/Team'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -34,9 +34,11 @@ describe('GetTeamJoinRequestsUseCase', () => { findById: vi.fn(), }; - useCase = new GetTeamJoinRequestsUseCase(membershipRepository as any, - driverRepository as any, - teamRepository as any); + useCase = new GetTeamJoinRequestsUseCase( + membershipRepository as unknown as TeamMembershipRepository, + driverRepository as unknown as DriverRepository, + teamRepository as unknown as TeamRepository + ); }); it('should return join requests with drivers when team exists', async () => { diff --git a/core/racing/application/use-cases/GetTeamMembersUseCase.test.ts b/core/racing/application/use-cases/GetTeamMembersUseCase.test.ts index 33e94a8a2..a425dccd4 100644 --- a/core/racing/application/use-cases/GetTeamMembersUseCase.test.ts +++ b/core/racing/application/use-cases/GetTeamMembersUseCase.test.ts @@ -7,6 +7,10 @@ import { type GetTeamMembersErrorCode, type GetTeamMembersInput } from './GetTeamMembersUseCase'; +import type { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { DriverRepository } from '../../domain/repositories/DriverRepository'; +import type { TeamRepository } from '../../domain/repositories/TeamRepository'; +import type { Logger } from '@core/shared/domain/Logger'; describe('GetTeamMembersUseCase', () => { let useCase: GetTeamMembersUseCase; @@ -41,10 +45,12 @@ describe('GetTeamMembersUseCase', () => { warn: vi.fn(), error: vi.fn(), }; - useCase = new GetTeamMembersUseCase(membershipRepository as any, - driverRepository as any, - teamRepository as any, - logger as any); + useCase = new GetTeamMembersUseCase( + membershipRepository as unknown as TeamMembershipRepository, + driverRepository as unknown as DriverRepository, + teamRepository as unknown as TeamRepository, + logger as unknown as Logger + ); }); it('should return team members with driver entities', async () => { diff --git a/core/racing/application/use-cases/GetTeamMembersUseCase.ts b/core/racing/application/use-cases/GetTeamMembersUseCase.ts index a20702dfc..7291fcf2d 100644 --- a/core/racing/application/use-cases/GetTeamMembersUseCase.ts +++ b/core/racing/application/use-cases/GetTeamMembersUseCase.ts @@ -3,6 +3,10 @@ import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorC import type { Driver } from '../../domain/entities/Driver'; import type { Team } from '../../domain/entities/Team'; import type { TeamMembership } from '../../domain/types/TeamMembership'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import { DriverRepository } from '../../domain/repositories/DriverRepository'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type GetTeamMembersInput = { teamId: string; diff --git a/core/racing/application/use-cases/GetTeamMembershipUseCase.test.ts b/core/racing/application/use-cases/GetTeamMembershipUseCase.test.ts index 7812f0ead..50af1e2e5 100644 --- a/core/racing/application/use-cases/GetTeamMembershipUseCase.test.ts +++ b/core/racing/application/use-cases/GetTeamMembershipUseCase.test.ts @@ -1,15 +1,21 @@ import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { - GetTeamMembershipUseCase, - type GetTeamMembershipErrorCode, - type GetTeamMembershipInput -} from './GetTeamMembershipUseCase'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; describe('GetTeamMembershipUseCase', () => { const mockGetMembership = vi.fn(); - const mockMembershipRepo: any = { + const mockMembershipRepo: { + getMembership: Mock; + getActiveMembershipForDriver: Mock; + getTeamMembers: Mock; + saveMembership: Mock; + removeMembership: Mock; + getJoinRequests: Mock; + countByTeamId: Mock; + saveJoinRequest: Mock; + removeJoinRequest: Mock; + } = { getMembership: mockGetMembership, getActiveMembershipForDriver: vi.fn(), getTeamMembers: vi.fn(), @@ -32,7 +38,7 @@ describe('GetTeamMembershipUseCase', () => { beforeEach(() => { vi.clearAllMocks(); - useCase = new GetTeamMembershipUseCase(mockMembershipRepo, mockLogger); + useCase = new GetTeamMembershipUseCase(mockMembershipRepo as unknown as TeamMembershipRepository, mockLogger); }); it('should return membership data when membership exists', async () => { diff --git a/core/racing/application/use-cases/GetTeamMembershipUseCase.ts b/core/racing/application/use-cases/GetTeamMembershipUseCase.ts index a8c8dee3a..6b2bbfba0 100644 --- a/core/racing/application/use-cases/GetTeamMembershipUseCase.ts +++ b/core/racing/application/use-cases/GetTeamMembershipUseCase.ts @@ -1,5 +1,8 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { Logger } from '@core/shared/domain/Logger'; + export type GetTeamMembershipInput = { teamId: string; driverId: string; diff --git a/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.test.ts b/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.test.ts index b9c8c2f8e..c9032b4b9 100644 --- a/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.test.ts +++ b/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.test.ts @@ -7,10 +7,15 @@ import { type GetTeamsLeaderboardInput } from './GetTeamsLeaderboardUseCase'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { Logger } from '@core/shared/domain/Logger'; + describe('GetTeamsLeaderboardUseCase', () => { let useCase: GetTeamsLeaderboardUseCase; let teamRepository: { findAll: Mock; + findById: Mock; }; let teamMembershipRepository: { getTeamMembers: Mock; @@ -26,6 +31,7 @@ describe('GetTeamsLeaderboardUseCase', () => { beforeEach(() => { teamRepository = { findAll: vi.fn(), + findById: vi.fn(), }; teamMembershipRepository = { getTeamMembers: vi.fn(), @@ -37,10 +43,11 @@ describe('GetTeamsLeaderboardUseCase', () => { warn: vi.fn(), error: vi.fn(), }; - useCase = new GetTeamsLeaderboardUseCase(teamRepository as any, - teamMembershipRepository as any, + useCase = new GetTeamsLeaderboardUseCase( + teamRepository as unknown as TeamRepository, + teamMembershipRepository as unknown as TeamMembershipRepository, getDriverStats as any, - logger as any + logger as unknown as Logger ); }); diff --git a/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.ts b/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.ts index df3642012..c66bcda1d 100644 --- a/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.ts +++ b/core/racing/application/use-cases/GetTeamsLeaderboardUseCase.ts @@ -1,8 +1,10 @@ -import { Team } from '@/racing/domain/entities/Team'; +import { Team } from '../../domain/entities/Team'; import { SkillLevelService, type SkillLevel } from '@core/racing/domain/services/SkillLevelService'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; interface DriverStatsAdapter { rating: number | null; @@ -55,7 +57,7 @@ export class GetTeamsLeaderboardUseCase { const items: TeamLeaderboardItem[] = []; await Promise.all( - allTeams.map(async (team) => { + allTeams.map(async (team: Team) => { const memberships = await this.teamMembershipRepository.getTeamMembers(team.id); const memberCount = memberships.length; diff --git a/core/racing/application/use-cases/GetTotalDriversUseCase.ts b/core/racing/application/use-cases/GetTotalDriversUseCase.ts index bb70968a7..e707655d2 100644 --- a/core/racing/application/use-cases/GetTotalDriversUseCase.ts +++ b/core/racing/application/use-cases/GetTotalDriversUseCase.ts @@ -16,6 +16,7 @@ export class GetTotalDriversUseCase { async execute( _input: GetTotalDriversInput, ): Promise>> { + void _input; try { const drivers = await this.driverRepository.findAll(); const totalDrivers = drivers.length; diff --git a/core/racing/application/use-cases/GetTotalLeaguesUseCase.ts b/core/racing/application/use-cases/GetTotalLeaguesUseCase.ts index 64c60b316..3cd5b1131 100644 --- a/core/racing/application/use-cases/GetTotalLeaguesUseCase.ts +++ b/core/racing/application/use-cases/GetTotalLeaguesUseCase.ts @@ -16,6 +16,7 @@ export class GetTotalLeaguesUseCase { async execute( _input: GetTotalLeaguesInput, ): Promise>> { + void _input; try { const leagues = await this.leagueRepository.findAll(); const totalLeagues = leagues.length; diff --git a/core/racing/application/use-cases/GetTotalRacesUseCase.ts b/core/racing/application/use-cases/GetTotalRacesUseCase.ts index f7ea6c8e1..074e24f9d 100644 --- a/core/racing/application/use-cases/GetTotalRacesUseCase.ts +++ b/core/racing/application/use-cases/GetTotalRacesUseCase.ts @@ -16,6 +16,7 @@ export class GetTotalRacesUseCase { async execute( _input: GetTotalRacesInput, ): Promise>> { + void _input; try { const races = await this.raceRepository.findAll(); const totalRaces = races.length; diff --git a/core/racing/application/use-cases/ImportRaceResultsApiUseCase.ts b/core/racing/application/use-cases/ImportRaceResultsApiUseCase.ts index 3a7f94b71..e7c48b5a2 100644 --- a/core/racing/application/use-cases/ImportRaceResultsApiUseCase.ts +++ b/core/racing/application/use-cases/ImportRaceResultsApiUseCase.ts @@ -1,6 +1,12 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { Result as RaceResult } from '../../domain/entities/result/Result'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { ResultRepository } from '../../domain/repositories/ResultRepository'; +import { DriverRepository } from '../../domain/repositories/DriverRepository'; +import { StandingRepository } from '../../domain/repositories/StandingRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type ImportRaceResultDTO = { id: string; diff --git a/core/racing/application/use-cases/ImportRaceResultsUseCase.ts b/core/racing/application/use-cases/ImportRaceResultsUseCase.ts index ff9271e97..65adc45c6 100644 --- a/core/racing/application/use-cases/ImportRaceResultsUseCase.ts +++ b/core/racing/application/use-cases/ImportRaceResultsUseCase.ts @@ -1,6 +1,12 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { Result as RaceResult } from '../../domain/entities/result/Result'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { ResultRepository } from '../../domain/repositories/ResultRepository'; +import { DriverRepository } from '../../domain/repositories/DriverRepository'; +import { StandingRepository } from '../../domain/repositories/StandingRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type ImportRaceResultRow = { id: string; diff --git a/core/racing/application/use-cases/JoinLeagueUseCase.ts b/core/racing/application/use-cases/JoinLeagueUseCase.ts index 7d03c1532..8365162a4 100644 --- a/core/racing/application/use-cases/JoinLeagueUseCase.ts +++ b/core/racing/application/use-cases/JoinLeagueUseCase.ts @@ -1,7 +1,8 @@ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { LeagueMembership } from '../../domain/entities/LeagueMembership'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; export type JoinLeagueErrorCode = 'ALREADY_MEMBER' | 'REPOSITORY_ERROR'; diff --git a/core/racing/application/use-cases/JoinTeamUseCase.ts b/core/racing/application/use-cases/JoinTeamUseCase.ts index e6f1b6902..8339168ea 100644 --- a/core/racing/application/use-cases/JoinTeamUseCase.ts +++ b/core/racing/application/use-cases/JoinTeamUseCase.ts @@ -1,8 +1,10 @@ -import { TeamMembership } from '@/racing/domain/types/TeamMembership'; +import { TeamMembership } from '../../domain/types/TeamMembership'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Team } from '../../domain/entities/Team'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; export type JoinTeamErrorCode = | 'ALREADY_IN_TEAM' diff --git a/core/racing/application/use-cases/LeagueSeasonScheduleMutationsUseCases.test.ts b/core/racing/application/use-cases/LeagueSeasonScheduleMutationsUseCases.test.ts index 85a81b4d2..6a777819b 100644 --- a/core/racing/application/use-cases/LeagueSeasonScheduleMutationsUseCases.test.ts +++ b/core/racing/application/use-cases/LeagueSeasonScheduleMutationsUseCases.test.ts @@ -5,20 +5,26 @@ import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorC import { Race } from '../../domain/entities/Race'; import { Season } from '../../domain/entities/season/Season'; +import type { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import type { RaceRepository } from '../../domain/repositories/RaceRepository'; import { CreateLeagueSeasonScheduleRaceUseCase, type CreateLeagueSeasonScheduleRaceErrorCode } from './CreateLeagueSeasonScheduleRaceUseCase'; +import { DeleteLeagueSeasonScheduleRaceUseCase, type DeleteLeagueSeasonScheduleRaceErrorCode } from './DeleteLeagueSeasonScheduleRaceUseCase'; +import { PublishLeagueSeasonScheduleUseCase, type PublishLeagueSeasonScheduleErrorCode } from './PublishLeagueSeasonScheduleUseCase'; +import { UnpublishLeagueSeasonScheduleUseCase, type UnpublishLeagueSeasonScheduleErrorCode } from './UnpublishLeagueSeasonScheduleUseCase'; +import { UpdateLeagueSeasonScheduleRaceUseCase, type UpdateLeagueSeasonScheduleRaceErrorCode } from './UpdateLeagueSeasonScheduleRaceUseCase'; @@ -60,8 +66,8 @@ describe('CreateLeagueSeasonScheduleRaceUseCase', () => { seasonRepository.findById.mockResolvedValue(season); raceRepository.create.mockImplementation(async (race: Race) => race); - const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger, { generateRaceId: () => 'race-123' }, ); @@ -89,8 +95,8 @@ describe('CreateLeagueSeasonScheduleRaceUseCase', () => { const season = createSeasonWithinWindow({ leagueId: 'other-league' }); seasonRepository.findById.mockResolvedValue(season); - const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger, { generateRaceId: () => 'race-123' }, ); @@ -116,8 +122,8 @@ describe('CreateLeagueSeasonScheduleRaceUseCase', () => { const season = createSeasonWithinWindow(); seasonRepository.findById.mockResolvedValue(season); - const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new CreateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger, { generateRaceId: () => 'race-123' }, ); @@ -165,8 +171,8 @@ describe('UpdateLeagueSeasonScheduleRaceUseCase', () => { raceRepository.findById.mockResolvedValue(existing); raceRepository.update.mockImplementation(async (race: Race) => race); - const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const newScheduledAt = new Date('2025-01-20T20:00:00Z'); @@ -189,8 +195,8 @@ describe('UpdateLeagueSeasonScheduleRaceUseCase', () => { const season = createSeasonWithinWindow({ leagueId: 'other-league' }); seasonRepository.findById.mockResolvedValue(season); - const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -223,8 +229,8 @@ describe('UpdateLeagueSeasonScheduleRaceUseCase', () => { }); raceRepository.findById.mockResolvedValue(existing); - const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -248,8 +254,8 @@ describe('UpdateLeagueSeasonScheduleRaceUseCase', () => { seasonRepository.findById.mockResolvedValue(season); raceRepository.findById.mockResolvedValue(null); - const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new UpdateLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -294,8 +300,8 @@ describe('DeleteLeagueSeasonScheduleRaceUseCase', () => { raceRepository.findById.mockResolvedValue(existing); raceRepository.delete.mockResolvedValue(undefined); - const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -313,8 +319,8 @@ describe('DeleteLeagueSeasonScheduleRaceUseCase', () => { const season = createSeasonWithinWindow({ leagueId: 'other-league' }); seasonRepository.findById.mockResolvedValue(season); - const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -338,8 +344,8 @@ describe('DeleteLeagueSeasonScheduleRaceUseCase', () => { seasonRepository.findById.mockResolvedValue(season); raceRepository.findById.mockResolvedValue(null); - const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as any, - raceRepository as any, + const useCase = new DeleteLeagueSeasonScheduleRaceUseCase(seasonRepository as unknown as SeasonRepository, + raceRepository as unknown as RaceRepository, logger); const result = await useCase.execute({ @@ -372,7 +378,7 @@ describe('PublishLeagueSeasonScheduleUseCase', () => { seasonRepository.findById.mockResolvedValue(season); seasonRepository.update.mockResolvedValue(undefined); - const useCase = new PublishLeagueSeasonScheduleUseCase(seasonRepository as any, + const useCase = new PublishLeagueSeasonScheduleUseCase(seasonRepository as unknown as SeasonRepository, logger); const result = await useCase.execute({ leagueId: 'league-1', seasonId: 'season-1' }); @@ -388,7 +394,7 @@ describe('PublishLeagueSeasonScheduleUseCase', () => { const season = createSeasonWithinWindow({ leagueId: 'other-league' }); seasonRepository.findById.mockResolvedValue(season); - const useCase = new PublishLeagueSeasonScheduleUseCase(seasonRepository as any, + const useCase = new PublishLeagueSeasonScheduleUseCase(seasonRepository as unknown as SeasonRepository, logger); const result = await useCase.execute({ leagueId: 'league-1', seasonId: 'season-1' }); @@ -417,7 +423,7 @@ describe('UnpublishLeagueSeasonScheduleUseCase', () => { seasonRepository.findById.mockResolvedValue(season); seasonRepository.update.mockResolvedValue(undefined); - const useCase = new UnpublishLeagueSeasonScheduleUseCase(seasonRepository as any, + const useCase = new UnpublishLeagueSeasonScheduleUseCase(seasonRepository as unknown as SeasonRepository, logger); const result = await useCase.execute({ leagueId: 'league-1', seasonId: 'season-1' }); @@ -433,7 +439,7 @@ describe('UnpublishLeagueSeasonScheduleUseCase', () => { const season = createSeasonWithinWindow({ leagueId: 'other-league' }); seasonRepository.findById.mockResolvedValue(season); - const useCase = new UnpublishLeagueSeasonScheduleUseCase(seasonRepository as any, + const useCase = new UnpublishLeagueSeasonScheduleUseCase(seasonRepository as unknown as SeasonRepository, logger); const result = await useCase.execute({ leagueId: 'league-1', seasonId: 'season-1' }); diff --git a/core/racing/application/use-cases/LeaveTeamUseCase.ts b/core/racing/application/use-cases/LeaveTeamUseCase.ts index 1fbd86a48..73d2da166 100644 --- a/core/racing/application/use-cases/LeaveTeamUseCase.ts +++ b/core/racing/application/use-cases/LeaveTeamUseCase.ts @@ -1,8 +1,10 @@ -import { TeamMembership } from '@/racing/domain/types/TeamMembership'; +import { TeamMembership } from '../../domain/types/TeamMembership'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Team } from '../../domain/entities/Team'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; export type LeaveTeamErrorCode = | 'TEAM_NOT_FOUND' diff --git a/core/racing/application/use-cases/PublishLeagueSeasonScheduleUseCase.ts b/core/racing/application/use-cases/PublishLeagueSeasonScheduleUseCase.ts index d3e96f3d0..79befd866 100644 --- a/core/racing/application/use-cases/PublishLeagueSeasonScheduleUseCase.ts +++ b/core/racing/application/use-cases/PublishLeagueSeasonScheduleUseCase.ts @@ -1,8 +1,12 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; - +export interface PublishLeagueSeasonScheduleInput { + leagueId: string; + seasonId: string; +} export type PublishLeagueSeasonScheduleResult = { success: true; diff --git a/core/racing/application/use-cases/QuickPenaltyUseCase.ts b/core/racing/application/use-cases/QuickPenaltyUseCase.ts index 0fdeb51ef..d58745128 100644 --- a/core/racing/application/use-cases/QuickPenaltyUseCase.ts +++ b/core/racing/application/use-cases/QuickPenaltyUseCase.ts @@ -5,11 +5,14 @@ * Designed for fast, common penalty scenarios like track limits, warnings, etc. */ -import { Result } from '@/shared/domain/Result'; +import { Result } from '@core/shared/domain/Result'; import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { randomUUID } from 'crypto'; import { Penalty } from '../../domain/entities/penalty/Penalty'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; export type QuickPenaltyErrorCode = 'RACE_NOT_FOUND' | 'UNAUTHORIZED' | 'UNKNOWN_INFRACTION' | 'REPOSITORY_ERROR'; @@ -55,7 +58,7 @@ export class QuickPenaltyUseCase { // Validate admin has authority const memberships = await this.leagueMembershipRepository.getLeagueMembers(race.leagueId); const adminMembership = memberships.find( - m => m.driverId.toString() === input.adminId && m.status.toString() === 'active' + (m: any) => m.driverId.toString() === input.adminId && m.status.toString() === 'active' ); if (!adminMembership || (adminMembership.role.toString() !== 'owner' && adminMembership.role.toString() !== 'admin')) { @@ -99,7 +102,7 @@ export class QuickPenaltyUseCase { await this.penaltyRepository.create(penalty); const result: QuickPenaltyResult = { - penaltyId: penalty.id, + penaltyId: penalty.id.toString(), raceId: input.raceId, driverId: input.driverId, type, diff --git a/core/racing/application/use-cases/RecalculateChampionshipStandingsUseCase.ts b/core/racing/application/use-cases/RecalculateChampionshipStandingsUseCase.ts index 78ca8376d..5d8870697 100644 --- a/core/racing/application/use-cases/RecalculateChampionshipStandingsUseCase.ts +++ b/core/racing/application/use-cases/RecalculateChampionshipStandingsUseCase.ts @@ -1,5 +1,5 @@ -import { ChampionshipStanding } from '@/racing/domain/entities/championship/ChampionshipStanding'; +import { ChampionshipStanding } from '../../domain/entities/championship/ChampionshipStanding'; import { ChampionshipAggregator } from '@core/racing/domain/services/ChampionshipAggregator'; import { EventScoringService } from '@core/racing/domain/services/EventScoringService'; import type { ChampionshipConfig } from '@core/racing/domain/types/ChampionshipConfig'; @@ -8,6 +8,13 @@ import type { SessionType } from '@core/racing/domain/types/SessionType'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { LeagueScoringConfigRepository } from '../../domain/repositories/LeagueScoringConfigRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { ResultRepository } from '../../domain/repositories/ResultRepository'; +import { PenaltyRepository } from '../../domain/repositories/PenaltyRepository'; +import { ChampionshipStandingRepository } from '../../domain/repositories/ChampionshipStandingRepository'; export type RecalculateChampionshipStandingsInput = { leagueId: string; @@ -48,7 +55,7 @@ export class RecalculateChampionshipStandingsUseCase { input: RecalculateChampionshipStandingsInput, ): Promise< Result< - void, + RecalculateChampionshipStandingsResult, ApplicationErrorCode > > { diff --git a/core/racing/application/use-cases/RecomputeTeamRatingSnapshotUseCase.test.ts b/core/racing/application/use-cases/RecomputeTeamRatingSnapshotUseCase.test.ts index a25831ee4..65c3037a3 100644 --- a/core/racing/application/use-cases/RecomputeTeamRatingSnapshotUseCase.test.ts +++ b/core/racing/application/use-cases/RecomputeTeamRatingSnapshotUseCase.test.ts @@ -5,6 +5,7 @@ import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; +import { TeamRating } from '../../domain/entities/TeamRating'; // Mock repositories class MockTeamRatingEventRepository implements TeamRatingEventRepository { @@ -48,13 +49,13 @@ class MockTeamRatingEventRepository implements TeamRatingEventRepository { } class MockTeamRatingRepository implements TeamRatingRepository { - private snapshots: Map = new Map(); + private snapshots: Map = new Map(); - async findByTeamId(teamId: string): Promise { + async findByTeamId(teamId: string): Promise { return this.snapshots.get(teamId) || null; } - async save(snapshot: any): Promise { + async save(snapshot: TeamRating): Promise { this.snapshots.set(snapshot.teamId, snapshot); return snapshot; } diff --git a/core/racing/application/use-cases/RecordTeamRaceRatingEventsUseCase.test.ts b/core/racing/application/use-cases/RecordTeamRaceRatingEventsUseCase.test.ts index ece593a9a..bab3fe80a 100644 --- a/core/racing/application/use-cases/RecordTeamRaceRatingEventsUseCase.test.ts +++ b/core/racing/application/use-cases/RecordTeamRaceRatingEventsUseCase.test.ts @@ -6,14 +6,14 @@ import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase'; import { TeamDrivingRaceFactsDto } from '@core/racing/domain/services/TeamDrivingRatingEventFactory'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; -import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; -import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; +import { TeamRating } from '../../domain/entities/TeamRating'; +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; // Mock repositories class MockTeamRaceResultsProvider implements TeamRaceResultsProvider { private results: TeamDrivingRaceFactsDto | null = null; - async getTeamRaceResults(raceId: string): Promise { + async getTeamRaceResults(_raceId: string): Promise { return this.results; } @@ -59,13 +59,13 @@ class MockTeamRatingEventRepository implements TeamRatingEventRepository { } class MockTeamRatingRepository implements TeamRatingRepository { - private snapshots: Map = new Map(); + private snapshots: Map = new Map(); - async findByTeamId(teamId: string): Promise { + async findByTeamId(teamId: string): Promise { return this.snapshots.get(teamId) || null; } - async save(snapshot: any): Promise { + async save(snapshot: TeamRating): Promise { this.snapshots.set(snapshot.teamId, snapshot); return snapshot; } diff --git a/core/racing/application/use-cases/RejectLeagueJoinRequestUseCase.test.ts b/core/racing/application/use-cases/RejectLeagueJoinRequestUseCase.test.ts index 8c3ecdf14..51e688ced 100644 --- a/core/racing/application/use-cases/RejectLeagueJoinRequestUseCase.test.ts +++ b/core/racing/application/use-cases/RejectLeagueJoinRequestUseCase.test.ts @@ -1,7 +1,6 @@ import { describe, it, expect, vi, type Mock, beforeEach } from 'vitest'; import { RejectLeagueJoinRequestUseCase, - type RejectLeagueJoinRequestResult, } from './RejectLeagueJoinRequestUseCase'; import type { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -22,7 +21,7 @@ describe('RejectLeagueJoinRequestUseCase', () => { it('reject removes request only', async () => { const output: { present: Mock } = { present: vi.fn(), - } as any; + }; const useCase = new RejectLeagueJoinRequestUseCase(leagueMembershipRepository as unknown as LeagueMembershipRepository); @@ -32,7 +31,6 @@ describe('RejectLeagueJoinRequestUseCase', () => { const result = await useCase.execute( { leagueId: 'league-1', joinRequestId: 'jr-1' }, - output, ); expect(result.isOk()).toBe(true); @@ -42,7 +40,7 @@ describe('RejectLeagueJoinRequestUseCase', () => { it('reject returns error when request missing', async () => { const output: { present: Mock } = { present: vi.fn(), - } as any; + }; const useCase = new RejectLeagueJoinRequestUseCase(leagueMembershipRepository as unknown as LeagueMembershipRepository); @@ -50,7 +48,6 @@ describe('RejectLeagueJoinRequestUseCase', () => { const result = await useCase.execute( { leagueId: 'league-1', joinRequestId: 'jr-404' }, - output, ); expect(result.isErr()).toBe(true); diff --git a/core/racing/application/use-cases/RejectSponsorshipRequestUseCase.ts b/core/racing/application/use-cases/RejectSponsorshipRequestUseCase.ts index 20245b25b..0afc6aa92 100644 --- a/core/racing/application/use-cases/RejectSponsorshipRequestUseCase.ts +++ b/core/racing/application/use-cases/RejectSponsorshipRequestUseCase.ts @@ -7,7 +7,13 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { SponsorshipRequestRepository } from '../../domain/repositories/SponsorshipRequestRepository'; +export interface RejectSponsorshipRequestInput { + requestId: string; + respondedBy: string; + reason?: string; +} export type RejectSponsorshipRequestResult = { requestId: string; diff --git a/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.test.ts b/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.test.ts index 7185d42ec..8f40e8b75 100644 --- a/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.test.ts +++ b/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.test.ts @@ -2,12 +2,12 @@ import { describe, it, expect, beforeEach, vi, type Mock } from 'vitest'; import { RejectTeamJoinRequestUseCase, type RejectTeamJoinRequestInput, - type RejectTeamJoinRequestResult, type RejectTeamJoinRequestErrorCode, } from './RejectTeamJoinRequestUseCase'; import type { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; import type { TeamRepository } from '../../domain/repositories/TeamRepository'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import type { Logger } from '@core/shared/domain/Logger'; interface TeamRepositoryMock { findById: Mock; diff --git a/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.ts b/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.ts index 110186596..a80300813 100644 --- a/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.ts +++ b/core/racing/application/use-cases/RejectTeamJoinRequestUseCase.ts @@ -1,7 +1,16 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { TeamRepository } from '../../domain/repositories/TeamRepository'; +import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; +import type { TeamJoinRequest } from '../../domain/types/TeamMembership'; +export interface RejectTeamJoinRequestInput { + teamId: string; + managerId: string; + requestId: string; + reason?: string; +} export type RejectTeamJoinRequestResult = { teamId: string; @@ -57,7 +66,7 @@ export class RejectTeamJoinRequestUseCase { } const joinRequests = await this.membershipRepository.getJoinRequests(teamId); - const joinRequest = joinRequests.find(r => r.id === requestId); + const joinRequest = joinRequests.find((r: TeamJoinRequest) => r.id === requestId); if (!joinRequest) { this.logger.warn('Join request not found when rejecting', { teamId, managerId, requestId }); return Result.err({ diff --git a/core/racing/application/use-cases/ReopenRaceUseCase.ts b/core/racing/application/use-cases/ReopenRaceUseCase.ts index e9ae53c7f..3c8660a21 100644 --- a/core/racing/application/use-cases/ReopenRaceUseCase.ts +++ b/core/racing/application/use-cases/ReopenRaceUseCase.ts @@ -1,6 +1,8 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Race } from '../../domain/entities/Race'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import type { Logger } from '@core/shared/domain/Logger'; export type ReopenRaceInput = { raceId: string; diff --git a/core/racing/application/use-cases/ReviewProtestUseCase.ts b/core/racing/application/use-cases/ReviewProtestUseCase.ts index f223c0c1b..017845fc2 100644 --- a/core/racing/application/use-cases/ReviewProtestUseCase.ts +++ b/core/racing/application/use-cases/ReviewProtestUseCase.ts @@ -6,6 +6,12 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { ProtestRepository } from '../../domain/repositories/ProtestRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +import type { Logger } from '@core/shared/domain/Logger'; + +import { LeagueMembership } from '../../domain/entities/LeagueMembership'; export type ReviewProtestErrorCode = 'PROTEST_NOT_FOUND' | 'RACE_NOT_FOUND' | 'NOT_LEAGUE_ADMIN' | 'REPOSITORY_ERROR'; @@ -53,7 +59,7 @@ export class ReviewProtestUseCase { // Validate steward has authority (owner or admin of the league) const memberships = await this.leagueMembershipRepository.getLeagueMembers(race.leagueId); const stewardMembership = memberships.find( - m => m.driverId.toString() === input.stewardId && m.status.toString() === 'active' + (m: LeagueMembership) => m.driverId.toString() === input.stewardId && m.status.toString() === 'active' ); if (!stewardMembership || (stewardMembership.role.toString() !== 'owner' && stewardMembership.role.toString() !== 'admin')) { diff --git a/core/racing/application/use-cases/SeasonUseCases.test.ts b/core/racing/application/use-cases/SeasonUseCases.test.ts index 605b22354..e56ec5f8e 100644 --- a/core/racing/application/use-cases/SeasonUseCases.test.ts +++ b/core/racing/application/use-cases/SeasonUseCases.test.ts @@ -11,10 +11,6 @@ import { ManageSeasonLifecycleUseCase, type CreateSeasonForLeagueCommand, type ManageSeasonLifecycleCommand, - type CreateSeasonForLeagueResult, - type ListSeasonsForLeagueResult, - type GetSeasonDetailsResult, - type ManageSeasonLifecycleResult, type CreateSeasonForLeagueErrorCode, type ListSeasonsForLeagueErrorCode, type GetSeasonDetailsErrorCode, diff --git a/core/racing/application/use-cases/SendFinalResultsUseCase.ts b/core/racing/application/use-cases/SendFinalResultsUseCase.ts index 4b348e65c..431960e9e 100644 --- a/core/racing/application/use-cases/SendFinalResultsUseCase.ts +++ b/core/racing/application/use-cases/SendFinalResultsUseCase.ts @@ -1,4 +1,4 @@ -import { Position } from '@/racing/domain/entities/result/Position'; +import { Position } from '../../domain/entities/result/Position'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -8,6 +8,10 @@ import type { RaceEvent } from '../../domain/entities/RaceEvent'; import { IncidentCount } from '../../domain/entities/result/IncidentCount'; import type { Result as RaceResult } from '../../domain/entities/result/Result'; import { isLeagueStewardOrHigherRole } from '../../domain/types/LeagueRoles'; +import { RaceEventRepository } from '../../domain/repositories/RaceEventRepository'; +import { ResultRepository } from '../../domain/repositories/ResultRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; export type SendFinalResultsInput = { leagueId: string; diff --git a/core/racing/application/use-cases/SendPerformanceSummaryUseCase.ts b/core/racing/application/use-cases/SendPerformanceSummaryUseCase.ts index 7c382dcf5..495fcf7b8 100644 --- a/core/racing/application/use-cases/SendPerformanceSummaryUseCase.ts +++ b/core/racing/application/use-cases/SendPerformanceSummaryUseCase.ts @@ -1,4 +1,4 @@ -import { isLeagueStewardOrHigherRole } from '@/racing/domain/types/LeagueRoles'; +import { isLeagueStewardOrHigherRole } from '../../domain/types/LeagueRoles'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; @@ -8,6 +8,11 @@ import type { RaceEvent } from '../../domain/entities/RaceEvent'; import { IncidentCount } from '../../domain/entities/result/IncidentCount'; import { Position } from '../../domain/entities/result/Position'; import type { Result as RaceResult } from '../../domain/entities/result/Result'; +import { RaceEventRepository } from '../../domain/repositories/RaceEventRepository'; +import { ResultRepository } from '../../domain/repositories/ResultRepository'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; +import { DriverRepository } from '../../domain/repositories/DriverRepository'; export type SendPerformanceSummaryInput = { leagueId: string; @@ -87,7 +92,7 @@ export class SendPerformanceSummaryUseCase { } const results = await this.resultRepository.findByRaceId(mainRaceSession.id); - const driverResult = results.find(r => r.driverId.toString() === input.driverId); + const driverResult = results.find((r: RaceResult) => r.driverId.toString() === input.driverId); if (!driverResult) { return Result.err({ diff --git a/core/racing/application/use-cases/TeamRankingUseCase.test.ts b/core/racing/application/use-cases/TeamRankingUseCase.test.ts index e99dc60f6..e5658c372 100644 --- a/core/racing/application/use-cases/TeamRankingUseCase.test.ts +++ b/core/racing/application/use-cases/TeamRankingUseCase.test.ts @@ -407,7 +407,6 @@ describe('TeamRankingUseCase', () => { describe('error handling', () => { it('should handle repository errors gracefully', async () => { // Mock repository to throw error - const originalFindAll = mockTeamRepo.findAll.bind(mockTeamRepo); mockTeamRepo.findAll = async () => { throw new Error('Repository connection failed'); }; diff --git a/core/racing/application/use-cases/TeamRatingFactoryUseCase.test.ts b/core/racing/application/use-cases/TeamRatingFactoryUseCase.test.ts index 024e9330f..cf456dbda 100644 --- a/core/racing/application/use-cases/TeamRatingFactoryUseCase.test.ts +++ b/core/racing/application/use-cases/TeamRatingFactoryUseCase.test.ts @@ -7,7 +7,7 @@ import { TeamRatingFactoryUseCase } from './TeamRatingFactoryUseCase'; class MockTeamRaceResultsProvider implements TeamRaceResultsProvider { private results: TeamDrivingRaceFactsDto | null = null; - async getTeamRaceResults(raceId: string): Promise { + async getTeamRaceResults(_raceId: string): Promise { return this.results; } diff --git a/core/racing/application/use-cases/TeamRatingFactoryUseCase.ts b/core/racing/application/use-cases/TeamRatingFactoryUseCase.ts index 42873b84c..e29425a42 100644 --- a/core/racing/application/use-cases/TeamRatingFactoryUseCase.ts +++ b/core/racing/application/use-cases/TeamRatingFactoryUseCase.ts @@ -6,12 +6,13 @@ * Mirrors the user rating factory pattern. */ -import { TeamDrivingRatingEventFactory } from '@/racing/domain/services/TeamDrivingRatingEventFactory'; +import { TeamDrivingRatingEventFactory } from '../../domain/services/TeamDrivingRatingEventFactory'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import type { Logger } from '@core/shared/domain/Logger'; +import { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider'; export interface TeamRatingFactoryInput { raceId: string; diff --git a/core/racing/application/use-cases/TransferLeagueOwnershipUseCase.ts b/core/racing/application/use-cases/TransferLeagueOwnershipUseCase.ts index 53398bc32..cc5c9308d 100644 --- a/core/racing/application/use-cases/TransferLeagueOwnershipUseCase.ts +++ b/core/racing/application/use-cases/TransferLeagueOwnershipUseCase.ts @@ -4,7 +4,13 @@ import type { import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +export interface TransferLeagueOwnershipInput { + leagueId: string; + currentOwnerId: string; + newOwnerId: string; +} export type TransferLeagueOwnershipResult = { leagueId: string; diff --git a/core/racing/application/use-cases/UnpublishLeagueSeasonScheduleUseCase.ts b/core/racing/application/use-cases/UnpublishLeagueSeasonScheduleUseCase.ts index 13ef952cb..98e9c1b9a 100644 --- a/core/racing/application/use-cases/UnpublishLeagueSeasonScheduleUseCase.ts +++ b/core/racing/application/use-cases/UnpublishLeagueSeasonScheduleUseCase.ts @@ -1,8 +1,12 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; - +export interface UnpublishLeagueSeasonScheduleInput { + leagueId: string; + seasonId: string; +} export type UnpublishLeagueSeasonScheduleResult = { success: true; diff --git a/core/racing/application/use-cases/UpdateDriverProfileUseCase.ts b/core/racing/application/use-cases/UpdateDriverProfileUseCase.ts index d3c38fa38..e52d7b81d 100644 --- a/core/racing/application/use-cases/UpdateDriverProfileUseCase.ts +++ b/core/racing/application/use-cases/UpdateDriverProfileUseCase.ts @@ -1,7 +1,7 @@ import { Result } from '@core/shared/domain/Result'; import type { UseCase } from '@core/shared/application/UseCase'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import type { Logger } from '@core/shared/application/Logger'; +import type { Logger } from '@core/shared/domain/Logger'; import type { DriverRepository } from '../../domain/repositories/DriverRepository'; import type { Driver } from '../../domain/entities/Driver'; diff --git a/core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase.test.ts b/core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase.test.ts index b84c93882..187378b2a 100644 --- a/core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase.test.ts +++ b/core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase.test.ts @@ -1,8 +1,7 @@ -import { describe, it, expect, vi, type Mock } from 'vitest'; +import { describe, it, expect, vi } from 'vitest'; import { UpdateLeagueMemberRoleUseCase, type UpdateLeagueMemberRoleInput, - type UpdateLeagueMemberRoleResult, type UpdateLeagueMemberRoleErrorCode, } from './UpdateLeagueMemberRoleUseCase'; import type { LeagueMembershipRepository } from '../../domain/repositories/LeagueMembershipRepository'; @@ -22,9 +21,9 @@ describe('UpdateLeagueMemberRoleUseCase', () => { const mockLeagueMembershipRepository = { getLeagueMembers: vi.fn().mockResolvedValue([mockMembership]), saveMembership: vi.fn().mockResolvedValue(undefined), - } as any; + }; - const useCase = new UpdateLeagueMemberRoleUseCase(mockLeagueMembershipRepository); + const useCase = new UpdateLeagueMemberRoleUseCase(mockLeagueMembershipRepository as unknown as LeagueMembershipRepository); const input: UpdateLeagueMemberRoleInput = { leagueId: 'league-1', diff --git a/core/racing/application/use-cases/UpdateLeagueSeasonScheduleRaceUseCase.ts b/core/racing/application/use-cases/UpdateLeagueSeasonScheduleRaceUseCase.ts index 52c9d0a32..bc922171a 100644 --- a/core/racing/application/use-cases/UpdateLeagueSeasonScheduleRaceUseCase.ts +++ b/core/racing/application/use-cases/UpdateLeagueSeasonScheduleRaceUseCase.ts @@ -2,9 +2,11 @@ import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; -import { SeasonScheduleGenerator } from '@/racing/domain/services/SeasonScheduleGenerator'; +import { SeasonScheduleGenerator } from '../../domain/services/SeasonScheduleGenerator'; import { Race } from '../../domain/entities/Race'; import type { Season } from '../../domain/entities/season/Season'; +import { SeasonRepository } from '../../domain/repositories/SeasonRepository'; +import { RaceRepository } from '../../domain/repositories/RaceRepository'; export type UpdateLeagueSeasonScheduleRaceInput = { leagueId: string; diff --git a/core/racing/application/use-cases/UpdateTeamUseCase.test.ts b/core/racing/application/use-cases/UpdateTeamUseCase.test.ts index 498c53414..18f660ee0 100644 --- a/core/racing/application/use-cases/UpdateTeamUseCase.test.ts +++ b/core/racing/application/use-cases/UpdateTeamUseCase.test.ts @@ -26,11 +26,6 @@ describe('UpdateTeamUseCase', () => { getMembership: vi.fn().mockResolvedValue(mockMembership), } as unknown as TeamMembershipRepository; - const present = vi.fn<(data: UpdateTeamResult) => void>(); - const output: { present: typeof present } = { - present, - }; - const useCase = new UpdateTeamUseCase(mockTeamRepository, mockMembershipRepository); const command: UpdateTeamInput = { @@ -78,7 +73,6 @@ describe('UpdateTeamUseCase', () => { const error = result.unwrapErr() as ApplicationErrorCode; expect(error.code).toBe('PERMISSION_DENIED'); expect(error.details?.message).toBe('User does not have permission to update this team'); - expect(present).not.toHaveBeenCalled(); }); it('returns error if team not found', async () => { @@ -94,11 +88,6 @@ describe('UpdateTeamUseCase', () => { getMembership: vi.fn().mockResolvedValue(mockMembership), } as unknown as TeamMembershipRepository; - const present = vi.fn<(data: UpdateTeamResult) => void>(); - const output: { present: typeof present } = { - present, - }; - const useCase = new UpdateTeamUseCase(mockTeamRepository, mockMembershipRepository); const command: UpdateTeamInput = { @@ -113,7 +102,6 @@ describe('UpdateTeamUseCase', () => { const error = result.unwrapErr() as ApplicationErrorCode; expect(error.code).toBe('TEAM_NOT_FOUND'); expect(error.details?.message).toBe('Team not found'); - expect(present).not.toHaveBeenCalled(); }); it('returns repository error on unexpected failure', async () => { @@ -129,11 +117,6 @@ describe('UpdateTeamUseCase', () => { getMembership: vi.fn().mockResolvedValue(mockMembership), } as unknown as TeamMembershipRepository; - const present = vi.fn<(data: UpdateTeamResult) => void>(); - const output: { present: typeof present } = { - present, - }; - const useCase = new UpdateTeamUseCase(mockTeamRepository, mockMembershipRepository); const command: UpdateTeamInput = { @@ -148,6 +131,5 @@ describe('UpdateTeamUseCase', () => { const error = result.unwrapErr() as ApplicationErrorCode; expect(error.code).toBe('REPOSITORY_ERROR'); expect(error.details?.message).toBe('db error'); - expect(present).not.toHaveBeenCalled(); }); }); diff --git a/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.test.ts b/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.test.ts index 510049c74..eb215ff3e 100644 --- a/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.test.ts +++ b/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.test.ts @@ -10,11 +10,20 @@ import { type WithdrawFromLeagueWalletInput } from './WithdrawFromLeagueWalletUseCase'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { LeagueWalletRepository } from '../../domain/repositories/LeagueWalletRepository'; +import { TransactionRepository } from '../../domain/repositories/TransactionRepository'; + describe('WithdrawFromLeagueWalletUseCase', () => { let leagueRepository: { findById: Mock }; let walletRepository: { findByLeagueId: Mock; update: Mock }; let transactionRepository: { create: Mock }; - let logger: Logger & { error: Mock }; + let logger: { + debug: Mock; + info: Mock; + warn: Mock; + error: Mock; + }; let useCase: WithdrawFromLeagueWalletUseCase; beforeEach(() => { @@ -27,12 +36,14 @@ describe('WithdrawFromLeagueWalletUseCase', () => { info: vi.fn(), warn: vi.fn(), error: vi.fn() - } as any; + }; - useCase = new WithdrawFromLeagueWalletUseCase(leagueRepository as any, - walletRepository as any, - transactionRepository as any, - logger); + useCase = new WithdrawFromLeagueWalletUseCase( + leagueRepository as unknown as LeagueRepository, + walletRepository as unknown as LeagueWalletRepository, + transactionRepository as unknown as TransactionRepository, + logger as unknown as Logger + ); }); it('returns LEAGUE_NOT_FOUND when league is missing', async () => { diff --git a/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.ts b/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.ts index bb5931e41..0f13fb37d 100644 --- a/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.ts +++ b/core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase.ts @@ -1,10 +1,13 @@ -import { LeagueWalletId } from '@/racing/domain/entities/league-wallet/LeagueWalletId'; +import { LeagueWalletId } from '../../domain/entities/league-wallet/LeagueWalletId'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { Transaction } from '../../domain/entities/league-wallet/Transaction'; import { TransactionId } from '../../domain/entities/league-wallet/TransactionId'; import { Money } from '../../domain/value-objects/Money'; +import { LeagueRepository } from '../../domain/repositories/LeagueRepository'; +import { LeagueWalletRepository } from '../../domain/repositories/LeagueWalletRepository'; +import { TransactionRepository } from '../../domain/repositories/TransactionRepository'; export type WithdrawFromLeagueWalletInput = { leagueId: string; diff --git a/core/racing/application/use-cases/WithdrawFromRaceUseCase.test.ts b/core/racing/application/use-cases/WithdrawFromRaceUseCase.test.ts index d2c29de40..27cdbc229 100644 --- a/core/racing/application/use-cases/WithdrawFromRaceUseCase.test.ts +++ b/core/racing/application/use-cases/WithdrawFromRaceUseCase.test.ts @@ -2,18 +2,22 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { WithdrawFromRaceUseCase, type WithdrawFromRaceInput, - type WithdrawFromRaceResult, type WithdrawFromRaceErrorCode, } from './WithdrawFromRaceUseCase'; import type { RaceRepository } from '../../domain/repositories/RaceRepository'; import type { RaceRegistrationRepository } from '../../domain/repositories/RaceRegistrationRepository'; -import type { Logger } from '@core/shared/application/Logger'; +import type { Logger } from '@core/shared/domain/Logger'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; describe('WithdrawFromRaceUseCase', () => { let raceRepository: { findById: ReturnType }; let registrationRepository: { isRegistered: ReturnType; withdraw: ReturnType }; - let logger: Logger; + let logger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; beforeEach(() => { raceRepository = { @@ -30,13 +34,15 @@ describe('WithdrawFromRaceUseCase', () => { info: vi.fn(), warn: vi.fn(), error: vi.fn(), - } as any; + }; }); const createUseCase = () => - new WithdrawFromRaceUseCase(raceRepository as any, - registrationRepository as any, - logger); + new WithdrawFromRaceUseCase( + raceRepository as unknown as RaceRepository, + registrationRepository as unknown as RaceRegistrationRepository, + logger as unknown as Logger + ); it('withdraws from race successfully', async () => { const race = { diff --git a/core/racing/application/use-cases/WithdrawFromRaceUseCase.ts b/core/racing/application/use-cases/WithdrawFromRaceUseCase.ts index 06d67c008..530ec964d 100644 --- a/core/racing/application/use-cases/WithdrawFromRaceUseCase.ts +++ b/core/racing/application/use-cases/WithdrawFromRaceUseCase.ts @@ -2,7 +2,7 @@ import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { RaceRegistrationRepository } from '@core/racing/domain/repositories/RaceRegistrationRepository'; import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository'; -import type { Logger } from '@core/shared/application/Logger'; +import type { Logger } from '@core/shared/domain/Logger'; export type WithdrawFromRaceInput = { raceId: string; diff --git a/core/racing/domain/entities/Protest.ts b/core/racing/domain/entities/Protest.ts index 48b4784be..78eb2cc8b 100644 --- a/core/racing/domain/entities/Protest.ts +++ b/core/racing/domain/entities/Protest.ts @@ -60,7 +60,7 @@ export interface ProtestProps { export class Protest extends Entity { private constructor(private readonly props: ProtestProps) { - super(props.id);} + super(props.id.toString());} static create(props: { id: string; @@ -172,7 +172,6 @@ export class Protest extends Entity { return new Protest(protestProps); } - get id(): string { return this.props.id.toString(); } get raceId(): string { return this.props.raceId.toString(); } get protestingDriverId(): string { return this.props.protestingDriverId.toString(); } get accusedDriverId(): string { return this.props.accusedDriverId.toString(); } diff --git a/core/racing/domain/entities/TeamRatingEvent.test.ts b/core/racing/domain/entities/TeamRatingEvent.test.ts index c04470383..438930419 100644 --- a/core/racing/domain/entities/TeamRatingEvent.test.ts +++ b/core/racing/domain/entities/TeamRatingEvent.test.ts @@ -47,27 +47,27 @@ describe('TeamRatingEvent', () => { }); it('should throw for missing dimension', () => { - const { dimension: _dimension, ...rest } = validProps; + const { dimension: _, ...rest } = validProps; expect(() => TeamRatingEvent.create(rest as typeof validProps)).toThrow(RacingDomainValidationError); }); it('should throw for missing delta', () => { - const { delta: _delta, ...rest } = validProps; + const { delta: _, ...rest } = validProps; expect(() => TeamRatingEvent.create(rest as typeof validProps)).toThrow(RacingDomainValidationError); }); it('should throw for missing source', () => { - const { source: _source, ...rest } = validProps; + const { source: _, ...rest } = validProps; expect(() => TeamRatingEvent.create(rest as typeof validProps)).toThrow(RacingDomainValidationError); }); it('should throw for missing reason', () => { - const { reason: _reason, ...rest } = validProps; + const { reason: _, ...rest } = validProps; expect(() => TeamRatingEvent.create(rest as typeof validProps)).toThrow(RacingDomainValidationError); }); it('should throw for missing visibility', () => { - const { visibility: _visibility, ...rest } = validProps; + const { visibility: _, ...rest } = validProps; expect(() => TeamRatingEvent.create(rest as typeof validProps)).toThrow(RacingDomainValidationError); }); diff --git a/core/racing/domain/entities/championship/ChampionshipStanding.ts b/core/racing/domain/entities/championship/ChampionshipStanding.ts index 52afae42d..ca530cb17 100644 --- a/core/racing/domain/entities/championship/ChampionshipStanding.ts +++ b/core/racing/domain/entities/championship/ChampionshipStanding.ts @@ -23,7 +23,8 @@ export class ChampionshipStanding extends Entity { resultsDropped: number; position: number; }) { - super(props.id); + const id = `${props.seasonId}-${props.championshipId}-${props.participant.id}`; + super(id); this.seasonId = props.seasonId; this.championshipId = props.championshipId; this.participant = props.participant; @@ -31,7 +32,6 @@ export class ChampionshipStanding extends Entity { this.resultsCounted = ResultsCount.create(props.resultsCounted); this.resultsDropped = ResultsCount.create(props.resultsDropped); this.position = Position.create(props.position); - this.id = `${this.seasonId}-${this.championshipId}-${this.participant.id}`; } static create(props: { diff --git a/core/racing/domain/entities/penalty/Penalty.ts b/core/racing/domain/entities/penalty/Penalty.ts index 5d105d1b3..b2f7db5f5 100644 --- a/core/racing/domain/entities/penalty/Penalty.ts +++ b/core/racing/domain/entities/penalty/Penalty.ts @@ -240,10 +240,10 @@ export class Penalty extends Entity { } } - equals(other: Entity): boolean { - if (!(other instanceof Penalty)) { + equals(other?: Entity): boolean { + if (!other || !(other instanceof Penalty)) { return false; } - return this.id === other.id; + return this.id.equals(other.id); } } diff --git a/core/racing/domain/entities/season/Season.test.ts b/core/racing/domain/entities/season/Season.test.ts index 75dcbacba..c40fe019c 100644 --- a/core/racing/domain/entities/season/Season.test.ts +++ b/core/racing/domain/entities/season/Season.test.ts @@ -6,8 +6,7 @@ import { } from '@core/racing/domain/errors/RacingDomainError'; import { SeasonScoringConfig } from '@core/racing/domain/value-objects/SeasonScoringConfig'; - SeasonDropPolicy, -} from '@core/racing/domain/value-objects/SeasonDropPolicy'; +import { SeasonDropPolicy } from '@core/racing/domain/value-objects/SeasonDropPolicy'; import { SeasonStewardingConfig } from '@core/racing/domain/value-objects/SeasonStewardingConfig'; import { Season, SeasonStatus } from '@core/racing/domain/entities/season/Season'; diff --git a/core/racing/domain/errors/RacingDomainError.ts b/core/racing/domain/errors/RacingDomainError.ts index a037391ad..9706b102a 100644 --- a/core/racing/domain/errors/RacingDomainError.ts +++ b/core/racing/domain/errors/RacingDomainError.ts @@ -1,5 +1,4 @@ -import type { DomainError } from '@core/shared/errors/DomainError'; -import type { CommonDomainErrorKind } from '@core/shared/errors/DomainError'; +import type { DomainError, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; export abstract class RacingDomainError extends Error implements DomainError { readonly type = 'domain' as const; diff --git a/core/racing/domain/value-objects/SeasonDropPolicy.test.ts b/core/racing/domain/value-objects/SeasonDropPolicy.test.ts index c5f8c095d..0f67961dd 100644 --- a/core/racing/domain/value-objects/SeasonDropPolicy.test.ts +++ b/core/racing/domain/value-objects/SeasonDropPolicy.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect } from 'vitest'; import { RacingDomainValidationError, } from '../errors/RacingDomainError'; - +import { SeasonDropPolicy, type SeasonDropStrategy, } from './SeasonDropPolicy'; diff --git a/core/shared/errors/DomainError.ts b/core/shared/errors/DomainError.ts index 3e3867cfb..4f9899a18 100644 --- a/core/shared/errors/DomainError.ts +++ b/core/shared/errors/DomainError.ts @@ -7,5 +7,6 @@ export interface DomainErrorProps exte } // Alias for backward compatibility +export type DomainError = DomainErrorProps; export type IDomainError = DomainErrorProps; export type DomainErrorAlias = DomainErrorProps; diff --git a/core/social/application/use-cases/GetCurrentUserSocialUseCase.test.ts b/core/social/application/use-cases/GetCurrentUserSocialUseCase.test.ts index b8f2b6f28..31e4a4352 100644 --- a/core/social/application/use-cases/GetCurrentUserSocialUseCase.test.ts +++ b/core/social/application/use-cases/GetCurrentUserSocialUseCase.test.ts @@ -6,10 +6,20 @@ import { type GetCurrentUserSocialApplicationError, type GetCurrentUserSocialInput, } from './GetCurrentUserSocialUseCase'; +import { SocialGraphRepository } from '../../domain/repositories/SocialGraphRepository'; describe('GetCurrentUserSocialUseCase', () => { - let socialGraphRepository: SocialGraphRepository & { getFriends: Mock }; - let logger: Logger & { debug: Mock; info: Mock; warn: Mock; error: Mock }; + let socialGraphRepository: { + getFriends: Mock; + getFriendIds: Mock; + getSuggestedFriends: Mock; + }; + let logger: { + debug: Mock; + info: Mock; + warn: Mock; + error: Mock; + }; let useCase: GetCurrentUserSocialUseCase; beforeEach(() => { @@ -17,16 +27,19 @@ describe('GetCurrentUserSocialUseCase', () => { getFriends: vi.fn(), getFriendIds: vi.fn(), getSuggestedFriends: vi.fn(), - } as any; + }; logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), - } as any; + }; - useCase = new GetCurrentUserSocialUseCase(socialGraphRepository, logger); + useCase = new GetCurrentUserSocialUseCase( + socialGraphRepository as unknown as SocialGraphRepository, + logger as unknown as Logger + ); }); it('returns current user social with mapped friends', async () => { diff --git a/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts b/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts index bf04e1fa6..eadaecb38 100644 --- a/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts +++ b/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts @@ -1,4 +1,4 @@ -import { SocialGraphRepository } from '@/social/domain/repositories/SocialGraphRepository'; +import { SocialGraphRepository } from '../../domain/repositories/SocialGraphRepository'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; diff --git a/core/social/application/use-cases/GetUserFeedUseCase.ts b/core/social/application/use-cases/GetUserFeedUseCase.ts index 88c72c417..20f9cf144 100644 --- a/core/social/application/use-cases/GetUserFeedUseCase.ts +++ b/core/social/application/use-cases/GetUserFeedUseCase.ts @@ -1,4 +1,4 @@ -import { FeedRepository } from '@/social/domain/repositories/FeedRepository'; +import { FeedRepository } from '../../domain/repositories/FeedRepository'; import type { Logger } from '@core/shared/domain/Logger'; import { Result } from '@core/shared/domain/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; diff --git a/core/social/domain/errors/SocialDomainError.ts b/core/social/domain/errors/SocialDomainError.ts index 25110e5c9..11a7afc57 100644 --- a/core/social/domain/errors/SocialDomainError.ts +++ b/core/social/domain/errors/SocialDomainError.ts @@ -1,5 +1,4 @@ -import type { DomainError } from '@core/shared/errors/DomainError'; -import type { CommonDomainErrorKind } from '@core/shared/errors/DomainError'; +import type { DomainError, CommonDomainErrorKind } from '@core/shared/errors/DomainError'; /** * Domain Error: SocialDomainError