import { DiscordUser } from '../types'; // Points to the production backend via Traefik const API_URL = 'https://vollidioten.ceraticsoft.de'; class AuthService { private user: DiscordUser | null = null; private listeners: ((user: DiscordUser | null) => void)[] = []; constructor() { this.checkSession(); } getUser(): DiscordUser | null { return this.user; } // Check if session cookie exists and is valid async checkSession() { try { const res = await fetch(`${API_URL}/auth/me`, { credentials: 'include' }); if (res.ok) { const data = await res.json(); // Ensure isAdmin property exists this.user = { ...data, isAdmin: data.isAdmin || false }; this.notifyListeners(); } } catch (e) { console.log("Auth check failed (Backend might be offline)", e); } } // Redirects to Discord OAuth async login(rememberMe: boolean = false): Promise { const rememberParam = rememberMe ? '?remember_me=true' : ''; window.location.href = `${API_URL}/auth/discord${rememberParam}`; } logout() { window.location.href = `${API_URL}/auth/logout`; } subscribe(listener: (user: DiscordUser | null) => void) { this.listeners.push(listener); listener(this.user); return () => { this.listeners = this.listeners.filter(l => l !== listener); }; } private notifyListeners() { this.listeners.forEach(l => l(this.user)); } } export const authService = new AuthService();