from flask_sqlalchemy import SQLAlchemy from sqlalchemy.dialects.postgresql import JSONB from werkzeug.security import generate_password_hash, check_password_hash # Create a SQLAlchemy instance. This will be linked to the Flask app in main.py. db = SQLAlchemy() class User(db.Model): """Represents a user in the database.""" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password_hash = db.Column(db.String(256), nullable=False) is_admin = db.Column(db.Boolean, default=False, nullable=False) def set_password(self, password): """Creates a secure hash of the password.""" self.password_hash = generate_password_hash(password) def check_password(self, password): """Checks if the provided password matches the stored hash.""" return check_password_hash(self.password_hash, password) class Station(db.Model): """Represents a battery swap station in the database.""" id = db.Column(db.Integer, primary_key=True) station_id = db.Column(db.String(120), unique=True, nullable=False) name = db.Column(db.String(120), nullable=True) location = db.Column(db.String(200), nullable=True) mqtt_broker = db.Column(db.String(255), nullable=False) mqtt_port = db.Column(db.Integer, nullable=False) mqtt_user = db.Column(db.String(120), nullable=True) mqtt_password = db.Column(db.String(120), nullable=True) class MqttLog(db.Model): """Represents a single MQTT message payload for historical logging.""" id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, server_default=db.func.now()) station_id = db.Column(db.String(120), nullable=False, index=True) topic = db.Column(db.String(255), nullable=False) topic_type = db.Column(db.String(50), nullable=False, index=True) payload = db.Column(JSONB)