hosting-platform/backend/app/models/domain.py

171 lines
6.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, db.ForeignKey('customers.id'), 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,
}