diff --git a/salesflow-saas/backend/app/models/__init__.py b/salesflow-saas/backend/app/models/__init__.py index ec1e68e6..0cf19ad5 100644 --- a/salesflow-saas/backend/app/models/__init__.py +++ b/salesflow-saas/backend/app/models/__init__.py @@ -26,6 +26,7 @@ from app.models.advanced import TrustScore, Prospect, Scorecard, AIRehearsal from app.models.consent import PDPLConsent, PDPLConsentAudit, DataRequest from app.models.sequence import Sequence, SequenceStep, SequenceEnrollment, SequenceEvent from app.models.strategic_deal import CompanyProfile, StrategicDeal, DealMatch +from app.models.api_key import APIKey, AppSetting __all__ = [ "BaseModel", "TenantModel", "Tenant", "User", "Lead", "Customer", diff --git a/salesflow-saas/backend/app/models/api_key.py b/salesflow-saas/backend/app/models/api_key.py new file mode 100644 index 00000000..7cbc3bd7 --- /dev/null +++ b/salesflow-saas/backend/app/models/api_key.py @@ -0,0 +1,44 @@ +""" +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, + )