- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동 - book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서) - 빈 폴더 제거 (journey/assets/*)
241 lines
13 KiB
Python
241 lines
13 KiB
Python
from typing import Optional
|
|
import datetime
|
|
import uuid
|
|
|
|
from sqlalchemy import (ARRAY, Boolean, DateTime, Double, Enum, ForeignKeyConstraint, Index, Integer, JSON, PrimaryKeyConstraint, String, Time, UniqueConstraint, Uuid, text, Sequence, func)
|
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
class Company(Base):
|
|
__tablename__ = 'company'
|
|
__table_args__ = (
|
|
PrimaryKeyConstraint('id', name='company_pk'),
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
name: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
url: Mapped[Optional[str]] = mapped_column(String(255))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
team: Mapped[list['Team']] = relationship('Team', back_populates='company')
|
|
|
|
|
|
class Product(Base):
|
|
__tablename__ = 'product'
|
|
__table_args__ = (
|
|
PrimaryKeyConstraint('id', name='product_pk'),
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
name: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
app_id: Mapped[Optional[str]] = mapped_column(String(16))
|
|
scope: Mapped[Optional[dict]] = mapped_column(JSON)
|
|
description: Mapped[Optional[str]] = mapped_column(String(256))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
robeing: Mapped[list['Robeing']] = relationship('Robeing', back_populates='product')
|
|
|
|
|
|
class Team(Base):
|
|
__tablename__ = 'team'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['company_id'], ['company.id'], name='team_company_id_fk'),
|
|
PrimaryKeyConstraint('id', name='team_pk')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
company_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
name: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
is_default: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=Boolean(False))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
company: Mapped['Company'] = relationship('Company', back_populates='team')
|
|
robeing: Mapped[list['Robeing']] = relationship('Robeing', back_populates='team')
|
|
slack_workspace: Mapped[list['SlackWorkspace']] = relationship('SlackWorkspace', back_populates='team')
|
|
user: Mapped[list['User']] = relationship('User', back_populates='team')
|
|
|
|
|
|
class Robeing(Base):
|
|
__tablename__ = 'robeing'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['product_id'], ['product.id'], name='robeing_product_id_fk'),
|
|
ForeignKeyConstraint(['team_id'], ['team.id'], name='robeing_team_id_fk'),
|
|
PrimaryKeyConstraint('id', name='robeing_pk')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
product_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
team_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
name: Mapped[Optional[str]] = mapped_column(String(32))
|
|
level: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(1))
|
|
experience: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(0))
|
|
memory: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(10))
|
|
compute: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(10))
|
|
react: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(10))
|
|
empathy: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(10))
|
|
leadership: Mapped[Optional[int]] = mapped_column(Integer, server_default=Integer(10))
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
robeing_container_id: Mapped[Optional[str]] = mapped_column(String(64))
|
|
robeing_container_url: Mapped[Optional[str]] = mapped_column(String(128))
|
|
|
|
product: Mapped['Product'] = relationship('Product', back_populates='robeing')
|
|
team: Mapped['Team'] = relationship('Team', back_populates='robeing')
|
|
|
|
|
|
class SlackWorkspace(Base):
|
|
__tablename__ = 'slack_workspace'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['team_id'], ['team.id'], name='slack_workspace_team_id_fk'),
|
|
PrimaryKeyConstraint('id', name='slack_workspace_pk')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
team_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
slack_team_id: Mapped[Optional[str]] = mapped_column(String(32))
|
|
bot_token: Mapped[Optional[str]] = mapped_column(String(255))
|
|
is_enterprise_install: Mapped[Optional[bool]] = mapped_column(Boolean, server_default=Boolean(True))
|
|
is_active: Mapped[Optional[bool]] = mapped_column(Boolean)
|
|
installed_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
team: Mapped['Team'] = relationship('Team', back_populates='slack_workspace')
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = 'user'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['team_id'], ['team.id'], name='user_team_id_fk'),
|
|
PrimaryKeyConstraint('id', name='user_pk'),
|
|
UniqueConstraint('email', name='users_email_key')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
team_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
email: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
username: Mapped[Optional[str]] = mapped_column(String(64))
|
|
name: Mapped[Optional[str]] = mapped_column(String(255))
|
|
picture: Mapped[Optional[str]] = mapped_column(String(500))
|
|
oauth_provider: Mapped[Optional[str]] = mapped_column(String(50))
|
|
oauth_id: Mapped[Optional[str]] = mapped_column(String(255))
|
|
is_active: Mapped[Optional[bool]] = mapped_column(Boolean)
|
|
is_admin: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=Boolean(False))
|
|
last_login_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
team: Mapped['Team'] = relationship('Team', back_populates='user')
|
|
conversation_log: Mapped[list['ConversationLog']] = relationship('ConversationLog', back_populates='user')
|
|
gmail_token: Mapped[list['GmailToken']] = relationship('GmailToken', back_populates='user')
|
|
news: Mapped[list['News']] = relationship('News', back_populates='user')
|
|
user_preference: Mapped[list['UserPreference']] = relationship('UserPreference', back_populates='user')
|
|
workspace_member: Mapped[list['WorkspaceMember']] = relationship('WorkspaceMember', back_populates='user')
|
|
|
|
|
|
class ConversationLog(Base):
|
|
__tablename__ = 'conversation_log'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['user_id'], ['user.id'], name='conversation_log_user_id'),
|
|
PrimaryKeyConstraint('id', name='conversation_log_pk')
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(Integer, Sequence('conversation_log_id_seq'), primary_key=True)
|
|
user_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
channel_id: Mapped[Optional[str]] = mapped_column(String(16))
|
|
message: Mapped[Optional[str]] = mapped_column(String)
|
|
response: Mapped[Optional[str]] = mapped_column(String)
|
|
intent: Mapped[Optional[str]] = mapped_column(String(256))
|
|
confidence: Mapped[Optional[float]] = mapped_column(Double(53))
|
|
thread_ts: Mapped[Optional[str]] = mapped_column(String(128))
|
|
timestamp: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True))
|
|
channel_type: Mapped[Optional[str]] = mapped_column(String(32))
|
|
|
|
user: Mapped['User'] = relationship('User', back_populates='conversation_log')
|
|
|
|
|
|
class GmailToken(Base):
|
|
__tablename__ = 'gmail_token'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['user_id'], ['user.id'], name='user_id_fk'),
|
|
PrimaryKeyConstraint('id', name='gmail_token_pk'),
|
|
Index('idx_gmail_token_oauth_config', 'oauth_config'),
|
|
Index('idx_gmail_token_token_data', 'token_data')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
user_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
token_data: Mapped[Optional[dict]] = mapped_column(JSONB)
|
|
oauth_config: Mapped[Optional[dict]] = mapped_column(JSONB)
|
|
scopes: Mapped[Optional[dict]] = mapped_column(JSONB)
|
|
metadata_: Mapped[Optional[dict]] = mapped_column('metadata', JSONB)
|
|
expiry: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime)
|
|
is_equipped: Mapped[Optional[bool]] = mapped_column(Boolean, server_default=Boolean(False))
|
|
equipped_to: Mapped[Optional[str]] = mapped_column(String(50))
|
|
token_type: Mapped[Optional[str]] = mapped_column(String, server_default=text("'Bearer'::character varying"))
|
|
expires_at: Mapped[Optional[float]] = mapped_column(Double(53))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
user: Mapped['User'] = relationship('User', back_populates='gmail_token')
|
|
|
|
|
|
class News(Base):
|
|
__tablename__ = 'news'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['user_id'], ['user.id'], name='news_user_id_fk'),
|
|
PrimaryKeyConstraint('id', name='news_pk')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
user_id: Mapped[Optional[uuid.UUID]] = mapped_column(Uuid)
|
|
data: Mapped[Optional[dict]] = mapped_column(JSONB)
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
user: Mapped[Optional['User']] = relationship('User', back_populates='news')
|
|
|
|
|
|
class UserPreference(Base):
|
|
__tablename__ = 'user_preference'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['user_id'], ['user.id'], name='user_preference_user_id_fk'),
|
|
PrimaryKeyConstraint('id', name='user_preference_pk')
|
|
)
|
|
|
|
user_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
news_keywords: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String(length=128)))
|
|
email_filter: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String(length=128)))
|
|
briefing_enabled: Mapped[Optional[bool]] = mapped_column(Boolean, server_default=Boolean(True))
|
|
briefing_time: Mapped[Optional[datetime.time]] = mapped_column(Time, server_default=text("'09:00:00'::time without time zone"))
|
|
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True), server_default=func.now(), onupdate=func.now())
|
|
|
|
user: Mapped['User'] = relationship('User', back_populates='user_preference')
|
|
|
|
|
|
class WorkspaceMember(Base):
|
|
__tablename__ = 'workspace_member'
|
|
__table_args__ = (
|
|
ForeignKeyConstraint(['user_id'], ['user.id'], name='workspace_member_user_id_fkey'),
|
|
PrimaryKeyConstraint('id', name='workspace_member_pk')
|
|
)
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4)
|
|
user_id: Mapped[uuid.UUID] = mapped_column(Uuid, nullable=False)
|
|
slack_user_id: Mapped[Optional[str]] = mapped_column(String(32))
|
|
role: Mapped[str] = mapped_column(Enum('OWNER', 'MEMBER', 'GUEST', name='user_role'), nullable=False, server_default=text("'GUEST'::user_role"))
|
|
is_active: Mapped[Optional[bool]] = mapped_column(Boolean)
|
|
joined_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime, server_default=func.now())
|
|
updated_at: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime, server_default=func.now())
|
|
|
|
user: Mapped['User'] = relationship('User', back_populates='workspace_member')
|