171 lines
6.7 KiB
Python
171 lines
6.7 KiB
Python
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,
|
||
}
|