website refactor

This commit is contained in:
2026-01-17 18:28:10 +01:00
parent 6d57f8b1ce
commit 64d9e7fd16
44 changed files with 1729 additions and 415 deletions

View File

@@ -16,6 +16,8 @@ import { WalletsApiClient } from './wallets/WalletsApiClient';
import { ErrorReporter } from '../interfaces/ErrorReporter';
import { Logger } from '../interfaces/Logger';
import { ConsoleLogger } from '../infrastructure/logging/ConsoleLogger';
export class ApiClient {
public readonly admin: AdminApiClient;
public readonly analytics: AnalyticsApiClient;
@@ -35,7 +37,7 @@ export class ApiClient {
constructor(baseUrl: string) {
// Default implementations for logger and error reporter if needed
const logger: Logger = console;
const logger: Logger = new ConsoleLogger();
const errorReporter: ErrorReporter = { report: (error) => console.error(error) };
this.admin = new AdminApiClient(baseUrl, errorReporter, logger);

View File

@@ -227,8 +227,13 @@ export function handleAuthFlow(
case AuthActionType.SHOW_PERMISSION_ERROR:
// Redirect to user's home page instead of login (they're already logged in)
const isAdmin = session?.role === 'admin' ||
session?.role === 'league-admin' ||
session?.role === 'system-owner' ||
session?.role === 'super-admin';
const homeUrl = session?.role === 'sponsor' ? routes.sponsor.dashboard :
session?.role === 'admin' ? routes.admin.root :
isAdmin ? routes.admin.root :
routes.protected.dashboard;
logger.info('[handleAuthFlow] Returning SHOW_PERMISSION_ERROR, redirecting to home', { homeUrl, userRole: session?.role });
return { shouldRedirect: true, redirectUrl: homeUrl };

View File

@@ -36,6 +36,7 @@ export class ConsoleLogger implements Logger {
const color = this.COLORS[level];
const emoji = this.EMOJIS[level];
const prefix = this.PREFIXES[level];
const timestamp = new Date().toISOString();
// Edge runtime doesn't support console.groupCollapsed/groupEnd
// Fallback to simple logging for compatibility
@@ -44,13 +45,13 @@ export class ConsoleLogger implements Logger {
if (supportsGrouping) {
// Safe to call - we've verified both functions exist
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(console as any).groupCollapsed(`%c${emoji} [${source.toUpperCase()}] ${prefix}: ${message}`, `color: ${color}; font-weight: bold;`);
(console as any).groupCollapsed(`%c${emoji} [${timestamp}] [${source.toUpperCase()}] ${prefix}: ${message}`, `color: ${color}; font-weight: bold;`);
} else {
// Simple format for edge runtime
console.log(`${emoji} [${source.toUpperCase()}] ${prefix}: ${message}`);
console.log(`${emoji} [${timestamp}] [${source.toUpperCase()}] ${prefix}: ${message}`);
}
console.log(`%cTimestamp:`, 'color: #666; font-weight: bold;', new Date().toISOString());
console.log(`%cTimestamp:`, 'color: #666; font-weight: bold;', timestamp);
console.log(`%cSource:`, 'color: #666; font-weight: bold;', source);
if (context) {

View File

@@ -366,7 +366,7 @@ export function buildPath(
let route: any = routes;
for (const part of parts) {
route = route[part];
route = (route as Record<string, any>)[part];
if (!route) {
throw new Error(`Unknown route: ${routeName}`);
}

View File

@@ -132,12 +132,12 @@ export class LeagueService implements Service {
}
}
async getAllLeagues(): Promise<any> {
async getAllLeagues(): Promise<Result<AllLeaguesWithCapacityAndScoringDTO, DomainError>> {
try {
const dto = await this.apiClient.getAllWithCapacityAndScoring();
return (dto as any).value || dto;
return Result.ok(dto);
} catch (error: unknown) {
throw error;
return Result.err({ type: 'serverError', message: (error as Error).message || 'Failed to fetch leagues' });
}
}