website refactor

This commit is contained in:
2026-01-16 21:35:35 +01:00
parent 77a923e6a3
commit ae910da21a
12 changed files with 21 additions and 29 deletions

View File

@@ -51,11 +51,11 @@ export class PageView extends Entity<string> {
this.validate(props); this.validate(props);
const baseProps: PageViewProps = { const baseProps: PageViewProps = {
id: props.id, id: props.id.trim(),
entityType: props.entityType, entityType: props.entityType,
entityId: props.entityId, entityId: props.entityId.trim(),
visitorType: props.visitorType, visitorType: props.visitorType,
sessionId: props.sessionId, sessionId: props.sessionId.trim(),
timestamp: props.timestamp ?? new Date(), timestamp: props.timestamp ?? new Date(),
...(props.visitorId !== undefined ? { visitorId: props.visitorId } : {}), ...(props.visitorId !== undefined ? { visitorId: props.visitorId } : {}),
...(props.referrer !== undefined ? { referrer: props.referrer } : {}), ...(props.referrer !== undefined ? { referrer: props.referrer } : {}),

View File

@@ -1,3 +1,4 @@
import { describe, expect, it, beforeEach } from 'vitest';
import { RatingEvent } from '../../domain/entities/RatingEvent'; import { RatingEvent } from '../../domain/entities/RatingEvent';
import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository'; import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository';
import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository';
@@ -148,7 +149,6 @@ describe('RecordRaceRatingEventsUseCase - Integration', () => {
); );
useCase = new RecordRaceRatingEventsUseCase( useCase = new RecordRaceRatingEventsUseCase(
raceResultsProvider, raceResultsProvider,
ratingEventRepository,
userRatingRepository, userRatingRepository,
appendRatingEventsUseCase appendRatingEventsUseCase
); );

View File

@@ -130,7 +130,6 @@ describe('RecordRaceRatingEventsUseCase', () => {
); );
useCase = new RecordRaceRatingEventsUseCase( useCase = new RecordRaceRatingEventsUseCase(
mockRaceResultsProvider, mockRaceResultsProvider,
mockRatingEventRepository,
mockUserRatingRepository, mockUserRatingRepository,
appendRatingEventsUseCase appendRatingEventsUseCase
); );

View File

@@ -1,4 +1,3 @@
import { RatingEventRepository } from '../../domain/repositories/RatingEventRepository';
import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository'; import { UserRatingRepository } from '../../domain/repositories/UserRatingRepository';
import { RatingEventFactory } from '../../domain/services/RatingEventFactory'; import { RatingEventFactory } from '../../domain/services/RatingEventFactory';
import { RecordRaceRatingEventsInput, RecordRaceRatingEventsOutput } from '../dtos/RecordRaceRatingEventsDto'; import { RecordRaceRatingEventsInput, RecordRaceRatingEventsOutput } from '../dtos/RecordRaceRatingEventsDto';
@@ -23,7 +22,6 @@ import { AppendRatingEventsUseCase } from './AppendRatingEventsUseCase';
export class RecordRaceRatingEventsUseCase { export class RecordRaceRatingEventsUseCase {
constructor( constructor(
private readonly raceResultsProvider: RaceResultsProvider, private readonly raceResultsProvider: RaceResultsProvider,
private readonly ratingEventRepository: RatingEventRepository,
private readonly userRatingRepository: UserRatingRepository, private readonly userRatingRepository: UserRatingRepository,
private readonly appendRatingEventsUseCase: AppendRatingEventsUseCase, private readonly appendRatingEventsUseCase: AppendRatingEventsUseCase,
) {} ) {}

View File

@@ -1,12 +1,11 @@
import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent';
import { TeamRatingEventRepository } from '@core/racing/domain/repositories/TeamRatingEventRepository'; import { TeamRatingEventRepository, PaginatedResult } from '@core/racing/domain/repositories/TeamRatingEventRepository';
import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository'; import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository';
import { TeamRating } from '@core/racing/domain/value-objects/TeamRating'; import { TeamRating } from '@core/racing/domain/value-objects/TeamRating';
import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta';
import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey';
import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId';
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { PaginatedResult } from '../../domain/repositories/TeamRatingEventRepository';
import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase'; import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase';
// Mock repositories // Mock repositories

View File

@@ -2,6 +2,11 @@ import type { Logger } from '@core/shared/domain/Logger';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest'; import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest';
import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository'; import { TeamMembershipRepository } from '../../domain/repositories/TeamMembershipRepository';
import {
GetTeamMembershipUseCase,
GetTeamMembershipInput,
GetTeamMembershipErrorCode,
} from './GetTeamMembershipUseCase';
describe('GetTeamMembershipUseCase', () => { describe('GetTeamMembershipUseCase', () => {
const mockGetMembership = vi.fn(); const mockGetMembership = vi.fn();

View File

@@ -1,12 +1,11 @@
import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent';
import { TeamRatingEventRepository } from '@core/racing/domain/repositories/TeamRatingEventRepository'; import { TeamRatingEventRepository, PaginatedResult } from '@core/racing/domain/repositories/TeamRatingEventRepository';
import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository'; import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository';
import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta'; import { TeamRatingDelta } from '@core/racing/domain/value-objects/TeamRatingDelta';
import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey'; import { TeamRatingDimensionKey } from '@core/racing/domain/value-objects/TeamRatingDimensionKey';
import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId';
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { PaginatedResult } from '../../domain/repositories/TeamRatingEventRepository'; import { TeamRatingSnapshot } from '../../domain/services/TeamRatingSnapshotCalculator';
import { TeamRating } from '../../domain/value-objects/TeamRating';
import { RecomputeTeamRatingSnapshotUseCase } from './RecomputeTeamRatingSnapshotUseCase'; import { RecomputeTeamRatingSnapshotUseCase } from './RecomputeTeamRatingSnapshotUseCase';
// Mock repositories // Mock repositories
@@ -51,13 +50,13 @@ class MockTeamRatingEventRepository implements TeamRatingEventRepository {
} }
class MockTeamRatingRepository implements TeamRatingRepository { class MockTeamRatingRepository implements TeamRatingRepository {
private snapshots: Map<string, TeamRating> = new Map(); private snapshots: Map<string, TeamRatingSnapshot> = new Map();
async findByTeamId(teamId: string): Promise<TeamRating | null> { async findByTeamId(teamId: string): Promise<TeamRatingSnapshot | null> {
return this.snapshots.get(teamId) || null; return this.snapshots.get(teamId) || null;
} }
async save(snapshot: TeamRating): Promise<TeamRating> { async save(snapshot: TeamRatingSnapshot): Promise<TeamRatingSnapshot> {
this.snapshots.set(snapshot.teamId, snapshot); this.snapshots.set(snapshot.teamId, snapshot);
return snapshot; return snapshot;
} }

View File

@@ -1,10 +1,9 @@
import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent';
import { TeamRatingEventRepository } from '@core/racing/domain/repositories/TeamRatingEventRepository'; import { TeamRatingEventRepository, PaginatedResult } from '@core/racing/domain/repositories/TeamRatingEventRepository';
import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository'; import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository';
import { TeamDrivingRaceFactsDto } from '@core/racing/domain/services/TeamDrivingRatingEventFactory'; import { TeamDrivingRaceFactsDto } from '@core/racing/domain/services/TeamDrivingRatingEventFactory';
import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId';
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { PaginatedResult } from '../../domain/repositories/TeamRatingEventRepository';
import { TeamRating } from '../../domain/value-objects/TeamRating'; import { TeamRating } from '../../domain/value-objects/TeamRating';
import { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider'; import { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider';
import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase'; import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase';
@@ -90,8 +89,6 @@ describe('RecordTeamRaceRatingEventsUseCase', () => {
appendUseCase = new AppendTeamRatingEventsUseCase(mockEventRepo, mockRatingRepo); appendUseCase = new AppendTeamRatingEventsUseCase(mockEventRepo, mockRatingRepo);
useCase = new RecordTeamRaceRatingEventsUseCase( useCase = new RecordTeamRaceRatingEventsUseCase(
mockResultsProvider, mockResultsProvider,
mockEventRepo,
mockRatingRepo,
appendUseCase appendUseCase
); );
}); });

View File

@@ -1,5 +1,3 @@
import type { TeamRatingEventRepository } from '@core/racing/domain/repositories/TeamRatingEventRepository';
import type { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository';
import { TeamDrivingRatingEventFactory } from '@core/racing/domain/services/TeamDrivingRatingEventFactory'; import { TeamDrivingRatingEventFactory } from '@core/racing/domain/services/TeamDrivingRatingEventFactory';
import { RecordTeamRaceRatingEventsInput, RecordTeamRaceRatingEventsOutput } from '../dtos/RecordTeamRaceRatingEventsDto'; import { RecordTeamRaceRatingEventsInput, RecordTeamRaceRatingEventsOutput } from '../dtos/RecordTeamRaceRatingEventsDto';
import type { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider'; import type { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider';
@@ -20,8 +18,6 @@ import { AppendTeamRatingEventsUseCase } from './AppendTeamRatingEventsUseCase';
export class RecordTeamRaceRatingEventsUseCase { export class RecordTeamRaceRatingEventsUseCase {
constructor( constructor(
private readonly teamRaceResultsProvider: TeamRaceResultsProvider, private readonly teamRaceResultsProvider: TeamRaceResultsProvider,
private readonly ratingEventRepository: TeamRatingEventRepository,
private readonly ratingRepository: TeamRatingRepository,
private readonly appendTeamRatingEventsUseCase: AppendTeamRatingEventsUseCase, private readonly appendTeamRatingEventsUseCase: AppendTeamRatingEventsUseCase,
) {} ) {}

View File

@@ -1,10 +1,9 @@
import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent'; import { TeamRatingEvent } from '@core/racing/domain/entities/TeamRatingEvent';
import { TeamRatingEventRepository } from '@core/racing/domain/repositories/TeamRatingEventRepository'; import { TeamRatingEventRepository, PaginatedResult } from '@core/racing/domain/repositories/TeamRatingEventRepository';
import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository'; import { TeamRatingRepository } from '@core/racing/domain/repositories/TeamRatingRepository';
import { TeamDrivingRaceFactsDto } from '@core/racing/domain/services/TeamDrivingRatingEventFactory'; import { TeamDrivingRaceFactsDto } from '@core/racing/domain/services/TeamDrivingRatingEventFactory';
import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId'; import { TeamRatingEventId } from '@core/racing/domain/value-objects/TeamRatingEventId';
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { PaginatedResult } from '../../domain/repositories/TeamRatingEventRepository';
import { TeamRating } from '../../domain/value-objects/TeamRating'; import { TeamRating } from '../../domain/value-objects/TeamRating';
import { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider'; import { TeamRaceResultsProvider } from '../ports/TeamRaceResultsProvider';
import { TeamRatingIntegrationAdapter } from './TeamRatingIntegrationAdapter'; import { TeamRatingIntegrationAdapter } from './TeamRatingIntegrationAdapter';

View File

@@ -15,7 +15,7 @@ describe('Penalty', () => {
issuedBy: 'steward-1', issuedBy: 'steward-1',
}); });
expect(penalty.id).toBe('penalty-1'); expect(penalty.id.toString()).toBe('penalty-1');
expect(penalty.leagueId).toBe('league-1'); expect(penalty.leagueId).toBe('league-1');
expect(penalty.raceId).toBe('race-1'); expect(penalty.raceId).toBe('race-1');
expect(penalty.driverId).toBe('driver-1'); expect(penalty.driverId).toBe('driver-1');
@@ -46,7 +46,7 @@ describe('Penalty', () => {
notes: 'Applied after review', notes: 'Applied after review',
}); });
expect(penalty.id).toBe('penalty-1'); expect(penalty.id.toString()).toBe('penalty-1');
expect(penalty.type).toBe('disqualification'); expect(penalty.type).toBe('disqualification');
expect(penalty.value).toBeUndefined(); expect(penalty.value).toBeUndefined();
expect(penalty.protestId).toBe('protest-1'); expect(penalty.protestId).toBe('protest-1');

View File

@@ -16,7 +16,7 @@ describe('Penalty', () => {
issuedBy: 'steward-1', issuedBy: 'steward-1',
}); });
expect(penalty.id).toBe('penalty-1'); expect(penalty.id.toString()).toBe('penalty-1');
expect(penalty.leagueId).toBe('league-1'); expect(penalty.leagueId).toBe('league-1');
expect(penalty.raceId).toBe('race-1'); expect(penalty.raceId).toBe('race-1');
expect(penalty.driverId).toBe('driver-1'); expect(penalty.driverId).toBe('driver-1');
@@ -47,7 +47,7 @@ describe('Penalty', () => {
notes: 'Applied after review', notes: 'Applied after review',
}); });
expect(penalty.id).toBe('penalty-1'); expect(penalty.id.toString()).toBe('penalty-1');
expect(penalty.type).toBe('disqualification'); expect(penalty.type).toBe('disqualification');
expect(penalty.value).toBeUndefined(); expect(penalty.value).toBeUndefined();
expect(penalty.protestId).toBe('protest-1'); expect(penalty.protestId).toBe('protest-1');