from datetime import datetime from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Domain(db.Model): __tablename__ = "domains" id = db.Column(db.Integer, primary_key=True) domain_name = db.Column(db.String(255), unique=True, nullable=False, index=True) customer_id = db.Column(db.Integer, nullable=False, index=True) # Cloudflare use_cloudflare = db.Column(db.Boolean, default=True) cf_zone_id = db.Column(db.String(255), nullable=True) cf_api_token = db.Column(db.Text, nullable=True) # Encrypted cf_proxy_enabled = db.Column(db.Boolean, default=True) # DNS current_ip = db.Column(db.String(45), nullable=True) lb_ip = db.Column(db.String(45), nullable=True) # Status status = db.Column(db.String(50), default="pending") # pending, active, error dns_configured = db.Column(db.Boolean, default=False) ssl_configured = db.Column(db.Boolean, default=False) # Timestamps created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships dns_records = db.relationship("DNSRecord", backref="domain", lazy=True, cascade="all, delete-orphan") def to_dict(self): return { "id": self.id, "domain_name": self.domain_name, "customer_id": self.customer_id, "use_cloudflare": self.use_cloudflare, "cf_zone_id": self.cf_zone_id, "cf_proxy_enabled": self.cf_proxy_enabled, "current_ip": self.current_ip, "lb_ip": self.lb_ip, "status": self.status, "dns_configured": self.dns_configured, "ssl_configured": self.ssl_configured, "created_at": self.created_at.isoformat() if self.created_at else None, "updated_at": self.updated_at.isoformat() if self.updated_at else None, } class DNSRecord(db.Model): __tablename__ = "dns_records" id = db.Column(db.Integer, primary_key=True) domain_id = db.Column(db.Integer, db.ForeignKey("domains.id"), nullable=False) record_type = db.Column(db.String(10), nullable=False) # A, CNAME, MX, TXT, etc. name = db.Column(db.String(255), nullable=False) content = db.Column(db.Text, nullable=False) ttl = db.Column(db.Integer, default=300) proxied = db.Column(db.Boolean, default=False) # Cloudflare cf_record_id = db.Column(db.String(255), nullable=True) # Timestamps created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) def to_dict(self): return { "id": self.id, "domain_id": self.domain_id, "record_type": self.record_type, "name": self.name, "content": self.content, "ttl": self.ttl, "proxied": self.proxied, "cf_record_id": self.cf_record_id, "created_at": self.created_at.isoformat() if self.created_at else None, "updated_at": self.updated_at.isoformat() if self.updated_at else None, }