Spaces:
Sleeping
Sleeping
File size: 9,898 Bytes
193acda | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | import uuid
from datetime import datetime
from sqlalchemy import Column, String, Boolean, DateTime, DECIMAL, ForeignKey, Integer, Text, BigInteger
from sqlalchemy.dialects.postgresql import UUID, JSONB, INET, ARRAY
from sqlalchemy.orm import relationship, declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
username = Column(String(50), unique=True, nullable=False)
email = Column(String(255), unique=True, nullable=False)
password_hash = Column(String(255))
name = Column(String(100))
avatar_url = Column(Text)
balance = Column(DECIMAL(15, 4), default=0.0000)
status = Column(String(50), default="active")
spent = Column(DECIMAL(15, 4), default=0.0000)
role = Column(String(20), default="USER")
api_key = Column(String(100), unique=True)
referral_code = Column(String(20), unique=True)
referred_by = Column(UUID(as_uuid=True), ForeignKey("users.id"))
timezone = Column(String(50), default="UTC")
currency = Column(String(3), default="USD")
locale = Column(String(5), default="en")
is_active = Column(Boolean, default=True)
login_attempts = Column(Integer, default=0)
locked_until = Column(DateTime(timezone=True))
oauth_provider = Column(String(20))
oauth_provider_id = Column(String(255))
last_login_at = Column(DateTime(timezone=True))
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
orders = relationship("Order", back_populates="user")
transactions = relationship("Transaction", back_populates="user")
tickets = relationship("Ticket", back_populates="user")
class Category(Base):
__tablename__ = "categories"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(150), nullable=False)
slug = Column(String(150), unique=True, nullable=False)
description = Column(Text)
icon = Column(String(50))
sort_order = Column(Integer, default=0)
is_active = Column(Boolean, default=True)
parent_id = Column(Integer, ForeignKey("categories.id"))
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
services = relationship("Service", back_populates="category")
class ApiProvider(Base):
__tablename__ = "api_providers"
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
url = Column(String(255), nullable=False)
api_key = Column(String(255), nullable=False)
balance = Column(DECIMAL(15, 4), default=0.0000)
currency = Column(String(3), default="USD")
is_active = Column(Boolean, default=True)
last_sync_at = Column(DateTime(timezone=True))
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
services = relationship("Service", back_populates="api_provider")
orders = relationship("Order", back_populates="api_provider")
class Service(Base):
__tablename__ = "services"
id = Column(Integer, primary_key=True, index=True)
category_id = Column(Integer, ForeignKey("categories.id"))
name = Column(String(500), nullable=False)
slug = Column(String(500))
type = Column(String(50), default="Default")
price = Column(DECIMAL(15, 6), nullable=False)
min_quantity = Column(Integer, nullable=False)
max_quantity = Column(Integer, nullable=False)
refill_enabled = Column(Boolean, default=False)
refill_days = Column(Integer, default=0)
speed = Column(String(100))
average_time = Column(String(100))
description = Column(Text)
api_provider_id = Column(Integer, ForeignKey("api_providers.id"))
api_service_id = Column(String(100))
is_drip_feed = Column(Boolean, default=False)
is_active = Column(Boolean, default=True)
sort_order = Column(Integer, default=0)
total_orders = Column(Integer, default=0)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
category = relationship("Category", back_populates="services")
api_provider = relationship("ApiProvider", back_populates="services")
orders = relationship("Order", back_populates="service")
class Order(Base):
__tablename__ = "orders"
id = Column(Integer, primary_key=True)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
service_id = Column(Integer, ForeignKey("services.id"))
link = Column(String(2000), nullable=False)
quantity = Column(Integer, nullable=False)
charge = Column(DECIMAL(15, 4), nullable=False)
status = Column(String(50), default="Pending")
start_count = Column(Integer, default=0)
remains = Column(Integer, default=0)
api_provider_id = Column(Integer, ForeignKey("api_providers.id"))
api_order_id = Column(String(100))
is_drip_feed = Column(Boolean, default=False)
drip_feed_interval = Column(Integer)
drip_feed_quantity = Column(Integer)
refill_count = Column(Integer, default=0)
last_refill_at = Column(DateTime(timezone=True))
ip_address = Column(INET)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="orders")
service = relationship("Service", back_populates="orders")
api_provider = relationship("ApiProvider", back_populates="orders")
tickets = relationship("Ticket", back_populates="order")
class Transaction(Base):
__tablename__ = "transactions"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
amount = Column(DECIMAL(15, 4), nullable=False)
type = Column(String(30), nullable=False)
payment_method = Column(String(50), nullable=False)
payment_gateway_id = Column(String(255))
status = Column(String(20), default="Pending")
balance_before = Column(DECIMAL(15, 4))
balance_after = Column(DECIMAL(15, 4))
note = Column(Text)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
user = relationship("User", back_populates="transactions")
class Ticket(Base):
__tablename__ = "tickets"
id = Column(Integer, primary_key=True)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
subject = Column(String(200), nullable=False)
status = Column(String(20), default="Pending")
priority = Column(String(10), default="Normal")
order_id = Column(Integer, ForeignKey("orders.id"))
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="tickets")
order = relationship("Order", back_populates="tickets")
messages = relationship("TicketMessage", back_populates="ticket")
class TicketMessage(Base):
__tablename__ = "ticket_messages"
id = Column(Integer, primary_key=True)
ticket_id = Column(Integer, ForeignKey("tickets.id"))
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
message = Column(Text, nullable=False)
is_admin = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
ticket = relationship("Ticket", back_populates="messages")
user = relationship("User")
class Referral(Base):
__tablename__ = "referrals"
id = Column(Integer, primary_key=True)
referrer_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
referred_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
commission_rate = Column(DECIMAL(5, 2), default=5.00)
total_earned = Column(DECIMAL(15, 4), default=0.0000)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
class BlogPost(Base):
__tablename__ = "blog_posts"
id = Column(Integer, primary_key=True)
title = Column(String(300), nullable=False)
slug = Column(String(300), unique=True, nullable=False)
content = Column(Text, nullable=False)
excerpt = Column(Text)
featured_image_url = Column(Text)
author_name = Column(String(100))
tags = Column(ARRAY(String))
meta_title = Column(String(300))
meta_description = Column(String(500))
is_published = Column(Boolean, default=False)
published_at = Column(DateTime(timezone=True))
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
class SystemSetting(Base):
__tablename__ = "system_settings"
key = Column(String(100), primary_key=True)
value = Column(Text, nullable=False)
description = Column(Text)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)
class AuditLog(Base):
__tablename__ = "audit_logs"
id = Column(BigInteger, primary_key=True)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
action = Column(String(100), nullable=False)
entity_type = Column(String(50))
entity_id = Column(String(100))
old_value = Column(JSONB)
new_value = Column(JSONB)
ip_address = Column(INET)
user_agent = Column(Text)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
user = relationship("User")
|