From 67ce62d4ab90c76270522ae0d1b64e371309d23c Mon Sep 17 00:00:00 2001 From: hhyong Date: Sun, 14 Sep 2025 11:17:49 +0900 Subject: [PATCH] Upload files to "300_architecture/database" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `sqlcodegen`을 사용하여 추출한 ORM 추가 --- 300_architecture/database/main_db.py | 240 +++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 300_architecture/database/main_db.py diff --git a/300_architecture/database/main_db.py b/300_architecture/database/main_db.py new file mode 100644 index 0000000..7344ef9 --- /dev/null +++ b/300_architecture/database/main_db.py @@ -0,0 +1,240 @@ +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')