from datetime import datetime from flask_sqlalchemy import SQLAlchemy from app.utils.encryption import encrypt_text, decrypt_text db = SQLAlchemy() class CloudflareAccount(db.Model): """Şirket Cloudflare hesapları - Admin tarafından yönetilir""" __tablename__ = "cloudflare_accounts" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) # "Account 1", "Production CF", etc. email = db.Column(db.String(255), nullable=False) api_token_encrypted = db.Column(db.Text, nullable=False) # Şifreli token # Limits & Status is_active = db.Column(db.Boolean, default=True) max_domains = db.Column(db.Integer, default=100) # Bu hesapta max kaç domain olabilir current_domain_count = db.Column(db.Integer, default=0) # Şu an kaç domain var # Metadata notes = db.Column(db.Text, nullable=True) # Admin notları created_by = db.Column(db.Integer, nullable=True) # Admin user ID # Timestamps created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships domains = db.relationship("Domain", backref="cf_account", lazy=True) def set_api_token(self, plaintext_token: str): """API token'ı şifrele ve kaydet""" self.api_token_encrypted = encrypt_text(plaintext_token) def get_api_token(self) -> str: """Şifreli API token'ı çöz ve döndür""" if not self.api_token_encrypted: return "" return decrypt_text(self.api_token_encrypted) def to_dict(self, include_token: bool = False): """ Model'i dict'e çevir Args: include_token: True ise API token'ı da döndür (sadece admin için) """ data = { "id": self.id, "name": self.name, "email": self.email, "is_active": self.is_active, "max_domains": self.max_domains, "current_domain_count": self.current_domain_count, "notes": self.notes, "created_at": self.created_at.isoformat() if self.created_at else None, "updated_at": self.updated_at.isoformat() if self.updated_at else None, } if include_token: data["api_token"] = self.get_api_token() return data 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 Configuration use_cloudflare = db.Column(db.Boolean, default=True) cf_account_type = db.Column(db.String(20), nullable=True) # "own" veya "company" cf_account_id = db.Column(db.Integer, db.ForeignKey("cloudflare_accounts.id"), nullable=True) # Şirket hesabı ise cf_zone_id = db.Column(db.String(255), nullable=True) cf_api_token_encrypted = db.Column(db.Text, nullable=True) # Müşterinin kendi token'ı (şifreli) cf_proxy_enabled = db.Column(db.Boolean, default=True) # Nameserver Status ns_configured = db.Column(db.Boolean, default=False) # NS'ler CF'ye yönlendirildi mi? ns_checked_at = db.Column(db.DateTime, nullable=True) # Son NS kontrolü # 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 set_cf_api_token(self, plaintext_token: str): """Müşterinin CF API token'ını şifrele ve kaydet""" self.cf_api_token_encrypted = encrypt_text(plaintext_token) def get_cf_api_token(self) -> str: """Şifreli CF API token'ı çöz ve döndür""" if self.cf_account_type == "company" and self.cf_account: # Şirket hesabı kullanıyorsa, o hesabın token'ını döndür return self.cf_account.get_api_token() elif self.cf_api_token_encrypted: # Kendi token'ı varsa onu döndür return decrypt_text(self.cf_api_token_encrypted) return "" def to_dict(self): return { "id": self.id, "domain_name": self.domain_name, "customer_id": self.customer_id, "use_cloudflare": self.use_cloudflare, "cf_account_type": self.cf_account_type, "cf_account_id": self.cf_account_id, "cf_zone_id": self.cf_zone_id, "cf_proxy_enabled": self.cf_proxy_enabled, "ns_configured": self.ns_configured, "ns_checked_at": self.ns_checked_at.isoformat() if self.ns_checked_at else None, "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, }