Files
infoscreen/server/init_database.py
2025-06-10 22:54:55 +02:00

68 lines
2.9 KiB
Python

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()