""" Application Factory der OIDC Flask Showcase App. Initialisiert Flask, SQLAlchemy und Authlib. Registriert alle Blueprints und stellt den CLI-Befehl ``flask seed-db`` bereit. :author: Björn Runden :date: 2026-06-17 :version: 0.1 """ import logging import click from flask import Flask from .config import Config from .database import db from .auth import oauth, init_oauth logging.basicConfig(level=logging.INFO) def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) db.init_app(app) init_oauth(app) from .routes import main app.register_blueprint(main) _register_cli(app) return app def _register_cli(app): @app.cli.command("seed-db") def seed_db(): """Initialisiert das Schema und befüllt die DB mit Testdaten.""" from datetime import datetime from .models import ( User, Client, Project, ProjectMitarbeiterMapping, ProjectKundenMapping, Note, ) db.drop_all() db.create_all() # ------------------------------------------------------------------ # Zitadel-User-IDs (sub-Werte) eintragen – Anleitung: ZITADEL-SETUP.md Schritt 6 # Beliebig viele Einträge pro Rolle möglich. # Format: (zitadel_sub, email) # ------------------------------------------------------------------ ADMINS = [ ("377858996305921031", "test@oidctest.local"), # Test Admin ("361726819499508906", "br@runden.de"), # Björn Runden ] MITARBEITER = [ ("377859593088271367", "testmuellerma@oidctest.local"), # Test Müller mitarbeiter ("377859271703921671", "staff2@oidctest.local"), # test2 staff ("377859141412062215", "teststaff@oidctest.local"), # test Mitarbeiter ] KUNDEN = [ ("377859426305967111", "testmueller@oidctest.local"), # oidctest kund1 Müller ] for sub, email in ADMINS: db.session.add(User(zitadel_user_id=sub, email=email, global_role="Admin")) for sub, email in MITARBEITER: db.session.add(User(zitadel_user_id=sub, email=email, global_role="Mitarbeiter")) for sub, email in KUNDEN: db.session.add(User(zitadel_user_id=sub, email=email, global_role="Kunde")) firma = Client(name="Firma Müller") db.session.add(firma) db.session.flush() p1 = Project(name="Akquise Landkreis", client_id=firma.id) p2 = Project(name="Akquise Bundesstaat", client_id=firma.id) p3 = Project(name="Spezielle Produktpalette", client_id=firma.id) db.session.add_all([p1, p2, p3]) db.session.flush() # Alle Mitarbeiter → Projekte 1 + 2 (nicht 3 → Failure-Test-Button) for sub, _ in MITARBEITER: db.session.add(ProjectMitarbeiterMapping(user_id=sub, project_id=p1.id)) db.session.add(ProjectMitarbeiterMapping(user_id=sub, project_id=p2.id)) # Alle Kunden → Projekt 1 (nicht 2 + 3 → Failure-Test-Button) for sub, _ in KUNDEN: db.session.add(ProjectKundenMapping(user_id=sub, project_id=p1.id)) # Beispielnotizen werden dem ersten Mitarbeiter zugeordnet ma_sub = MITARBEITER[0][0] db.session.add_all([ Note(text="Erstkontakt aufgenommen.", project_id=p1.id, user_id=ma_sub, created_at=datetime.utcnow()), Note(text="Angebot versendet.", project_id=p1.id, user_id=ma_sub, created_at=datetime.utcnow()), Note(text="Folgetermin vereinbart.", project_id=p2.id, user_id=ma_sub, created_at=datetime.utcnow()), ]) db.session.commit() click.echo("Datenbank initialisiert und mit Testdaten befüllt.") click.echo(f" Admins : {[s for s, _ in ADMINS]}") click.echo(f" Mitarbeiter : {[s for s, _ in MITARBEITER]}") click.echo(f" Kunden : {[s for s, _ in KUNDEN]}")