Problem: Frontend JS bundle used credentials:'same-origin' which dropped cookies on cross-domain requests. Login worked (200) but the subsequent /auth/me check returned 401, leaving the user stuck on the login screen. Fix: - AuthController now sets a dtp_jwt HttpOnly cookie on login/refresh - Cookie uses Domain=.fahrschultermin.de (shared between frontend and api subdomain), Secure, SameSite=Lax, Max-Age=8h - JwtMiddleware reads JWT from Authorization header OR cookie - Added AuthController::me() endpoint (was missing, caused 500) - Logout endpoint clears the cookie - Frontend index.php patches fetch() to use credentials:'include' for all /api/v1/* calls
146 lines
4.8 KiB
SQL
Executable File
146 lines
4.8 KiB
SQL
Executable File
CREATE TABLE IF NOT EXISTS tenants (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
timezone TEXT NOT NULL DEFAULT 'Europe/Berlin',
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NULL,
|
|
role TEXT NOT NULL,
|
|
email TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
first_name TEXT NOT NULL,
|
|
last_name TEXT NOT NULL,
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS instructors (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
first_name TEXT NOT NULL,
|
|
last_name TEXT NOT NULL,
|
|
color TEXT NOT NULL,
|
|
notes TEXT DEFAULT '',
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS lesson_types (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
name TEXT NOT NULL,
|
|
color TEXT NOT NULL,
|
|
default_duration INTEGER NOT NULL,
|
|
category TEXT NOT NULL,
|
|
requirement_key TEXT DEFAULT NULL,
|
|
is_billable INTEGER NOT NULL DEFAULT 0,
|
|
is_counted INTEGER NOT NULL DEFAULT 0,
|
|
is_rest_relevant INTEGER NOT NULL DEFAULT 0,
|
|
fixed_duration INTEGER NOT NULL DEFAULT 0,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS license_class_templates (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
code TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
is_combination INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
UNIQUE (tenant_id, code),
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS license_template_requirements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
template_id INTEGER NOT NULL,
|
|
requirement_key TEXT NOT NULL,
|
|
label TEXT NOT NULL,
|
|
required_units INTEGER NOT NULL,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
FOREIGN KEY (template_id) REFERENCES license_class_templates (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS students (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
template_id INTEGER NOT NULL,
|
|
first_name TEXT NOT NULL,
|
|
last_name TEXT NOT NULL,
|
|
phone TEXT DEFAULT '',
|
|
notes TEXT DEFAULT '',
|
|
status TEXT NOT NULL DEFAULT 'active',
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE,
|
|
FOREIGN KEY (template_id) REFERENCES license_class_templates (id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS student_requirement_snapshots (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
student_id INTEGER NOT NULL,
|
|
requirement_key TEXT NOT NULL,
|
|
label TEXT NOT NULL,
|
|
required_units INTEGER NOT NULL,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
FOREIGN KEY (student_id) REFERENCES students (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS appointments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
student_id INTEGER DEFAULT NULL,
|
|
instructor_id INTEGER NOT NULL,
|
|
lesson_type_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
category TEXT NOT NULL,
|
|
start_at TEXT NOT NULL,
|
|
end_at TEXT NOT NULL,
|
|
units INTEGER NOT NULL DEFAULT 1,
|
|
status TEXT NOT NULL DEFAULT 'planned',
|
|
notes TEXT DEFAULT '',
|
|
warning_acknowledged INTEGER NOT NULL DEFAULT 0,
|
|
created_by INTEGER NOT NULL,
|
|
updated_by INTEGER NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE,
|
|
FOREIGN KEY (student_id) REFERENCES students (id) ON DELETE SET NULL,
|
|
FOREIGN KEY (instructor_id) REFERENCES instructors (id),
|
|
FOREIGN KEY (lesson_type_id) REFERENCES lesson_types (id),
|
|
FOREIGN KEY (created_by) REFERENCES users (id),
|
|
FOREIGN KEY (updated_by) REFERENCES users (id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS appointment_units (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
appointment_id INTEGER NOT NULL,
|
|
requirement_key TEXT DEFAULT NULL,
|
|
label TEXT DEFAULT NULL,
|
|
units_counted INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
FOREIGN KEY (appointment_id) REFERENCES appointments (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL,
|
|
key_name TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
UNIQUE (tenant_id, key_name),
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants (id) ON DELETE CASCADE
|
|
);
|