system-prompts-and-models-o.../salesflow-saas/backend/app/models/api_key.py
Claude 89bffbed40
feat: Merge VoXc2/dealix models — APIKey + AppSetting + deployment guide
Merged from VoXc2/dealix repository:
- api_key.py: APIKey model (hash, prefix, permissions, rate limit, expiry)
  + AppSetting model (key-value config with typed values)
- Both adapted to TenantModel (multi-tenant) + added Arabic fields
- Registered in models/__init__.py

This closes the "API key management" gap from the gap analysis.

Also includes production deployment guide with step-by-step instructions
for going from code to live product (~283 SAR/month operating cost).

https://claude.ai/code/session_01LsnvBa7HwF5hs99VZbgLGj
2026-04-12 04:08:08 +00:00

45 lines
2.0 KiB
Python

"""
API Key Model — Dealix AI Revenue OS
Manages API keys for external integrations and developer access.
Adapted from VoXc2/dealix repository.
"""
from datetime import datetime
from sqlalchemy import String, Boolean, DateTime, ForeignKey, Integer, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import TenantModel
class APIKey(TenantModel):
__tablename__ = "api_keys"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
name: Mapped[str] = mapped_column(String(100), nullable=False)
name_ar: Mapped[str | None] = mapped_column(String(100))
key_hash: Mapped[str] = mapped_column(String(255), unique=True, nullable=False)
key_prefix: Mapped[str] = mapped_column(String(20), nullable=False)
permissions: Mapped[str | None] = mapped_column(Text) # JSON: ["read_leads", "write_deals"]
last_used_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
request_count: Mapped[int] = mapped_column(Integer, default=0)
rate_limit: Mapped[int] = mapped_column(Integer, default=1000) # per hour
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
expires_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow)
created_by: Mapped[int | None] = mapped_column(ForeignKey("users.id"))
class AppSetting(TenantModel):
__tablename__ = "app_settings"
key: Mapped[str] = mapped_column(String(100), primary_key=True)
value: Mapped[str | None] = mapped_column(Text)
value_type: Mapped[str] = mapped_column(String(20), default="string") # string, int, bool, json
description: Mapped[str | None] = mapped_column(Text)
description_ar: Mapped[str | None] = mapped_column(Text)
is_public: Mapped[bool] = mapped_column(Boolean, default=False)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=datetime.utcnow,
onupdate=datetime.utcnow,
)