feat: Add DatabaseManager and LinkPlayer components, implement authentication and linking logic

- Created DatabaseManager component for managing database access via phpMyAdmin.
- Developed LinkPlayer component to link Discord accounts with game characters, including user authentication and error handling.
- Added mock data files for players, organizations, and projects to handle backend unavailability.
- Implemented AuthService for managing user authentication and session checks.
- Created DatabaseService to fetch and manage player, organization, and project data with fallback to mock data.
- Added HTML page for handling authentication unavailability.
- Developed a test script for validating Docker setup and required files.
This commit is contained in:
Lars Behrends
2025-12-28 16:46:04 +01:00
parent 6abdffe22a
commit d3d7ec46e6
40 changed files with 5967 additions and 102 deletions

54
services/AuthService.ts Normal file
View File

@@ -0,0 +1,54 @@
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();
this.user = data;
this.notifyListeners();
}
} catch (e) {
console.log("Auth check failed (Backend might be offline)", e);
}
}
// Redirects to Discord OAuth
async login(): Promise<void> {
window.location.href = `${API_URL}/auth/discord`;
}
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();