Initial import with GitLab CI/CD and registry deploy flow
This commit is contained in:
@@ -0,0 +1,748 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import Boolean, Float, Index, Integer, String, Text, UniqueConstraint
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
class AuthUser(Base):
|
||||
__tablename__ = "auth_users"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
user_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
username: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
password: Mapped[str] = mapped_column(String(256))
|
||||
full_name: Mapped[str] = mapped_column(String(256))
|
||||
role: Mapped[str] = mapped_column(String(32), index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64))
|
||||
|
||||
|
||||
class AuthExternalIdentity(Base):
|
||||
__tablename__ = "auth_external_identities"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
provider: Mapped[str] = mapped_column(String(64), index=True)
|
||||
external_subject: Mapped[str] = mapped_column(String(256), index=True)
|
||||
username: Mapped[str] = mapped_column(String(128), index=True)
|
||||
email: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
full_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
role: Mapped[str] = mapped_column(String(32), index=True)
|
||||
linked_user_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
last_login_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class AuthOIDCState(Base):
|
||||
__tablename__ = "auth_oidc_states"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
state: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
nonce: Mapped[str] = mapped_column(String(128))
|
||||
code_verifier: Mapped[str] = mapped_column(String(256))
|
||||
redirect_uri: Mapped[str] = mapped_column(String(512))
|
||||
return_mode: Mapped[str] = mapped_column(String(32), default="popup")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
expires_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
consumed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
|
||||
|
||||
class Customer(Base):
|
||||
__tablename__ = "customers"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
customer_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
display_name: Mapped[str] = mapped_column(String(256), index=True)
|
||||
phones_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
preferred_phone: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
tags_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
created_at: Mapped[str] = mapped_column(String(64))
|
||||
|
||||
|
||||
class CustomerExternalIdentity(Base):
|
||||
__tablename__ = "customer_external_identities"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"ix_customer_external_identities_channel_subject_unique",
|
||||
"channel",
|
||||
"external_subject",
|
||||
unique=True,
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
identity_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
customer_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
external_subject: Mapped[str] = mapped_column(String(256), index=True)
|
||||
display_name_snapshot: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class Interaction(Base):
|
||||
__tablename__ = "interactions"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
subject: Mapped[str] = mapped_column(String(512))
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
priority: Mapped[int] = mapped_column(Integer, default=3, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
assigned_to: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64))
|
||||
updated_at: Mapped[str] = mapped_column(String(64))
|
||||
|
||||
|
||||
class InteractionTimeline(Base):
|
||||
__tablename__ = "interaction_timelines"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
timestamp: Mapped[str] = mapped_column(String(64), index=True)
|
||||
action: Mapped[str] = mapped_column(String(128))
|
||||
metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
|
||||
|
||||
class Queue(Base):
|
||||
__tablename__ = "queues"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
name: Mapped[str] = mapped_column(String(256), index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
rules_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
created_at: Mapped[str] = mapped_column(String(64))
|
||||
|
||||
|
||||
class RoutingCounter(Base):
|
||||
__tablename__ = "routing_counters"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), unique=True, index=True)
|
||||
counter: Mapped[int] = mapped_column(Integer, default=0)
|
||||
|
||||
|
||||
class AuditEventRow(Base):
|
||||
__tablename__ = "audit_events"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
event_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
actor: Mapped[str] = mapped_column(String(128), index=True)
|
||||
action: Mapped[str] = mapped_column(String(128), index=True)
|
||||
entity: Mapped[str] = mapped_column(String(128), index=True)
|
||||
metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class EventOutboxRow(Base):
|
||||
__tablename__ = "event_outbox"
|
||||
__table_args__ = (
|
||||
Index("idx_event_outbox_status_available_at_id", "status", "available_at", "id"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
event_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
event_type: Mapped[str] = mapped_column(String(128), index=True)
|
||||
event_version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
producer_service: Mapped[str] = mapped_column(String(128), index=True)
|
||||
entity_type: Mapped[str] = mapped_column(String(128), index=True)
|
||||
entity_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
correlation_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
routing_key: Mapped[str] = mapped_column(String(128), index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
attempt_count: Mapped[int] = mapped_column(Integer, default=0)
|
||||
last_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
available_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
published_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class EventInboxRow(Base):
|
||||
__tablename__ = "event_inbox"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
consumer_name: Mapped[str] = mapped_column(String(128), index=True)
|
||||
event_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
event_type: Mapped[str] = mapped_column(String(128), index=True)
|
||||
processed_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
notes: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
|
||||
|
||||
class AsteriskEventLogRow(Base):
|
||||
__tablename__ = "asterisk_event_log"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"idx_asterisk_event_log_name_call_status_id",
|
||||
"ami_event_name",
|
||||
"call_id",
|
||||
"forward_status",
|
||||
"id",
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
bridge_event_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
ami_event_name: Mapped[str] = mapped_column(String(128), index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
linked_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
recording_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
forward_status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
last_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class AsteriskCallLinkRow(Base):
|
||||
__tablename__ = "asterisk_call_links"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
linked_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
queue_code: Mapped[str] = mapped_column(String(64), index=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
caller_number: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
caller_name: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
telephony_status: Mapped[str] = mapped_column(String(32), index=True, default="ringing")
|
||||
claimed_by_user: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
claimed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
operator_extension: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
channel_name: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
voice_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_state: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
ai_handoff_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
ai_last_model_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
started_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
connected_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ended_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class AsteriskCallActionLogRow(Base):
|
||||
__tablename__ = "asterisk_call_action_log"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
action_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
action_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
actor_user: Mapped[str] = mapped_column(String(128), index=True)
|
||||
actor_role: Mapped[str] = mapped_column(String(32), index=True)
|
||||
request_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
result_status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
ami_action_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class VoiceEventRow(Base):
|
||||
__tablename__ = "voice_events"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"ix_voice_events_source_event_id",
|
||||
"source_event_id",
|
||||
unique=True,
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
event_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
event_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
source_event_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class CallRecordingRow(Base):
|
||||
__tablename__ = "call_recordings"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"ix_call_recordings_source_event_id",
|
||||
"source_event_id",
|
||||
unique=True,
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
recording_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
source_event_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
file_name: Mapped[str] = mapped_column(String(256))
|
||||
storage_backend: Mapped[str] = mapped_column(String(32), index=True)
|
||||
storage_path: Mapped[str] = mapped_column(Text)
|
||||
mime_type: Mapped[str] = mapped_column(String(128))
|
||||
size_bytes: Mapped[int] = mapped_column(Integer)
|
||||
duration_seconds: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
checksum_sha256: Mapped[str] = mapped_column(String(64), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
recorded_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
archived_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
|
||||
|
||||
class IvrFlowRow(Base):
|
||||
__tablename__ = "ivr_flows"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
flow_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
name: Mapped[str] = mapped_column(String(256), index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
|
||||
entry_node_id: Mapped[str] = mapped_column(String(64))
|
||||
flow_json: Mapped[str] = mapped_column(Text)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class IvrSessionRow(Base):
|
||||
__tablename__ = "ivr_sessions"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
flow_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
current_node_id: Mapped[str] = mapped_column(String(64))
|
||||
entered_digits_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
outcome_code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
resolved_queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
resolved_queue_code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
completed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class AISessionRow(Base):
|
||||
__tablename__ = "ai_sessions"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
call_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
thread_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
agent_profile: Mapped[str] = mapped_column(String(64), index=True, default="telegram_support")
|
||||
language: Mapped[str | None] = mapped_column(String(16), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="active")
|
||||
summary_text: Mapped[str] = mapped_column(Text, default="")
|
||||
last_user_message_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_ai_message_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
handoff_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
closed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
|
||||
|
||||
class AIJobRow(Base):
|
||||
__tablename__ = "ai_jobs"
|
||||
__table_args__ = (
|
||||
Index("idx_ai_jobs_thread_status_id", "thread_id", "status", "id"),
|
||||
Index("idx_ai_jobs_thread_trigger_id", "thread_id", "trigger_message_id", "id"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
job_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
thread_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
trigger_message_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="pending")
|
||||
attempts: Mapped[int] = mapped_column(Integer, default=0)
|
||||
next_attempt_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
locked_until: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class VoiceAISessionRow(Base):
|
||||
__tablename__ = "voice_ai_sessions"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
linked_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
agent_profile: Mapped[str] = mapped_column(String(64), index=True, default="voice_support")
|
||||
language: Mapped[str | None] = mapped_column(String(16), nullable=True, index=True)
|
||||
asr_provider: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
tts_provider: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="queued")
|
||||
handoff_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
handoff_target_queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
media_uuid: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
media_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
media_connected_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
media_ended_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_media_frame_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
disclosure_played_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_user_utterance_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_ai_reply_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
started_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
ended_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
|
||||
|
||||
class AITurnRow(Base):
|
||||
__tablename__ = "ai_turns"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
turn_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
thread_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
role: Mapped[str] = mapped_column(String(32), index=True)
|
||||
source_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
text: Mapped[str] = mapped_column(Text)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
model: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
finish_reason: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
latency_ms: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class VoiceTranscriptSegmentRow(Base):
|
||||
__tablename__ = "voice_transcript_segments"
|
||||
__table_args__ = (
|
||||
UniqueConstraint(
|
||||
"session_id",
|
||||
"sequence_no",
|
||||
name="uq_voice_transcript_segments_session_sequence",
|
||||
),
|
||||
Index(
|
||||
"idx_voice_transcript_segments_session_speaker_final_id",
|
||||
"session_id",
|
||||
"speaker",
|
||||
"is_final",
|
||||
"id",
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
segment_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
session_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
speaker: Mapped[str] = mapped_column(String(32), index=True)
|
||||
source_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
sequence_no: Mapped[int] = mapped_column(Integer, index=True)
|
||||
text: Mapped[str] = mapped_column(Text)
|
||||
confidence: Mapped[float | None] = mapped_column(Float, nullable=True)
|
||||
is_final: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
|
||||
barge_in_interrupted: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class TelegramMessageRow(Base):
|
||||
__tablename__ = "telegram_messages"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"ix_telegram_messages_chat_external_unique",
|
||||
"chat_id",
|
||||
"telegram_message_id_external",
|
||||
unique=True,
|
||||
),
|
||||
Index(
|
||||
"idx_telegram_messages_thread_direction_author_created_id",
|
||||
"thread_id",
|
||||
"direction",
|
||||
"author_type",
|
||||
"created_at",
|
||||
"id",
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
message_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
thread_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
chat_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
text: Mapped[str] = mapped_column(Text)
|
||||
customer_external_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
direction: Mapped[str] = mapped_column(String(16), index=True, default="inbound")
|
||||
telegram_message_id_external: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
operator_user: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
author_type: Mapped[str] = mapped_column(String(32), index=True, default="customer")
|
||||
author_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
delivery_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
delivery_attempts: Mapped[int] = mapped_column(Integer, default=0)
|
||||
next_delivery_attempt_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
delivery_locked_until: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_delivery_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class TelegramThreadRow(Base):
|
||||
__tablename__ = "telegram_threads"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
thread_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
chat_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
telegram_user_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
username: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
display_name: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
claimed_by_user: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
claimed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_state: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
ai_handoff_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
ai_last_model_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_message_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
last_message_preview: Mapped[str] = mapped_column(Text, default="")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class WhatsAppMessageRow(Base):
|
||||
__tablename__ = "whatsapp_messages"
|
||||
__table_args__ = (
|
||||
Index(
|
||||
"ix_whatsapp_messages_chat_external_unique",
|
||||
"chat_id",
|
||||
"whatsapp_message_id_external",
|
||||
unique=True,
|
||||
),
|
||||
Index(
|
||||
"idx_whatsapp_messages_thread_direction_author_created_id",
|
||||
"thread_id",
|
||||
"direction",
|
||||
"author_type",
|
||||
"created_at",
|
||||
"id",
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
message_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
thread_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
chat_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
text: Mapped[str] = mapped_column(Text)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
direction: Mapped[str] = mapped_column(String(16), index=True, default="inbound")
|
||||
whatsapp_message_id_external: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
operator_user: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
author_type: Mapped[str] = mapped_column(String(32), index=True, default="customer")
|
||||
author_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
delivery_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
delivery_attempts: Mapped[int] = mapped_column(Integer, default=0)
|
||||
next_delivery_attempt_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
delivery_locked_until: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_delivery_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class WhatsAppThreadRow(Base):
|
||||
__tablename__ = "whatsapp_threads"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
thread_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
chat_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
whatsapp_user_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
phone_number: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
display_name: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
is_group: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
claimed_by_user: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
claimed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
ai_state: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
ai_handoff_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
ai_last_model_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_message_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
last_message_preview: Mapped[str] = mapped_column(Text, default="")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class WebchatMessageRow(Base):
|
||||
__tablename__ = "webchat_messages"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
message_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
session_id: Mapped[str] = mapped_column(String(128), index=True)
|
||||
text: Mapped[str] = mapped_column(Text)
|
||||
visitor_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
customer_external_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
priority: Mapped[int] = mapped_column(Integer, default=3, index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class EmailMessageRow(Base):
|
||||
__tablename__ = "email_messages"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
message_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
from_email: Mapped[str] = mapped_column(String(256), index=True)
|
||||
subject: Mapped[str] = mapped_column(String(512), index=True)
|
||||
body: Mapped[str] = mapped_column(Text)
|
||||
customer_external_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
priority: Mapped[int] = mapped_column(Integer, default=3, index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class KBCategoryRow(Base):
|
||||
__tablename__ = "kb_categories"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
category_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
name: Mapped[str] = mapped_column(String(256), index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class KBArticleRow(Base):
|
||||
__tablename__ = "kb_articles"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
article_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
category_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
article_group_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
language: Mapped[str] = mapped_column(String(8), index=True, default="ru")
|
||||
title: Mapped[str] = mapped_column(String(512), index=True)
|
||||
body: Mapped[str] = mapped_column(Text)
|
||||
tags_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class ReportingEventRow(Base):
|
||||
__tablename__ = "reporting_events"
|
||||
__table_args__ = (
|
||||
Index("idx_reporting_events_queue_channel_created_at", "queue_id", "channel", "created_at"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
channel: Mapped[str] = mapped_column(String(32), index=True, default="voice")
|
||||
agent_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
answered: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
wait_seconds: Mapped[int] = mapped_column(Integer, default=0)
|
||||
handle_seconds: Mapped[int] = mapped_column(Integer, default=0)
|
||||
abandoned: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
resolved_first_contact: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class ReportingEventLogRow(Base):
|
||||
__tablename__ = "reporting_event_log"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
event_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
event_type: Mapped[str] = mapped_column(String(128), index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
channel: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class ReportingInteractionFactRow(Base):
|
||||
__tablename__ = "reporting_interaction_facts"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("interaction_id", name="uq_reporting_interaction_facts_interaction_id"),
|
||||
Index(
|
||||
"idx_reporting_interaction_facts_created_queue_channel",
|
||||
"created_at",
|
||||
"queue_id",
|
||||
"channel",
|
||||
),
|
||||
Index(
|
||||
"idx_reporting_interaction_facts_status_agent",
|
||||
"status",
|
||||
"agent_id",
|
||||
),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
interaction_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
channel: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
agent_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
created_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
closed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
answered: Mapped[bool | None] = mapped_column(Boolean, nullable=True)
|
||||
abandoned: Mapped[bool | None] = mapped_column(Boolean, nullable=True)
|
||||
wait_seconds: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
handle_seconds: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
resolved_first_contact: Mapped[bool | None] = mapped_column(Boolean, nullable=True)
|
||||
source: Mapped[str] = mapped_column(String(64), index=True, default="unknown")
|
||||
|
||||
|
||||
class ReportingSavedViewRow(Base):
|
||||
__tablename__ = "reporting_saved_views"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("owner_user", "view_id", name="uq_reporting_saved_views_owner_view"),
|
||||
Index("idx_reporting_saved_views_owner_updated", "owner_user", "updated_at"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
owner_user: Mapped[str] = mapped_column(String(128), index=True)
|
||||
owner_role: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
view_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
name: Mapped[str] = mapped_column(String(160))
|
||||
snapshot_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SupervisorAgentStateRow(Base):
|
||||
__tablename__ = "supervisor_agent_states"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
agent_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
||||
state: Mapped[str] = mapped_column(String(32), index=True)
|
||||
queue_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SupervisorQueueSnapshotRow(Base):
|
||||
__tablename__ = "supervisor_queue_snapshots"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
queue_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
in_queue: Mapped[int] = mapped_column(Integer, default=0)
|
||||
avg_wait_seconds: Mapped[int] = mapped_column(Integer, default=0)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
Reference in New Issue
Block a user