meta embed flow

This commit is contained in:
debu-2 2026-10-07 23:25:19 +05:30
parent ae72b59878
commit 99ed8f2477
10 changed files with 2256 additions and 151 deletions

View file

@ -539,6 +539,87 @@ class WhatsAppMessage(Base):
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)
class WhatsAppMetaConnection(Base):
"""A customer's Meta authorization. Tokens stay server-side."""
__tablename__ = "whatsapp_meta_connections"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("user_accounts.id", ondelete="CASCADE"), index=True)
status: Mapped[str] = mapped_column(String(24), default="pending", index=True)
meta_business_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
business_name: Mapped[str | None] = mapped_column(String(200), nullable=True)
granted_scopes: Mapped[str | None] = mapped_column(String(500), nullable=True)
access_token: Mapped[str | None] = mapped_column(Text, nullable=True)
last_error: Mapped[str | None] = mapped_column(String(500), nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
disconnected_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
accounts: Mapped[list["WhatsAppBusinessAccount"]] = relationship(back_populates="connection")
class WhatsAppBusinessAccount(Base):
"""One WhatsApp Business Account (WABA) owned by a single Urmi user."""
__tablename__ = "whatsapp_business_accounts"
__table_args__ = (UniqueConstraint("waba_id", name="uq_whatsapp_waba_id"),)
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("user_accounts.id", ondelete="CASCADE"), index=True)
connection_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("whatsapp_meta_connections.id", ondelete="CASCADE"), index=True
)
waba_id: Mapped[str] = mapped_column(String(64), index=True)
name: Mapped[str] = mapped_column(String(200), default="WhatsApp Business")
status: Mapped[str] = mapped_column(String(24), default="provisioning", index=True)
messaging_status: Mapped[str] = mapped_column(String(24), default="unavailable")
management_status: Mapped[str] = mapped_column(String(24), default="unavailable")
templates_status: Mapped[str] = mapped_column(String(24), default="unavailable")
webhooks_status: Mapped[str] = mapped_column(String(24), default="unavailable")
template_count: Mapped[int] = mapped_column(default=0)
last_error: Mapped[str | None] = mapped_column(String(500), nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
connection: Mapped[WhatsAppMetaConnection] = relationship(back_populates="accounts")
phones: Mapped[list["WhatsAppPhoneAsset"]] = relationship(
back_populates="account", cascade="all, delete-orphan"
)
class WhatsAppPhoneAsset(Base):
__tablename__ = "whatsapp_phone_assets"
__table_args__ = (UniqueConstraint("phone_number_id", name="uq_whatsapp_phone_number_id"),)
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("user_accounts.id", ondelete="CASCADE"), index=True)
account_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("whatsapp_business_accounts.id", ondelete="CASCADE"), index=True
)
phone_number_id: Mapped[str] = mapped_column(String(64), index=True)
display_phone: Mapped[str] = mapped_column(String(32), default="")
verified_name: Mapped[str | None] = mapped_column(String(200), nullable=True)
quality: Mapped[str | None] = mapped_column(String(24), nullable=True)
status: Mapped[str] = mapped_column(String(32), default="pending")
code_verification_status: Mapped[str | None] = mapped_column(String(32), nullable=True)
account: Mapped[WhatsAppBusinessAccount] = relationship(back_populates="phones")
class WhatsAppConnectionAudit(Base):
__tablename__ = "whatsapp_connection_audits"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("user_accounts.id", ondelete="CASCADE"), index=True)
connection_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), nullable=True, index=True)
waba_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
event: Mapped[str] = mapped_column(String(40), index=True)
detail: Mapped[str] = mapped_column(String(500), default="")
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)
class AgentMessageTemplate(Base):
"""Platform WhatsApp agent message templates available for user subscription."""