""" SQLAlchemy models for VPN server """ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Float, Enum, Boolean from sqlalchemy.orm import relationship from datetime import datetime import enum from core.database import Base class UserRole(str, enum.Enum): ADMIN = "admin" USER = "user" class UserStatus(str, enum.Enum): ACTIVE = "active" INACTIVE = "inactive" SUSPENDED = "suspended" class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, unique=True, index=True) email = Column(String, unique=True, index=True) password = Column(String) role = Column(String, default=UserRole.USER) status = Column(String, default=UserStatus.ACTIVE) vpn_protocol = Column(String, default="outline") created_at = Column(DateTime, default=datetime.utcnow) last_login = Column(DateTime, nullable=True) # Relationships sessions = relationship("VPNSession", back_populates="user") config = relationship("UserVPNConfig", back_populates="user", uselist=False) bandwidth_usages = relationship("BandwidthUsage", back_populates="user") class VPNSession(Base): __tablename__ = "vpn_sessions" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) protocol = Column(String) client_ip = Column(String) server_ip = Column(String) start_time = Column(DateTime, default=datetime.utcnow) end_time = Column(DateTime, nullable=True) bytes_sent = Column(Integer, default=0) bytes_received = Column(Integer, default=0) status = Column(String, default="active") # Relationships user = relationship("User", back_populates="sessions") class UserVPNConfig(Base): __tablename__ = "user_vpn_configs" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), unique=True) protocol = Column(String) config_data = Column(String) # JSON string of configuration created_at = Column(DateTime, default=datetime.utcnow) last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships user = relationship("User", back_populates="config") class BandwidthUsage(Base): __tablename__ = "bandwidth_usage" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) timestamp = Column(DateTime, default=datetime.utcnow) bytes_up = Column(Integer, default=0) bytes_down = Column(Integer, default=0) protocol = Column(String) # Relationships user = relationship("User", back_populates="bandwidth_usages") class ServerConfig(Base): __tablename__ = "server_config" id = Column(Integer, primary_key=True, index=True) server_name = Column(String, default="VPN Server") max_clients = Column(Integer, default=100) bandwidth_limit = Column(Integer, nullable=True) # In bytes per second maintenance_mode = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class AuditLog(Base): __tablename__ = "audit_logs" id = Column(Integer, primary_key=True, index=True) timestamp = Column(DateTime, default=datetime.utcnow) user_id = Column(Integer, ForeignKey("users.id"), nullable=True) action = Column(String) details = Column(String) ip_address = Column(String, nullable=True) # Relationships user = relationship("User")