from sqlalchemy import create_engine, Column, Integer, String, Enum, TIMESTAMP, func, text from sqlalchemy.orm import sessionmaker, declarative_base import enum import bcrypt # Basis-Klasse für unsere Modelle Base = declarative_base() # Enum zur Definition der möglichen Rollen class UserRole(enum.Enum): user = "user" admin = "admin" superadmin = "superadmin" # Definition des User Models (Tabelle) class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), unique=True, nullable=False) password_hash = Column(String(60), nullable=False) # bcrypt erzeugt einen 60-Zeichen-Hash role = Column(Enum(UserRole), nullable=False, default=UserRole.user) created_at = Column(TIMESTAMP, server_default=func.current_timestamp()) updated_at = Column(TIMESTAMP, server_default=func.current_timestamp(), onupdate=func.current_timestamp()) # Definition des Client Models (Tabelle) class Client(Base): __tablename__ = 'clients' # Die UUID wird vom Client erzeugt und muss daher übermittelt werden (kein Default) uuid = Column(String(36), primary_key=True, nullable=False) # Der Hardware-Hash wird ebenfalls direkt vom Client geliefert hardware_hash = Column(String(64), nullable=False) # Spalte für den Standort, der vom Benutzer bei der Anmeldung eingegeben wird location = Column(String(100), nullable=True) # Spalte für die IP-Adresse, die vom Server beim Kontakt ermittelt wird ip_address = Column(String(45), nullable=True) # Speicherung des Registrierungszeitpunkts, wird automatisch gesetzt registration_time = Column(TIMESTAMP, server_default=func.current_timestamp(), nullable=False) # Speicherung des Zeitpunkts der letzten Rückmeldung (Alive-Signal) last_alive = Column( TIMESTAMP, server_default=func.current_timestamp(), onupdate=func.current_timestamp(), nullable=False ) def main(): # Zuerst Verbindung zur MariaDB ohne spezifische Datenbank, um die Datenbank anzulegen. admin_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa' admin_engine = create_engine(admin_connection_str, echo=True) # Datenbank "infoscreen_by_taa" anlegen, falls sie noch nicht existiert. with admin_engine.connect() as conn: conn.execute(text("CREATE DATABASE IF NOT EXISTS infoscreen_by_taa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;")) # Verbindung zur spezifischen Datenbank herstellen. db_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa' engine = create_engine(db_connection_str, echo=True) # Erstelle die Tabellen 'users' und 'clients' Base.metadata.create_all(engine) print("Die Tabellen 'users' und 'clients' wurden in der Datenbank 'infoscreen_by_taa' erstellt.") if __name__ == '__main__': main()