fix logger

This commit is contained in:
2025-12-15 22:39:17 +01:00
parent 7a11daa878
commit 3b566c973d
110 changed files with 1413 additions and 903 deletions

View File

@@ -6,13 +6,13 @@
import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository'; import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository';
import { AnalyticsSnapshot, type SnapshotPeriod, type SnapshotEntityType } from '../../domain/entities/AnalyticsSnapshot'; import { AnalyticsSnapshot, type SnapshotPeriod, type SnapshotEntityType } from '../../domain/entities/AnalyticsSnapshot';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryAnalyticsSnapshotRepository implements IAnalyticsSnapshotRepository { export class InMemoryAnalyticsSnapshotRepository implements IAnalyticsSnapshotRepository {
private snapshots: Map<string, AnalyticsSnapshot> = new Map(); private snapshots: Map<string, AnalyticsSnapshot> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger) { constructor(logger: Logger) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryAnalyticsSnapshotRepository initialized.'); this.logger.info('InMemoryAnalyticsSnapshotRepository initialized.');
} }

View File

@@ -6,13 +6,14 @@
import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository';
import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent'; import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryEngagementRepository implements IEngagementRepository { export class InMemoryEngagementRepository implements IEngagementRepository {
private events: Map<string, EngagementEvent> = new Map(); private events: Map<string, EngagementEvent> = new Map();
private logger: ILogger; private logger: Logger;
constructor(logger: ILogger) { constructor(logger: Logger) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryEngagementRepository initialized.'); this.logger.info('InMemoryEngagementRepository initialized.');
} }

View File

@@ -6,13 +6,13 @@
import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository';
import { PageView, type EntityType } from '../../domain/entities/PageView'; import { PageView, type EntityType } from '../../domain/entities/PageView';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryPageViewRepository implements IPageViewRepository { export class InMemoryPageViewRepository implements IPageViewRepository {
private pageViews: Map<string, PageView> = new Map(); private pageViews: Map<string, PageView> = new Map();
private logger: ILogger; private logger: Logger;
constructor(logger: ILogger) { constructor(logger: Logger) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryPageViewRepository initialized.'); this.logger.info('InMemoryPageViewRepository initialized.');
} }

View File

@@ -4,6 +4,7 @@
* In-memory implementation of IAchievementRepository * In-memory implementation of IAchievementRepository
*/ */
import { Logger } from '@gridpilot/core/shared/application';
import { import {
Achievement, Achievement,
AchievementCategory, AchievementCategory,
@@ -14,14 +15,13 @@ import {
} from '../../domain/entities/Achievement'; } from '../../domain/entities/Achievement';
import { UserAchievement } from '../../domain/entities/UserAchievement'; import { UserAchievement } from '../../domain/entities/UserAchievement';
import type { IAchievementRepository } from '../../domain/repositories/IAchievementRepository'; import type { IAchievementRepository } from '../../domain/repositories/IAchievementRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger';
export class InMemoryAchievementRepository implements IAchievementRepository { export class InMemoryAchievementRepository implements IAchievementRepository {
private achievements: Map<string, Achievement> = new Map(); private achievements: Map<string, Achievement> = new Map();
private userAchievements: Map<string, UserAchievement> = new Map(); private userAchievements: Map<string, UserAchievement> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger) { constructor(logger: Logger) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryAchievementRepository initialized.'); this.logger.info('InMemoryAchievementRepository initialized.');
// Seed with predefined achievements // Seed with predefined achievements

View File

@@ -2,15 +2,16 @@ import { IAuthRepository } from '@gridpilot/core/identity/domain/repositories/IA
import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository'; import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository';
import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService'; import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService';
import { User } from '@gridpilot/core/identity/domain/entities/User'; import { User } from '@gridpilot/core/identity/domain/entities/User';
import { ILogger } from '@gridpilot/shared/logging/ILogger';
import { EmailAddress } from '@gridpilot/core/identity/domain/value-objects/EmailAddress'; import { EmailAddress } from '@gridpilot/core/identity/domain/value-objects/EmailAddress';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryAuthRepository implements IAuthRepository { export class InMemoryAuthRepository implements IAuthRepository {
constructor( constructor(
private readonly userRepository: IUserRepository, private readonly userRepository: IUserRepository,
private readonly passwordHashingService: IPasswordHashingService, private readonly passwordHashingService: IPasswordHashingService,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async findByEmail(email: EmailAddress): Promise<User | null> { async findByEmail(email: EmailAddress): Promise<User | null> {

View File

@@ -7,13 +7,13 @@
import type { ISponsorAccountRepository } from '../../domain/repositories/ISponsorAccountRepository'; import type { ISponsorAccountRepository } from '../../domain/repositories/ISponsorAccountRepository';
import type { SponsorAccount } from '../../domain/entities/SponsorAccount'; import type { SponsorAccount } from '../../domain/entities/SponsorAccount';
import type { UserId } from '../../domain/value-objects/UserId'; import type { UserId } from '../../domain/value-objects/UserId';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemorySponsorAccountRepository implements ISponsorAccountRepository { export class InMemorySponsorAccountRepository implements ISponsorAccountRepository {
private accounts: Map<string, SponsorAccount> = new Map(); private accounts: Map<string, SponsorAccount> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: SponsorAccount[]) { constructor(logger: Logger, seedData?: SponsorAccount[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemorySponsorAccountRepository initialized.'); this.logger.info('InMemorySponsorAccountRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -6,13 +6,13 @@
import { UserRating } from '../../domain/value-objects/UserRating'; import { UserRating } from '../../domain/value-objects/UserRating';
import type { IUserRatingRepository } from '../../domain/repositories/IUserRatingRepository'; import type { IUserRatingRepository } from '../../domain/repositories/IUserRatingRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryUserRatingRepository implements IUserRatingRepository { export class InMemoryUserRatingRepository implements IUserRatingRepository {
private ratings: Map<string, UserRating> = new Map(); private ratings: Map<string, UserRating> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: UserRating[]) { constructor(logger: Logger, seedData?: UserRating[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryUserRatingRepository initialized.'); this.logger.info('InMemoryUserRatingRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -4,15 +4,15 @@
* Stores users in memory for demo/development purposes. * Stores users in memory for demo/development purposes.
*/ */
import { Logger } from '@gridpilot/core/shared/application';
import type { IUserRepository, StoredUser } from '../../domain/repositories/IUserRepository'; import type { IUserRepository, StoredUser } from '../../domain/repositories/IUserRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger';
export class InMemoryUserRepository implements IUserRepository { export class InMemoryUserRepository implements IUserRepository {
private users: Map<string, StoredUser> = new Map(); private users: Map<string, StoredUser> = new Map();
private emailIndex: Map<string, string> = new Map(); // email -> userId private emailIndex: Map<string, string> = new Map(); // email -> userId
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, initialUsers: StoredUser[] = []) { constructor(logger: Logger, initialUsers: StoredUser[] = []) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryUserRepository initialized.'); this.logger.info('InMemoryUserRepository initialized.');
for (const user of initialUsers) { for (const user of initialUsers) {

View File

@@ -4,15 +4,15 @@
* Manages user session using cookies. This is a placeholder implementation. * Manages user session using cookies. This is a placeholder implementation.
*/ */
import type { ILogger } from '@gridpilot/shared/logging/ILogger';
import type { AuthenticatedUserDTO } from '@gridpilot/core/identity/application/dto/AuthenticatedUserDTO'; import type { AuthenticatedUserDTO } from '@gridpilot/core/identity/application/dto/AuthenticatedUserDTO';
import type { AuthSessionDTO } from '@gridpilot/core/identity/application/dto/AuthSessionDTO'; import type { AuthSessionDTO } from '@gridpilot/core/identity/application/dto/AuthSessionDTO';
import type { IdentitySessionPort } from '@gridpilot/core/identity/application/ports/IdentitySessionPort'; import type { IdentitySessionPort } from '@gridpilot/core/identity/application/ports/IdentitySessionPort';
import { Logger } from '@gridpilot/core/shared/application';
export class CookieIdentitySessionAdapter implements IdentitySessionPort { export class CookieIdentitySessionAdapter implements IdentitySessionPort {
private currentSession: AuthSessionDTO | null = null; private currentSession: AuthSessionDTO | null = null;
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('CookieIdentitySessionAdapter initialized.'); this.logger.info('CookieIdentitySessionAdapter initialized.');
// In a real application, you would load the session from a cookie here // In a real application, you would load the session from a cookie here
// For demo, we'll start with no session. // For demo, we'll start with no session.

View File

@@ -1,6 +1,6 @@
import { ILogger } from './ILogger'; import { Logger } from "@gridpilot/core/shared/application";
export class ConsoleLogger implements ILogger { export class ConsoleLogger implements Logger {
debug(message: string, ...args: any[]): void { debug(message: string, ...args: any[]): void {
console.debug(message, ...args); console.debug(message, ...args);
} }

View File

@@ -1,12 +1,12 @@
import { IAvatarGenerationRepository } from '@gridpilot/core/media/domain/repositories/IAvatarGenerationRepository'; import { IAvatarGenerationRepository } from '@gridpilot/core/media/domain/repositories/IAvatarGenerationRepository';
import { AvatarGenerationRequest } from '@gridpilot/core/media/domain/entities/AvatarGenerationRequest'; import { AvatarGenerationRequest } from '@gridpilot/core/media/domain/entities/AvatarGenerationRequest';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/application';
export class InMemoryAvatarGenerationRepository implements IAvatarGenerationRepository { export class InMemoryAvatarGenerationRepository implements IAvatarGenerationRepository {
private requests: Map<string, AvatarGenerationRequest> = new Map(); // Key: requestId private requests: Map<string, AvatarGenerationRequest> = new Map(); // Key: requestId
private userRequests: Map<string, AvatarGenerationRequest[]> = new Map(); // Key: userId private userRequests: Map<string, AvatarGenerationRequest[]> = new Map(); // Key: userId
constructor(private readonly logger: ILogger, initialRequests: AvatarGenerationRequest[] = []) { constructor(private readonly logger: Logger, initialRequests: AvatarGenerationRequest[] = []) {
this.logger.info('InMemoryAvatarGenerationRepository initialized.'); this.logger.info('InMemoryAvatarGenerationRepository initialized.');
for (const req of initialRequests) { for (const req of initialRequests) {
this.requests.set(req.id, req); this.requests.set(req.id, req);

View File

@@ -1,8 +1,8 @@
import type { FaceValidationPort, FaceValidationResult } from '@gridpilot/core/media/application/ports/FaceValidationPort'; import type { FaceValidationPort, FaceValidationResult } from '@gridpilot/core/media/application/ports/FaceValidationPort';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryFaceValidationAdapter implements FaceValidationPort { export class InMemoryFaceValidationAdapter implements FaceValidationPort {
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('InMemoryFaceValidationAdapter initialized.'); this.logger.info('InMemoryFaceValidationAdapter initialized.');
} }

View File

@@ -1,8 +1,8 @@
import type { IImageServicePort } from '@gridpilot/racing/application/ports/IImageServicePort'; import type { IImageServicePort } from '@gridpilot/racing/application/ports/IImageServicePort';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryImageServiceAdapter implements IImageServicePort { export class InMemoryImageServiceAdapter implements IImageServicePort {
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('InMemoryImageServiceAdapter initialized.'); this.logger.info('InMemoryImageServiceAdapter initialized.');
} }

View File

@@ -1,11 +1,11 @@
import { INotificationPreferenceRepository } from '@gridpilot/core/notifications/domain/repositories/INotificationPreferenceRepository'; import { INotificationPreferenceRepository } from '@gridpilot/core/notifications/domain/repositories/INotificationPreferenceRepository';
import { NotificationPreference } from '@gridpilot/core/notifications/domain/entities/NotificationPreference'; import { NotificationPreference } from '@gridpilot/core/notifications/domain/entities/NotificationPreference';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryNotificationPreferenceRepository implements INotificationPreferenceRepository { export class InMemoryNotificationPreferenceRepository implements INotificationPreferenceRepository {
private preferences: Map<string, NotificationPreference> = new Map(); private preferences: Map<string, NotificationPreference> = new Map();
constructor(private readonly logger: ILogger, initialPreferences: NotificationPreference[] = []) { constructor(private readonly logger: Logger, initialPreferences: NotificationPreference[] = []) {
this.logger.info('InMemoryNotificationPreferenceRepository initialized.'); this.logger.info('InMemoryNotificationPreferenceRepository initialized.');
for (const pref of initialPreferences) { for (const pref of initialPreferences) {
this.preferences.set(pref.id, pref); this.preferences.set(pref.id, pref);

View File

@@ -7,13 +7,13 @@
import { Notification } from '../../domain/entities/Notification'; import { Notification } from '../../domain/entities/Notification';
import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository';
import type { NotificationType } from '../../domain/types/NotificationTypes'; import type { NotificationType } from '../../domain/types/NotificationTypes';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryNotificationRepository implements INotificationRepository { export class InMemoryNotificationRepository implements INotificationRepository {
private notifications: Map<string, Notification> = new Map(); private notifications: Map<string, Notification> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, initialNotifications: Notification[] = []) { constructor(logger: Logger, initialNotifications: Notification[] = []) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryNotificationRepository initialized.'); this.logger.info('InMemoryNotificationRepository initialized.');
initialNotifications.forEach(notification => { initialNotifications.forEach(notification => {

View File

@@ -8,13 +8,13 @@
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { Car, CarClass, CarLicense } from '@gridpilot/racing/domain/entities/Car'; import { Car, CarClass, CarLicense } from '@gridpilot/racing/domain/entities/Car';
import type { ICarRepository } from '@gridpilot/racing/domain/repositories/ICarRepository'; import type { ICarRepository } from '@gridpilot/racing/domain/repositories/ICarRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryCarRepository implements ICarRepository { export class InMemoryCarRepository implements ICarRepository {
private cars: Map<string, Car>; private cars: Map<string, Car>;
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Car[]) { constructor(logger: Logger, seedData?: Car[]) {
this.logger = logger; this.logger = logger;
this.cars = new Map(); this.cars = new Map();

View File

@@ -1,12 +1,12 @@
import { IDriverRepository } from '@gridpilot/racing/domain/repositories/IDriverRepository'; import { IDriverRepository } from '@gridpilot/racing/domain/repositories/IDriverRepository';
import { Driver } from '@gridpilot/racing/domain/entities/Driver'; import { Driver } from '@gridpilot/racing/domain/entities/Driver';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryDriverRepository implements IDriverRepository { export class InMemoryDriverRepository implements IDriverRepository {
private drivers: Map<string, Driver> = new Map(); private drivers: Map<string, Driver> = new Map();
private iracingIdIndex: Map<string, string> = new Map(); // iracingId -> driverId private iracingIdIndex: Map<string, string> = new Map(); // iracingId -> driverId
constructor(private readonly logger: ILogger, initialDrivers: Driver[] = []) { constructor(private readonly logger: Logger, initialDrivers: Driver[] = []) {
this.logger.info('InMemoryDriverRepository initialized.'); this.logger.info('InMemoryDriverRepository initialized.');
for (const driver of initialDrivers) { for (const driver of initialDrivers) {
this.drivers.set(driver.id, driver); this.drivers.set(driver.id, driver);

View File

@@ -1,11 +1,11 @@
import { IGameRepository } from '@gridpilot/racing/domain/repositories/IGameRepository'; import { IGameRepository } from '@gridpilot/racing/domain/repositories/IGameRepository';
import { Game } from '@gridpilot/racing/domain/entities/Game'; import { Game } from '@gridpilot/racing/domain/entities/Game';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryGameRepository implements IGameRepository { export class InMemoryGameRepository implements IGameRepository {
private games: Map<string, Game> = new Map(); private games: Map<string, Game> = new Map();
constructor(private readonly logger: ILogger, initialGames: Game[] = []) { constructor(private readonly logger: Logger, initialGames: Game[] = []) {
this.logger.info('InMemoryGameRepository initialized.'); this.logger.info('InMemoryGameRepository initialized.');
for (const game of initialGames) { for (const game of initialGames) {
this.games.set(game.id, game); this.games.set(game.id, game);

View File

@@ -1,12 +1,12 @@
import { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; import { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository';
import { LeagueMembership, JoinRequest } from '@gridpilot/racing/domain/entities/LeagueMembership'; import { LeagueMembership, JoinRequest } from '@gridpilot/racing/domain/entities/LeagueMembership';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLeagueMembershipRepository implements ILeagueMembershipRepository { export class InMemoryLeagueMembershipRepository implements ILeagueMembershipRepository {
private memberships: Map<string, LeagueMembership> = new Map(); // Key: `${leagueId}:${driverId}` private memberships: Map<string, LeagueMembership> = new Map(); // Key: `${leagueId}:${driverId}`
private joinRequests: Map<string, JoinRequest> = new Map(); // Key: requestId private joinRequests: Map<string, JoinRequest> = new Map(); // Key: requestId
constructor(private readonly logger: ILogger, initialMemberships: LeagueMembership[] = [], initialJoinRequests: JoinRequest[] = []) { constructor(private readonly logger: Logger, initialMemberships: LeagueMembership[] = [], initialJoinRequests: JoinRequest[] = []) {
this.logger.info('InMemoryLeagueMembershipRepository initialized.'); this.logger.info('InMemoryLeagueMembershipRepository initialized.');
for (const membership of initialMemberships) { for (const membership of initialMemberships) {
this.memberships.set(`${membership.leagueId}:${membership.driverId}`, membership); this.memberships.set(`${membership.leagueId}:${membership.driverId}`, membership);

View File

@@ -1,11 +1,11 @@
import { ILeagueRepository } from '@gridpilot/core/racing/domain/repositories/ILeagueRepository'; import { ILeagueRepository } from '@gridpilot/core/racing/domain/repositories/ILeagueRepository';
import { League } from '@gridpilot/core/racing/domain/entities/League'; import { League } from '@gridpilot/core/racing/domain/entities/League';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLeagueRepository implements ILeagueRepository { export class InMemoryLeagueRepository implements ILeagueRepository {
private leagues: Map<string, League> = new Map(); private leagues: Map<string, League> = new Map();
constructor(private readonly logger: ILogger, initialLeagues: League[] = []) { constructor(private readonly logger: Logger, initialLeagues: League[] = []) {
this.logger.info('InMemoryLeagueRepository initialized.'); this.logger.info('InMemoryLeagueRepository initialized.');
for (const league of initialLeagues) { for (const league of initialLeagues) {
this.leagues.set(league.id, league); this.leagues.set(league.id, league);

View File

@@ -1,11 +1,11 @@
import { ILeagueScoringConfigRepository } from '@gridpilot/racing/domain/repositories/ILeagueScoringConfigRepository'; import { ILeagueScoringConfigRepository } from '@gridpilot/racing/domain/repositories/ILeagueScoringConfigRepository';
import { LeagueScoringConfig } from '@gridpilot/racing/domain/entities/LeagueScoringConfig'; import { LeagueScoringConfig } from '@gridpilot/racing/domain/entities/LeagueScoringConfig';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLeagueScoringConfigRepository implements ILeagueScoringConfigRepository { export class InMemoryLeagueScoringConfigRepository implements ILeagueScoringConfigRepository {
private configs: Map<string, LeagueScoringConfig> = new Map(); // Key: seasonId private configs: Map<string, LeagueScoringConfig> = new Map(); // Key: seasonId
constructor(private readonly logger: ILogger, initialConfigs: LeagueScoringConfig[] = []) { constructor(private readonly logger: Logger, initialConfigs: LeagueScoringConfig[] = []) {
this.logger.info('InMemoryLeagueScoringConfigRepository initialized.'); this.logger.info('InMemoryLeagueScoringConfigRepository initialized.');
for (const config of initialConfigs) { for (const config of initialConfigs) {
this.configs.set(config.seasonId, config); this.configs.set(config.seasonId, config);

View File

@@ -1,10 +1,10 @@
import { ILeagueStandingsRepository, RawStanding } from '@gridpilot/core/league/application/ports/ILeagueStandingsRepository'; import { ILeagueStandingsRepository, RawStanding } from '@gridpilot/core/league/application/ports/ILeagueStandingsRepository';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLeagueStandingsRepository implements ILeagueStandingsRepository { export class InMemoryLeagueStandingsRepository implements ILeagueStandingsRepository {
private standings: Map<string, RawStanding[]> = new Map(); // Key: leagueId private standings: Map<string, RawStanding[]> = new Map(); // Key: leagueId
constructor(private readonly logger: ILogger, initialStandings: Record<string, RawStanding[]> = {}) { constructor(private readonly logger: Logger, initialStandings: Record<string, RawStanding[]> = {}) {
this.logger.info('InMemoryLeagueStandingsRepository initialized.'); this.logger.info('InMemoryLeagueStandingsRepository initialized.');
for (const leagueId in initialStandings) { for (const leagueId in initialStandings) {
// Ensure initialStandings[leagueId] is not undefined before setting // Ensure initialStandings[leagueId] is not undefined before setting

View File

@@ -6,13 +6,13 @@
import type { LeagueWallet } from '../../domain/entities/LeagueWallet'; import type { LeagueWallet } from '../../domain/entities/LeagueWallet';
import type { ILeagueWalletRepository } from '../../domain/repositories/ILeagueWalletRepository'; import type { ILeagueWalletRepository } from '../../domain/repositories/ILeagueWalletRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLeagueWalletRepository implements ILeagueWalletRepository { export class InMemoryLeagueWalletRepository implements ILeagueWalletRepository {
private wallets: Map<string, LeagueWallet> = new Map(); private wallets: Map<string, LeagueWallet> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: LeagueWallet[]) { constructor(logger: Logger, seedData?: LeagueWallet[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryLeagueWalletRepository initialized.'); this.logger.info('InMemoryLeagueWalletRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -7,14 +7,14 @@
import type { DriverLivery } from '../../domain/entities/DriverLivery'; import type { DriverLivery } from '../../domain/entities/DriverLivery';
import type { LiveryTemplate } from '../../domain/entities/LiveryTemplate'; import type { LiveryTemplate } from '../../domain/entities/LiveryTemplate';
import type { ILiveryRepository } from '../../domain/repositories/ILiveryRepository'; import type { ILiveryRepository } from '../../domain/repositories/ILiveryRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryLiveryRepository implements ILiveryRepository { export class InMemoryLiveryRepository implements ILiveryRepository {
private driverLiveries: Map<string, DriverLivery> = new Map(); private driverLiveries: Map<string, DriverLivery> = new Map();
private templates: Map<string, LiveryTemplate> = new Map(); private templates: Map<string, LiveryTemplate> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedDriverLiveries?: DriverLivery[], seedTemplates?: LiveryTemplate[]) { constructor(logger: Logger, seedDriverLiveries?: DriverLivery[], seedTemplates?: LiveryTemplate[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryLiveryRepository initialized.'); this.logger.info('InMemoryLiveryRepository initialized.');
if (seedDriverLiveries) { if (seedDriverLiveries) {

View File

@@ -6,13 +6,13 @@
import type { Penalty } from '../../domain/entities/Penalty'; import type { Penalty } from '../../domain/entities/Penalty';
import type { IPenaltyRepository } from '../../domain/repositories/IPenaltyRepository'; import type { IPenaltyRepository } from '../../domain/repositories/IPenaltyRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryPenaltyRepository implements IPenaltyRepository { export class InMemoryPenaltyRepository implements IPenaltyRepository {
private penalties: Map<string, Penalty> = new Map(); private penalties: Map<string, Penalty> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, initialPenalties: Penalty[] = []) { constructor(logger: Logger, initialPenalties: Penalty[] = []) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryPenaltyRepository initialized.'); this.logger.info('InMemoryPenaltyRepository initialized.');
initialPenalties.forEach(penalty => { initialPenalties.forEach(penalty => {

View File

@@ -1,11 +1,11 @@
import { IProtestRepository } from '@gridpilot/racing/domain/repositories/IProtestRepository'; import { IProtestRepository } from '@gridpilot/racing/domain/repositories/IProtestRepository';
import { Protest, ProtestStatus } from '@gridpilot/racing/domain/entities/Protest'; import { Protest, ProtestStatus } from '@gridpilot/racing/domain/entities/Protest';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryProtestRepository implements IProtestRepository { export class InMemoryProtestRepository implements IProtestRepository {
private protests: Map<string, Protest> = new Map(); private protests: Map<string, Protest> = new Map();
constructor(private readonly logger: ILogger, initialProtests: Protest[] = []) { constructor(private readonly logger: Logger, initialProtests: Protest[] = []) {
this.logger.info('InMemoryProtestRepository initialized.'); this.logger.info('InMemoryProtestRepository initialized.');
for (const protest of initialProtests) { for (const protest of initialProtests) {
this.protests.set(protest.id, protest); this.protests.set(protest.id, protest);

View File

@@ -3,13 +3,13 @@
*/ */
import type { IRaceEventRepository } from '../../domain/repositories/IRaceEventRepository'; import type { IRaceEventRepository } from '../../domain/repositories/IRaceEventRepository';
import type { RaceEvent } from '../../domain/entities/RaceEvent'; import type { RaceEvent } from '../../domain/entities/RaceEvent';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryRaceEventRepository implements IRaceEventRepository { export class InMemoryRaceEventRepository implements IRaceEventRepository {
private raceEvents: Map<string, RaceEvent> = new Map(); private raceEvents: Map<string, RaceEvent> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: RaceEvent[]) { constructor(logger: Logger, seedData?: RaceEvent[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryRaceEventRepository initialized.'); this.logger.info('InMemoryRaceEventRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -1,11 +1,11 @@
import { IRaceRegistrationRepository } from '@gridpilot/racing/domain/repositories/IRaceRegistrationRepository'; import { IRaceRegistrationRepository } from '@gridpilot/racing/domain/repositories/IRaceRegistrationRepository';
import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration'; import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryRaceRegistrationRepository implements IRaceRegistrationRepository { export class InMemoryRaceRegistrationRepository implements IRaceRegistrationRepository {
private registrations: Map<string, RaceRegistration> = new Map(); // Key: `${raceId}:${driverId}` private registrations: Map<string, RaceRegistration> = new Map(); // Key: `${raceId}:${driverId}`
constructor(private readonly logger: ILogger, initialRegistrations: RaceRegistration[] = []) { constructor(private readonly logger: Logger, initialRegistrations: RaceRegistration[] = []) {
this.logger.info('InMemoryRaceRegistrationRepository initialized.'); this.logger.info('InMemoryRaceRegistrationRepository initialized.');
for (const reg of initialRegistrations) { for (const reg of initialRegistrations) {
this.registrations.set(reg.id, reg); this.registrations.set(reg.id, reg);

View File

@@ -1,11 +1,11 @@
import { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; import { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository';
import { Race, RaceStatus } from '@gridpilot/racing/domain/entities/Race'; import { Race, RaceStatus } from '@gridpilot/racing/domain/entities/Race';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryRaceRepository implements IRaceRepository { export class InMemoryRaceRepository implements IRaceRepository {
private races: Map<string, Race> = new Map(); private races: Map<string, Race> = new Map();
constructor(private readonly logger: ILogger, initialRaces: Race[] = []) { constructor(private readonly logger: Logger, initialRaces: Race[] = []) {
this.logger.info('InMemoryRaceRepository initialized.'); this.logger.info('InMemoryRaceRepository initialized.');
for (const race of initialRaces) { for (const race of initialRaces) {
this.races.set(race.id, race); this.races.set(race.id, race);

View File

@@ -9,14 +9,14 @@ import { v4 as uuidv4 } from 'uuid';
import { Result } from '@gridpilot/racing/domain/entities/Result'; import { Result } from '@gridpilot/racing/domain/entities/Result';
import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository'; import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository';
import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryResultRepository implements IResultRepository { export class InMemoryResultRepository implements IResultRepository {
private results: Map<string, Result>; private results: Map<string, Result>;
private raceRepository: IRaceRepository | null; private raceRepository: IRaceRepository | null;
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Result[], raceRepository?: IRaceRepository | null) { constructor(logger: Logger, seedData?: Result[], raceRepository?: IRaceRepository | null) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryResultRepository initialized.'); this.logger.info('InMemoryResultRepository initialized.');
this.results = new Map(); this.results = new Map();

View File

@@ -13,9 +13,9 @@ import type { IChampionshipStandingRepository } from '@gridpilot/racing/domain/r
import { ChampionshipStanding } from '@gridpilot/racing/domain/entities/ChampionshipStanding'; import { ChampionshipStanding } from '@gridpilot/racing/domain/entities/ChampionshipStanding';
import type { ChampionshipType } from '@gridpilot/racing/domain/types/ChampionshipType'; import type { ChampionshipType } from '@gridpilot/racing/domain/types/ChampionshipType';
import type { ParticipantRef } from '@gridpilot/racing/domain/types/ParticipantRef'; import type { ParticipantRef } from '@gridpilot/racing/domain/types/ParticipantRef';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
class SilentLogger implements ILogger { class SilentLogger implements Logger {
debug(..._args: unknown[]): void { debug(..._args: unknown[]): void {
// console.debug(..._args); // console.debug(..._args);
} }
@@ -264,9 +264,9 @@ export function getLeagueScoringPresetById(
export class InMemoryGameRepository implements IGameRepository { export class InMemoryGameRepository implements IGameRepository {
private games: Game[]; private games: Game[];
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Game[]) { constructor(logger: Logger, seedData?: Game[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryGameRepository initialized.'); this.logger.info('InMemoryGameRepository initialized.');
this.games = seedData ? [...seedData] : []; this.games = seedData ? [...seedData] : [];
@@ -314,9 +314,9 @@ export class InMemoryGameRepository implements IGameRepository {
export class InMemorySeasonRepository implements ISeasonRepository { export class InMemorySeasonRepository implements ISeasonRepository {
private seasons: Season[]; private seasons: Season[];
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Season[]) { constructor(logger: Logger, seedData?: Season[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemorySeasonRepository initialized.'); this.logger.info('InMemorySeasonRepository initialized.');
this.seasons = seedData ? [...seedData] : []; this.seasons = seedData ? [...seedData] : [];
@@ -433,9 +433,9 @@ export class InMemoryLeagueScoringConfigRepository
implements ILeagueScoringConfigRepository implements ILeagueScoringConfigRepository
{ {
private configs: LeagueScoringConfig[]; private configs: LeagueScoringConfig[];
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: LeagueScoringConfig[]) { constructor(logger: Logger, seedData?: LeagueScoringConfig[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryLeagueScoringConfigRepository initialized.'); this.logger.info('InMemoryLeagueScoringConfigRepository initialized.');
this.configs = seedData ? [...seedData] : []; this.configs = seedData ? [...seedData] : [];
@@ -493,9 +493,9 @@ export class InMemoryChampionshipStandingRepository
implements IChampionshipStandingRepository implements IChampionshipStandingRepository
{ {
private standings: ChampionshipStanding[] = []; private standings: ChampionshipStanding[] = [];
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: ChampionshipStanding[]) { constructor(logger: Logger, seedData?: ChampionshipStanding[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryChampionshipStandingRepository initialized.'); this.logger.info('InMemoryChampionshipStandingRepository initialized.');
this.standings = seedData ? [...seedData] : []; this.standings = seedData ? [...seedData] : [];

View File

@@ -1,11 +1,11 @@
import { ISeasonRepository } from '@gridpilot/racing/domain/repositories/ISeasonRepository'; import { ISeasonRepository } from '@gridpilot/racing/domain/repositories/ISeasonRepository';
import { Season } from '@gridpilot/racing/domain/entities/Season'; import { Season } from '@gridpilot/racing/domain/entities/Season';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemorySeasonRepository implements ISeasonRepository { export class InMemorySeasonRepository implements ISeasonRepository {
private seasons: Map<string, Season> = new Map(); // Key: seasonId private seasons: Map<string, Season> = new Map(); // Key: seasonId
constructor(private readonly logger: ILogger, initialSeasons: Season[] = []) { constructor(private readonly logger: Logger, initialSeasons: Season[] = []) {
this.logger.info('InMemorySeasonRepository initialized.'); this.logger.info('InMemorySeasonRepository initialized.');
for (const season of initialSeasons) { for (const season of initialSeasons) {
this.seasons.set(season.id, season); this.seasons.set(season.id, season);

View File

@@ -6,13 +6,13 @@
import type { SeasonSponsorship, SponsorshipTier } from '../../domain/entities/SeasonSponsorship'; import type { SeasonSponsorship, SponsorshipTier } from '../../domain/entities/SeasonSponsorship';
import type { ISeasonSponsorshipRepository } from '../../domain/repositories/ISeasonSponsorshipRepository'; import type { ISeasonSponsorshipRepository } from '../../domain/repositories/ISeasonSponsorshipRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemorySeasonSponsorshipRepository implements ISeasonSponsorshipRepository { export class InMemorySeasonSponsorshipRepository implements ISeasonSponsorshipRepository {
private sponsorships: Map<string, SeasonSponsorship> = new Map(); private sponsorships: Map<string, SeasonSponsorship> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: SeasonSponsorship[]) { constructor(logger: Logger, seedData?: SeasonSponsorship[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemorySeasonSponsorshipRepository initialized.'); this.logger.info('InMemorySeasonSponsorshipRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -3,13 +3,13 @@
*/ */
import type { ISessionRepository } from '../../domain/repositories/ISessionRepository'; import type { ISessionRepository } from '../../domain/repositories/ISessionRepository';
import type { Session } from '../../domain/entities/Session'; import type { Session } from '../../domain/entities/Session';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemorySessionRepository implements ISessionRepository { export class InMemorySessionRepository implements ISessionRepository {
private sessions: Map<string, Session> = new Map(); private sessions: Map<string, Session> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Session[]) { constructor(logger: Logger, seedData?: Session[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemorySessionRepository initialized.'); this.logger.info('InMemorySessionRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -1,12 +1,12 @@
import { ISponsorRepository } from '@gridpilot/core/racing/domain/repositories/ISponsorRepository'; import { ISponsorRepository } from '@gridpilot/core/racing/domain/repositories/ISponsorRepository';
import { Sponsor } from '@gridpilot/core/racing/domain/entities/Sponsor'; import { Sponsor } from '@gridpilot/core/racing/domain/entities/Sponsor';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemorySponsorRepository implements ISponsorRepository { export class InMemorySponsorRepository implements ISponsorRepository {
private sponsors: Map<string, Sponsor> = new Map(); private sponsors: Map<string, Sponsor> = new Map();
private emailIndex: Map<string, string> = new Map(); // contactEmail -> sponsorId private emailIndex: Map<string, string> = new Map(); // contactEmail -> sponsorId
constructor(private readonly logger: ILogger, initialSponsors: Sponsor[] = []) { constructor(private readonly logger: Logger, initialSponsors: Sponsor[] = []) {
this.logger.info('InMemorySponsorRepository initialized.'); this.logger.info('InMemorySponsorRepository initialized.');
for (const sponsor of initialSponsors) { for (const sponsor of initialSponsors) {
this.sponsors.set(sponsor.id, sponsor); this.sponsors.set(sponsor.id, sponsor);

View File

@@ -5,7 +5,7 @@
import type { ISponsorshipPricingRepository } from '../../domain/repositories/ISponsorshipPricingRepository'; import type { ISponsorshipPricingRepository } from '../../domain/repositories/ISponsorshipPricingRepository';
import { SponsorshipPricing } from '../../domain/value-objects/SponsorshipPricing'; import { SponsorshipPricing } from '../../domain/value-objects/SponsorshipPricing';
import type { SponsorableEntityType } from '../../domain/entities/SponsorshipRequest'; import type { SponsorableEntityType } from '../../domain/entities/SponsorshipRequest';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
interface StorageKey { interface StorageKey {
entityType: SponsorableEntityType; entityType: SponsorableEntityType;
@@ -14,9 +14,9 @@ interface StorageKey {
export class InMemorySponsorshipPricingRepository implements ISponsorshipPricingRepository { export class InMemorySponsorshipPricingRepository implements ISponsorshipPricingRepository {
private pricings: Map<string, { entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }> = new Map(); private pricings: Map<string, { entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Array<{ entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }>) { constructor(logger: Logger, seedData?: Array<{ entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }>) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemorySponsorshipPricingRepository initialized.'); this.logger.info('InMemorySponsorshipPricingRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -1,11 +1,11 @@
import { ISponsorshipRequestRepository } from '@gridpilot/racing/domain/repositories/ISponsorshipRequestRepository'; import { ISponsorshipRequestRepository } from '@gridpilot/racing/domain/repositories/ISponsorshipRequestRepository';
import { SponsorshipRequest, SponsorableEntityType, SponsorshipRequestStatus } from '@gridpilot/racing/domain/entities/SponsorshipRequest'; import { SponsorshipRequest, SponsorableEntityType, SponsorshipRequestStatus } from '@gridpilot/racing/domain/entities/SponsorshipRequest';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemorySponsorshipRequestRepository implements ISponsorshipRequestRepository { export class InMemorySponsorshipRequestRepository implements ISponsorshipRequestRepository {
private requests: Map<string, SponsorshipRequest> = new Map(); private requests: Map<string, SponsorshipRequest> = new Map();
constructor(private readonly logger: ILogger, initialRequests: SponsorshipRequest[] = []) { constructor(private readonly logger: Logger, initialRequests: SponsorshipRequest[] = []) {
this.logger.info('InMemorySponsorshipRequestRepository initialized.'); this.logger.info('InMemorySponsorshipRequestRepository initialized.');
for (const req of initialRequests) { for (const req of initialRequests) {
this.requests.set(req.id, req); this.requests.set(req.id, req);

View File

@@ -10,7 +10,7 @@ import type { IStandingRepository } from '@gridpilot/racing/domain/repositories/
import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository'; import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository';
import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository';
import type { ILeagueRepository } from '@gridpilot/racing/domain/repositories/ILeagueRepository'; import type { ILeagueRepository } from '@gridpilot/racing/domain/repositories/ILeagueRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
/** /**
* Points systems presets * Points systems presets
@@ -32,10 +32,10 @@ export class InMemoryStandingRepository implements IStandingRepository {
private resultRepository: IResultRepository | null; private resultRepository: IResultRepository | null;
private raceRepository: IRaceRepository | null; private raceRepository: IRaceRepository | null;
private leagueRepository: ILeagueRepository | null; private leagueRepository: ILeagueRepository | null;
private readonly logger: ILogger; private readonly logger: Logger;
constructor( constructor(
logger: ILogger, logger: Logger,
seedData?: Standing[], seedData?: Standing[],
resultRepository?: IResultRepository | null, resultRepository?: IResultRepository | null,
raceRepository?: IRaceRepository | null, raceRepository?: IRaceRepository | null,

View File

@@ -10,14 +10,14 @@ import type {
TeamJoinRequest, TeamJoinRequest,
} from '@gridpilot/racing/domain/types/TeamMembership'; } from '@gridpilot/racing/domain/types/TeamMembership';
import type { ITeamMembershipRepository } from '@gridpilot/racing/domain/repositories/ITeamMembershipRepository'; import type { ITeamMembershipRepository } from '@gridpilot/racing/domain/repositories/ITeamMembershipRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryTeamMembershipRepository implements ITeamMembershipRepository { export class InMemoryTeamMembershipRepository implements ITeamMembershipRepository {
private membershipsByTeam: Map<string, TeamMembership[]>; private membershipsByTeam: Map<string, TeamMembership[]>;
private joinRequestsByTeam: Map<string, TeamJoinRequest[]>; private joinRequestsByTeam: Map<string, TeamJoinRequest[]>;
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedMemberships?: TeamMembership[], seedJoinRequests?: TeamJoinRequest[]) { constructor(logger: Logger, seedMemberships?: TeamMembership[], seedJoinRequests?: TeamJoinRequest[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryTeamMembershipRepository initialized.'); this.logger.info('InMemoryTeamMembershipRepository initialized.');
this.membershipsByTeam = new Map(); this.membershipsByTeam = new Map();

View File

@@ -7,13 +7,13 @@
import type { Team } from '@gridpilot/racing/domain/entities/Team'; import type { Team } from '@gridpilot/racing/domain/entities/Team';
import type { ITeamRepository } from '@gridpilot/racing/domain/repositories/ITeamRepository'; import type { ITeamRepository } from '@gridpilot/racing/domain/repositories/ITeamRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryTeamRepository implements ITeamRepository { export class InMemoryTeamRepository implements ITeamRepository {
private teams: Map<string, Team>; private teams: Map<string, Team>;
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Team[]) { constructor(logger: Logger, seedData?: Team[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryTeamRepository initialized.'); this.logger.info('InMemoryTeamRepository initialized.');
this.teams = new Map(); this.teams = new Map();

View File

@@ -8,13 +8,13 @@
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { Track, TrackCategory } from '@gridpilot/racing/domain/entities/Track'; import { Track, TrackCategory } from '@gridpilot/racing/domain/entities/Track';
import type { ITrackRepository } from '@gridpilot/racing/domain/repositories/ITrackRepository'; import type { ITrackRepository } from '@gridpilot/racing/domain/repositories/ITrackRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryTrackRepository implements ITrackRepository { export class InMemoryTrackRepository implements ITrackRepository {
private tracks: Map<string, Track>; private tracks: Map<string, Track>;
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Track[]) { constructor(logger: Logger, seedData?: Track[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryTrackRepository initialized.'); this.logger.info('InMemoryTrackRepository initialized.');
this.tracks = new Map(); this.tracks = new Map();

View File

@@ -6,13 +6,13 @@
import type { Transaction, TransactionType } from '../../domain/entities/Transaction'; import type { Transaction, TransactionType } from '../../domain/entities/Transaction';
import type { ITransactionRepository } from '../../domain/repositories/ITransactionRepository'; import type { ITransactionRepository } from '../../domain/repositories/ITransactionRepository';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryTransactionRepository implements ITransactionRepository { export class InMemoryTransactionRepository implements ITransactionRepository {
private transactions: Map<string, Transaction> = new Map(); private transactions: Map<string, Transaction> = new Map();
private readonly logger: ILogger; private readonly logger: Logger;
constructor(logger: ILogger, seedData?: Transaction[]) { constructor(logger: Logger, seedData?: Transaction[]) {
this.logger = logger; this.logger = logger;
this.logger.info('InMemoryTransactionRepository initialized.'); this.logger.info('InMemoryTransactionRepository initialized.');
if (seedData) { if (seedData) {

View File

@@ -1,8 +1,8 @@
import type { DriverRatingProvider } from '@gridpilot/racing/application/ports/DriverRatingProvider'; import type { DriverRatingProvider } from '@gridpilot/racing/application/ports/DriverRatingProvider';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryDriverRatingProvider implements DriverRatingProvider { export class InMemoryDriverRatingProvider implements DriverRatingProvider {
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('InMemoryDriverRatingProvider initialized.'); this.logger.info('InMemoryDriverRatingProvider initialized.');
} }

View File

@@ -1,8 +1,8 @@
import type { IDriverStatsService, DriverStats } from '@gridpilot/racing/domain/services/IDriverStatsService'; import type { IDriverStatsService, DriverStats } from '@gridpilot/racing/domain/services/IDriverStatsService';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryDriverStatsService implements IDriverStatsService { export class InMemoryDriverStatsService implements IDriverStatsService {
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('InMemoryDriverStatsService initialized.'); this.logger.info('InMemoryDriverStatsService initialized.');
} }

View File

@@ -1,8 +1,8 @@
import type { IRankingService, DriverRanking } from '@gridpilot/racing/domain/services/IRankingService'; import type { IRankingService, DriverRanking } from '@gridpilot/racing/domain/services/IRankingService';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class InMemoryRankingService implements IRankingService { export class InMemoryRankingService implements IRankingService {
constructor(private readonly logger: ILogger) { constructor(private readonly logger: Logger) {
this.logger.info('InMemoryRankingService initialized.'); this.logger.info('InMemoryRankingService initialized.');
} }

View File

@@ -21,10 +21,12 @@
"@nestjs/common": "^10.4.20", "@nestjs/common": "^10.4.20",
"@nestjs/core": "^10.4.20", "@nestjs/core": "^10.4.20",
"@nestjs/platform-express": "^10.4.20", "@nestjs/platform-express": "^10.4.20",
"@nestjs/swagger": "^7.4.2", "@nestjs/swagger": "^11.2.3",
"@nestjs/typeorm": "^10.0.2", "@nestjs/typeorm": "^10.0.2",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.3", "class-validator": "^0.14.3",
"electron": "39.2.7",
"next": "15.5.9",
"pg": "^8.12.0", "pg": "^8.12.0",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",

View File

@@ -2,11 +2,11 @@ import { Module } from '@nestjs/common';
import { AnalyticsController } from './AnalyticsController'; import { AnalyticsController } from './AnalyticsController';
import { AnalyticsService } from './AnalyticsService'; import { AnalyticsService } from './AnalyticsService';
const ILogger_TOKEN = 'ILogger_TOKEN'; const Logger_TOKEN = 'Logger_TOKEN';
const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN'; const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN';
const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN'; const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository'; import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository';
import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository'; import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository';
@@ -20,7 +20,7 @@ import { InMemoryEngagementRepository } from '../../../../adapters/analytics/per
providers: [ providers: [
AnalyticsService, AnalyticsService,
{ {
provide: ILogger_TOKEN, provide: Logger_TOKEN,
useClass: ConsoleLogger, useClass: ConsoleLogger,
}, },
{ {
@@ -35,7 +35,7 @@ import { InMemoryEngagementRepository } from '../../../../adapters/analytics/per
], ],
exports: [ exports: [
AnalyticsService, AnalyticsService,
ILogger_TOKEN, Logger_TOKEN,
IPAGE_VIEW_REPO_TOKEN, IPAGE_VIEW_REPO_TOKEN,
IENGAGEMENT_REPO_TOKEN, IENGAGEMENT_REPO_TOKEN,
], ],

View File

@@ -2,11 +2,11 @@ import { Injectable, Inject } from '@nestjs/common';
import { RecordEngagementInput, RecordEngagementOutput, RecordPageViewInput, RecordPageViewOutput } from './dto/AnalyticsDto'; import { RecordEngagementInput, RecordEngagementOutput, RecordPageViewInput, RecordPageViewOutput } from './dto/AnalyticsDto';
import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository'; import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository';
import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository'; import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
import { PageView } from '@gridpilot/analytics/domain/entities/PageView'; import { PageView } from '@gridpilot/analytics/domain/entities/PageView';
import { EngagementEvent } from '@gridpilot/analytics/domain/entities/EngagementEvent'; import { EngagementEvent } from '@gridpilot/analytics/domain/entities/EngagementEvent';
const ILogger_TOKEN = 'ILogger_TOKEN'; const Logger_TOKEN = 'Logger_TOKEN';
const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN'; const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN';
const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN'; const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN';
@@ -15,7 +15,7 @@ export class AnalyticsService {
constructor( constructor(
@Inject(IPAGE_VIEW_REPO_TOKEN) private readonly pageViewRepository: IPageViewRepository, @Inject(IPAGE_VIEW_REPO_TOKEN) private readonly pageViewRepository: IPageViewRepository,
@Inject(IENGAGEMENT_REPO_TOKEN) private readonly engagementRepository: IEngagementRepository, @Inject(IENGAGEMENT_REPO_TOKEN) private readonly engagementRepository: IEngagementRepository,
@Inject(ILogger_TOKEN) private readonly logger: ILogger, @Inject(Logger_TOKEN) private readonly logger: Logger,
) {} ) {}
async recordPageView(input: RecordPageViewInput): Promise<RecordPageViewOutput> { async recordPageView(input: RecordPageViewInput): Promise<RecordPageViewOutput> {

View File

@@ -5,7 +5,7 @@ import { AuthService } from './AuthService';
import { IAuthRepository } from '@gridpilot/core/identity/domain/repositories/IAuthRepository'; import { IAuthRepository } from '@gridpilot/core/identity/domain/repositories/IAuthRepository';
import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository'; import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository';
import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService'; import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService';
import { ILogger } from '@gridpilot/core/shared/logging/ILogger'; import { Logger } from '@gridpilot/core/shared/logging/Logger';
import { InMemoryAuthRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryAuthRepository'; import { InMemoryAuthRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryAuthRepository';
import { InMemoryUserRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryUserRepository'; import { InMemoryUserRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryUserRepository';
@@ -18,14 +18,14 @@ import { CookieIdentitySessionAdapter } from '../../../adapters/identity/session
export const AUTH_REPOSITORY_TOKEN = 'IAuthRepository'; export const AUTH_REPOSITORY_TOKEN = 'IAuthRepository';
export const USER_REPOSITORY_TOKEN = 'IUserRepository'; export const USER_REPOSITORY_TOKEN = 'IUserRepository';
export const PASSWORD_HASHING_SERVICE_TOKEN = 'IPasswordHashingService'; export const PASSWORD_HASHING_SERVICE_TOKEN = 'IPasswordHashingService';
export const LOGGER_TOKEN = 'ILogger'; export const LOGGER_TOKEN = 'Logger';
export const IDENTITY_SESSION_PORT_TOKEN = 'IdentitySessionPort'; export const IDENTITY_SESSION_PORT_TOKEN = 'IdentitySessionPort';
export const AuthProviders: Provider[] = [ export const AuthProviders: Provider[] = [
AuthService, // Provide the service itself AuthService, // Provide the service itself
{ {
provide: AUTH_REPOSITORY_TOKEN, provide: AUTH_REPOSITORY_TOKEN,
useFactory: (userRepository: IUserRepository, passwordHashingService: IPasswordHashingService, logger: ILogger) => { useFactory: (userRepository: IUserRepository, passwordHashingService: IPasswordHashingService, logger: Logger) => {
// Seed initial users for InMemoryUserRepository // Seed initial users for InMemoryUserRepository
const initialUsers: StoredUser[] = [ const initialUsers: StoredUser[] = [
// Example user (replace with actual test users as needed) // Example user (replace with actual test users as needed)
@@ -45,7 +45,7 @@ export const AuthProviders: Provider[] = [
}, },
{ {
provide: USER_REPOSITORY_TOKEN, provide: USER_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryUserRepository(logger), // Factory for InMemoryUserRepository useFactory: (logger: Logger) => new InMemoryUserRepository(logger), // Factory for InMemoryUserRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
@@ -58,7 +58,7 @@ export const AuthProviders: Provider[] = [
}, },
{ {
provide: IDENTITY_SESSION_PORT_TOKEN, provide: IDENTITY_SESSION_PORT_TOKEN,
useFactory: (logger: ILogger) => new CookieIdentitySessionAdapter(logger), useFactory: (logger: Logger) => new CookieIdentitySessionAdapter(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
]; ];

View File

@@ -13,7 +13,7 @@ import { LoginWithIracingCallbackUseCase } from '../../../../core/identity/appli
import { AUTH_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN, IDENTITY_SESSION_PORT_TOKEN, USER_REPOSITORY_TOKEN } from './AuthProviders'; import { AUTH_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN, IDENTITY_SESSION_PORT_TOKEN, USER_REPOSITORY_TOKEN } from './AuthProviders';
import { IAuthRepository } from '../../../../core/identity/domain/repositories/IAuthRepository'; import { IAuthRepository } from '../../../../core/identity/domain/repositories/IAuthRepository';
import { IPasswordHashingService } from '../../../../core/identity/domain/services/PasswordHashingService'; import { IPasswordHashingService } from '../../../../core/identity/domain/services/PasswordHashingService';
import { ILogger } from '../../../../core/shared/logging/ILogger'; import { Logger } from "@gridpilot/core/shared/application";
import { IdentitySessionPort } from '../../../../core/identity/application/ports/IdentitySessionPort'; import { IdentitySessionPort } from '../../../../core/identity/application/ports/IdentitySessionPort';
import { UserId } from '../../../../core/identity/domain/value-objects/UserId'; import { UserId } from '../../../../core/identity/domain/value-objects/UserId';
import { User } from '../../../../core/identity/domain/entities/User'; import { User } from '../../../../core/identity/domain/entities/User';
@@ -32,7 +32,7 @@ export class AuthService {
constructor( constructor(
@Inject(AUTH_REPOSITORY_TOKEN) private authRepository: IAuthRepository, @Inject(AUTH_REPOSITORY_TOKEN) private authRepository: IAuthRepository,
@Inject(PASSWORD_HASHING_SERVICE_TOKEN) private passwordHashingService: IPasswordHashingService, @Inject(PASSWORD_HASHING_SERVICE_TOKEN) private passwordHashingService: IPasswordHashingService,
@Inject(LOGGER_TOKEN) private logger: ILogger, @Inject(LOGGER_TOKEN) private logger: Logger,
@Inject(IDENTITY_SESSION_PORT_TOKEN) private identitySessionPort: IdentitySessionPort, @Inject(IDENTITY_SESSION_PORT_TOKEN) private identitySessionPort: IdentitySessionPort,
@Inject(USER_REPOSITORY_TOKEN) private userRepository: IUserRepository, // Inject IUserRepository here @Inject(USER_REPOSITORY_TOKEN) private userRepository: IUserRepository, // Inject IUserRepository here
) { ) {

View File

@@ -9,7 +9,7 @@ import { DriverRatingProvider } from '../../../../core/racing/application/ports/
import { IImageServicePort } from '../../../../core/racing/application/ports/IImageServicePort'; import { IImageServicePort } from '../../../../core/racing/application/ports/IImageServicePort';
import { IRaceRegistrationRepository } from '../../../../core/racing/domain/repositories/IRaceRegistrationRepository'; import { IRaceRegistrationRepository } from '../../../../core/racing/domain/repositories/IRaceRegistrationRepository';
import { INotificationPreferenceRepository } from '../../../../core/notifications/domain/repositories/INotificationPreferenceRepository'; import { INotificationPreferenceRepository } from '../../../../core/notifications/domain/repositories/INotificationPreferenceRepository';
import { ILogger } from '../../../../core/shared/logging/ILogger'; import { Logger } from "@gridpilot/core/shared/application";
// Import concrete in-memory implementations // Import concrete in-memory implementations
import { InMemoryDriverRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryDriverRepository'; import { InMemoryDriverRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryDriverRepository';
@@ -29,43 +29,43 @@ export const DRIVER_RATING_PROVIDER_TOKEN = 'DriverRatingProvider';
export const IMAGE_SERVICE_PORT_TOKEN = 'IImageServicePort'; export const IMAGE_SERVICE_PORT_TOKEN = 'IImageServicePort';
export const RACE_REGISTRATION_REPOSITORY_TOKEN = 'IRaceRegistrationRepository'; export const RACE_REGISTRATION_REPOSITORY_TOKEN = 'IRaceRegistrationRepository';
export const NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN = 'INotificationPreferenceRepository'; export const NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN = 'INotificationPreferenceRepository';
export const LOGGER_TOKEN = 'ILogger'; // Already defined in AuthProviders, but good to have here too export const LOGGER_TOKEN = 'Logger'; // Already defined in AuthProviders, but good to have here too
export const DriverProviders: Provider[] = [ export const DriverProviders: Provider[] = [
DriverService, // Provide the service itself DriverService, // Provide the service itself
{ {
provide: DRIVER_REPOSITORY_TOKEN, provide: DRIVER_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryDriverRepository(logger), // Factory for InMemoryDriverRepository useFactory: (logger: Logger) => new InMemoryDriverRepository(logger), // Factory for InMemoryDriverRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: RANKING_SERVICE_TOKEN, provide: RANKING_SERVICE_TOKEN,
useFactory: (logger: ILogger) => new InMemoryRankingService(logger), useFactory: (logger: Logger) => new InMemoryRankingService(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: DRIVER_STATS_SERVICE_TOKEN, provide: DRIVER_STATS_SERVICE_TOKEN,
useFactory: (logger: ILogger) => new InMemoryDriverStatsService(logger), useFactory: (logger: Logger) => new InMemoryDriverStatsService(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: DRIVER_RATING_PROVIDER_TOKEN, provide: DRIVER_RATING_PROVIDER_TOKEN,
useFactory: (logger: ILogger) => new InMemoryDriverRatingProvider(logger), useFactory: (logger: Logger) => new InMemoryDriverRatingProvider(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: IMAGE_SERVICE_PORT_TOKEN, provide: IMAGE_SERVICE_PORT_TOKEN,
useFactory: (logger: ILogger) => new InMemoryImageServiceAdapter(logger), useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: RACE_REGISTRATION_REPOSITORY_TOKEN, provide: RACE_REGISTRATION_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryRaceRegistrationRepository(logger), useFactory: (logger: Logger) => new InMemoryRaceRegistrationRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN, provide: NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryNotificationPreferenceRepository(logger), useFactory: (logger: Logger) => new InMemoryNotificationPreferenceRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {

View File

@@ -10,7 +10,7 @@ import { ILeagueScoringConfigRepository } from 'core/racing/domain/repositories/
import { IGameRepository } from 'core/racing/domain/repositories/IGameRepository'; import { IGameRepository } from 'core/racing/domain/repositories/IGameRepository';
import { IProtestRepository } from 'core/racing/domain/repositories/IProtestRepository'; import { IProtestRepository } from 'core/racing/domain/repositories/IProtestRepository';
import { IRaceRepository } from 'core/racing/domain/repositories/IRaceRepository'; import { IRaceRepository } from 'core/racing/domain/repositories/IRaceRepository';
import { ILogger } from 'core/shared/logging/ILogger'; import { Logger } from 'core/shared/logging/Logger';
// Import concrete in-memory implementations // Import concrete in-memory implementations
import { InMemoryLeagueRepository } from 'adapters/racing/persistence/inmemory/InMemoryLeagueRepository'; import { InMemoryLeagueRepository } from 'adapters/racing/persistence/inmemory/InMemoryLeagueRepository';
@@ -32,48 +32,48 @@ export const LEAGUE_SCORING_CONFIG_REPOSITORY_TOKEN = 'ILeagueScoringConfigRepos
export const GAME_REPOSITORY_TOKEN = 'IGameRepository'; export const GAME_REPOSITORY_TOKEN = 'IGameRepository';
export const PROTEST_REPOSITORY_TOKEN = 'IProtestRepository'; export const PROTEST_REPOSITORY_TOKEN = 'IProtestRepository';
export const RACE_REPOSITORY_TOKEN = 'IRaceRepository'; export const RACE_REPOSITORY_TOKEN = 'IRaceRepository';
export const LOGGER_TOKEN = 'ILogger'; // Already defined in AuthProviders, but good to have here too export const LOGGER_TOKEN = 'Logger'; // Already defined in AuthProviders, but good to have here too
export const LeagueProviders: Provider[] = [ export const LeagueProviders: Provider[] = [
LeagueService, // Provide the service itself LeagueService, // Provide the service itself
{ {
provide: LEAGUE_REPOSITORY_TOKEN, provide: LEAGUE_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryLeagueRepository(logger), // Factory for InMemoryLeagueRepository useFactory: (logger: Logger) => new InMemoryLeagueRepository(logger), // Factory for InMemoryLeagueRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, provide: LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryLeagueMembershipRepository(logger), // Factory for InMemoryLeagueMembershipRepository useFactory: (logger: Logger) => new InMemoryLeagueMembershipRepository(logger), // Factory for InMemoryLeagueMembershipRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: LEAGUE_STANDINGS_REPOSITORY_TOKEN, provide: LEAGUE_STANDINGS_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryLeagueStandingsRepository(logger), // Factory for InMemoryLeagueStandingsRepository useFactory: (logger: Logger) => new InMemoryLeagueStandingsRepository(logger), // Factory for InMemoryLeagueStandingsRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: SEASON_REPOSITORY_TOKEN, provide: SEASON_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemorySeasonRepository(logger), // Factory for InMemorySeasonRepository useFactory: (logger: Logger) => new InMemorySeasonRepository(logger), // Factory for InMemorySeasonRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: LEAGUE_SCORING_CONFIG_REPOSITORY_TOKEN, provide: LEAGUE_SCORING_CONFIG_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryLeagueScoringConfigRepository(logger), // Factory for InMemoryLeagueScoringConfigRepository useFactory: (logger: Logger) => new InMemoryLeagueScoringConfigRepository(logger), // Factory for InMemoryLeagueScoringConfigRepository
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: GAME_REPOSITORY_TOKEN, provide: GAME_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryGameRepository(logger), useFactory: (logger: Logger) => new InMemoryGameRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: PROTEST_REPOSITORY_TOKEN, provide: PROTEST_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryProtestRepository(logger), useFactory: (logger: Logger) => new InMemoryProtestRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: RACE_REPOSITORY_TOKEN, provide: RACE_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryRaceRepository(logger), useFactory: (logger: Logger) => new InMemoryRaceRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {

View File

@@ -7,7 +7,7 @@ import { MediaService } from './MediaService';
/* /*
import { IAvatarGenerationRepository } from 'core/media/domain/repositories/IAvatarGenerationRepository'; import { IAvatarGenerationRepository } from 'core/media/domain/repositories/IAvatarGenerationRepository';
import { FaceValidationPort } from 'core/media/application/ports/FaceValidationPort'; import { FaceValidationPort } from 'core/media/application/ports/FaceValidationPort';
import { ILogger } from 'core/shared/logging/ILogger'; import { Logger } from 'core/shared/logging/Logger';
import { InMemoryAvatarGenerationRepository } from 'adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository'; import { InMemoryAvatarGenerationRepository } from 'adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository';
import { InMemoryFaceValidationAdapter } from 'adapters/media/ports/InMemoryFaceValidationAdapter'; import { InMemoryFaceValidationAdapter } from 'adapters/media/ports/InMemoryFaceValidationAdapter';
@@ -17,7 +17,7 @@ import { MediaService } from './MediaService';
// Define injection tokens as string literals for NestJS // Define injection tokens as string literals for NestJS
export const AVATAR_GENERATION_REPOSITORY_TOKEN = 'IAvatarGenerationRepository'; export const AVATAR_GENERATION_REPOSITORY_TOKEN = 'IAvatarGenerationRepository';
export const FACE_VALIDATION_PORT_TOKEN = 'FaceValidationPort'; export const FACE_VALIDATION_PORT_TOKEN = 'FaceValidationPort';
export const LOGGER_TOKEN = 'ILogger'; export const LOGGER_TOKEN = 'Logger';
export const MediaProviders: Provider[] = [ export const MediaProviders: Provider[] = [
MediaService, // Provide the service itself MediaService, // Provide the service itself
@@ -25,12 +25,12 @@ export const MediaProviders: Provider[] = [
/* /*
{ {
provide: AVATAR_GENERATION_REPOSITORY_TOKEN, provide: AVATAR_GENERATION_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryAvatarGenerationRepository(logger), useFactory: (logger: Logger) => new InMemoryAvatarGenerationRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: FACE_VALIDATION_PORT_TOKEN, provide: FACE_VALIDATION_PORT_TOKEN,
useFactory: (logger: ILogger) => new InMemoryFaceValidationAdapter(logger), useFactory: (logger: Logger) => new InMemoryFaceValidationAdapter(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {

View File

@@ -11,7 +11,7 @@ import { IMembershipFeeRepository } from 'core/payments/domain/repositories/IMem
import { IPrizeRepository } from 'core/payments/domain/repositories/IPrizeRepository'; import { IPrizeRepository } from 'core/payments/domain/repositories/IPrizeRepository';
import { IWalletRepository } from 'core/payments/domain/repositories/IWalletRepository'; import { IWalletRepository } from 'core/payments/domain/repositories/IWalletRepository';
import { IPaymentGateway } from 'core/payments/application/ports/IPaymentGateway'; import { IPaymentGateway } from 'core/payments/application/ports/IPaymentGateway';
import { ILogger } from 'core/shared/logging/ILogger'; import { Logger } from 'core/shared/logging/Logger';
// Import concrete in-memory implementations // Import concrete in-memory implementations
import { InMemoryPaymentRepository } from 'adapters/payments/persistence/inmemory/InMemoryPaymentRepository'; import { InMemoryPaymentRepository } from 'adapters/payments/persistence/inmemory/InMemoryPaymentRepository';
@@ -28,7 +28,7 @@ export const MEMBERSHIP_FEE_REPOSITORY_TOKEN = 'IMembershipFeeRepository';
export const PRIZE_REPOSITORY_TOKEN = 'IPrizeRepository'; export const PRIZE_REPOSITORY_TOKEN = 'IPrizeRepository';
export const WALLET_REPOSITORY_TOKEN = 'IWalletRepository'; export const WALLET_REPOSITORY_TOKEN = 'IWalletRepository';
export const PAYMENT_GATEWAY_TOKEN = 'IPaymentGateway'; export const PAYMENT_GATEWAY_TOKEN = 'IPaymentGateway';
export const LOGGER_TOKEN = 'ILogger'; // Already defined in other Providers, but good to have here too export const LOGGER_TOKEN = 'Logger'; // Already defined in other Providers, but good to have here too
export const PaymentsProviders: Provider[] = [ export const PaymentsProviders: Provider[] = [
PaymentsService, // Provide the service itself PaymentsService, // Provide the service itself
@@ -36,27 +36,27 @@ export const PaymentsProviders: Provider[] = [
/* /*
{ {
provide: PAYMENT_REPOSITORY_TOKEN, provide: PAYMENT_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryPaymentRepository(logger), useFactory: (logger: Logger) => new InMemoryPaymentRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: MEMBERSHIP_FEE_REPOSITORY_TOKEN, provide: MEMBERSHIP_FEE_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryMembershipFeeRepository(logger), useFactory: (logger: Logger) => new InMemoryMembershipFeeRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: PRIZE_REPOSITORY_TOKEN, provide: PRIZE_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryPrizeRepository(logger), useFactory: (logger: Logger) => new InMemoryPrizeRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: WALLET_REPOSITORY_TOKEN, provide: WALLET_REPOSITORY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryWalletRepository(logger), useFactory: (logger: Logger) => new InMemoryWalletRepository(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {
provide: PAYMENT_GATEWAY_TOKEN, provide: PAYMENT_GATEWAY_TOKEN,
useFactory: (logger: ILogger) => new InMemoryPaymentGateway(logger), useFactory: (logger: Logger) => new InMemoryPaymentGateway(logger),
inject: [LOGGER_TOKEN], inject: [LOGGER_TOKEN],
}, },
{ {

View File

@@ -6,7 +6,7 @@ export const RaceProviders: Provider[] = [
// In a functional setup, other providers would be here, e.g.: // In a functional setup, other providers would be here, e.g.:
/* /*
{ {
provide: 'ILogger', provide: 'Logger',
useClass: ConsoleLogger, useClass: ConsoleLogger,
}, },
{ {

View File

@@ -15,12 +15,14 @@
"@types/react": "^18.2.0", "@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0", "@types/react-dom": "^18.2.0",
"@vitejs/plugin-react": "^4.2.0", "@vitejs/plugin-react": "^4.2.0",
"electron": "^28.3.3", "electron": "^39.2.7",
"electron-vite": "^2.3.0", "electron-vite": "^3.1.0",
"typescript": "^5.7.2", "typescript": "^5.7.2",
"vite": "^5.4.21" "vite": "^6.4.1"
}, },
"dependencies": { "dependencies": {
"@nestjs/swagger": "11.2.3",
"next": "15.5.9",
"puppeteer-core": "^24.31.0", "puppeteer-core": "^24.31.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0"

View File

@@ -18,13 +18,14 @@
"@gridpilot/social": "file:../../core/social", "@gridpilot/social": "file:../../core/social",
"@gridpilot/testing-support": "file:../../core/testing-support", "@gridpilot/testing-support": "file:../../core/testing-support",
"@vercel/kv": "^3.0.0", "@vercel/kv": "^3.0.0",
"electron": "39.2.7",
"framer-motion": "^12.23.25", "framer-motion": "^12.23.25",
"lucide-react": "^0.555.0", "lucide-react": "^0.555.0",
"next": "15.5.7", "next": "^15.5.9",
"react": "^18.3.0", "react": "^18.3.0",
"react-dom": "^18.3.0", "react-dom": "^18.3.0",
"zod": "^3.25.76", "uuid": "^11.0.5",
"uuid": "^11.0.5" "zod": "^3.25.76"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.0.0", "@types/node": "^20.0.0",

View File

@@ -6,7 +6,7 @@
*/ */
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '@gridpilot/shared/application'; import type { Logger } from '@gridpilot/shared/application';
import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository';
import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository';
import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository'; import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository';
@@ -49,7 +49,7 @@ export class GetEntityAnalyticsQuery
private readonly pageViewRepository: IPageViewRepository, private readonly pageViewRepository: IPageViewRepository,
private readonly engagementRepository: IEngagementRepository, private readonly engagementRepository: IEngagementRepository,
private readonly snapshotRepository: IAnalyticsSnapshotRepository, private readonly snapshotRepository: IAnalyticsSnapshotRepository,
private readonly logger: ILogger private readonly logger: Logger
) {} ) {}
async execute(input: GetEntityAnalyticsInput): Promise<EntityAnalyticsOutput> { async execute(input: GetEntityAnalyticsInput): Promise<EntityAnalyticsOutput> {

View File

@@ -5,7 +5,7 @@
*/ */
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent'; import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent';
import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository';
@@ -28,7 +28,7 @@ export class RecordEngagementUseCase
implements AsyncUseCase<RecordEngagementInput, RecordEngagementOutput> { implements AsyncUseCase<RecordEngagementInput, RecordEngagementOutput> {
constructor( constructor(
private readonly engagementRepository: IEngagementRepository, private readonly engagementRepository: IEngagementRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(input: RecordEngagementInput): Promise<RecordEngagementOutput> { async execute(input: RecordEngagementInput): Promise<RecordEngagementOutput> {

View File

@@ -5,7 +5,7 @@
*/ */
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
import { PageView } from '../../domain/entities/PageView'; import { PageView } from '../../domain/entities/PageView';
import type { EntityType, VisitorType } from '../../domain/types/PageView'; import type { EntityType, VisitorType } from '../../domain/types/PageView';
import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository';
@@ -29,7 +29,7 @@ export class RecordPageViewUseCase
implements AsyncUseCase<RecordPageViewInput, RecordPageViewOutput> { implements AsyncUseCase<RecordPageViewInput, RecordPageViewOutput> {
constructor( constructor(
private readonly pageViewRepository: IPageViewRepository, private readonly pageViewRepository: IPageViewRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(input: RecordPageViewInput): Promise<RecordPageViewOutput> { async execute(input: RecordPageViewInput): Promise<RecordPageViewOutput> {

View File

@@ -1,4 +1,4 @@
export interface ILogger { export interface Logger {
debug(message: string, ...args: any[]): void; debug(message: string, ...args: any[]): void;
info(message: string, ...args: any[]): void; info(message: string, ...args: any[]): void;
warn(message: string, ...args: any[]): void; warn(message: string, ...args: any[]): void;

View File

@@ -1,4 +1,4 @@
export interface ILogger { export interface Logger {
debug(message: string, context?: Record<string, any>): void; debug(message: string, context?: Record<string, any>): void;
info(message: string, context?: Record<string, any>): void; info(message: string, context?: Record<string, any>): void;
warn(message: string, context?: Record<string, any>): void; warn(message: string, context?: Record<string, any>): void;

View File

@@ -1,11 +1,11 @@
import type { LogLevel } from './LoggerLogLevel'; import type { LogLevel } from './LoggerLogLevel';
import type { LogContext } from './LoggerContext'; import type { LogContext } from './LoggerContext';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
/** /**
* LoggerPort - Port interface for application-layer logging. * LoggerPort - Port interface for application-layer logging.
*/ */
export interface LoggerPort extends ILogger { export interface LoggerPort extends Logger {
debug(message: string, context?: LogContext): void; debug(message: string, context?: LogContext): void;
info(message: string, context?: LogContext): void; info(message: string, context?: LogContext): void;
warn(message: string, context?: LogContext): void; warn(message: string, context?: LogContext): void;

View File

@@ -1,5 +1,5 @@
import { AuthenticationState } from '../../domain/value-objects/AuthenticationState'; import { AuthenticationState } from '../../domain/value-objects/AuthenticationState';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort';
import { SessionLifetime } from '../../domain/value-objects/SessionLifetime'; import { SessionLifetime } from '../../domain/value-objects/SessionLifetime';
@@ -17,7 +17,7 @@ import type { SessionValidatorPort } from '../ports/SessionValidatorPort';
*/ */
export class CheckAuthenticationUseCase { export class CheckAuthenticationUseCase {
constructor( constructor(
private readonly logger: ILogger, private readonly logger: Logger,
private readonly authService: AuthenticationServicePort, private readonly authService: AuthenticationServicePort,
private readonly sessionValidator?: SessionValidatorPort private readonly sessionValidator?: SessionValidatorPort
) {} ) {}

View File

@@ -1,6 +1,6 @@
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use case for clearing the user's session (logout). * Use case for clearing the user's session (logout).
@@ -11,7 +11,7 @@ import type { ILogger } from '../../../shared/src/logging/ILogger';
export class ClearSessionUseCase { export class ClearSessionUseCase {
constructor( constructor(
private readonly authService: AuthenticationServicePort, private readonly authService: AuthenticationServicePort,
private readonly logger: ILogger, // Inject ILogger private readonly logger: Logger, // Inject Logger
) {} ) {}
/** /**

View File

@@ -1,10 +1,10 @@
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import { RaceCreationResult } from '../../domain/value-objects/RaceCreationResult'; import { RaceCreationResult } from '../../domain/value-objects/RaceCreationResult';
import type { CheckoutServicePort } from '../ports/CheckoutServicePort'; import type { CheckoutServicePort } from '../ports/CheckoutServicePort';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export class CompleteRaceCreationUseCase { export class CompleteRaceCreationUseCase {
constructor(private readonly checkoutService: CheckoutServicePort, private readonly logger: ILogger) {} constructor(private readonly checkoutService: CheckoutServicePort, private readonly logger: Logger) {}
async execute(sessionId: string): Promise<Result<RaceCreationResult>> { async execute(sessionId: string): Promise<Result<RaceCreationResult>> {
this.logger.debug(`Attempting to complete race creation for session ID: ${sessionId}`); this.logger.debug(`Attempting to complete race creation for session ID: ${sessionId}`);

View File

@@ -1,5 +1,5 @@
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { CheckoutServicePort } from '../ports/CheckoutServicePort'; import type { CheckoutServicePort } from '../ports/CheckoutServicePort';
import type { CheckoutConfirmationPort } from '../ports/CheckoutConfirmationPort'; import type { CheckoutConfirmationPort } from '../ports/CheckoutConfirmationPort';
import { CheckoutStateEnum } from '../../domain/value-objects/CheckoutState'; import { CheckoutStateEnum } from '../../domain/value-objects/CheckoutState';
@@ -16,7 +16,7 @@ export class ConfirmCheckoutUseCase {
constructor( constructor(
private readonly checkoutService: CheckoutServicePort, private readonly checkoutService: CheckoutServicePort,
private readonly confirmationPort: CheckoutConfirmationPort, private readonly confirmationPort: CheckoutConfirmationPort,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(sessionMetadata?: SessionMetadata): Promise<Result<void>> { async execute(sessionMetadata?: SessionMetadata): Promise<Result<void>> {

View File

@@ -1,6 +1,6 @@
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort';
import type { ILogger } from '../../../shared/logger/ILogger'; import type { Logger } from '@gridpilot/shared/application/Logger';
/** /**
* Use case for initiating the manual login flow. * Use case for initiating the manual login flow.
@@ -12,7 +12,7 @@ import type { ILogger } from '../../../shared/logger/ILogger';
export class InitiateLoginUseCase { export class InitiateLoginUseCase {
constructor( constructor(
private readonly authService: AuthenticationServicePort, private readonly authService: AuthenticationServicePort,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
/** /**

View File

@@ -1,5 +1,5 @@
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import { AutomationSession } from '../../domain/entities/AutomationSession'; import { AutomationSession } from '../../domain/entities/AutomationSession';
import type { HostedSessionConfig } from '../../domain/types/HostedSessionConfig'; import type { HostedSessionConfig } from '../../domain/types/HostedSessionConfig';
import { AutomationEnginePort } from '../ports/AutomationEnginePort'; import { AutomationEnginePort } from '../ports/AutomationEnginePort';
@@ -13,7 +13,7 @@ export class StartAutomationSessionUseCase
private readonly automationEngine: AutomationEnginePort, private readonly automationEngine: AutomationEnginePort,
private readonly browserAutomation: IBrowserAutomation, private readonly browserAutomation: IBrowserAutomation,
private readonly sessionRepository: SessionRepositoryPort, private readonly sessionRepository: SessionRepositoryPort,
private readonly logger: ILogger private readonly logger: Logger
) {} ) {}
async execute(config: HostedSessionConfig): Promise<SessionDTO> { async execute(config: HostedSessionConfig): Promise<SessionDTO> {

View File

@@ -1,7 +1,7 @@
import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort';
import { Result } from '../../../shared/result/Result'; import { Result } from '../../../shared/result/Result';
import { BrowserAuthenticationState } from '../../domain/value-objects/BrowserAuthenticationState'; import { BrowserAuthenticationState } from '../../domain/value-objects/BrowserAuthenticationState';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use case for verifying browser shows authenticated page state. * Use case for verifying browser shows authenticated page state.
@@ -10,7 +10,7 @@ import type { ILogger } from '../../../shared/src/logging/ILogger';
export class VerifyAuthenticatedPageUseCase { export class VerifyAuthenticatedPageUseCase {
constructor( constructor(
private readonly authService: AuthenticationServicePort, private readonly authService: AuthenticationServicePort,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(): Promise<Result<BrowserAuthenticationState>> { async execute(): Promise<Result<BrowserAuthenticationState>> {

View File

@@ -1,8 +1,8 @@
import type { LoggerPort } from '../../../application/ports/LoggerPort'; import type { LoggerPort } from '../../../application/ports/LoggerPort';
import type { LogContext } from '../../../application/ports/LoggerContext'; import type { LogContext } from '../../../application/ports/LoggerContext';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
export class NoOpLogAdapter implements LoggerPort, ILogger { export class NoOpLogAdapter implements LoggerPort, Logger {
debug(_message: string, _context?: LogContext): void {} debug(_message: string, _context?: LogContext): void {}
info(_message: string, _context?: LogContext): void {} info(_message: string, _context?: LogContext): void {}

View File

@@ -2,7 +2,7 @@ import type { LoggerPort } from '@gridpilot/automation/application/ports/LoggerP
import type { LogContext } from '@gridpilot/automation/application/ports/LoggerContext'; import type { LogContext } from '@gridpilot/automation/application/ports/LoggerContext';
import type { LogLevel } from '@gridpilot/automation/application/ports/LoggerLogLevel'; import type { LogLevel } from '@gridpilot/automation/application/ports/LoggerLogLevel';
import { loadLoggingConfig, type LoggingEnvironmentConfig } from '../../config/LoggingConfig'; import { loadLoggingConfig, type LoggingEnvironmentConfig } from '../../config/LoggingConfig';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = { const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {
debug: 10, debug: 10,
@@ -21,7 +21,7 @@ const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {
* *
* This provides structured JSON logging to stdout with the same interface. * This provides structured JSON logging to stdout with the same interface.
*/ */
export class PinoLogAdapter implements LoggerPort, ILogger { export class PinoLogAdapter implements LoggerPort, Logger {
private readonly config: LoggingEnvironmentConfig; private readonly config: LoggingEnvironmentConfig;
private readonly baseContext: LogContext; private readonly baseContext: LogContext;
private readonly levelPriority: number; private readonly levelPriority: number;

View File

@@ -1,4 +1,4 @@
import type { AsyncUseCase, ILogger } from '@gridpilot/shared/application'; import type { AsyncUseCase, Logger } from '@gridpilot/shared/application';
import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository';
import type { FaceValidationPort } from '../ports/FaceValidationPort'; import type { FaceValidationPort } from '../ports/FaceValidationPort';
import type { AvatarGenerationPort } from '../ports/AvatarGenerationPort'; import type { AvatarGenerationPort } from '../ports/AvatarGenerationPort';
@@ -25,7 +25,7 @@ export class RequestAvatarGenerationUseCase
private readonly avatarRepository: IAvatarGenerationRepository, private readonly avatarRepository: IAvatarGenerationRepository,
private readonly faceValidation: FaceValidationPort, private readonly faceValidation: FaceValidationPort,
private readonly avatarGeneration: AvatarGenerationPort, private readonly avatarGeneration: AvatarGenerationPort,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: RequestAvatarGenerationCommand): Promise<RequestAvatarGenerationResult> { async execute(command: RequestAvatarGenerationCommand): Promise<RequestAvatarGenerationResult> {

View File

@@ -4,7 +4,7 @@
* Allows a user to select one of the generated avatars as their profile avatar. * Allows a user to select one of the generated avatars as their profile avatar.
*/ */
import type { AsyncUseCase, ILogger } from '@gridpilot/shared/application'; import type { AsyncUseCase, Logger } from '@gridpilot/shared/application';
import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository';
export interface SelectAvatarCommand { export interface SelectAvatarCommand {
@@ -23,7 +23,7 @@ export class SelectAvatarUseCase
implements AsyncUseCase<SelectAvatarCommand, SelectAvatarResult> { implements AsyncUseCase<SelectAvatarCommand, SelectAvatarResult> {
constructor( constructor(
private readonly avatarRepository: IAvatarGenerationRepository, private readonly avatarRepository: IAvatarGenerationRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: SelectAvatarCommand): Promise<SelectAvatarResult> { async execute(command: SelectAvatarCommand): Promise<SelectAvatarResult> {

View File

@@ -5,7 +5,7 @@
*/ */
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { Notification } from '../../domain/entities/Notification'; import type { Notification } from '../../domain/entities/Notification';
import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository';
@@ -17,7 +17,7 @@ export interface UnreadNotificationsResult {
export class GetUnreadNotificationsUseCase implements AsyncUseCase<string, UnreadNotificationsResult> { export class GetUnreadNotificationsUseCase implements AsyncUseCase<string, UnreadNotificationsResult> {
constructor( constructor(
private readonly notificationRepository: INotificationRepository, private readonly notificationRepository: INotificationRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(recipientId: string): Promise<UnreadNotificationsResult> { async execute(recipientId: string): Promise<UnreadNotificationsResult> {

View File

@@ -7,7 +7,7 @@
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository';
import { NotificationDomainError } from '../../domain/errors/NotificationDomainError'; import { NotificationDomainError } from '../../domain/errors/NotificationDomainError';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export interface MarkNotificationReadCommand { export interface MarkNotificationReadCommand {
notificationId: string; notificationId: string;
@@ -17,7 +17,7 @@ export interface MarkNotificationReadCommand {
export class MarkNotificationReadUseCase implements AsyncUseCase<MarkNotificationReadCommand, void> { export class MarkNotificationReadUseCase implements AsyncUseCase<MarkNotificationReadCommand, void> {
constructor( constructor(
private readonly notificationRepository: INotificationRepository, private readonly notificationRepository: INotificationRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: MarkNotificationReadCommand): Promise<void> { async execute(command: MarkNotificationReadCommand): Promise<void> {

View File

@@ -5,7 +5,7 @@
*/ */
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { Logger } from '@gridpilot/shared/logging/Logger';
import { NotificationPreference } from '../../domain/entities/NotificationPreference'; import { NotificationPreference } from '../../domain/entities/NotificationPreference';
import type { ChannelPreference, TypePreference } from '../../domain/entities/NotificationPreference'; import type { ChannelPreference, TypePreference } from '../../domain/entities/NotificationPreference';
import type { INotificationPreferenceRepository } from '../../domain/repositories/INotificationPreferenceRepository'; import type { INotificationPreferenceRepository } from '../../domain/repositories/INotificationPreferenceRepository';
@@ -18,7 +18,7 @@ import { NotificationDomainError } from '../../domain/errors/NotificationDomainE
export class GetNotificationPreferencesQuery implements AsyncUseCase<string, NotificationPreference> { export class GetNotificationPreferencesQuery implements AsyncUseCase<string, NotificationPreference> {
constructor( constructor(
private readonly preferenceRepository: INotificationPreferenceRepository, private readonly preferenceRepository: INotificationPreferenceRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(driverId: string): Promise<NotificationPreference> { async execute(driverId: string): Promise<NotificationPreference> {
@@ -46,7 +46,7 @@ export interface UpdateChannelPreferenceCommand {
export class UpdateChannelPreferenceUseCase implements AsyncUseCase<UpdateChannelPreferenceCommand, void> { export class UpdateChannelPreferenceUseCase implements AsyncUseCase<UpdateChannelPreferenceCommand, void> {
constructor( constructor(
private readonly preferenceRepository: INotificationPreferenceRepository, private readonly preferenceRepository: INotificationPreferenceRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: UpdateChannelPreferenceCommand): Promise<void> { async execute(command: UpdateChannelPreferenceCommand): Promise<void> {
@@ -75,7 +75,7 @@ export interface UpdateTypePreferenceCommand {
export class UpdateTypePreferenceUseCase implements AsyncUseCase<UpdateTypePreferenceCommand, void> { export class UpdateTypePreferenceUseCase implements AsyncUseCase<UpdateTypePreferenceCommand, void> {
constructor( constructor(
private readonly preferenceRepository: INotificationPreferenceRepository, private readonly preferenceRepository: INotificationPreferenceRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: UpdateTypePreferenceCommand): Promise<void> { async execute(command: UpdateTypePreferenceCommand): Promise<void> {
@@ -104,7 +104,7 @@ export interface UpdateQuietHoursCommand {
export class UpdateQuietHoursUseCase implements AsyncUseCase<UpdateQuietHoursCommand, void> { export class UpdateQuietHoursUseCase implements AsyncUseCase<UpdateQuietHoursCommand, void> {
constructor( constructor(
private readonly preferenceRepository: INotificationPreferenceRepository, private readonly preferenceRepository: INotificationPreferenceRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: UpdateQuietHoursCommand): Promise<void> { async execute(command: UpdateQuietHoursCommand): Promise<void> {

View File

@@ -7,7 +7,7 @@
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import { Notification } from '../../domain/entities/Notification'; import { Notification } from '../../domain/entities/Notification';
import type { NotificationData } from '../../domain/entities/Notification'; import type { NotificationData } from '../../domain/entities/Notification';
import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository';
@@ -49,7 +49,7 @@ export class SendNotificationUseCase implements AsyncUseCase<SendNotificationCom
private readonly notificationRepository: INotificationRepository, private readonly notificationRepository: INotificationRepository,
private readonly preferenceRepository: INotificationPreferenceRepository, private readonly preferenceRepository: INotificationPreferenceRepository,
private readonly gatewayRegistry: INotificationGatewayRegistry, private readonly gatewayRegistry: INotificationGatewayRegistry,
private readonly logger: ILogger, private readonly logger: Logger,
) { ) {
this.logger.debug('SendNotificationUseCase initialized.'); this.logger.debug('SendNotificationUseCase initialized.');
} }

View File

@@ -5,7 +5,7 @@
* This creates an active sponsorship and notifies the sponsor. * This creates an active sponsorship and notifies the sponsor.
*/ */
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { ISponsorshipRequestRepository } from '../../domain/repositories/ISponsorshipRequestRepository'; import type { ISponsorshipRequestRepository } from '../../domain/repositories/ISponsorshipRequestRepository';
import type { ISeasonSponsorshipRepository } from '../../domain/repositories/ISeasonSponsorshipRepository'; import type { ISeasonSponsorshipRepository } from '../../domain/repositories/ISeasonSponsorshipRepository';
import type { ISeasonRepository } from '../../domain/repositories/ISeasonRepository'; import type { ISeasonRepository } from '../../domain/repositories/ISeasonRepository';
@@ -32,7 +32,7 @@ export class AcceptSponsorshipRequestUseCase
private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository, private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository,
private readonly seasonSponsorshipRepo: ISeasonSponsorshipRepository, private readonly seasonSponsorshipRepo: ISeasonSponsorshipRepository,
private readonly seasonRepository: ISeasonRepository, private readonly seasonRepository: ISeasonRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(dto: AcceptSponsorshipRequestDTO): Promise<AcceptSponsorshipRequestResultDTO> { async execute(dto: AcceptSponsorshipRequestDTO): Promise<AcceptSponsorshipRequestResultDTO> {

View File

@@ -16,7 +16,7 @@ import {
EntityNotFoundError, EntityNotFoundError,
BusinessRuleViolationError, BusinessRuleViolationError,
} from '../errors/RacingApplicationError'; } from '../errors/RacingApplicationError';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export interface ApplyForSponsorshipDTO { export interface ApplyForSponsorshipDTO {
sponsorId: string; sponsorId: string;
@@ -41,7 +41,7 @@ export class ApplyForSponsorshipUseCase
private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository, private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository,
private readonly sponsorshipPricingRepo: ISponsorshipPricingRepository, private readonly sponsorshipPricingRepo: ISponsorshipPricingRepository,
private readonly sponsorRepo: ISponsorRepository, private readonly sponsorRepo: ISponsorRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(dto: ApplyForSponsorshipDTO): Promise<ApplyForSponsorshipResultDTO> { async execute(dto: ApplyForSponsorshipDTO): Promise<ApplyForSponsorshipResultDTO> {

View File

@@ -12,7 +12,7 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'
import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export interface ApplyPenaltyCommand { export interface ApplyPenaltyCommand {
raceId: string; raceId: string;
@@ -32,7 +32,7 @@ export class ApplyPenaltyUseCase
private readonly protestRepository: IProtestRepository, private readonly protestRepository: IProtestRepository,
private readonly raceRepository: IRaceRepository, private readonly raceRepository: IRaceRepository,
private readonly leagueMembershipRepository: ILeagueMembershipRepository, private readonly leagueMembershipRepository: ILeagueMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: ApplyPenaltyCommand): Promise<{ penaltyId: string }> { async execute(command: ApplyPenaltyCommand): Promise<{ penaltyId: string }> {

View File

@@ -1,4 +1,4 @@
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository';
import type { import type {
TeamMembership, TeamMembership,
@@ -13,7 +13,7 @@ export class ApproveTeamJoinRequestUseCase
implements AsyncUseCase<ApproveTeamJoinRequestCommandDTO, void> { implements AsyncUseCase<ApproveTeamJoinRequestCommandDTO, void> {
constructor( constructor(
private readonly membershipRepository: ITeamMembershipRepository, private readonly membershipRepository: ITeamMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: ApproveTeamJoinRequestCommandDTO): Promise<void> { async execute(command: ApproveTeamJoinRequestCommandDTO): Promise<void> {

View File

@@ -1,6 +1,6 @@
import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { IRaceRepository } from '../../domain/repositories/IRaceRepository';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use Case: CancelRaceUseCase * Use Case: CancelRaceUseCase
@@ -19,7 +19,7 @@ export class CancelRaceUseCase
implements AsyncUseCase<CancelRaceCommandDTO, void> { implements AsyncUseCase<CancelRaceCommandDTO, void> {
constructor( constructor(
private readonly raceRepository: IRaceRepository, private readonly raceRepository: IRaceRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: CancelRaceCommandDTO): Promise<void> { async execute(command: CancelRaceCommandDTO): Promise<void> {

View File

@@ -6,7 +6,7 @@ import type { DriverRatingProvider } from '../ports/DriverRatingProvider';
import { Result } from '../../domain/entities/Result'; import { Result } from '../../domain/entities/Result';
import { Standing } from '../../domain/entities/Standing'; import { Standing } from '../../domain/entities/Standing';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use Case: CompleteRaceUseCase * Use Case: CompleteRaceUseCase
@@ -31,7 +31,7 @@ export class CompleteRaceUseCase
private readonly resultRepository: IResultRepository, private readonly resultRepository: IResultRepository,
private readonly standingRepository: IStandingRepository, private readonly standingRepository: IStandingRepository,
private readonly driverRatingProvider: DriverRatingProvider, private readonly driverRatingProvider: DriverRatingProvider,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: CompleteRaceCommandDTO): Promise<void> { async execute(command: CompleteRaceCommandDTO): Promise<void> {

View File

@@ -8,7 +8,7 @@ import { Standing } from '../../domain/entities/Standing';
import { RaceResultGenerator } from '../utils/RaceResultGenerator'; import { RaceResultGenerator } from '../utils/RaceResultGenerator';
import { RatingUpdateService } from '@gridpilot/identity/domain/services/RatingUpdateService'; import { RatingUpdateService } from '@gridpilot/identity/domain/services/RatingUpdateService';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Enhanced CompleteRaceUseCase that includes rating updates * Enhanced CompleteRaceUseCase that includes rating updates
@@ -26,7 +26,7 @@ export class CompleteRaceUseCaseWithRatings
private readonly standingRepository: IStandingRepository, private readonly standingRepository: IStandingRepository,
private readonly driverRatingProvider: DriverRatingProvider, private readonly driverRatingProvider: DriverRatingProvider,
private readonly ratingUpdateService: RatingUpdateService, private readonly ratingUpdateService: RatingUpdateService,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: CompleteRaceCommandDTO): Promise<void> { async execute(command: CompleteRaceCommandDTO): Promise<void> {

View File

@@ -6,7 +6,7 @@ import type { ISeasonRepository } from '../../domain/repositories/ISeasonReposit
import type { ILeagueScoringConfigRepository } from '../../domain/repositories/ILeagueScoringConfigRepository'; import type { ILeagueScoringConfigRepository } from '../../domain/repositories/ILeagueScoringConfigRepository';
import type { LeagueScoringConfig } from '../../domain/entities/LeagueScoringConfig'; import type { LeagueScoringConfig } from '../../domain/entities/LeagueScoringConfig';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { import type {
LeagueScoringPresetProvider, LeagueScoringPresetProvider,
LeagueScoringPresetDTO, LeagueScoringPresetDTO,

View File

@@ -1,6 +1,6 @@
import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { IRaceRepository } from '../../domain/repositories/IRaceRepository';
import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { import type {
IAllRacesPagePresenter, IAllRacesPagePresenter,
AllRacesPageResultDTO, AllRacesPageResultDTO,
@@ -15,7 +15,7 @@ export class GetAllRacesPageDataUseCase
constructor( constructor(
private readonly raceRepository: IRaceRepository, private readonly raceRepository: IRaceRepository,
private readonly leagueRepository: ILeagueRepository, private readonly leagueRepository: ILeagueRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(_input: void, presenter: IAllRacesPagePresenter): Promise<void> { async execute(_input: void, presenter: IAllRacesPagePresenter): Promise<void> {

View File

@@ -6,7 +6,7 @@ import type {
} from '../presenters/IAllTeamsPresenter'; } from '../presenters/IAllTeamsPresenter';
import type { UseCase } from '@gridpilot/shared/application'; import type { UseCase } from '@gridpilot/shared/application';
import type { Team } from '../../domain/entities/Team'; import type { Team } from '../../domain/entities/Team';
import { ILogger } from '../../../shared/src/logging/ILogger'; import { Logger } from "@gridpilot/core/shared/application";
/** /**
* Use Case for retrieving all teams. * Use Case for retrieving all teams.
@@ -18,7 +18,7 @@ export class GetAllTeamsUseCase
constructor( constructor(
private readonly teamRepository: ITeamRepository, private readonly teamRepository: ITeamRepository,
private readonly teamMembershipRepository: ITeamMembershipRepository, private readonly teamMembershipRepository: ITeamMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(_input: void, presenter: IAllTeamsPresenter): Promise<void> { async execute(_input: void, presenter: IAllTeamsPresenter): Promise<void> {

View File

@@ -6,7 +6,7 @@ import type {
DriverTeamViewModel, DriverTeamViewModel,
} from '../presenters/IDriverTeamPresenter'; } from '../presenters/IDriverTeamPresenter';
import type { UseCase } from '@gridpilot/shared/application'; import type { UseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use Case for retrieving a driver's team. * Use Case for retrieving a driver's team.
@@ -18,7 +18,7 @@ export class GetDriverTeamUseCase
constructor( constructor(
private readonly teamRepository: ITeamRepository, private readonly teamRepository: ITeamRepository,
private readonly membershipRepository: ITeamMembershipRepository, private readonly membershipRepository: ITeamMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
// Kept for backward compatibility; callers must pass their own presenter. // Kept for backward compatibility; callers must pass their own presenter.
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
public readonly presenter: IDriverTeamPresenter, public readonly presenter: IDriverTeamPresenter,

View File

@@ -12,7 +12,7 @@ import type { SponsorableEntityType } from '../../domain/entities/SponsorshipReq
import type { SponsorshipTier } from '../../domain/entities/SeasonSponsorship'; import type { SponsorshipTier } from '../../domain/entities/SeasonSponsorship';
import type { IEntitySponsorshipPricingPresenter } from '../presenters/IEntitySponsorshipPricingPresenter'; import type { IEntitySponsorshipPricingPresenter } from '../presenters/IEntitySponsorshipPricingPresenter';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export interface GetEntitySponsorshipPricingDTO { export interface GetEntitySponsorshipPricingDTO {
entityType: SponsorableEntityType; entityType: SponsorableEntityType;
@@ -47,7 +47,7 @@ export class GetEntitySponsorshipPricingUseCase
private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository, private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository,
private readonly seasonSponsorshipRepo: ISeasonSponsorshipRepository, private readonly seasonSponsorshipRepo: ISeasonSponsorshipRepository,
private readonly presenter: IEntitySponsorshipPricingPresenter, private readonly presenter: IEntitySponsorshipPricingPresenter,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(dto: GetEntitySponsorshipPricingDTO): Promise<void> { async execute(dto: GetEntitySponsorshipPricingDTO): Promise<void> {

View File

@@ -9,7 +9,7 @@ import type { IResultRepository } from '../../domain/repositories/IRaceRepositor
import type { DriverRatingProvider } from '../ports/DriverRatingProvider'; import type { DriverRatingProvider } from '../ports/DriverRatingProvider';
import type { ILeagueStatsPresenter } from '../presenters/ILeagueStatsPresenter'; import type { ILeagueStatsPresenter } from '../presenters/ILeagueStatsPresenter';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import { ILogger } from '../../../shared/src/logging/ILogger'; import { Logger } from "@gridpilot/core/shared/application";
import { import {
AverageStrengthOfFieldCalculator, AverageStrengthOfFieldCalculator,
type StrengthOfFieldCalculator, type StrengthOfFieldCalculator,
@@ -32,7 +32,7 @@ export class GetLeagueStatsUseCase
private readonly resultRepository: IResultRepository, private readonly resultRepository: IResultRepository,
private readonly driverRatingProvider: DriverRatingProvider, private readonly driverRatingProvider: DriverRatingProvider,
public readonly presenter: ILeagueStatsPresenter, public readonly presenter: ILeagueStatsPresenter,
private readonly logger: ILogger, private readonly logger: Logger,
sofCalculator?: StrengthOfFieldCalculator, sofCalculator?: StrengthOfFieldCalculator,
) { ) {
this.sofCalculator = sofCalculator ?? new AverageStrengthOfFieldCalculator(); this.sofCalculator = sofCalculator ?? new AverageStrengthOfFieldCalculator();

View File

@@ -7,7 +7,7 @@ import type {
TeamJoinRequestsViewModel, TeamJoinRequestsViewModel,
} from '../presenters/ITeamJoinRequestsPresenter'; } from '../presenters/ITeamJoinRequestsPresenter';
import type { UseCase } from '@gridpilot/shared/application'; import type { UseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use Case for retrieving team join requests. * Use Case for retrieving team join requests.
@@ -20,7 +20,7 @@ export class GetTeamJoinRequestsUseCase
private readonly membershipRepository: ITeamMembershipRepository, private readonly membershipRepository: ITeamMembershipRepository,
private readonly driverRepository: IDriverRepository, private readonly driverRepository: IDriverRepository,
private readonly imageService: IImageServicePort, private readonly imageService: IImageServicePort,
private readonly logger: ILogger, private readonly logger: Logger,
// Kept for backward compatibility; callers must pass their own presenter. // Kept for backward compatibility; callers must pass their own presenter.
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
public readonly presenter: ITeamJoinRequestsPresenter, public readonly presenter: ITeamJoinRequestsPresenter,

View File

@@ -7,7 +7,7 @@ import type {
TeamMembersViewModel, TeamMembersViewModel,
} from '../presenters/ITeamMembersPresenter'; } from '../presenters/ITeamMembersPresenter';
import type { UseCase } from '@gridpilot/shared/application'; import type { UseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
/** /**
* Use Case for retrieving team members. * Use Case for retrieving team members.
@@ -20,7 +20,7 @@ export class GetTeamMembersUseCase
private readonly membershipRepository: ITeamMembershipRepository, private readonly membershipRepository: ITeamMembershipRepository,
private readonly driverRepository: IDriverRepository, private readonly driverRepository: IDriverRepository,
private readonly imageService: IImageServicePort, private readonly imageService: IImageServicePort,
private readonly logger: ILogger, private readonly logger: Logger,
// Kept for backward compatibility; callers must pass their own presenter. // Kept for backward compatibility; callers must pass their own presenter.
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
public readonly presenter: ITeamMembersPresenter, public readonly presenter: ITeamMembersPresenter,

View File

@@ -4,7 +4,7 @@ import type { IResultRepository } from '../../domain/repositories/IResultReposit
import type { IDriverRepository } from '../../domain/repositories/IDriverRepository'; import type { IDriverRepository } from '../../domain/repositories/IDriverRepository';
import type { IStandingRepository } from '../../domain/repositories/IStandingRepository'; import type { IStandingRepository } from '../../domain/repositories/IStandingRepository';
import { Result } from '../../domain/entities/Result'; import { Result } from '../../domain/entities/Result';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase, Logger } from '@gridpilot/shared/application';
import { import {
BusinessRuleViolationError, BusinessRuleViolationError,
EntityNotFoundError, EntityNotFoundError,
@@ -13,7 +13,6 @@ import type {
IImportRaceResultsPresenter, IImportRaceResultsPresenter,
ImportRaceResultsSummaryViewModel, ImportRaceResultsSummaryViewModel,
} from '../presenters/IImportRaceResultsPresenter'; } from '../presenters/IImportRaceResultsPresenter';
import type { ILogger } from '../../../shared/src/logging/ILogger';
export interface ImportRaceResultDTO { export interface ImportRaceResultDTO {
id: string; id: string;
@@ -40,7 +39,7 @@ export class ImportRaceResultsUseCase
private readonly driverRepository: IDriverRepository, private readonly driverRepository: IDriverRepository,
private readonly standingRepository: IStandingRepository, private readonly standingRepository: IStandingRepository,
public readonly presenter: IImportRaceResultsPresenter, public readonly presenter: IImportRaceResultsPresenter,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(params: ImportRaceResultsParams): Promise<void> { async execute(params: ImportRaceResultsParams): Promise<void> {

View File

@@ -1,4 +1,4 @@
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import type { import type {
ILeagueMembershipRepository, ILeagueMembershipRepository,
} from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository';
@@ -14,7 +14,7 @@ import { BusinessRuleViolationError } from '../errors/RacingApplicationError';
export class JoinLeagueUseCase implements AsyncUseCase<JoinLeagueCommandDTO, LeagueMembership> { export class JoinLeagueUseCase implements AsyncUseCase<JoinLeagueCommandDTO, LeagueMembership> {
constructor( constructor(
private readonly membershipRepository: ILeagueMembershipRepository, private readonly membershipRepository: ILeagueMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
/** /**

View File

@@ -7,7 +7,7 @@ import type {
} from '../../domain/types/TeamMembership'; } from '../../domain/types/TeamMembership';
import type { JoinTeamCommandDTO } from '../dto/TeamCommandAndQueryDTO'; import type { JoinTeamCommandDTO } from '../dto/TeamCommandAndQueryDTO';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
import { import {
BusinessRuleViolationError, BusinessRuleViolationError,
EntityNotFoundError, EntityNotFoundError,
@@ -17,7 +17,7 @@ export class JoinTeamUseCase implements AsyncUseCase<JoinTeamCommandDTO, void> {
constructor( constructor(
private readonly teamRepository: ITeamRepository, private readonly teamRepository: ITeamRepository,
private readonly membershipRepository: ITeamMembershipRepository, private readonly membershipRepository: ITeamMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: JoinTeamCommandDTO): Promise<void> { async execute(command: JoinTeamCommandDTO): Promise<void> {

View File

@@ -11,7 +11,7 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'
import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import type { ILogger } from '../../../shared/src/logging/ILogger'; import type { Logger } from '../../../shared/src/logging/Logger';
export interface QuickPenaltyCommand { export interface QuickPenaltyCommand {
raceId: string; raceId: string;
@@ -28,7 +28,7 @@ export class QuickPenaltyUseCase
private readonly penaltyRepository: IPenaltyRepository, private readonly penaltyRepository: IPenaltyRepository,
private readonly raceRepository: IRaceRepository, private readonly raceRepository: IRaceRepository,
private readonly leagueMembershipRepository: ILeagueMembershipRepository, private readonly leagueMembershipRepository: ILeagueMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
async execute(command: QuickPenaltyCommand): Promise<{ penaltyId: string }> { async execute(command: QuickPenaltyCommand): Promise<{ penaltyId: string }> {

View File

@@ -3,7 +3,7 @@ import type { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repos
import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration'; import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration';
import type { RegisterForRaceCommandDTO } from '../dto/RegisterForRaceCommandDTO'; import type { RegisterForRaceCommandDTO } from '../dto/RegisterForRaceCommandDTO';
import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { AsyncUseCase } from '@gridpilot/shared/application';
import { ILogger } from '@gridpilot/shared/logging/ILogger'; import { Logger } from '@gridpilot/shared/logging/Logger';
import { import {
BusinessRuleViolationError, BusinessRuleViolationError,
PermissionDeniedError, PermissionDeniedError,
@@ -15,7 +15,7 @@ export class RegisterForRaceUseCase
constructor( constructor(
private readonly registrationRepository: IRaceRegistrationRepository, private readonly registrationRepository: IRaceRegistrationRepository,
private readonly membershipRepository: ILeagueMembershipRepository, private readonly membershipRepository: ILeagueMembershipRepository,
private readonly logger: ILogger, private readonly logger: Logger,
) {} ) {}
/** /**

View File

@@ -1,4 +1,4 @@
export interface ILogger { export interface Logger {
debug(message: string, context?: Record<string, any>): void; debug(message: string, context?: Record<string, any>): void;
info(message: string, context?: Record<string, any>): void; info(message: string, context?: Record<string, any>): void;
warn(message: string, context?: Record<string, any>): void; warn(message: string, context?: Record<string, any>): void;

View File

@@ -1,3 +1,4 @@
export * from './UseCase'; export * from './UseCase';
export * from './AsyncUseCase'; export * from './AsyncUseCase';
export * from './Service'; export * from './Service';
export * from './Logger';

Some files were not shown because too many files have changed in this diff Show More