diff --git a/src/main/models/auth.types.ts b/src/main/models/auth.types.ts new file mode 100644 index 0000000..a75e5d5 --- /dev/null +++ b/src/main/models/auth.types.ts @@ -0,0 +1,10 @@ +export interface AuthResult { + success: boolean; + message?: string; +} + +export interface SessionInfo { + username: string; + isLoggedIn: boolean; + loginTime: Date; +} diff --git a/src/main/services/auth.service.ts b/src/main/services/auth.service.ts new file mode 100644 index 0000000..6a02b54 --- /dev/null +++ b/src/main/services/auth.service.ts @@ -0,0 +1,76 @@ +import { PlaywrightService } from './playwright.service'; +import { Credentials, LoginResult } from '../models/playwright.types'; +import { AuthResult, SessionInfo } from '../models/auth.types'; +import { LoggerService } from './logger.service'; + +export class AuthService { + private currentSession?: LoginResult; + private sessionInfo?: SessionInfo; + + constructor(private playwrightService: PlaywrightService) {} + + async login(credentials: Credentials): Promise { + try { + LoggerService.info(`Logging in user: ${credentials.username}`); + + const session = await this.playwrightService.login(credentials); + this.currentSession = session; + this.sessionInfo = { + username: credentials.username, + isLoggedIn: true, + loginTime: new Date(), + }; + + LoggerService.info('Login successful'); + return { success: true, message: 'Login successful' }; + } catch (error) { + LoggerService.error('Login failed', error); + + // Ensure cleanup on failed login + await this.playwrightService.closeBrowser().catch(cleanupError => { + LoggerService.error('Failed to cleanup after failed login', cleanupError); + }); + + this.currentSession = undefined; + this.sessionInfo = undefined; + + return { + success: false, + message: error instanceof Error ? error.message : 'Unknown error', + }; + } + } + + async logout(): Promise { + if (!this.currentSession) { + return; // Already logged out + } + + try { + LoggerService.info('Logging out...'); + await this.playwrightService.closeBrowser(); + LoggerService.info('Logout successful'); + } catch (error) { + LoggerService.error('Logout failed', error); + throw new Error(`Logout failed: ${error instanceof Error ? error.message : 'Unknown error'}`); + } finally { + // Always clear state + this.currentSession = undefined; + this.sessionInfo = undefined; + } + } + + getSessionInfo(): SessionInfo | undefined { + return this.sessionInfo; + } + + isLoggedIn(): boolean { + return this.sessionInfo?.isLoggedIn ?? false; + } + + async destroy(): Promise { + await this.logout().catch(err => + LoggerService.error('Failed to logout during destroy', err) + ); + } +}