This commit is contained in:
2025-12-03 16:33:12 +01:00
parent a572e6edce
commit c0fdae3d3c
157 changed files with 7824 additions and 1042 deletions

View File

@@ -1,5 +1,5 @@
import { AuthenticationState } from '../../domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../domain/value-objects/BrowserAuthenticationState';
import { AuthenticationState } from '../../automation-domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../automation-domain/value-objects/BrowserAuthenticationState';
import { Result } from '../../shared/result/Result';
/**

View File

@@ -1,5 +1,5 @@
import { HostedSessionConfig } from '../../domain/entities/HostedSessionConfig';
import { StepId } from '../../domain/value-objects/StepId';
import { HostedSessionConfig } from '../../automation-domain/entities/HostedSessionConfig';
import { StepId } from '../../automation-domain/value-objects/StepId';
export interface ValidationResult {
isValid: boolean;

View File

@@ -1,7 +1,7 @@
import { Result } from '../../shared/result/Result';
import { CheckoutConfirmation } from '../../domain/value-objects/CheckoutConfirmation';
import { CheckoutPrice } from '../../domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../automation-domain/value-objects/CheckoutConfirmation';
import { CheckoutPrice } from '../../automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../automation-domain/value-objects/CheckoutState';
export interface CheckoutConfirmationRequest {
price: CheckoutPrice;

View File

@@ -1,6 +1,6 @@
import { Result } from '../../shared/result/Result';
import { CheckoutPrice } from '../../domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../domain/value-objects/CheckoutState';
import { CheckoutPrice } from '../../automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../automation-domain/value-objects/CheckoutState';
export interface CheckoutInfo {
price: CheckoutPrice | null;

View File

@@ -1,4 +1,4 @@
import { StepId } from '../../domain/value-objects/StepId';
import { StepId } from '../../automation-domain/value-objects/StepId';
import {
NavigationResult,
FormFillResult,

View File

@@ -1,5 +1,5 @@
import { AutomationSession } from '../../domain/entities/AutomationSession';
import { SessionStateValue } from '../../domain/value-objects/SessionState';
import { AutomationSession } from '../../automation-domain/entities/AutomationSession';
import { SessionStateValue } from '../../automation-domain/value-objects/SessionState';
export interface ISessionRepository {
save(session: AutomationSession): Promise<void>;

View File

@@ -1,6 +1,6 @@
import { IOverlaySyncPort, OverlayAction, ActionAck } from '../ports/IOverlaySyncPort'
import { IAutomationEventPublisher, AutomationEvent } from '../ports/IAutomationEventPublisher'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../infrastructure/adapters/IAutomationLifecycleEmitter'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../automation-infrastructure/adapters/IAutomationLifecycleEmitter'
import { ILogger } from '../ports/ILogger'
type ConstructorArgs = {

View File

@@ -1,7 +1,7 @@
import { AuthenticationState } from '../../domain/value-objects/AuthenticationState';
import { AuthenticationState } from '../../automation-domain/value-objects/AuthenticationState';
import { Result } from '../../shared/result/Result';
import type { IAuthenticationService } from '../ports/IAuthenticationService';
import { SessionLifetime } from '../../domain/value-objects/SessionLifetime';
import { SessionLifetime } from '../../automation-domain/value-objects/SessionLifetime';
/**
* Port for optional server-side session validation.

View File

@@ -1,5 +1,5 @@
import { Result } from '../../shared/result/Result';
import { RaceCreationResult } from '../../domain/value-objects/RaceCreationResult';
import { RaceCreationResult } from '../../automation-domain/value-objects/RaceCreationResult';
import type { ICheckoutService } from '../ports/ICheckoutService';
export class CompleteRaceCreationUseCase {

View File

@@ -1,7 +1,7 @@
import { Result } from '../../shared/result/Result';
import { ICheckoutService } from '../ports/ICheckoutService';
import { ICheckoutConfirmationPort } from '../ports/ICheckoutConfirmationPort';
import { CheckoutStateEnum } from '../../domain/value-objects/CheckoutState';
import { CheckoutStateEnum } from '../../automation-domain/value-objects/CheckoutState';
interface SessionMetadata {
sessionName: string;

View File

@@ -1,5 +1,5 @@
import { AutomationSession } from '../../domain/entities/AutomationSession';
import { HostedSessionConfig } from '../../domain/entities/HostedSessionConfig';
import { AutomationSession } from '../../automation-domain/entities/AutomationSession';
import { HostedSessionConfig } from '../../automation-domain/entities/HostedSessionConfig';
import { IAutomationEngine } from '../ports/IAutomationEngine';
import type { IBrowserAutomation } from '../ports/IScreenAutomation';
import { ISessionRepository } from '../ports/ISessionRepository';

View File

@@ -1,6 +1,6 @@
import { IAuthenticationService } from '../ports/IAuthenticationService';
import { Result } from '../../shared/result/Result';
import { BrowserAuthenticationState } from '../../domain/value-objects/BrowserAuthenticationState';
import { BrowserAuthenticationState } from '../../automation-domain/value-objects/BrowserAuthenticationState';
/**
* Use case for verifying browser shows authenticated page state.

View File

@@ -1,4 +1,4 @@
import { AutomationEvent } from '../../application/ports/IAutomationEventPublisher'
import { AutomationEvent } from '../../automation-application/ports/IAutomationEventPublisher'
export type LifecycleCallback = (event: AutomationEvent) => Promise<void> | void

View File

@@ -1,7 +1,7 @@
import { Result } from '../../../shared/result/Result';
import { CheckoutPrice } from '../../../domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../domain/value-objects/CheckoutState';
import { CheckoutInfo } from '../../../application/ports/ICheckoutService';
import { CheckoutPrice } from '../../../automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../automation-domain/value-objects/CheckoutState';
import { CheckoutInfo } from '../../../automation-application/ports/ICheckoutService';
import { IRACING_SELECTORS } from './dom/IRacingSelectors';
interface Page {

View File

@@ -1,5 +1,5 @@
import { Page } from 'playwright';
import { ILogger } from '../../../../application/ports/ILogger';
import { ILogger } from '../../../../automation-application/ports/ILogger';
export class AuthenticationGuard {
constructor(

View File

@@ -1,5 +1,5 @@
import type { Page } from 'playwright';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import type { IPlaywrightAuthFlow } from './PlaywrightAuthFlow';
import { IRACING_URLS, IRACING_SELECTORS, IRACING_TIMEOUTS } from '../dom/IRacingSelectors';
import { AuthenticationGuard } from './AuthenticationGuard';

View File

@@ -1,10 +1,10 @@
import * as fs from 'fs';
import type { BrowserContext, Page } from 'playwright';
import type { IAuthenticationService } from '../../../../application/ports/IAuthenticationService';
import type { ILogger } from '../../../../application/ports/ILogger';
import { AuthenticationState } from '../../../../domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../domain/value-objects/BrowserAuthenticationState';
import type { IAuthenticationService } from '../../../../automation-application/ports/IAuthenticationService';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import { AuthenticationState } from '../../../../automation-domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../automation-domain/value-objects/BrowserAuthenticationState';
import { Result } from '../../../../shared/result/Result';
import { PlaywrightBrowserSession } from '../core/PlaywrightBrowserSession';
import { SessionCookieStore } from './SessionCookieStore';

View File

@@ -1,9 +1,9 @@
import * as fs from 'fs/promises';
import * as path from 'path';
import { AuthenticationState } from '../../../../domain/value-objects/AuthenticationState';
import { CookieConfiguration } from '../../../../domain/value-objects/CookieConfiguration';
import { AuthenticationState } from '../../../../automation-domain/value-objects/AuthenticationState';
import { CookieConfiguration } from '../../../../automation-domain/value-objects/CookieConfiguration';
import { Result } from '../../../../shared/result/Result';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
interface Cookie {
name: string;

View File

@@ -1,13 +1,13 @@
import type { Browser, Page, BrowserContext } from 'playwright';
import * as fs from 'fs';
import * as path from 'path';
import { StepId } from '../../../../domain/value-objects/StepId';
import { AuthenticationState } from '../../../../domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../domain/value-objects/BrowserAuthenticationState';
import { CheckoutPrice } from '../../../../domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../../domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../domain/value-objects/CheckoutConfirmation';
import type { IBrowserAutomation } from '../../../../application/ports/IScreenAutomation';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import { AuthenticationState } from '../../../../automation-domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../automation-domain/value-objects/BrowserAuthenticationState';
import { CheckoutPrice } from '../../../../automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../../automation-domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../automation-domain/value-objects/CheckoutConfirmation';
import type { IBrowserAutomation } from '../../../../automation-application/ports/IScreenAutomation';
import type {
NavigationResult,
FormFillResult,
@@ -15,9 +15,9 @@ import type {
WaitResult,
ModalResult,
AutomationResult,
} from '../../../../application/ports/AutomationResults';
import type { IAuthenticationService } from '../../../../application/ports/IAuthenticationService';
import type { ILogger } from '../../../../application/ports/ILogger';
} from '../../../../automation-application/ports/AutomationResults';
import type { IAuthenticationService } from '../../../../automation-application/ports/IAuthenticationService';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import { Result } from '../../../../shared/result/Result';
import { IRACING_SELECTORS, IRACING_URLS, IRACING_TIMEOUTS, ALL_BLOCKED_SELECTORS, BLOCKED_KEYWORDS } from '../dom/IRacingSelectors';
import { SessionCookieStore } from '../auth/SessionCookieStore';
@@ -25,7 +25,7 @@ import { PlaywrightBrowserSession } from './PlaywrightBrowserSession';
import { getFixtureForStep } from '../engine/FixtureServer';
import { BrowserModeConfigLoader, BrowserMode } from '../../../config/BrowserModeConfig';
import { getAutomationMode } from '../../../config/AutomationConfig';
import { PageStateValidator, PageStateValidation, PageStateValidationResult } from '../../../../domain/services/PageStateValidator';
import { PageStateValidator, PageStateValidation, PageStateValidationResult } from '../../../../automation-domain/services/PageStateValidator';
import { IRacingDomNavigator } from '../dom/IRacingDomNavigator';
import { SafeClickService } from '../dom/SafeClickService';
import { IRacingDomInteractor } from '../dom/IRacingDomInteractor';

View File

@@ -4,7 +4,7 @@ import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import * as fs from 'fs';
import * as path from 'path';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import { BrowserModeConfigLoader, BrowserMode } from '../../../config/BrowserModeConfig';
import { getAutomationMode } from '../../../config/AutomationConfig';
import type { PlaywrightConfig } from './PlaywrightAutomationAdapter';

View File

@@ -1,15 +1,15 @@
import type { Page } from 'playwright';
import { StepId } from '../../../../domain/value-objects/StepId';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import type {
AutomationResult,
ClickResult,
FormFillResult,
} from '../../../../application/ports/AutomationResults';
import type { IAuthenticationService } from '../../../../application/ports/IAuthenticationService';
import type { ILogger } from '../../../../application/ports/ILogger';
import { CheckoutPrice } from '../../../../domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../../domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../domain/value-objects/CheckoutConfirmation';
} from '../../../../automation-application/ports/AutomationResults';
import type { IAuthenticationService } from '../../../../automation-application/ports/IAuthenticationService';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import { CheckoutPrice } from '../../../../automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '../../../../automation-domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../automation-domain/value-objects/CheckoutConfirmation';
import type { PlaywrightConfig } from './PlaywrightAutomationAdapter';
import { PlaywrightBrowserSession } from './PlaywrightBrowserSession';
import { IRacingDomNavigator } from '../dom/IRacingDomNavigator';
@@ -19,7 +19,7 @@ import { getFixtureForStep } from '../engine/FixtureServer';
import type {
PageStateValidation,
PageStateValidationResult,
} from '../../../../domain/services/PageStateValidator';
} from '../../../../automation-domain/services/PageStateValidator';
import type { Result } from '../../../../shared/result/Result';
interface WizardStepOrchestratorDeps {

View File

@@ -1,11 +1,11 @@
import type { Page } from 'playwright';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import type {
FormFillResult,
ClickResult,
ModalResult,
} from '../../../../application/ports/AutomationResults';
import { StepId } from '../../../../domain/value-objects/StepId';
} from '../../../../automation-application/ports/AutomationResults';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import type { PlaywrightConfig } from '../core/PlaywrightAutomationAdapter';
import { PlaywrightBrowserSession } from '../core/PlaywrightBrowserSession';
import { IRACING_SELECTORS, IRACING_TIMEOUTS } from './IRacingSelectors';

View File

@@ -1,6 +1,6 @@
import type { Page } from 'playwright';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { NavigationResult, WaitResult } from '../../../../application/ports/AutomationResults';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import type { NavigationResult, WaitResult } from '../../../../automation-application/ports/AutomationResults';
import type { PlaywrightConfig } from '../core/PlaywrightAutomationAdapter';
import { PlaywrightBrowserSession } from '../core/PlaywrightBrowserSession';
import { IRACING_SELECTORS, IRACING_TIMEOUTS, IRACING_URLS } from './IRacingSelectors';

View File

@@ -1,5 +1,5 @@
import type { Page } from 'playwright';
import type { ILogger } from '../../../../application/ports/ILogger';
import type { ILogger } from '../../../../automation-application/ports/ILogger';
import { IRACING_SELECTORS, BLOCKED_KEYWORDS } from './IRacingSelectors';
import type { PlaywrightConfig } from '../core/PlaywrightAutomationAdapter';
import { PlaywrightBrowserSession } from '../core/PlaywrightBrowserSession';

View File

@@ -1,9 +1,9 @@
import { IAutomationEngine, ValidationResult } from '../../../../application/ports/IAutomationEngine';
import { HostedSessionConfig } from '../../../../domain/entities/HostedSessionConfig';
import { StepId } from '../../../../domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../application/ports/ISessionRepository';
import { StepTransitionValidator } from '../../../../domain/services/StepTransitionValidator';
import { IAutomationEngine, ValidationResult } from '../../../../automation-application/ports/IAutomationEngine';
import { HostedSessionConfig } from '../../../../automation-domain/entities/HostedSessionConfig';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../automation-application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../automation-application/ports/ISessionRepository';
import { StepTransitionValidator } from '../../../../automation-domain/services/StepTransitionValidator';
/**
* Real Automation Engine Adapter.

View File

@@ -1,9 +1,9 @@
import { IAutomationEngine, ValidationResult } from '../../../../application/ports/IAutomationEngine';
import { HostedSessionConfig } from '../../../../domain/entities/HostedSessionConfig';
import { StepId } from '../../../../domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../application/ports/ISessionRepository';
import { StepTransitionValidator } from '../../../../domain/services/StepTransitionValidator';
import { IAutomationEngine, ValidationResult } from '../../../../automation-application/ports/IAutomationEngine';
import { HostedSessionConfig } from '../../../../automation-domain/entities/HostedSessionConfig';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../automation-application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../automation-application/ports/ISessionRepository';
import { StepTransitionValidator } from '../../../../automation-domain/services/StepTransitionValidator';
export class MockAutomationEngineAdapter implements IAutomationEngine {
private isRunning = false;

View File

@@ -1,5 +1,5 @@
import { StepId } from '../../../../domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../application/ports/IScreenAutomation';
import { StepId } from '../../../../automation-domain/value-objects/StepId';
import type { IBrowserAutomation } from '../../../../automation-application/ports/IScreenAutomation';
import {
NavigationResult,
FormFillResult,
@@ -7,7 +7,7 @@ import {
WaitResult,
ModalResult,
AutomationResult,
} from '../../../../application/ports/AutomationResults';
} from '../../../../automation-application/ports/AutomationResults';
interface MockConfig {
simulateFailures?: boolean;

View File

@@ -6,8 +6,8 @@
import type { BrowserWindow } from 'electron';
import { ipcMain } from 'electron';
import { Result } from '../../../shared/result/Result';
import type { ICheckoutConfirmationPort, CheckoutConfirmationRequest } from '../../../application/ports/ICheckoutConfirmationPort';
import { CheckoutConfirmation } from '../../../domain/value-objects/CheckoutConfirmation';
import type { ICheckoutConfirmationPort, CheckoutConfirmationRequest } from '../../../automation-application/ports/ICheckoutConfirmationPort';
import { CheckoutConfirmation } from '../../../automation-domain/value-objects/CheckoutConfirmation';
export class ElectronCheckoutConfirmationAdapter implements ICheckoutConfirmationPort {
private mainWindow: BrowserWindow;

View File

@@ -1,4 +1,4 @@
import type { ILogger, LogContext } from '../../../application/ports/ILogger';
import type { ILogger, LogContext } from '../../../automation-application/ports/ILogger';
export class NoOpLogAdapter implements ILogger {
debug(_message: string, _context?: LogContext): void {}

View File

@@ -1,4 +1,4 @@
import type { ILogger, LogContext, LogLevel } from '../../../application/ports/ILogger';
import type { ILogger, LogContext, LogLevel } from '../../../automation-application/ports/ILogger';
import { loadLoggingConfig, type LoggingEnvironmentConfig } from '../../config/LoggingConfig';
const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {

View File

@@ -1,4 +1,4 @@
import type { LogLevel } from '../../application/ports/ILogger';
import type { LogLevel } from '../../automation-application/ports/ILogger';
export type LogEnvironment = 'development' | 'production' | 'test';

View File

@@ -1,6 +1,6 @@
import { AutomationSession } from '../../domain/entities/AutomationSession';
import { SessionStateValue } from '../../domain/value-objects/SessionState';
import { ISessionRepository } from '../../application/ports/ISessionRepository';
import { AutomationSession } from '../../automation-domain/entities/AutomationSession';
import { SessionStateValue } from '../../automation-domain/value-objects/SessionState';
import { ISessionRepository } from '../../automation-application/ports/ISessionRepository';
export class InMemorySessionRepository implements ISessionRepository {
private sessions: Map<string, AutomationSession> = new Map();