Files
project_vollidioten_website/services/AuthService.ts
Lars Behrends 065a6e657d feat: add world map functionality and admin map management
- Added world map page with interactive marker display
- Implemented admin map management for marker CRUD operations
- Added map layers and markers seed data to database
- Integrated new routes for map functionality
- Updated database configuration for production environment
- Added documentation page route
- Enhanced package.json with required dependencies for map features
2026-01-02 05:08:07 +01:00

60 lines
1.5 KiB
TypeScript

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<void> {
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();