M3 Registrierung und Login-Grundlage ergänzen

- SaaS-Auth-Helper und PDO-Datenbankzugriff einführen
- Registrierung, Login, Logout und Kontoansicht ergänzen
- Auth-Migration, Flow-Check und Smoke-Abdeckung aktualisieren
This commit is contained in:
2026-07-12 20:17:42 +02:00
parent eef0338e31
commit 5baf6542ce
15 changed files with 909 additions and 24 deletions
@@ -34,9 +34,6 @@ CREATE TABLE IF NOT EXISTS users (
display_name VARCHAR(255) NOT NULL,
password_hash VARCHAR(255) NULL,
status VARCHAR(30) NOT NULL DEFAULT 'active',
email_verified_at DATETIME NULL,
mfa_enabled TINYINT(1) NOT NULL DEFAULT 0,
disabled_at DATETIME NULL,
last_login_at DATETIME NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
@@ -79,9 +76,7 @@ CREATE TABLE IF NOT EXISTS participants (
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uq_participants_tenant_legacy (tenant_id, legacy_mitarbeiter_id),
UNIQUE KEY uq_participants_tenant_email_norm (tenant_id, email_norm),
UNIQUE KEY uq_participants_tenant_user (tenant_id, user_id),
KEY idx_participants_tenant_active_name (tenant_id, active, display_name),
KEY idx_participants_tenant_paypal_name (tenant_id, paypal_name),
KEY idx_participants_user (user_id),
CONSTRAINT fk_participants_tenant
FOREIGN KEY (tenant_id) REFERENCES tenants(id)
@@ -0,0 +1,86 @@
SET @schema_name = DATABASE();
SET @sql = (
SELECT IF(
EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'email_verified_at'
),
'SELECT 1',
'ALTER TABLE users ADD COLUMN email_verified_at DATETIME NULL AFTER status'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = (
SELECT IF(
EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'mfa_enabled'
),
'SELECT 1',
'ALTER TABLE users ADD COLUMN mfa_enabled TINYINT(1) NOT NULL DEFAULT 0 AFTER email_verified_at'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = (
SELECT IF(
EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'disabled_at'
),
'SELECT 1',
'ALTER TABLE users ADD COLUMN disabled_at DATETIME NULL AFTER mfa_enabled'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = (
SELECT IF(
EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'participants'
AND INDEX_NAME = 'uq_participants_tenant_user'
),
'SELECT 1',
'ALTER TABLE participants ADD UNIQUE KEY uq_participants_tenant_user (tenant_id, user_id)'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = (
SELECT IF(
EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'participants'
AND INDEX_NAME = 'idx_participants_tenant_paypal_name'
),
'SELECT 1',
'ALTER TABLE participants ADD KEY idx_participants_tenant_paypal_name (tenant_id, paypal_name)'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;