This commit is contained in:
2025-12-16 13:53:23 +01:00
parent 84f05598a6
commit 29dc11deb9
127 changed files with 538 additions and 547 deletions

View File

@@ -1,6 +1,6 @@
import { ApproveLeagueJoinRequestUseCase } from '@core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase';
import { ApproveLeagueJoinRequestPresenter } from '@apps/api/src/modules/league/presenters/ApproveLeagueJoinRequestPresenter';
import { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
describe('ApproveLeagueJoinRequestUseCase', () => {
let useCase: ApproveLeagueJoinRequestUseCase;
@@ -12,7 +12,7 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
getJoinRequests: jest.fn(),
removeJoinRequest: jest.fn(),
saveMembership: jest.fn(),
} as any;
} as unknown;
presenter = new ApproveLeagueJoinRequestPresenter();
useCase = new ApproveLeagueJoinRequestUseCase(leagueMembershipRepository);
});

View File

@@ -6,7 +6,7 @@ import { Race } from '@core/racing/domain/entities/Race';
import { Result } from '@core/racing/domain/entities/Result';
import { League } from '@core/racing/domain/entities/League';
import { Standing } from '@core/racing/domain/entities/Standing';
import { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership';
import type { FeedItem } from '@core/social/domain/types/FeedItem';
import type {
IDashboardOverviewPresenter,

View File

@@ -1,6 +1,6 @@
import { GetLeagueJoinRequestsUseCase } from '@core/racing/application/use-cases/GetLeagueJoinRequestsUseCase';
import { LeagueJoinRequestsPresenter } from '@apps/api/src/modules/league/presenters/LeagueJoinRequestsPresenter';
import { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
import { IDriverRepository } from '@core/racing/domain/repositories/IDriverRepository';
describe('GetLeagueJoinRequestsUseCase', () => {
@@ -12,10 +12,10 @@ describe('GetLeagueJoinRequestsUseCase', () => {
beforeEach(() => {
leagueMembershipRepository = {
getJoinRequests: jest.fn(),
} as any;
} as unknown;
driverRepository = {
findByIds: jest.fn(),
} as any;
} as unknown;
presenter = new LeagueJoinRequestsPresenter();
useCase = new GetLeagueJoinRequestsUseCase(leagueMembershipRepository, driverRepository);
});

View File

@@ -2,11 +2,7 @@ import { describe, it, expect, beforeEach } from 'vitest';
import { JoinLeagueUseCase } from '@core/racing/application/use-cases/JoinLeagueUseCase';
import type { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
import {
LeagueMembership,
type MembershipRole,
type MembershipStatus,
} from '@core/racing/domain/entities/LeagueMembership';
class InMemoryLeagueMembershipRepository implements ILeagueMembershipRepository {
private memberships: LeagueMembership[] = [];

View File

@@ -17,7 +17,7 @@ import { Race } from '@core/racing/domain/entities/Race';
import { League } from '@core/racing/domain/entities/League';
import { Result } from '@core/racing/domain/entities/Result';
import { Driver } from '@core/racing/domain/entities/Driver';
import { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership';
import { GetRaceDetailUseCase } from '@core/racing/application/use-cases/GetRaceDetailUseCase';
import { CancelRaceUseCase } from '@core/racing/application/use-cases/CancelRaceUseCase';

View File

@@ -5,7 +5,7 @@ import { League } from '@core/racing/domain/entities/League';
import { Result } from '@core/racing/domain/entities/Result';
import { Penalty } from '@core/racing/domain/entities/Penalty';
import { Standing } from '@core/racing/domain/entities/Standing';
import { Driver } from '@core/racing/domain/entities/Driver';
import { GetRaceResultsDetailUseCase } from '@core/racing/application/use-cases/GetRaceResultsDetailUseCase';
import { ImportRaceResultsUseCase } from '@core/racing/application/use-cases/ImportRaceResultsUseCase';

View File

@@ -5,11 +5,8 @@ import type { ILeagueMembershipRepository } from '@core/racing/domain/repositori
import type { ITeamRepository } from '@core/racing/domain/repositories/ITeamRepository';
import type { ITeamMembershipRepository } from '@core/racing/domain/repositories/ITeamMembershipRepository';
import type { RaceRegistration } from '@core/racing/domain/entities/RaceRegistration';
import {
LeagueMembership,
type MembershipStatus,
} from '@core/racing/domain/entities/LeagueMembership';
import { Team } from '@core/racing/domain/entities/Team';
import { Driver } from '@core/racing/domain/entities/Driver';
import type {
TeamMembership,
@@ -23,17 +20,17 @@ import { WithdrawFromRaceUseCase } from '@core/racing/application/use-cases/With
import { IsDriverRegisteredForRaceUseCase } from '@core/racing/application/use-cases/IsDriverRegisteredForRaceUseCase';
import { GetRaceRegistrationsUseCase } from '@core/racing/application/use-cases/GetRaceRegistrationsUseCase';
import { CreateTeamUseCase } from '@core/racing/application/use-cases/CreateTeamUseCase';
import { JoinTeamUseCase } from '@core/racing/application/use-cases/JoinTeamUseCase';
import { LeaveTeamUseCase } from '@core/racing/application/use-cases/LeaveTeamUseCase';
import { ApproveTeamJoinRequestUseCase } from '@core/racing/application/use-cases/ApproveTeamJoinRequestUseCase';
import { RejectTeamJoinRequestUseCase } from '@core/racing/application/use-cases/RejectTeamJoinRequestUseCase';
import { UpdateTeamUseCase } from '@core/racing/application/use-cases/UpdateTeamUseCase';
import { GetAllTeamsUseCase } from '@core/racing/application/use-cases/GetAllTeamsUseCase';
import { GetTeamDetailsUseCase } from '@core/racing/application/use-cases/GetTeamDetailsUseCase';
import { GetTeamMembersUseCase } from '@core/racing/application/use-cases/GetTeamMembersUseCase';
import { GetTeamJoinRequestsUseCase } from '@core/racing/application/use-cases/GetTeamJoinRequestsUseCase';
import { GetDriverTeamUseCase } from '@core/racing/application/use-cases/GetDriverTeamUseCase';
import type { IDriverRegistrationStatusPresenter } from '@core/racing/application/presenters/IDriverRegistrationStatusPresenter';
import type { IRaceRegistrationsPresenter } from '@core/racing/application/presenters/IRaceRegistrationsPresenter';
import type {
@@ -510,9 +507,9 @@ describe('Racing application use-cases - teams', () => {
description: team.description,
memberCount: team.memberCount,
leagues: team.leagues,
specialization: (team as any).specialization,
region: (team as any).region,
languages: (team as any).languages,
specialization: (team as unknown).specialization,
region: (team as unknown).region,
languages: (team as unknown).languages,
})),
totalCount: input.teams.length,
};
@@ -522,7 +519,7 @@ describe('Racing application use-cases - teams', () => {
return this.viewModel;
}
get teams(): any[] {
get teams(): unknown[] {
return this.viewModel?.teams ?? [];
}
}
@@ -559,7 +556,7 @@ describe('Racing application use-cases - teams', () => {
return {
driverId,
driverName,
role: ((membership.role as any) === 'owner' ? 'owner' : (membership.role as any) === 'member' ? 'member' : (membership.role as any) === 'manager' ? 'manager' : (membership.role as any) === 'driver' ? 'member' : 'member') as "owner" | "member" | "manager",
role: ((membership.role as unknown) === 'owner' ? 'owner' : (membership.role as unknown) === 'member' ? 'member' : (membership.role as unknown) === 'manager' ? 'manager' : (membership.role as unknown) === 'driver' ? 'member' : 'member') as "owner" | "member" | "manager",
joinedAt: membership.joinedAt.toISOString(),
isActive: membership.status === 'active',
avatarUrl,
@@ -568,7 +565,7 @@ describe('Racing application use-cases - teams', () => {
const ownerCount = members.filter((m) => m.role === 'owner').length;
const managerCount = members.filter((m) => m.role === 'manager').length;
const memberCount = members.filter((m) => (m.role as any) === 'member').length;
const memberCount = members.filter((m) => (m.role as unknown) === 'member').length;
this.viewModel = {
members,
@@ -583,7 +580,7 @@ describe('Racing application use-cases - teams', () => {
return this.viewModel;
}
get members(): any[] {
get members(): unknown[] {
return this.viewModel?.members ?? [];
}
}
@@ -625,7 +622,7 @@ describe('Racing application use-cases - teams', () => {
return this.viewModel;
}
get requests(): any[] {
get requests(): unknown[] {
return this.viewModel?.requests ?? [];
}
}

View File

@@ -1,6 +1,6 @@
import { RejectLeagueJoinRequestUseCase } from '@core/racing/application/use-cases/RejectLeagueJoinRequestUseCase';
import { RejectLeagueJoinRequestPresenter } from '@apps/api/src/modules/league/presenters/RejectLeagueJoinRequestPresenter';
import { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
describe('RejectLeagueJoinRequestUseCase', () => {
let useCase: RejectLeagueJoinRequestUseCase;
@@ -10,7 +10,7 @@ describe('RejectLeagueJoinRequestUseCase', () => {
beforeEach(() => {
leagueMembershipRepository = {
removeJoinRequest: jest.fn(),
} as any;
} as unknown;
presenter = new RejectLeagueJoinRequestPresenter();
useCase = new RejectLeagueJoinRequestUseCase(leagueMembershipRepository);
});

View File

@@ -1,6 +1,6 @@
import { RemoveLeagueMemberUseCase } from '@core/racing/application/use-cases/RemoveLeagueMemberUseCase';
import { RemoveLeagueMemberPresenter } from '@apps/api/src/modules/league/presenters/RemoveLeagueMemberPresenter';
import { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
describe('RemoveLeagueMemberUseCase', () => {
let useCase: RemoveLeagueMemberUseCase;
@@ -11,7 +11,7 @@ describe('RemoveLeagueMemberUseCase', () => {
leagueMembershipRepository = {
getLeagueMembers: jest.fn(),
saveMembership: jest.fn(),
} as any;
} as unknown;
presenter = new RemoveLeagueMemberPresenter();
useCase = new RemoveLeagueMemberUseCase(leagueMembershipRepository);
});

View File

@@ -1,6 +1,6 @@
import { UpdateLeagueMemberRoleUseCase } from '@core/racing/application/use-cases/UpdateLeagueMemberRoleUseCase';
import { UpdateLeagueMemberRolePresenter } from '@apps/api/src/modules/league/presenters/UpdateLeagueMemberRolePresenter';
import { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository';
describe('UpdateLeagueMemberRoleUseCase', () => {
let useCase: UpdateLeagueMemberRoleUseCase;
@@ -11,7 +11,7 @@ describe('UpdateLeagueMemberRoleUseCase', () => {
leagueMembershipRepository = {
getLeagueMembers: jest.fn(),
saveMembership: jest.fn(),
} as any;
} as unknown;
presenter = new UpdateLeagueMemberRolePresenter();
useCase = new UpdateLeagueMemberRoleUseCase(leagueMembershipRepository);
});

View File

@@ -14,7 +14,7 @@ export interface GetLeagueJoinRequestsViewModel {
}
export interface GetLeagueJoinRequestsResultDTO {
joinRequests: any[];
joinRequests: unknown[];
drivers: { id: string; name: string }[];
}

View File

@@ -14,7 +14,7 @@ export interface GetLeagueMembershipsViewModel {
}
export interface GetLeagueMembershipsResultDTO {
memberships: any[];
memberships: unknown[];
drivers: { id: string; name: string }[];
}

View File

@@ -1,14 +1,14 @@
import type { Presenter } from '@core/shared/presentation/Presenter';
export interface GetLeagueProtestsViewModel {
protests: any[];
protests: unknown[];
racesById: Record<string, any>;
driversById: Record<string, any>;
}
export interface GetLeagueProtestsResultDTO {
protests: any[];
races: any[];
protests: unknown[];
races: unknown[];
drivers: { id: string; name: string }[];
}

View File

@@ -15,7 +15,7 @@ export interface GetLeagueSeasonsViewModel {
}
export interface GetLeagueSeasonsResultDTO {
seasons: any[];
seasons: unknown[];
}
export interface IGetLeagueSeasonsPresenter extends Presenter<GetLeagueSeasonsResultDTO, GetLeagueSeasonsViewModel> {}

View File

@@ -28,7 +28,7 @@ export interface RacesPageViewModel {
}
export interface RacesPageResultDTO {
races: any[];
races: unknown[];
}
export interface IRacesPagePresenter

View File

@@ -96,7 +96,7 @@ export class AcceptSponsorshipRequestUseCase
platformFee: acceptedRequest.getPlatformFee().amount,
netAmount: acceptedRequest.getNetAmount().amount,
};
} catch (error: any) {
} catch (error) {
this.logger.error(`Failed to accept sponsorship request ${dto.requestId}: ${error.message}`, { requestId: dto.requestId, error: error.message, stack: error.stack });
throw error;
}

View File

@@ -128,7 +128,7 @@ export class CreateLeagueWithSeasonAndScoringUseCase
};
this.logger.debug('CreateLeagueWithSeasonAndScoringUseCase completed successfully.', { result });
return result;
} catch (error: any) {
} catch (error) {
this.logger.error('Error during CreateLeagueWithSeasonAndScoringUseCase execution.', {
command,
error: error.message,

View File

@@ -4,7 +4,7 @@
* Creates a new sponsor.
*/
import { Sponsor, type SponsorProps } from '../../domain/entities/Sponsor';
import type { ISponsorRepository } from '../../domain/repositories/ISponsorRepository';
import type {
ICreateSponsorPresenter,
@@ -41,7 +41,7 @@ export class CreateSponsorUseCase
contactEmail: input.contactEmail,
...(input.websiteUrl !== undefined ? { websiteUrl: input.websiteUrl } : {}),
...(input.logoUrl !== undefined ? { logoUrl: input.logoUrl } : {}),
} as any);
} as unknown);
await this.sponsorRepository.create(sponsor);

View File

@@ -138,8 +138,8 @@ export class GetDashboardOverviewUseCase {
presenter.present(viewModel);
}
private async getDriverLeagues(allLeagues: any[], driverId: string): Promise<any[]> {
const driverLeagues: any[] = [];
private async getDriverLeagues(allLeagues: unknown[], driverId: string): Promise<any[]> {
const driverLeagues: unknown[] = [];
for (const league of allLeagues) {
const membership = await this.leagueMembershipRepository.getMembership(league.id, driverId);
@@ -152,7 +152,7 @@ export class GetDashboardOverviewUseCase {
}
private async partitionUpcomingRacesByRegistration(
upcomingRaces: any[],
upcomingRaces: unknown[],
driverId: string,
leagueMap: Map<string, string>,
): Promise<{
@@ -194,9 +194,9 @@ export class GetDashboardOverviewUseCase {
}
private buildRecentResults(
allResults: any[],
allRaces: any[],
allLeagues: any[],
allResults: unknown[],
allRaces: unknown[],
allLeagues: unknown[],
driverId: string,
): DashboardRecentResultViewModel[] {
const raceById = new Map(allRaces.map(race => [race.id, race]));
@@ -237,7 +237,7 @@ export class GetDashboardOverviewUseCase {
}
private async buildLeagueStandingsSummaries(
driverLeagues: any[],
driverLeagues: unknown[],
driverId: string,
): Promise<DashboardLeagueStandingSummaryViewModel[]> {
const summaries: DashboardLeagueStandingSummaryViewModel[] = [];
@@ -277,7 +277,7 @@ export class GetDashboardOverviewUseCase {
return activeLeagueIds.size;
}
private buildFeedSummary(feedItems: any[]): DashboardFeedSummaryViewModel {
private buildFeedSummary(feedItems: unknown[]): DashboardFeedSummaryViewModel {
const items: DashboardFeedItemSummaryViewModel[] = feedItems.map(item => ({
id: item.id,
type: item.type,
@@ -297,7 +297,7 @@ export class GetDashboardOverviewUseCase {
};
}
private buildFriendsSummary(friends: any[]): DashboardFriendSummaryViewModel[] {
private buildFriendsSummary(friends: unknown[]): DashboardFriendSummaryViewModel[] {
return friends.map(friend => ({
id: friend.id,
name: friend.name,

View File

@@ -8,7 +8,7 @@ export interface GetLeagueJoinRequestsUseCaseParams {
}
export interface GetLeagueJoinRequestsResultDTO {
joinRequests: any[];
joinRequests: unknown[];
drivers: { id: string; name: string }[];
}

View File

@@ -9,8 +9,8 @@ export interface GetLeagueProtestsUseCaseParams {
}
export interface GetLeagueProtestsResultDTO {
protests: any[];
races: any[];
protests: unknown[];
races: unknown[];
drivers: { id: string; name: string }[];
}

View File

@@ -7,7 +7,7 @@ export interface GetLeagueSeasonsUseCaseParams {
}
export interface GetLeagueSeasonsResultDTO {
seasons: any[];
seasons: unknown[];
}
export class GetLeagueSeasonsUseCase implements UseCase<GetLeagueSeasonsUseCaseParams, GetLeagueSeasonsResultDTO, GetLeagueSeasonsViewModel, IGetLeagueSeasonsPresenter> {

View File

@@ -202,7 +202,7 @@ export class GetProfileOverviewUseCase {
private async buildTeamMemberships(
driverId: string,
teams: any[],
teams: unknown[],
): Promise<ProfileOverviewTeamMembershipViewModel[]> {
const memberships: ProfileOverviewTeamMembershipViewModel[] = [];
@@ -231,7 +231,7 @@ export class GetProfileOverviewUseCase {
return memberships;
}
private buildSocialSummary(friends: any[]): ProfileOverviewSocialSummaryViewModel {
private buildSocialSummary(friends: unknown[]): ProfileOverviewSocialSummaryViewModel {
return {
friendsCount: friends.length,
friends: friends.map(friend => ({

View File

@@ -32,7 +32,7 @@ export class GetTeamsLeaderboardUseCase
async execute(_input: void, presenter: ITeamsLeaderboardPresenter): Promise<void> {
const allTeams = await this.teamRepository.findAll();
const teams: any[] = [];
const teams: unknown[] = [];
await Promise.all(
allTeams.map(async (team) => {

View File

@@ -3,11 +3,7 @@ import type {
ILeagueMembershipRepository,
} from '@core/racing/domain/repositories/ILeagueMembershipRepository';
import type { AsyncUseCase } from '@core/shared/application';
import {
LeagueMembership,
type MembershipRole,
type MembershipStatus,
} from '@core/racing/domain/entities/LeagueMembership';
import type { JoinLeagueCommandDTO } from '../dto/JoinLeagueCommandDTO';
import { BusinessRuleViolationError } from '../errors/RacingApplicationError';

View File

@@ -1,6 +1,6 @@
import type { ITeamRepository } from '../../domain/repositories/ITeamRepository';
import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository';
import { Team } from '../../domain/entities/Team';
import type { UpdateTeamCommandDTO } from '../dto/TeamCommandAndQueryDTO';
export class UpdateTeamUseCase {

View File

@@ -4,7 +4,7 @@
* Represents a driver's custom livery for a specific car.
* Includes user-placed decals and league-specific overrides.
*/
import { RacingDomainValidationError, RacingDomainInvariantError, RacingDomainError } from '../errors/RacingDomainError';
import type { IEntity } from '@core/shared/domain';
import type { LiveryDecal } from '../value-objects/LiveryDecal';

View File

@@ -4,7 +4,7 @@
* Represents an admin-defined livery template for a specific car.
* Contains base image and sponsor decal placements.
*/
import { RacingDomainValidationError, RacingDomainInvariantError, RacingDomainError } from '../errors/RacingDomainError';
import type { IEntity } from '@core/shared/domain';
import type { LiveryDecal } from '../value-objects/LiveryDecal';

View File

@@ -4,10 +4,7 @@ import {
RacingDomainInvariantError,
RacingDomainValidationError,
} from '@core/racing/domain/errors/RacingDomainError';
import {
Season,
type SeasonStatus,
} from '@core/racing/domain/entities/Season';
import { SeasonScoringConfig } from '@core/racing/domain/value-objects/SeasonScoringConfig';
import {
SeasonDropPolicy,

View File

@@ -5,7 +5,7 @@
* Immutable entity with factory methods and domain validation.
*/
import { RacingDomainError, RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@core/shared/domain';
export class Standing implements IEntity<string> {

View File

@@ -1,7 +1,7 @@
import { SeasonSchedule } from '../value-objects/SeasonSchedule';
import { ScheduledRaceSlot } from '../value-objects/ScheduledRaceSlot';
import type { RecurrenceStrategy } from '../value-objects/RecurrenceStrategy';
import { RacingDomainError, RacingDomainValidationError } from '../errors/RacingDomainError';
import { RaceTimeOfDay } from '../value-objects/RaceTimeOfDay';
import type { Weekday } from '../types/Weekday';
import { weekdayToIndex } from '../types/Weekday';