85 lines
3.2 KiB
Python
85 lines
3.2 KiB
Python
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,
|
|
}
|