From 8c02b803595537ac7ac2e6daa952396671273624 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Fri, 26 Sep 2025 00:49:47 +0900 Subject: [PATCH] Fix incorrect table names in documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gmail_tokens โ†’ gmail_token (33 files) - companies โ†’ company (17 files) - conversation_logs โ†’ conversation_log (27 files) - workspace_members โ†’ workspace_member (28 files) All table names now match the actual PostgreSQL schema --- ...ฐ_์ปจํ…Œ์ด๋„ˆ์™€_๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค.md | 2 +- ...320_Slack_๊ธฐ๋ฐ˜_์ธํ„ฐํŽ˜์ด์Šค_์„ค๊ณ„.md | 2 +- 300_architecture/380_authentication_system.md | 8 +-- .../250820_postgresql_ssh_tunnel_guide.md | 16 +++--- 300_architecture/database/README.md | 4 +- 300_architecture/database/relationships.md | 48 ++++++++--------- .../sequences/auth_login_sequences.md | 2 +- .../sequences/chat_history_flow.md | 18 +++---- .../sequences/daily_briefing_sequences.md | 8 +-- 300_architecture/sequences/email_sequences.md | 26 +++++----- 300_architecture/sequences/items_sequences.md | 24 ++++----- 300_architecture/uuid_conversion_system.md | 10 ++-- .../auth-server-database-schema.md | 8 +-- .../frontend-architecture-strategy.md | 4 +- .../๋กœ๋น™_์•„ํ‚คํ…์ณ_์„ค๊ณ„_๊ฒฝ๋Ÿ‰.md | 4 +- ideas/250810_auth_system_analysis.md | 2 +- ...ck_๋ฉ”์‹œ์ง€_์ฒ˜๋ฆฌ_์•„ํ‚คํ…์ฒ˜_๋ถ„์„.md | 10 ++-- ...ion_logs_๋ฐ_robing_stats_ํ™œ์šฉ_๊ณ„ํš.md | 22 ++++---- ...™”ํ˜•_์ ์ง„์ _์˜๋„_๊ตฌ์ถ•_์‹œ์Šคํ…œ.md | 4 +- plans/000000_unresolved_items_matrix.md | 2 +- plans/250831_todo_and_tech_debt.md | 6 +-- ...nified_id_system_implementation_roadmap.md | 8 +-- plans/250831_workspace_unification_plan.md | 24 ++++----- plans/250911_main_db3_migration_plan.md | 28 +++++----- ...0812_auth_db_ํ…Œ์ด๋ธ”_๋‹จ์ˆœํ™”_๋ฐฉ์•ˆ.md | 30 +++++------ ...ฐœ์ž_Slack์‚ฌ์šฉ์ž๋งคํ•‘_๊ตฌํ˜„๊ณ„ํš.md | 4 +- .../250819_gmail_item_detailed_tasks.md | 4 +- .../250819_gmail_item_implementation_plan.md | 30 +++++------ ...0819_rb8001_gmail_integration_completed.md | 6 +-- ...819_skill_email_db_connection_completed.md | 20 +++---- .../250823_4pm_email_briefing_demo_plan.md | 2 +- .../250828_slack_integration_level3_plan.md | 12 ++--- ...pybell80_์„œ๋น„์Šค๊ตฌ์ถ•๋ฐ๋ฐฐํฌ๋ณต๊ตฌ.md | 2 +- ...๋ก ํŠธ๋ฐฑ์—”๋“œ์—ฐ๊ฒฐ๋ฐworkspace์ „ํ™˜.md | 16 +++--- ...happybell80_ํ”„๋ก ํŠธ์—”๋“œ๋กœ๋น™์—ฐ๊ฒฐ.md | 2 +- ...•™์„น์…˜์ •์ œ๋ฐauth์„œ๋ฒ„์—…๋ฐ์ดํŠธ.md | 2 +- ...250809_happybell80_robing-gateway๊ตฌํ˜„.md | 20 +++---- ...811_happybell80_ChromaDB๋ฉ”๋ชจ๋ฆฌ์†์‹ค.md | 2 +- ...1_happybell80_Gatewayํ•„๋“œ๋ณ€ํ™˜๋ฌธ์ œ.md | 2 +- .../250812_slack_user_mapping_๊ตฌํ˜„.md | 4 +- .../250817_email_skill_integration_status.md | 4 +- .../250817_robeing_monitor_integration.md | 4 +- .../250818_gmail_tokens_database_setup.md | 30 +++++------ ...ppybell80_Gmail์•„์ดํ…œ์‹œ์Šคํ…œํ†ตํ•ฉ.md | 2 +- ...bell80_GmailํŒจ์ŠคํฌํŠธ์‹œ์Šคํ…œ์™„์„ฑ.md | 4 +- ...appybell80_auth_db๋ฅผ_main_db๋กœ_๋ณ€๊ฒฝ.md | 2 +- ...80_skill-email_DBํ†ตํ•ฉ๋ฐActions๋ฐฐํฌ.md | 2 +- ...80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™๋™์ ํ• ๋‹น๊ตฌํ˜„.md | 8 +-- .../250821_gmail_token_auto_refresh.md | 8 +-- ...l80_Gmailํ†ตํ•ฉ_UUID๋ณ€ํ™˜_๋ฌธ์ œํ•ด๊ฒฐ.md | 2 +- ...il_OAuth_ํ† ํฐ_๊ฐฑ์‹ _์‹œ์Šคํ…œ_๊ตฌ์ถ•.md | 14 ++--- ..._gmail_token_expired_daily_briefing_fix.md | 16 +++--- ...์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md | 2 +- .../250825_robeing_stats_display_issue.md | 2 +- ...6_frontend_rb8001_chat_endpoint_missing.md | 2 +- ...l80_frontend_rb8001_์ฑ„ํŒ…์—ฐ๊ฒฐ_๊ณ„ํš.md | 4 +- ...6_happybell80_rb8001_์ด์ค‘์ €์žฅ๊ตฌํ˜„.md | 14 ++--- ...๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md | 52 +++++++++---------- ...826_rb8001_conversation_storage_failure.md | 12 ++--- .../250826_slack_id_column_standardization.md | 2 +- .../250827_UUID_username_ํ˜ผ์šฉ_CRITICAL.md | 8 +-- ...d_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md | 2 +- ...๊ธด๊ธ‰์ด์Šˆ์ ๊ฒ€๋ฐ์ฝ”๋“œ์—…๋ฐ์ดํŠธ.md | 2 +- ...UUID_ํ†ตํ•ฉ_๋ฐ_์‚ฌ์šฉ์ž_๊ฒฉ๋ฆฌ_๊ณ„ํš.md | 6 +-- ...conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md | 6 +-- ...50831_rb8001_context_race_condition_fix.md | 4 +- ...1_rb8001_postgresql_context_integration.md | 2 +- ..._slack_login_workspace_assignment_issue.md | 22 ++++---- ...250831_slack_oauth_login_implementation.md | 10 ++-- ...1_hongtaeju_slack_oauth_mapping_failure.md | 10 ++-- .../250902_slack_bot_install_url_analysis.md | 22 ++++---- ...03_frontend_conversation_order_reversed.md | 2 +- ...903_gmail_token_permission_denied_issue.md | 4 +- .../250903_slack_chat_display_indicator.md | 4 +- ...ppybell80_gmail_refresh_token_๋ถˆ์ผ์น˜.md | 2 +- ...ostgreSQL_ํ…Œ์ด๋ธ”๋ช…_๋‹จ์ˆ˜ํ˜•_ํ†ต์ผ.md | 14 ++--- ...mail_token_slack_user_id_column_missing.md | 2 +- ...80_UUID_์›์น™_์œ„๋ฐ˜_email_integration.md | 4 +- 78 files changed, 380 insertions(+), 380 deletions(-) diff --git a/300_architecture/310_์ „์ฒด_์‹œ์Šคํ…œ_๊ตฌ์กฐ_์ปจํ…Œ์ด๋„ˆ์™€_๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค.md b/300_architecture/310_์ „์ฒด_์‹œ์Šคํ…œ_๊ตฌ์กฐ_์ปจํ…Œ์ด๋„ˆ์™€_๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค.md index 501d363..72b4edc 100644 --- a/300_architecture/310_์ „์ฒด_์‹œ์Šคํ…œ_๊ตฌ์กฐ_์ปจํ…Œ์ด๋„ˆ์™€_๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค.md +++ b/300_architecture/310_์ „์ฒด_์‹œ์Šคํ…œ_๊ตฌ์กฐ_์ปจํ…Œ์ด๋„ˆ์™€_๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค.md @@ -91,7 +91,7 @@ users: id(UUID), username, email, name, created_at -- Gmail ํ† ํฐ (์•„์ดํ…œ) -gmail_tokens: id, user_id, email, is_equipped, equipped_to +gmail_token: id, user_id, email, is_equipped, equipped_to -- Gmail ๊ฐ์‚ฌ ๋กœ๊ทธ gmail_audit_logs: id, user_id, robeing_id, action, created_at diff --git a/300_architecture/320_Slack_๊ธฐ๋ฐ˜_์ธํ„ฐํŽ˜์ด์Šค_์„ค๊ณ„.md b/300_architecture/320_Slack_๊ธฐ๋ฐ˜_์ธํ„ฐํŽ˜์ด์Šค_์„ค๊ณ„.md index 84e3493..065c9c3 100644 --- a/300_architecture/320_Slack_๊ธฐ๋ฐ˜_์ธํ„ฐํŽ˜์ด์Šค_์„ค๊ณ„.md +++ b/300_architecture/320_Slack_๊ธฐ๋ฐ˜_์ธํ„ฐํŽ˜์ด์Šค_์„ค๊ณ„.md @@ -213,7 +213,7 @@ async def show_typing(channel: str): -- ๋Œ€์‹  users ํ…Œ์ด๋ธ”์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ -- ๋Œ€ํ™” ๋กœ๊ทธ -CREATE TABLE conversation_logs ( +CREATE TABLE conversation_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID, -- slack_user_mapping์—์„œ ์กฐํšŒํ•œ UUID robeing_id VARCHAR(50), diff --git a/300_architecture/380_authentication_system.md b/300_architecture/380_authentication_system.md index 6a120d6..31a5a3c 100644 --- a/300_architecture/380_authentication_system.md +++ b/300_architecture/380_authentication_system.md @@ -61,7 +61,7 @@ - PRIMARY KEY (slack_user_id, slack_workspace_id) ``` -#### gmail_tokens ํ…Œ์ด๋ธ” +#### gmail_token ํ…Œ์ด๋ธ” ```sql - id: UUID - user_id: UUID (FK โ†’ users.id) @@ -114,7 +114,7 @@ sequenceDiagram - Slack๋„ ์ž„์‹œ ์ฝ”๋“œ ๋ฐฉ์‹์œผ๋กœ ๋งž์ถค 2. **DB ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜** - - companies vs workspaces ํ…Œ์ด๋ธ” ๊ณต์กด + - company vs workspaces ํ…Œ์ด๋ธ” ๊ณต์กด - relationship ์ฃผ์„ ์ฒ˜๋ฆฌ 3. **ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’** @@ -138,7 +138,7 @@ sequenceDiagram ### ํŠน์ง• - **์›ํŽ˜์ด์ง€ ๋ณต๊ท€**: OAuth ์ธ์ฆ ํ›„ ์›๋ž˜ ์žˆ๋˜ ํŽ˜์ด์ง€๋กœ ์ž๋™ ๋ณต๊ท€ - **์ƒํƒœ ๊ด€๋ฆฌ**: state ํŒŒ๋ผ๋ฏธํ„ฐ์— return_url ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌ -- **ํ† ํฐ ์ €์žฅ**: gmail_tokens ํ…Œ์ด๋ธ”์— ์•”ํ˜ธํ™” ์ €์žฅ +- **ํ† ํฐ ์ €์žฅ**: gmail_token ํ…Œ์ด๋ธ”์— ์•”ํ˜ธํ™” ์ €์žฅ ## ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ @@ -185,7 +185,7 @@ DATABASE_URL=postgresql://robeings:password@localhost/main_db ## ํ–ฅํ›„ ๊ฐœ์„  ๊ณ„ํš ### ๋‹จ๊ธฐ (1-2์ฃผ) -1. DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (companies โ†’ workspaces) +1. DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (company โ†’ workspaces) 2. Frontend ์ธ์ฆ ๋ฐฉ์‹ ํ†ต์ผ 3. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ •๋ฆฌ diff --git a/300_architecture/database/250820_postgresql_ssh_tunnel_guide.md b/300_architecture/database/250820_postgresql_ssh_tunnel_guide.md index 99d16bf..3c92c3e 100644 --- a/300_architecture/database/250820_postgresql_ssh_tunnel_guide.md +++ b/300_architecture/database/250820_postgresql_ssh_tunnel_guide.md @@ -83,7 +83,7 @@ psql -h localhost -p 5432 -U robeings -d main_db \dt -- ํŠน์ • ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณด๊ธฐ -\d gmail_tokens +\d gmail_token \d users -- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก @@ -160,9 +160,9 @@ CREATE TABLE users ( ); ``` -### 2. gmail_tokens ํ…Œ์ด๋ธ” +### 2. gmail_token ํ…Œ์ด๋ธ” ```sql -CREATE TABLE gmail_tokens ( +CREATE TABLE gmail_token ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id), slack_id VARCHAR(100), -- Slack ์‚ฌ์šฉ์ž ID (์ƒˆ๋กœ ์ถ”๊ฐ€) @@ -184,9 +184,9 @@ CREATE TABLE gmail_tokens ( ); ``` -### 3. conversation_logs ํ…Œ์ด๋ธ” +### 3. conversation_log ํ…Œ์ด๋ธ” ```sql -CREATE TABLE conversation_logs ( +CREATE TABLE conversation_log ( id SERIAL PRIMARY KEY, robeing_id VARCHAR, channel_id VARCHAR, @@ -235,7 +235,7 @@ query = """ g.robeing_id, g.token_data, g.scopes - FROM gmail_tokens g + FROM gmail_token g JOIN users u ON g.user_id = u.id ORDER BY g.created_at DESC """ @@ -308,7 +308,7 @@ def add_gmail_token(slack_user_id, email, access_token, refresh_token): ON CONFLICT (id) DO UPDATE SET email = EXCLUDED.email """, (user_uuid, email, slack_user_id)) - # 2. gmail_tokens ์ถ”๊ฐ€ ๋˜๋Š” ์—…๋ฐ์ดํŠธ + # 2. gmail_token ์ถ”๊ฐ€ ๋˜๋Š” ์—…๋ฐ์ดํŠธ token_data = { "access_token": access_token, "refresh_token": refresh_token, @@ -316,7 +316,7 @@ def add_gmail_token(slack_user_id, email, access_token, refresh_token): } cur.execute(""" - INSERT INTO gmail_tokens (user_id, token_data, is_equipped, robeing_id, created_at) + INSERT INTO gmail_token (user_id, token_data, is_equipped, robeing_id, created_at) VALUES (%s, %s::jsonb, true, 'rb8001', NOW()) ON CONFLICT (user_id) DO UPDATE SET token_data = EXCLUDED.token_data, diff --git a/300_architecture/database/README.md b/300_architecture/database/README.md index f3041a3..2910c32 100644 --- a/300_architecture/database/README.md +++ b/300_architecture/database/README.md @@ -42,8 +42,8 @@ psql postgresql://robeings:robeings@localhost:5433/main_db ``` ## ์ตœ๊ทผ ๋ณ€๊ฒฝ์‚ฌํ•ญ -- 2025-08-26: conversation_logs์— slack_user_id ์ถ”๊ฐ€ -- 2025-08-23: gmail_tokens ๊ตฌ์กฐ ๋ณ€๊ฒฝ +- 2025-08-26: conversation_log์— slack_user_id ์ถ”๊ฐ€ +- 2025-08-23: gmail_token ๊ตฌ์กฐ ๋ณ€๊ฒฝ - 2025-08-20: auth_db โ†’ main_db ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ## ์ตœ์ข… ์—…๋ฐ์ดํŠธ diff --git a/300_architecture/database/relationships.md b/300_architecture/database/relationships.md index ab4a8af..45cdaae 100644 --- a/300_architecture/database/relationships.md +++ b/300_architecture/database/relationships.md @@ -8,22 +8,22 @@ ```mermaid erDiagram - users ||--o{ workspace_members : "has many" + users ||--o{ workspace_member : "has many" users ||--o{ slack_user_mapping : "has many" - users ||--o{ gmail_tokens : "has" + users ||--o{ gmail_token : "has" users ||--o{ robeing_stats : "has" - users ||--o{ conversation_logs : "has many" + users ||--o{ conversation_log : "has many" - workspaces ||--o{ workspace_members : "has many" - workspaces }o--|| companies : "belongs to" + workspaces ||--o{ workspace_member : "has many" + workspaces }o--|| company : "belongs to" slack_workspaces ||--o{ slack_user_mapping : "has many" - workspace_members ||--o{ slack_user_mapping : "references" + workspace_member ||--o{ slack_user_mapping : "references" - gmail_tokens }o--|| users : "belongs to" + gmail_token }o--|| users : "belongs to" robeing_stats }o--|| users : "belongs to" - conversation_logs }o--|| users : "belongs to" + conversation_log }o--|| users : "belongs to" ``` --- @@ -32,11 +32,11 @@ erDiagram ### 1. User ์ค‘์‹ฌ ๊ด€๊ณ„ ``` -users (1) โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€ (*) workspace_members +users (1) โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€ (*) workspace_member โ”œโ”€โ”€โ”€โ”€ (*) slack_user_mapping - โ”œโ”€โ”€โ”€โ”€ (0..1) gmail_tokens + โ”œโ”€โ”€โ”€โ”€ (0..1) gmail_token โ”œโ”€โ”€โ”€โ”€ (0..1) robeing_stats - โ””โ”€โ”€โ”€โ”€ (*) conversation_logs + โ””โ”€โ”€โ”€โ”€ (*) conversation_log ``` - ํ•œ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ @@ -47,8 +47,8 @@ users (1) โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€ (*) workspace_members ### 2. Workspace ๊ด€๊ณ„ ``` -companies (1) โ”€โ”€โ”€โ”€ (*) workspaces -workspaces (1) โ”€โ”€โ”€โ”€ (*) workspace_members +company (1) โ”€โ”€โ”€โ”€ (*) workspaces +workspaces (1) โ”€โ”€โ”€โ”€ (*) workspace_member ``` - ํ•œ ํšŒ์‚ฌ๋Š” ์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ @@ -58,11 +58,11 @@ workspaces (1) โ”€โ”€โ”€โ”€ (*) workspace_members ``` slack_workspaces (1) โ”€โ”€โ”€โ”€ (*) slack_user_mapping slack_user_mapping (*) โ”€โ”€โ”€โ”€ (1) users -slack_user_mapping (*) โ”€โ”€โ”€โ”€ (0..1) workspace_members +slack_user_mapping (*) โ”€โ”€โ”€โ”€ (0..1) workspace_member ``` - Slack ์‚ฌ์šฉ์ž ID๋ฅผ ์‹œ์Šคํ…œ UUID๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ธŒ๋ฆฟ์ง€ ์—ญํ•  -- workspace_members์™€ ์„ ํƒ์  ์—ฐ๊ฒฐ +- workspace_member์™€ ์„ ํƒ์  ์—ฐ๊ฒฐ --- @@ -79,9 +79,9 @@ SELECT sum.slack_user_id, gt.is_equipped as gmail_equipped FROM users u -LEFT JOIN workspace_members wm ON u.id = wm.user_id +LEFT JOIN workspace_member wm ON u.id = wm.user_id LEFT JOIN slack_user_mapping sum ON u.id = sum.user_id -LEFT JOIN gmail_tokens gt ON u.id = gt.user_id +LEFT JOIN gmail_token gt ON u.id = gt.user_id WHERE u.username = 'happybell80'; ``` @@ -108,7 +108,7 @@ SELECT rs.level, gt.scopes FROM users u -JOIN gmail_tokens gt ON u.id = gt.user_id +JOIN gmail_token gt ON u.id = gt.user_id LEFT JOIN robeing_stats rs ON u.id = rs.user_id WHERE gt.is_equipped = true; ``` @@ -122,7 +122,7 @@ SELECT wm.role, wm.robeing_id FROM workspaces w -JOIN workspace_members wm ON w.id = wm.workspace_id +JOIN workspace_member wm ON w.id = wm.workspace_id JOIN users u ON wm.user_id = u.id WHERE w.name = 'Ivada Robeing'; ``` @@ -148,7 +148,7 @@ user_id (UUID) ํš๋“ ``` User ์š”์ฒญ โ†“ -user_id (UUID)๋กœ gmail_tokens ์กฐํšŒ +user_id (UUID)๋กœ gmail_token ์กฐํšŒ โ†“ is_equipped ํ™•์ธ โ†“ @@ -202,10 +202,10 @@ BEGIN; SELECT level FROM robeing_stats WHERE user_id = ?; -- 2. ์†Œ์œ ๊ถŒ ํ™•์ธ -SELECT id FROM gmail_tokens WHERE user_id = ?; +SELECT id FROM gmail_token WHERE user_id = ?; -- 3. ์žฅ์ฐฉ ์ฒ˜๋ฆฌ -UPDATE gmail_tokens +UPDATE gmail_token SET is_equipped = true, equipped_to = ? WHERE user_id = ?; @@ -223,8 +223,8 @@ BEGIN; INSERT INTO users (id, email, name, username) VALUES (?, ?, ?, ?); --- 2. workspace_members ์ถ”๊ฐ€ -INSERT INTO workspace_members (user_id, workspace_id, role) +-- 2. workspace_member ์ถ”๊ฐ€ +INSERT INTO workspace_member (user_id, workspace_id, role) VALUES (?, ?, 'member'); -- 3. robeing_stats ์ดˆ๊ธฐํ™” diff --git a/300_architecture/sequences/auth_login_sequences.md b/300_architecture/sequences/auth_login_sequences.md index 7561b0d..bc23fb5 100644 --- a/300_architecture/sequences/auth_login_sequences.md +++ b/300_architecture/sequences/auth_login_sequences.md @@ -315,7 +315,7 @@ stateDiagram-v2 - username (์‚ฌ์šฉ์ž ์ •์˜ ๋˜๋Š” ์ž๋™ ์ƒ์„ฑ) ๊ด€๊ณ„: - - users.id (UUID) โ† gmail_tokens.user_id + - users.id (UUID) โ† gmail_token.user_id - users.id (UUID) โ† slack_user_mapping.user_id - users.id (UUID) โ† robeing_stats.user_id diff --git a/300_architecture/sequences/chat_history_flow.md b/300_architecture/sequences/chat_history_flow.md index 40ebf5b..09d2bc2 100644 --- a/300_architecture/sequences/chat_history_flow.md +++ b/300_architecture/sequences/chat_history_flow.md @@ -20,10 +20,10 @@ sequenceDiagram F->>G: GET /gateway/api/history?limit=30
Authorization: Bearer {JWT} G->>G: JWT ๊ฒ€์ฆ (์„œ๋ช…, ๋งŒ๋ฃŒ์‹œ๊ฐ„) G->>G: JWT์—์„œ sub(UUID) ์ถ”์ถœ - G->>G: workspace_members ํ…Œ์ด๋ธ” ์กฐํšŒ
robeing_id ํ™•์ธ (rb8001) + G->>G: workspace_member ํ…Œ์ด๋ธ” ์กฐํšŒ
robeing_id ํ™•์ธ (rb8001) G->>R: GET /api/history?limit=30
Authorization: Bearer {JWT}
X-User-Id: {UUID} R->>R: JWT ๊ฒ€์ฆ ๋ฐ user_id ์ถ”์ถœ - R->>DB: SELECT * FROM conversation_logs
WHERE user_id = (:user_id)::uuid + R->>DB: SELECT * FROM conversation_log
WHERE user_id = (:user_id)::uuid DB-->>R: ๋Œ€ํ™” ๊ธฐ๋ก ๋ฐ˜ํ™˜ R->>R: DB row๋ฅผ Frontend ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
(user/robeing ๋ฉ”์‹œ์ง€ ๋ถ„๋ฆฌ) R-->>G: {"messages": [...], "has_more": true} @@ -66,8 +66,8 @@ def verify_jwt_token(token: str): ### 3.2 robeing ๋ผ์šฐํŒ… ```python -# workspace_members ํ…Œ์ด๋ธ” ์กฐํšŒ -SELECT robeing_id FROM workspace_members +# workspace_member ํ…Œ์ด๋ธ” ์กฐํšŒ +SELECT robeing_id FROM workspace_member WHERE user_id = :user_id # ๊ฒฐ๊ณผ: rb8001 ๋˜๋Š” rb10508_micro @@ -100,7 +100,7 @@ async def get_current_user(authorization: str = Header(None)): async def get_paginated_conversations(user_id: str, before: float = None, limit: int = 30): query = """ SELECT id, message, response, timestamp - FROM conversation_logs + FROM conversation_log WHERE user_id = (:user_id)::uuid AND robeing_id = 'rb8001' AND (:before::timestamp IS NULL OR timestamp < :before) @@ -175,18 +175,18 @@ CREATE TABLE users ( ); ``` -### 6.2 workspace_members ํ…Œ์ด๋ธ” +### 6.2 workspace_member ํ…Œ์ด๋ธ” ```sql -CREATE TABLE workspace_members ( +CREATE TABLE workspace_member ( user_id UUID REFERENCES users(id), workspace_id UUID, robeing_id VARCHAR(50) -- rb8001, rb10508_micro ๋“ฑ ); ``` -### 6.3 conversation_logs ํ…Œ์ด๋ธ” +### 6.3 conversation_log ํ…Œ์ด๋ธ” ```sql -CREATE TABLE conversation_logs ( +CREATE TABLE conversation_log ( id INTEGER PRIMARY KEY, robeing_id VARCHAR, message VARCHAR, diff --git a/300_architecture/sequences/daily_briefing_sequences.md b/300_architecture/sequences/daily_briefing_sequences.md index 960a554..02e5d56 100644 --- a/300_architecture/sequences/daily_briefing_sequences.md +++ b/300_architecture/sequences/daily_briefing_sequences.md @@ -64,13 +64,13 @@ sequenceDiagram DM->>Email: GET /messages
?user_id={slack_id}
&limit=5
&query=category:primary %% ํ† ํฐ ์ฒดํฌ ๋ฐ ๊ฐฑ์‹  - Email->>DB: SELECT * FROM gmail_tokens
WHERE user_id = ? + Email->>DB: SELECT * FROM gmail_token
WHERE user_id = ? DB-->>Email: token_data, refresh_token alt ํ† ํฐ ๋งŒ๋ฃŒ Email->>Auth: POST /api/gmail/refresh
Body: {user_id, refresh_token} Auth->>Auth: Google OAuth ํ† ํฐ ๊ฐฑ์‹  - Auth->>DB: UPDATE gmail_tokens + Auth->>DB: UPDATE gmail_token Auth-->>Email: ์ƒˆ access_token end @@ -127,7 +127,7 @@ sequenceDiagram rect rgb(255, 230, 230) Note over DM,Email: ์ด๋ฉ”์ผ ์ˆ˜์ง‘ ์‹คํŒจ DM->>Email: GET /messages - Email->>DB: SELECT gmail_tokens + Email->>DB: SELECT gmail_token DB-->>Email: token_data: NULL โŒ Email-->>DM: 500 Internal Server Error Note over DM: ์ด๋ฉ”์ผ ๋ฐ์ดํ„ฐ = [] @@ -199,7 +199,7 @@ docker logs rb8001 --tail 100 | grep daily-summary docker logs skill-email --tail 50 | grep ERROR # DB ํ† ํฐ ์ƒํƒœ -psql -U robeings -d main_db -c "SELECT user_id, token_data IS NOT NULL as has_token FROM gmail_tokens;" +psql -U robeings -d main_db -c "SELECT user_id, token_data IS NOT NULL as has_token FROM gmail_token;" ``` --- diff --git a/300_architecture/sequences/email_sequences.md b/300_architecture/sequences/email_sequences.md index f3c29aa..197b94a 100644 --- a/300_architecture/sequences/email_sequences.md +++ b/300_architecture/sequences/email_sequences.md @@ -53,7 +53,7 @@ sequenceDiagram Auth->>Google: ํ† ํฐ ๊ตํ™˜ ์š”์ฒญ Google-->>Auth: access_token, refresh_token - Auth->>DB: gmail_tokens ํ…Œ์ด๋ธ” ์ €์žฅ + Auth->>DB: gmail_token ํ…Œ์ด๋ธ” ์ €์žฅ Note over DB: user_id, email,
tokens (์•”ํ˜ธํ™”),
scopes, metadata Auth->>Auth: ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URL ๊ฒฐ์ • @@ -121,7 +121,7 @@ sequenceDiagram Gateway->>Monitor: ์•„์ดํ…œ ๋ชฉ๋ก ์š”์ฒญ Note over Monitor: X-User-Id ํ—ค๋”๋กœ
UUID ์ „๋‹ฌ - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ Note over DB: user_id๋กœ ํ•„ํ„ฐ๋ง Monitor->>DB: robeing_stats ์กฐํšŒ @@ -153,7 +153,7 @@ sequenceDiagram Gateway-->>Front: ๋ ˆ๋ฒจ ๋ถ€์กฑ ์—๋Ÿฌ Front->>Front: "๋ ˆ๋ฒจ 5๊ฐ€ ๋˜๋ฉด
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์š”!" ํ‘œ์‹œ else ๋ ˆ๋ฒจ >= 5 - Monitor->>DB: gmail_tokens ์—…๋ฐ์ดํŠธ + Monitor->>DB: gmail_token ์—…๋ฐ์ดํŠธ Note over DB: is_equipped = true
equipped_to = "rb10508_micro" Monitor->>DB: gmail_audit_logs ๊ธฐ๋ก @@ -203,7 +203,7 @@ sequenceDiagram RB->>Monitor: GET /api/items/gmail/status Note over Monitor: ์žฅ์ฐฉ ์ƒํƒœ ํ™•์ธ - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ DB-->>Monitor: ์žฅ์ฐฉ ์ •๋ณด alt Gmail ์•„์ดํ…œ ๋ฏธ์žฅ์ฐฉ @@ -216,7 +216,7 @@ sequenceDiagram RB->>Skill: POST /send-email Note over Skill: user_id, to,
subject, body - Skill->>DB: gmail_tokens ์กฐํšŒ + Skill->>DB: gmail_token ์กฐํšŒ Note over DB: user_id์™€ is_equipped ํ™•์ธ DB-->>Skill: access_token (๋ณตํ˜ธํ™”) @@ -232,7 +232,7 @@ sequenceDiagram Gmail-->>Skill: ๋ฐœ์†ก ์„ฑ๊ณต (message_id) Skill->>DB: ๋ฐœ์†ก ๋กœ๊ทธ ์ €์žฅ - Note over DB: conversation_logs ๋˜๋Š”
email_send_history + Note over DB: conversation_log ๋˜๋Š”
email_send_history Skill-->>RB: ๋ฐœ์†ก ๊ฒฐ๊ณผ RB->>DB: robeing_stats ๊ฒฝํ—˜์น˜ ์ฆ๊ฐ€ @@ -273,7 +273,7 @@ sequenceDiagram DB-->>RB: user_id, name: "๊น€์ข…ํƒœ" RB->>Monitor: Gmail ์•„์ดํ…œ ์ƒํƒœ ํ™•์ธ - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ alt ์•„์ดํ…œ ๋ฏธ์žฅ์ฐฉ DB-->>Monitor: is_equipped = false @@ -293,7 +293,7 @@ sequenceDiagram RB->>Skill: POST /send-email Note over Skill: to: goeun2dc@gmail.com
subject: "ํšŒ์˜ ์ผ์ • ์•ˆ๋‚ด"
body: LLM ์ƒ์„ฑ ๋‚ด์šฉ - Skill->>DB: gmail_tokens ์กฐํšŒ + Skill->>DB: gmail_token ์กฐํšŒ DB-->>Skill: access_token Skill->>Gmail: ์ด๋ฉ”์ผ ๋ฐœ์†ก @@ -302,7 +302,7 @@ sequenceDiagram Skill-->>RB: ๋ฐœ์†ก ์™„๋ฃŒ RB->>DB: ๋Œ€ํ™” ๋กœ๊ทธ ์ €์žฅ - Note over DB: conversation_logs์—
์ด๋ฉ”์ผ ๋ฐœ์†ก ๊ธฐ๋ก + Note over DB: conversation_log์—
์ด๋ฉ”์ผ ๋ฐœ์†ก ๊ธฐ๋ก RB-->>Slack: "์ข…ํƒœ๋‹˜๊ป˜ ํšŒ์˜ ์ผ์ • ๋ฉ”์ผ์„
๋ฐœ์†กํ–ˆ์Šต๋‹ˆ๋‹ค." end @@ -345,7 +345,7 @@ sequenceDiagram Auth->>Google: ํ† ํฐ ๊ตํ™˜ Google-->>Auth: ์ƒˆ access_token, refresh_token - Auth->>DB: gmail_tokens ์—…๋ฐ์ดํŠธ + Auth->>DB: gmail_token ์—…๋ฐ์ดํŠธ Note over DB: ์ƒˆ ํ† ํฐ์œผ๋กœ ๊ต์ฒด
updated_at ๊ฐฑ์‹  Auth->>DB: gmail_audit_logs ๊ธฐ๋ก @@ -372,7 +372,7 @@ sequenceDiagram Slack->>RB: ์ด๋ฉ”์ผ ์š”์ฒญ RB->>Monitor: Gmail ์•„์ดํ…œ ํ™•์ธ - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ DB-->>Monitor: ๊ฒฐ๊ณผ @@ -417,7 +417,7 @@ sequenceDiagram RB->>Skill: GET /list-emails Note over Skill: maxResults: 10
q: "is:unread" - Skill->>DB: gmail_tokens ์กฐํšŒ + Skill->>DB: gmail_token ์กฐํšŒ DB-->>Skill: access_token Skill->>Gmail: GET /gmail/v1/users/me/messages @@ -510,7 +510,7 @@ sequenceDiagram ## ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” -### gmail_tokens +### gmail_token - id: UUID - user_id: UUID (users ํ…Œ์ด๋ธ” ์ฐธ์กฐ) - robeing_id: VARCHAR (ํ†ต์ผ๋œ ์ปฌ๋Ÿผ๋ช…) diff --git a/300_architecture/sequences/items_sequences.md b/300_architecture/sequences/items_sequences.md index 7b9ef64..f5a46cb 100644 --- a/300_architecture/sequences/items_sequences.md +++ b/300_architecture/sequences/items_sequences.md @@ -41,7 +41,7 @@ graph TB subgraph Database PG[(PostgreSQL)] - GT[gmail_tokens] + GT[gmail_token] RS[robeing_stats] end @@ -87,7 +87,7 @@ sequenceDiagram Note over Gateway: JWT ํ† ํฐ ๊ฒ€์ฆ Gateway->>Monitor: GET /api/items/gmail
Header: X-User-Id - Monitor->>DB: SELECT * FROM gmail_tokens
WHERE user_id = ? + Monitor->>DB: SELECT * FROM gmail_token
WHERE user_id = ? DB-->>Monitor: ํ† ํฐ ๋ฐ์ดํ„ฐ Monitor->>Monitor: ์•„์ดํ…œ ์ƒํƒœ ๊ณ„์‚ฐ @@ -152,7 +152,7 @@ sequenceDiagram Auth->>Google: ์ฝ”๋“œ โ†’ ํ† ํฐ ๊ตํ™˜ Google-->>Auth: Access Token + Refresh Token - Auth->>DB: INSERT INTO gmail_tokens + Auth->>DB: INSERT INTO gmail_token Note over DB: token_data, scopes,
metadata (email ๋“ฑ) Auth->>Front: ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ /inventory?success=true @@ -192,7 +192,7 @@ sequenceDiagram Monitor->>DB: ํ† ํฐ ์†Œ์œ ๊ถŒ ํ™•์ธ DB-->>Monitor: ํ† ํฐ ์กด์žฌ ํ™•์ธ - Monitor->>DB: UPDATE gmail_tokens
SET is_equipped = true,
equipped_to = 'rb10508_micro' + Monitor->>DB: UPDATE gmail_token
SET is_equipped = true,
equipped_to = 'rb10508_micro' DB-->>Monitor: ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ Monitor->>DB: INSERT INTO gmail_audit_logs @@ -222,11 +222,11 @@ sequenceDiagram DB-->>Monitor: level: 3 Monitor-->>Front: {error: "๋ ˆ๋ฒจ 5 ์ด์ƒ ํ•„์š”"} else ํ† ํฐ ์—†์Œ - Monitor->>DB: SELECT * FROM gmail_tokens + Monitor->>DB: SELECT * FROM gmail_token DB-->>Monitor: null Monitor-->>Front: {error: "Gmail ์—ฐ๊ฒฐ ํ•„์š”"} else ์ด๋ฏธ ์žฅ์ฐฉ๋จ - Monitor->>DB: SELECT is_equipped FROM gmail_tokens + Monitor->>DB: SELECT is_equipped FROM gmail_token DB-->>Monitor: is_equipped: true Monitor-->>Front: {error: "์ด๋ฏธ ์žฅ์ฐฉ๋จ"} end @@ -254,7 +254,7 @@ sequenceDiagram RB->>Monitor: GET /api/items/gmail Note over Monitor: Header: X-User-Id - Monitor->>DB: SELECT * FROM gmail_tokens
WHERE user_id = ? + Monitor->>DB: SELECT * FROM gmail_token
WHERE user_id = ? DB-->>Monitor: ํ† ํฐ ๋ฐ์ดํ„ฐ Monitor-->>RB: {equipped: {is_equipped: true,
capabilities: {send: true, read: true}}} @@ -263,7 +263,7 @@ sequenceDiagram RB->>SE: POST /process Note over SE: message: "์ตœ๊ทผ ์ด๋ฉ”์ผ ํ™•์ธ" - SE->>DB: SELECT token_data FROM gmail_tokens + SE->>DB: SELECT token_data FROM gmail_token DB-->>SE: OAuth ํ† ํฐ SE->>SE: Gmail API ํ˜ธ์ถœ @@ -314,7 +314,7 @@ sequenceDiagram User->>Front: "ํ•ด์ œ" ๋ฒ„ํŠผ ํด๋ฆญ Front->>Monitor: POST /api/items/gmail/{userId}/unequip - Monitor->>DB: UPDATE gmail_tokens
SET is_equipped = false,
equipped_to = null + Monitor->>DB: UPDATE gmail_token
SET is_equipped = false,
equipped_to = null DB-->>Monitor: ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ Monitor->>DB: INSERT INTO gmail_audit_logs @@ -367,7 +367,7 @@ sequenceDiagram Note over Front: ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ Front->>Monitor: GET /api/items/gmail - Monitor->>DB: SELECT * FROM gmail_tokens + Monitor->>DB: SELECT * FROM gmail_token DB-->>Monitor: is_equipped: true Monitor-->>Front: ์žฅ์ฐฉ ์ƒํƒœ ๋ฐ˜ํ™˜ @@ -384,14 +384,14 @@ sequenceDiagram participant Auth as auth-server participant Google as Google OAuth - SE->>DB: SELECT token_data FROM gmail_tokens + SE->>DB: SELECT token_data FROM gmail_token DB-->>SE: ํ† ํฐ (๋งŒ๋ฃŒ๋จ) SE->>Auth: ํ† ํฐ ๊ฐฑ์‹  ์š”์ฒญ Auth->>Google: Refresh Token ์‚ฌ์šฉ Google-->>Auth: ์ƒˆ Access Token - Auth->>DB: UPDATE gmail_tokens
SET token_data = ? + Auth->>DB: UPDATE gmail_token
SET token_data = ? DB-->>Auth: ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ Auth-->>SE: ์ƒˆ ํ† ํฐ diff --git a/300_architecture/uuid_conversion_system.md b/300_architecture/uuid_conversion_system.md index 9c1963c..8668650 100644 --- a/300_architecture/uuid_conversion_system.md +++ b/300_architecture/uuid_conversion_system.md @@ -221,20 +221,20 @@ for slack_id, name in slack_ids.items(): ```sql -- 1. ์ž„์‹œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€ -ALTER TABLE gmail_tokens ADD COLUMN user_uuid UUID; +ALTER TABLE gmail_token ADD COLUMN user_uuid UUID; -- 2. UUID ๋งคํ•‘ -UPDATE gmail_tokens gt +UPDATE gmail_token gt SET user_uuid = u.id FROM users u WHERE gt.user_id = u.username; -- 3. ๊ธฐ์กด ์ปฌ๋Ÿผ ์ œ๊ฑฐ ๋ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ -ALTER TABLE gmail_tokens DROP COLUMN user_id; -ALTER TABLE gmail_tokens RENAME COLUMN user_uuid TO user_id; +ALTER TABLE gmail_token DROP COLUMN user_id; +ALTER TABLE gmail_token RENAME COLUMN user_uuid TO user_id; -- 4. ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ ์ถ”๊ฐ€ -ALTER TABLE gmail_tokens +ALTER TABLE gmail_token ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id); ``` diff --git a/_archive/docs/architecture/auth-server-database-schema.md b/_archive/docs/architecture/auth-server-database-schema.md index 3e00e69..e4af3b5 100644 --- a/_archive/docs/architecture/auth-server-database-schema.md +++ b/_archive/docs/architecture/auth-server-database-schema.md @@ -10,10 +10,10 @@ auth-server๋Š” ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž ์ธ์ฆ๋ณด๋‹ค๋Š” **ํšŒ์‚ฌ๋ณ„ Slack ๋ด‡ ์ธ์ฆ ๋ฐ ## ํ…Œ์ด๋ธ” ๊ตฌ์กฐ -### 1. companies (ํšŒ์‚ฌ/์กฐ์ง ๊ด€๋ฆฌ) +### 1. company (ํšŒ์‚ฌ/์กฐ์ง ๊ด€๋ฆฌ) ```sql -CREATE TABLE companies ( +CREATE TABLE company ( id uuid PRIMARY KEY, name varchar(255) NOT NULL, subdomain varchar(100) NOT NULL UNIQUE, @@ -41,7 +41,7 @@ CREATE TABLE companies ( ```sql CREATE TABLE slack_workspaces ( id uuid PRIMARY KEY, - company_id uuid NOT NULL REFERENCES companies(id), + company_id uuid NOT NULL REFERENCES company(id), team_id varchar(100) NOT NULL UNIQUE, team_name varchar(255), bot_token text, @@ -71,7 +71,7 @@ CREATE TABLE slack_workspaces ( **์ธ๋ฑ์Šค**: - Primary Key: `id` - Unique: `team_id` -- Foreign Key: `company_id` โ†’ `companies(id)` +- Foreign Key: `company_id` โ†’ `company(id)` ## ํ˜„์žฌ ๋ฐ์ดํ„ฐ ํ˜„ํ™ฉ diff --git a/_archive/docs/architecture/frontend-architecture-strategy.md b/_archive/docs/architecture/frontend-architecture-strategy.md index 95d11af..519b5b2 100644 --- a/_archive/docs/architecture/frontend-architecture-strategy.md +++ b/_archive/docs/architecture/frontend-architecture-strategy.md @@ -88,7 +88,7 @@ ```sql -- PostgreSQL@51123:5432 โ”œโ”€โ”€ main_db (๊ธฐ์กด) -โ”‚ โ”œโ”€โ”€ companies +โ”‚ โ”œโ”€โ”€ company โ”‚ โ””โ”€โ”€ slack_workspaces โ”‚ โ””โ”€โ”€ robbing_db (์‹ ๊ทœ ์ œ์•ˆ) @@ -117,7 +117,7 @@ WS /ws/robbing/realtime # ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ์—…๋ฐ์ดํŠธ **์œ„์น˜**: auth-server ๋‚ด์žฅ ๋˜๋Š” ๋ณ„๋„ React ์•ฑ **๋ฐ์ดํ„ฐ ์ €์žฅ**: -- ํšŒ์‚ฌ ์ •๋ณด: PostgreSQL `main_db.companies` +- ํšŒ์‚ฌ ์ •๋ณด: PostgreSQL `main_db.company` - ์„ธ์…˜ ๊ด€๋ฆฌ: JWT ํ† ํฐ - OAuth ํ† ํฐ: ํŒŒ์ผ์‹œ์Šคํ…œ `/tokens/` diff --git a/_archive/docs/architecture/๋กœ๋น™_์•„ํ‚คํ…์ณ_์„ค๊ณ„_๊ฒฝ๋Ÿ‰.md b/_archive/docs/architecture/๋กœ๋น™_์•„ํ‚คํ…์ณ_์„ค๊ณ„_๊ฒฝ๋Ÿ‰.md index c3163c5..df71d10 100644 --- a/_archive/docs/architecture/๋กœ๋น™_์•„ํ‚คํ…์ณ_์„ค๊ณ„_๊ฒฝ๋Ÿ‰.md +++ b/_archive/docs/architecture/๋กœ๋น™_์•„ํ‚คํ…์ณ_์„ค๊ณ„_๊ฒฝ๋Ÿ‰.md @@ -119,7 +119,7 @@ async def level_up_user(user_id: str, stat: str, points: int): ```sql -- PostgreSQL ์Šคํ‚ค๋งˆ -CREATE TABLE companies ( +CREATE TABLE company ( id UUID PRIMARY KEY, name VARCHAR(255), slack_workspace_id VARCHAR(50) UNIQUE, @@ -132,7 +132,7 @@ CREATE TABLE companies ( CREATE TABLE users ( id UUID PRIMARY KEY, - company_id UUID REFERENCES companies(id), + company_id UUID REFERENCES company(id), slack_user_id VARCHAR(50), stats JSONB DEFAULT '{"์—ฐ์‚ฐ": 0, "๊ธฐ์–ต": 0, "๊ณต๊ฐ": 0, "ํ†ต์†”": 0, "๋ฐ˜์‘": 0}', level INTEGER DEFAULT 1, diff --git a/ideas/250810_auth_system_analysis.md b/ideas/250810_auth_system_analysis.md index 2c7083a..7419895 100644 --- a/ideas/250810_auth_system_analysis.md +++ b/ideas/250810_auth_system_analysis.md @@ -299,7 +299,7 @@ email โ†” slack_id โ†” username ##### ํ˜„์žฌ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ (5๊ฐœ) - **users**: ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด (email, username) - **workspaces**: ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด (๋กœ๋น™ ํ• ๋‹น) -- **workspace_members**: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ +- **workspace_member**: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ - **slack_workspaces**: Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด - **slack_user_mapping**: Slack ID โ†” User ID ๋งคํ•‘ (3๊ฐœ๋งŒ ์กด์žฌ) diff --git a/ideas/250812_claude_Slack_๋ฉ”์‹œ์ง€_์ฒ˜๋ฆฌ_์•„ํ‚คํ…์ฒ˜_๋ถ„์„.md b/ideas/250812_claude_Slack_๋ฉ”์‹œ์ง€_์ฒ˜๋ฆฌ_์•„ํ‚คํ…์ฒ˜_๋ถ„์„.md index 05cdc8c..0e3047f 100644 --- a/ideas/250812_claude_Slack_๋ฉ”์‹œ์ง€_์ฒ˜๋ฆฌ_์•„ํ‚คํ…์ฒ˜_๋ถ„์„.md +++ b/ideas/250812_claude_Slack_๋ฉ”์‹œ์ง€_์ฒ˜๋ฆฌ_์•„ํ‚คํ…์ฒ˜_๋ถ„์„.md @@ -298,16 +298,16 @@ class SlackItem(APIItem): - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด (robeing_id, robeing_port, robeing_url ํฌํ•จ) - ํ˜„์žฌ 1๊ฐœ ์›Œํฌ์ŠคํŽ˜์ด์Šค: ivada-robeing (rb10508_micro ์‚ฌ์šฉ) -3. **workspace_members ํ…Œ์ด๋ธ”** +3. **workspace_member ํ…Œ์ด๋ธ”** - ์‚ฌ์šฉ์ž์™€ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ - robeing_id ํ•„๋“œ๋กœ ๊ฐ ๋ฉค๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•  ๋กœ๋น™ ์ง€์ • ๊ฐ€๋Šฅ 4. **slack_workspaces ํ…Œ์ด๋ธ”** - Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด (team_id, bot_token, bot_user_id ๋“ฑ) - 2๊ฐœ Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋“ฑ๋ก๋จ (GoodGang Labs, test) - - companies ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋จ + - company ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋จ -5. **companies ํ…Œ์ด๋ธ”** +5. **company ํ…Œ์ด๋ธ”** - ํšŒ์‚ฌ ์ •๋ณด ๊ด€๋ฆฌ - slack_workspaces์™€ 1:N ๊ด€๊ณ„ @@ -329,7 +329,7 @@ CREATE TABLE slack_user_mapping ( slack_user_id VARCHAR(100) NOT NULL, slack_workspace_id INTEGER REFERENCES slack_workspaces(id), user_id UUID REFERENCES users(id), - workspace_member_id UUID REFERENCES workspace_members(id), + workspace_member_id UUID REFERENCES workspace_member(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(slack_user_id, slack_workspace_id) @@ -345,7 +345,7 @@ slack_user_mapping ์กฐํšŒ โ†“ user_id ํš๋“ โ†“ -workspace_members์—์„œ robeing_id ํ™•์ธ +workspace_member์—์„œ robeing_id ํ™•์ธ โ†“ ํ•ด๋‹น ๋กœ๋น™์œผ๋กœ ๋ผ์šฐํŒ… โ†“ diff --git a/ideas/250818_conversation_logs_๋ฐ_robing_stats_ํ™œ์šฉ_๊ณ„ํš.md b/ideas/250818_conversation_logs_๋ฐ_robing_stats_ํ™œ์šฉ_๊ณ„ํš.md index 4e15e3c..0a39749 100644 --- a/ideas/250818_conversation_logs_๋ฐ_robing_stats_ํ™œ์šฉ_๊ณ„ํš.md +++ b/ideas/250818_conversation_logs_๋ฐ_robing_stats_ํ™œ์šฉ_๊ณ„ํš.md @@ -1,4 +1,4 @@ -# conversation_logs ๋ฐ robeing_stats ํ…Œ์ด๋ธ” ํ™œ์šฉ ๊ณ„ํš +# conversation_log ๋ฐ robeing_stats ํ…Œ์ด๋ธ” ํ™œ์šฉ ๊ณ„ํš ์ž‘์„ฑ์ผ: 2025๋…„ 8์›” 18์ผ ์ž‘์„ฑ์ž: Claude (51123 ์„œ๋ฒ„) @@ -9,7 +9,7 @@ ### 1.1 ๋ฏธ์‚ฌ์šฉ ํ…Œ์ด๋ธ” ํ˜„ํ™ฉ ```sql -- main_db์— ์กด์žฌํ•˜์ง€๋งŒ ์ „ํ˜€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”๋“ค -conversation_logs: 0 records (0 KB) +conversation_log: 0 records (0 KB) robeing_stats: 0 records (0 KB) robeing_settings: 0 records (0 KB) ``` @@ -25,11 +25,11 @@ robeing_settings: 0 records (0 KB) 3. **๊ฐœ์ธํ™” ๋ถˆ๊ฐ€**: ์‚ฌ์šฉ์ž๋ณ„ ์„ค์ •์ด ์ €์žฅ๋˜์ง€ ์•Š์Œ 4. **๋ถ„์„ ๋ถˆ๊ฐ€**: ์‚ฌ์šฉ ํŒจํ„ด, ์„ฑ๋Šฅ ์ง€ํ‘œ ์ถ”์  ๋ถˆ๊ฐ€ -## 2. conversation_logs ํ…Œ์ด๋ธ” ํ™œ์šฉ ๋ฐฉ์•ˆ +## 2. conversation_log ํ…Œ์ด๋ธ” ํ™œ์šฉ ๋ฐฉ์•ˆ ### 2.1 ํ…Œ์ด๋ธ” ๊ตฌ์กฐ (ํ˜„์žฌ) ```sql -CREATE TABLE conversation_logs ( +CREATE TABLE conversation_log ( id INTEGER PRIMARY KEY (auto-increment), robeing_id VARCHAR, channel_id VARCHAR, @@ -70,7 +70,7 @@ class ConversationLogger: """๋Œ€ํ™” ๋‚ด์šฉ์„ DB์— ์ €์žฅ""" async with asyncpg.connect(self.db_url) as conn: await conn.execute(""" - INSERT INTO conversation_logs + INSERT INTO conversation_log (id, robeing_id, user_id, message, response, created_at, metadata) VALUES ($1, $2, $3, $4, $5, $6, $7) """, @@ -307,7 +307,7 @@ skill_settings = { ## 5. ๊ตฌํ˜„ ์šฐ์„ ์ˆœ์œ„ ### Phase 1: ์ฆ‰์‹œ ๊ตฌํ˜„ (1์ฃผ์ผ) -1. **conversation_logs ์ €์žฅ ๊ธฐ๋Šฅ** +1. **conversation_log ์ €์žฅ ๊ธฐ๋Šฅ** - ๋ชจ๋“  ๋Œ€ํ™”๋ฅผ DB์— ์ €์žฅ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จ (์ฑ„๋„, ์‹œ๊ฐ„ ๋“ฑ) @@ -337,12 +337,12 @@ skill_settings = { ### 6.1 ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ํ•„์š” ```sql --- conversation_logs ๋น ๋ฅธ ์กฐํšŒ +-- conversation_log ๋น ๋ฅธ ์กฐํšŒ CREATE INDEX idx_conversation_user_time -ON conversation_logs(user_id, created_at DESC); +ON conversation_log(user_id, created_at DESC); CREATE INDEX idx_conversation_robeing_time -ON conversation_logs(robeing_id, created_at DESC); +ON conversation_log(robeing_id, created_at DESC); -- robeing_stats ๋น ๋ฅธ ์กฐํšŒ CREATE INDEX idx_robeing_stats_robeing @@ -363,7 +363,7 @@ ON robeing_stats(robeing_id); ```sql -- ์ผ์ผ ๋Œ€ํ™”๋Ÿ‰ SELECT DATE(created_at), COUNT(*) -FROM conversation_logs +FROM conversation_log GROUP BY DATE(created_at); -- ๋กœ๋น™๋ณ„ ํ™œ๋™ @@ -396,7 +396,7 @@ FROM robeing_stats; ## 9. ์ฃผ์˜์‚ฌํ•ญ ### 9.1 ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ -- conversation_logs์— ๋ฏผ๊ฐ ์ •๋ณด ๋งˆ์Šคํ‚น +- conversation_log์— ๋ฏผ๊ฐ ์ •๋ณด ๋งˆ์Šคํ‚น - GDPR ์ค€์ˆ˜ (์‚ญ์ œ ์š”์ฒญ ์ฒ˜๋ฆฌ) - ์•”ํ˜ธํ™” ๊ณ ๋ ค diff --git a/ideas/250819_๋Œ€ํ™”ํ˜•_์ ์ง„์ _์˜๋„_๊ตฌ์ถ•_์‹œ์Šคํ…œ.md b/ideas/250819_๋Œ€ํ™”ํ˜•_์ ์ง„์ _์˜๋„_๊ตฌ์ถ•_์‹œ์Šคํ…œ.md index b77d9fc..09c7c05 100644 --- a/ideas/250819_๋Œ€ํ™”ํ˜•_์ ์ง„์ _์˜๋„_๊ตฌ์ถ•_์‹œ์Šคํ…œ.md +++ b/ideas/250819_๋Œ€ํ™”ํ˜•_์ ์ง„์ _์˜๋„_๊ตฌ์ถ•_์‹œ์Šคํ…œ.md @@ -217,7 +217,7 @@ flowchart TD ## 3.4 ์‹œ๊ฐ„ ์ธ์‹ ์˜๋„ ์ฒ˜๋ฆฌ (์‹ ๊ทœ ์ถ”๊ฐ€ 2025-09-09) ### 3.4.1 ์‹ค์ œ ๋Œ€ํ™” ๋กœ๊ทธ ๋ถ„์„ ๊ฒฐ๊ณผ -2025๋…„ 9์›” 9์ผ PostgreSQL conversation_logs ํ…Œ์ด๋ธ” ๋ถ„์„ ๊ฒฐ๊ณผ, ๋กœ๋น™์˜ ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” **์‹œ๊ฐ„ ์ธ์‹ ๋ถ€์žฌ**์ž…๋‹ˆ๋‹ค. +2025๋…„ 9์›” 9์ผ PostgreSQL conversation_log ํ…Œ์ด๋ธ” ๋ถ„์„ ๊ฒฐ๊ณผ, ๋กœ๋น™์˜ ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” **์‹œ๊ฐ„ ์ธ์‹ ๋ถ€์žฌ**์ž…๋‹ˆ๋‹ค. ``` ์‹ค์ œ ์‚ฌ๋ก€: @@ -250,7 +250,7 @@ CONTEXT_RETRIEVAL_PATTERNS = { # DB์—์„œ ๊ณผ๊ฑฐ ๋Œ€ํ™” ์กฐํšŒ ํ•„์ˆ˜ if pattern_matches(CONTEXT_RETRIEVAL_PATTERNS): - past_logs = await fetch_conversation_logs( + past_logs = await fetch_conversation_log( user_id=user_id, time_range="-2 hours", limit=5 diff --git a/plans/000000_unresolved_items_matrix.md b/plans/000000_unresolved_items_matrix.md index 2fc3cf8..bd591a9 100644 --- a/plans/000000_unresolved_items_matrix.md +++ b/plans/000000_unresolved_items_matrix.md @@ -26,7 +26,7 @@ 1. **์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”** - WebSocket/ํด๋ง ๋ฏธ๊ตฌํ˜„ (์˜ํ–ฅ๋„ ์žฌํ‰๊ฐ€ ํ•„์š”) (2์ฃผ) [โ†’250827](../troubleshooting/250827_frontend_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md) 2. **PKCE ์ ์šฉ** - OAuth ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฏธ๊ตฌํ˜„ (1์ฃผ) [โ†’380](../300_architecture/380_authentication_system.md) 3. **Refresh Token** - ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์ฒด๊ณ„ ๋ฏธ๊ตฌํ˜„ (1์ฃผ) [โ†’380](../300_architecture/380_authentication_system.md) -4. **DB ์Šคํ‚ค๋งˆ ํ†ต์ผ** - companiesโ†’workspaces ๋ฏธ๊ตฌํ˜„ (2์ฃผ) [โ†’250831](250831_todo_and_tech_debt.md) +4. **DB ์Šคํ‚ค๋งˆ ํ†ต์ผ** - companyโ†’workspaces ๋ฏธ๊ตฌํ˜„ (2์ฃผ) [โ†’250831](250831_todo_and_tech_debt.md) 5. **์Šคํ‚ฌ ๋ผ์šฐํŒ… ๊ณ ๋„ํ™”** - Decision Engine ๋ฏธ๊ตฌํ˜„ (3์ฃผ) [โ†’250811](../ideas/250811_claude_rb10408_vs_rb10508_๋น„๊ต๋ถ„์„.md) 6. **IntentAnalyzer ํ™œ์„ฑํ™”** - ํ˜„์žฌ ๋ฏธ์‚ฌ์šฉ, LLM ๊ธฐ๋ฐ˜ ์˜๋„๋ถ„์„๊ธฐ ๋ฏธ์—ฐ๋™ (1์ฃผ) [โ†’250914](../troubleshooting/250914_happybell80_IntentAnalyzer_๋ฏธ์‚ฌ์šฉ_๋ฌธ์ œ.md) 7. **์ „์—ญ ENV ๊ฐ์‚ฌ** - ๋ ˆํฌ ์ „๋ฐ˜ ๋ฏธ์‚ฌ์šฉ/์ค‘๋ณต ENV ์ •๋ฆฌ ๋ฏธ๊ตฌํ˜„ (2์ฃผ) diff --git a/plans/250831_todo_and_tech_debt.md b/plans/250831_todo_and_tech_debt.md index f1b7493..a860cc8 100644 --- a/plans/250831_todo_and_tech_debt.md +++ b/plans/250831_todo_and_tech_debt.md @@ -16,12 +16,12 @@ ### 2. DB ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜ **๋ฌธ์ œ**: -- companies vs workspaces ํ…Œ์ด๋ธ” ๊ณต์กด +- company vs workspaces ํ…Œ์ด๋ธ” ๊ณต์กด - SlackWorkspace ๋ชจ๋ธ FK ์˜ค๋ฅ˜ (company_id๋ฅผ workspace_id๋กœ ์ฐธ์กฐ) **ํ•ด๊ฒฐ ๊ณ„ํš**: 1. ๋ฐ์ดํ„ฐ ๋ฐฑ์—… -2. companies โ†’ workspaces ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +2. company โ†’ workspaces ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 3. FK ๊ด€๊ณ„ ์žฌ์„ค์ • 4. ๋ชจ๋ธ ํŒŒ์ผ ํ†ต์ผ @@ -99,7 +99,7 @@ fetch('https://auth.ro-being.com/auth/verify') ## ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] ํ•˜๋“œ์ฝ”๋”ฉ URL ํ™˜๊ฒฝ๋ณ€์ˆ˜ํ™” -- [ ] DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (companies โ†’ workspaces) +- [ ] DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (company โ†’ workspaces) - [ ] ์ž„์‹œ ์ฝ”๋“œ ๋ฐฉ์‹ ์ œ๊ฑฐ - [ ] UserIdentityService ๊ตฌํ˜„ - [ ] Refresh Token ๊ตฌํ˜„ diff --git a/plans/250831_unified_id_system_implementation_roadmap.md b/plans/250831_unified_id_system_implementation_roadmap.md index 462b9ec..4305c64 100644 --- a/plans/250831_unified_id_system_implementation_roadmap.md +++ b/plans/250831_unified_id_system_implementation_roadmap.md @@ -50,9 +50,9 @@ SET user_uuid = ( AND sum.team_id = gp.team_id ); --- workspace_members UUID ํ™•์ธ -ALTER TABLE workspace_members -ADD CONSTRAINT fk_workspace_members_user_id +-- workspace_member UUID ํ™•์ธ +ALTER TABLE workspace_member +ADD CONSTRAINT fk_workspace_member_user_id FOREIGN KEY (user_id) REFERENCES users(id); ``` @@ -406,4 +406,4 @@ if not uuid_mapping: - [250828_slack_auth_integration_completed.md](../troubleshooting/250828_slack_auth_integration_completed.md) - [250828_slack_integration_level3_plan.md](./250828_slack_integration_level3_plan.md) -- [250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md](../troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) \ No newline at end of file +- [250828_conversation_log_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md](../troubleshooting/250828_conversation_log_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) \ No newline at end of file diff --git a/plans/250831_workspace_unification_plan.md b/plans/250831_workspace_unification_plan.md index 170aac3..2d4bec7 100644 --- a/plans/250831_workspace_unification_plan.md +++ b/plans/250831_workspace_unification_plan.md @@ -3,21 +3,21 @@ ## ์ž‘์„ฑ์ผ: 2025๋…„ 8์›” 31์ผ ## ๐ŸŽฏ ๋ชฉํ‘œ -`companies` ํ…Œ์ด๋ธ”๊ณผ `workspaces` ํ…Œ์ด๋ธ”์„ `workspaces`๋กœ ํ†ตํ•ฉํ•˜์—ฌ DB ์Šคํ‚ค๋งˆ ์ผ๊ด€์„ฑ ํ™•๋ณด +`company` ํ…Œ์ด๋ธ”๊ณผ `workspaces` ํ…Œ์ด๋ธ”์„ `workspaces`๋กœ ํ†ตํ•ฉํ•˜์—ฌ DB ์Šคํ‚ค๋งˆ ์ผ๊ด€์„ฑ ํ™•๋ณด ## ๐Ÿ“Š ํ˜„์žฌ ์ƒํ™ฉ ### ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋น„๊ต -| ๊ตฌ๋ถ„ | companies | workspaces | +| ๊ตฌ๋ถ„ | company | workspaces | |------|-----------|------------| | **ํฌํŠธ ์ปฌ๋Ÿผ** | `container_port` | `robeing_port` | -| **FK ์ฐธ์กฐ** | `slack_workspaces.company_id` | `workspace_members.workspace_id` | +| **FK ์ฐธ์กฐ** | `slack_workspaces.company_id` | `workspace_member.workspace_id` | | **์ถ”๊ฐ€ ์ปฌ๋Ÿผ** | - | `robeing_id`, `robeing_url`, `max_members`, `workspace_type` | | **๋ฐ์ดํ„ฐ** | 4๊ฐœ ๋ ˆ์ฝ”๋“œ | 2๊ฐœ ๋ ˆ์ฝ”๋“œ | ### ๋ฌธ์ œ์  1. ์ค‘๋ณต ๋ฐ์ดํ„ฐ (Company-X๊ฐ€ ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ์กด์žฌ) -2. FK ๊ด€๊ณ„ ๋ถˆ์ผ์น˜ (slack_workspaces โ†’ companies, workspace_members โ†’ workspaces) +2. FK ๊ด€๊ณ„ ๋ถˆ์ผ์น˜ (slack_workspaces โ†’ company, workspace_member โ†’ workspaces) 3. ์ฝ”๋“œ์—์„œ ์ž˜๋ชป๋œ ์ฐธ์กฐ (`workspace.workspace`, `workspace.robeing_port`) ## ๐Ÿ”ง ์ž‘์—… ๊ณ„ํš @@ -25,15 +25,15 @@ ### Phase 1: DB ๋ฐฑ์—… ๋ฐ ์ค€๋น„ ```bash # ๋ฐฑ์—… ์ƒ์„ฑ -sudo -u postgres pg_dump -t companies -t workspaces -t slack_workspaces main_db > /home/admin/backup_workspace_$(date +%Y%m%d_%H%M%S).sql +sudo -u postgres pg_dump -t company -t workspaces -t slack_workspaces main_db > /home/admin/backup_workspace_$(date +%Y%m%d_%H%M%S).sql ``` ### Phase 2: DB ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ```sql --- 1. companies ๋ฐ์ดํ„ฐ๋ฅผ workspaces๋กœ ์ด๋™ +-- 1. company ๋ฐ์ดํ„ฐ๋ฅผ workspaces๋กœ ์ด๋™ INSERT INTO workspaces (id, name, subdomain, robeing_port, status, created_at, updated_at) SELECT id, name, subdomain, container_port, status, created_at, updated_at -FROM companies +FROM company WHERE id NOT IN (SELECT id FROM workspaces); -- 2. slack_workspaces ํ…Œ์ด๋ธ” ์ˆ˜์ • @@ -48,8 +48,8 @@ ALTER TABLE slack_workspaces ADD CONSTRAINT slack_workspaces_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspaces(id); --- 3. companies ํ…Œ์ด๋ธ” ์ œ๊ฑฐ -DROP TABLE companies CASCADE; +-- 3. company ํ…Œ์ด๋ธ” ์ œ๊ฑฐ +DROP TABLE company CASCADE; ``` ### Phase 3: ์ฝ”๋“œ ์ˆ˜์ • @@ -123,7 +123,7 @@ curl -X POST https://auth.ro-being.com/slack/events/router \ ```bash cd /home/admin/auth-server git add -A -git commit -m "refactor: companies ํ…Œ์ด๋ธ”์„ workspaces๋กœ ํ†ตํ•ฉ" +git commit -m "refactor: company ํ…Œ์ด๋ธ”์„ workspaces๋กœ ํ†ตํ•ฉ" git push origin main ``` @@ -154,9 +154,9 @@ sudo -u postgres psql main_db < /home/admin/backup_workspace_YYYYMMDD_HHMMSS.sql ## ๐Ÿ“ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] DB ๋ฐฑ์—… ์™„๋ฃŒ -- [ ] companies โ†’ workspaces ๋ฐ์ดํ„ฐ ์ด๋™ +- [ ] company โ†’ workspaces ๋ฐ์ดํ„ฐ ์ด๋™ - [ ] slack_workspaces FK ๋ณ€๊ฒฝ -- [ ] companies ํ…Œ์ด๋ธ” ์‚ญ์ œ +- [ ] company ํ…Œ์ด๋ธ” ์‚ญ์ œ - [ ] workspace.py ๋ชจ๋ธ ์ˆ˜์ • - [ ] slack_router.py ์ˆ˜์ • - [ ] slack.py provider ์ˆ˜์ • diff --git a/plans/250911_main_db3_migration_plan.md b/plans/250911_main_db3_migration_plan.md index e372782..1ac9eb2 100644 --- a/plans/250911_main_db3_migration_plan.md +++ b/plans/250911_main_db3_migration_plan.md @@ -9,7 +9,7 @@ ### main_db3 (์‚ญ์ œ ์˜ˆ์ •) - ์ด 13๊ฐœ ํ…Œ์ด๋ธ”, 614๊ฐœ ๋ ˆ์ฝ”๋“œ -- ์ฃผ์š” ๋ฐ์ดํ„ฐ: users(17), companies(4), conversation_logs(555) +- ์ฃผ์š” ๋ฐ์ดํ„ฐ: users(17), company(4), conversation_log(555) - Slack/Gmail ์—ฐ๋™ ๋ฐ์ดํ„ฐ ๋ณด์œ  ### main_db (์šด์˜ DB) @@ -22,14 +22,14 @@ | main_db3 | main_db | ๋น„๊ณ  | |----------|---------|------| -| companies | company | 2๊ฐœ ์ค‘๋ณต ํ™•์ธ ํ•„์š” | +| company | company | 2๊ฐœ ์ค‘๋ณต ํ™•์ธ ํ•„์š” | | users | user | team_id ํ•„์ˆ˜ ์ถ”๊ฐ€ | | workspaces | team | ๊ตฌ์กฐ ๋ณ€ํ™˜ ํ•„์š” | -| workspace_members | workspace_member | user_id ๋งคํ•‘ | +| workspace_member | workspace_member | user_id ๋งคํ•‘ | | slack_workspaces | slack_workspace | team_id ๋งคํ•‘ | | user_preferences | user_preference | slack_user_id ์ œ๊ฑฐ๋จ | -| conversation_logs | conversation_log | robeing_id ์ปฌ๋Ÿผ ์—†์Œ | -| gmail_tokens | gmail_token | ๊ตฌ์กฐ ๋™์ผ | +| conversation_log | conversation_log | robeing_id ์ปฌ๋Ÿผ ์—†์Œ | +| gmail_token | gmail_token | ๊ตฌ์กฐ ๋™์ผ | | robeing_stats | robeing | product_id, team_id ์ถ”๊ฐ€ | | slack_user_mapping | - | workspace_member๋กœ ํ†ตํ•ฉ | @@ -39,10 +39,10 @@ ### Phase 1: ์กฐ์ง ๊ตฌ์กฐ (ํ•„์ˆ˜ ์„ ํ–‰) ```sql --- 1. companies โ†’ company (์ค‘๋ณต ์ œ์™ธ) +-- 1. company โ†’ company (์ค‘๋ณต ์ œ์™ธ) INSERT INTO company (id, name, url, created_at, updated_at) SELECT id, name, domain, created_at, updated_at -FROM main_db3.companies +FROM main_db3.company WHERE id NOT IN ('28f17b47-33f8-47ac-b1ae-100e77b37edb', '99d22d6b-d327-4fa4-bd2f-d228c11056e2'); -- 2. workspaces โ†’ team ๋ณ€ํ™˜ @@ -58,11 +58,11 @@ SELECT u.id, COALESCE(wm.workspace_id, '38bdc27d-cb01-4960-867e-41733d2f3529'), -- ๊ธฐ๋ณธ ํŒ€ u.email, u.name, u.username, u.oauth_provider, u.oauth_id, u.is_active FROM main_db3.users u -LEFT JOIN main_db3.workspace_members wm ON u.id = wm.user_id; +LEFT JOIN main_db3.workspace_member wm ON u.id = wm.user_id; --- 4. workspace_members โ†’ workspace_member (slack_user_id ์ถ”๊ฐ€ ์˜ˆ์ •) +-- 4. workspace_member โ†’ workspace_member (slack_user_id ์ถ”๊ฐ€ ์˜ˆ์ •) INSERT INTO workspace_member (id, user_id, role, is_active, joined_at) -SELECT id, user_id, role::user_role, is_active, joined_at FROM main_db3.workspace_members; +SELECT id, user_id, role::user_role, is_active, joined_at FROM main_db3.workspace_member; ``` ### Phase 3: ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ @@ -75,16 +75,16 @@ SELECT id, workspace_id, team_id, bot_token, is_active FROM main_db3.slack_works INSERT INTO user_preference (user_id, news_keywords, email_filter, briefing_enabled) SELECT user_id, news_keywords, email_filter, briefing_enabled FROM main_db3.user_preferences; --- 7. gmail_tokens โ†’ gmail_token -INSERT INTO gmail_token SELECT * FROM main_db3.gmail_tokens; +-- 7. gmail_token โ†’ gmail_token +INSERT INTO gmail_token SELECT * FROM main_db3.gmail_token; ``` ### Phase 4: ๋Œ€ํ™” ๊ธฐ๋ก ```sql --- 8. conversation_logs โ†’ conversation_log (์ปฌ๋Ÿผ ๋งคํ•‘ ์ฃผ์˜) +-- 8. conversation_log โ†’ conversation_log (์ปฌ๋Ÿผ ๋งคํ•‘ ์ฃผ์˜) INSERT INTO conversation_log (user_id, channel_id, message, response, intent, confidence, timestamp) SELECT user_id, channel_id, message, response, intent, confidence, timestamp -FROM main_db3.conversation_logs WHERE user_id IS NOT NULL; +FROM main_db3.conversation_log WHERE user_id IS NOT NULL; ``` --- diff --git a/plans/completed/250812_auth_db_ํ…Œ์ด๋ธ”_๋‹จ์ˆœํ™”_๋ฐฉ์•ˆ.md b/plans/completed/250812_auth_db_ํ…Œ์ด๋ธ”_๋‹จ์ˆœํ™”_๋ฐฉ์•ˆ.md index 268df28..a0a88fb 100644 --- a/plans/completed/250812_auth_db_ํ…Œ์ด๋ธ”_๋‹จ์ˆœํ™”_๋ฐฉ์•ˆ.md +++ b/plans/completed/250812_auth_db_ํ…Œ์ด๋ธ”_๋‹จ์ˆœํ™”_๋ฐฉ์•ˆ.md @@ -9,23 +9,23 @@ ### 1.1 ํ˜„์žฌ ํ…Œ์ด๋ธ” (5๊ฐœ) - **users**: ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด - **workspaces**: ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด (๋กœ๋น™ ํ• ๋‹น) -- **workspace_members**: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ -- **companies**: ํšŒ์‚ฌ ์ •๋ณด +- **workspace_member**: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ +- **company**: ํšŒ์‚ฌ ์ •๋ณด - **slack_workspaces**: Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ •๋ณด ### 1.2 ํ˜„์žฌ ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์  #### ๋ณต์žก๋„ ๋ฌธ์ œ 1. **๊ณผ๋„ํ•œ ๊ด€๊ณ„ ๋ถ„๋ฆฌ** - - companies โ†” slack_workspaces โ†” workspaces 3๋‹จ๊ณ„ ๊ด€๊ณ„ + - company โ†” slack_workspaces โ†” workspaces 3๋‹จ๊ณ„ ๊ด€๊ณ„ - ์‹ค์ œ๋กœ๋Š” 1๊ฐœ workspace๋งŒ ์‚ฌ์šฉ ์ค‘ 2. **์ค‘๋ณต ๋ฐ์ดํ„ฐ** - - robeing_id๊ฐ€ workspaces์™€ workspace_members ์–‘์ชฝ์— ์กด์žฌ + - robeing_id๊ฐ€ workspaces์™€ workspace_member ์–‘์ชฝ์— ์กด์žฌ - robeing_url๋„ ์ค‘๋ณต ์ €์žฅ 3. **๋ถˆ๋ช…ํ™•ํ•œ ๊ฐœ๋…** - - companies์˜ ์‹ค์ œ ํ•„์š”์„ฑ ๋ถˆ๋ถ„๋ช… + - company์˜ ์‹ค์ œ ํ•„์š”์„ฑ ๋ถˆ๋ถ„๋ช… - workspaces๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ๋ชจํ˜ธ 4. **๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ** @@ -36,8 +36,8 @@ ``` users: 3๋ช… (happybell80, eagle0914, hhyong91) workspaces: 1๊ฐœ (ivada-robeing) -workspace_members: 3๊ฐœ (๋ชจ๋‘ rb10508_micro ์‚ฌ์šฉ) -companies: 2๊ฐœ (ํ…Œ์ŠคํŠธ ํšŒ์‚ฌ) +workspace_member: 3๊ฐœ (๋ชจ๋‘ rb10508_micro ์‚ฌ์šฉ) +company: 2๊ฐœ (ํ…Œ์ŠคํŠธ ํšŒ์‚ฌ) slack_workspaces: 2๊ฐœ (GoodGang Labs, test) ``` @@ -197,8 +197,8 @@ CREATE TABLE slack_config ( ```sql -- ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ฐฑ์—… CREATE TABLE backup_workspaces AS SELECT * FROM workspaces; -CREATE TABLE backup_workspace_members AS SELECT * FROM workspace_members; -CREATE TABLE backup_companies AS SELECT * FROM companies; +CREATE TABLE backup_workspace_member AS SELECT * FROM workspace_member; +CREATE TABLE backup_company AS SELECT * FROM company; ``` #### Phase 2: ์ƒˆ ํ…Œ์ด๋ธ” ์ƒ์„ฑ @@ -217,7 +217,7 @@ SELECT '192.168.219.52' as robeing_host, true as is_primary, joined_at as created_at -FROM workspace_members; +FROM workspace_member; -- slack_users ํ…Œ์ด๋ธ” ์ƒ์„ฑ (๋นˆ ํ…Œ์ด๋ธ”) CREATE TABLE slack_users ( @@ -238,9 +238,9 @@ CREATE TABLE slack_users ( ALTER TABLE slack_workspaces DROP CONSTRAINT slack_workspaces_company_id_fkey; ALTER TABLE slack_workspaces DROP COLUMN company_id; -DROP TABLE workspace_members; +DROP TABLE workspace_member; DROP TABLE workspaces; -DROP TABLE companies; +DROP TABLE company; ``` ### 3.3 ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํ๋ฆ„ @@ -272,11 +272,11 @@ ChromaDB์— user_id ๊ธฐ๋ฐ˜ ์ €์žฅ - ๊ธฐ์กด ํ…Œ์ด๋ธ” ์˜ํ–ฅ ์—†์Œ 2. **๋‹จ๊ณ„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**: user_robeings ํ…Œ์ด๋ธ” - - workspace_members ๋ฐ์ดํ„ฐ ์ด์ „ + - workspace_member ๋ฐ์ดํ„ฐ ์ด์ „ - ํ…Œ์ŠคํŠธ ํ›„ ๊ธฐ์กด ํ…Œ์ด๋ธ” ์ œ๊ฑฐ 3. **์ •๋ฆฌ ์ž‘์—…**: ๋ถˆํ•„์š”ํ•œ ํ…Œ์ด๋ธ” ์ œ๊ฑฐ - - companies, workspaces ์ œ๊ฑฐ + - company, workspaces ์ œ๊ฑฐ - slack_workspaces ๋‹จ์ˆœํ™” ## 5. API ๋ณ€๊ฒฝ์‚ฌํ•ญ @@ -284,7 +284,7 @@ ChromaDB์— user_id ๊ธฐ๋ฐ˜ ์ €์žฅ ### 5.1 ์‚ฌ์šฉ์ž-๋กœ๋น™ ์กฐํšŒ ```python # ๊ธฐ์กด -SELECT * FROM workspace_members WHERE user_id = ? +SELECT * FROM workspace_member WHERE user_id = ? # ๋ณ€๊ฒฝ SELECT * FROM user_robeings WHERE user_id = ? AND is_primary = true diff --git a/plans/completed/250812_๋กœ์ปฌ๊ฐœ๋ฐœ์ž_Slack์‚ฌ์šฉ์ž๋งคํ•‘_๊ตฌํ˜„๊ณ„ํš.md b/plans/completed/250812_๋กœ์ปฌ๊ฐœ๋ฐœ์ž_Slack์‚ฌ์šฉ์ž๋งคํ•‘_๊ตฌํ˜„๊ณ„ํš.md index 5452f35..448518e 100644 --- a/plans/completed/250812_๋กœ์ปฌ๊ฐœ๋ฐœ์ž_Slack์‚ฌ์šฉ์ž๋งคํ•‘_๊ตฌํ˜„๊ณ„ํš.md +++ b/plans/completed/250812_๋กœ์ปฌ๊ฐœ๋ฐœ์ž_Slack์‚ฌ์šฉ์ž๋งคํ•‘_๊ตฌํ˜„๊ณ„ํš.md @@ -115,7 +115,7 @@ async def get_user_mapping( wm.robeing_id FROM slack_user_mapping sum JOIN users u ON sum.user_id = u.id - LEFT JOIN workspace_members wm ON u.id = wm.user_id + LEFT JOIN workspace_member wm ON u.id = wm.user_id WHERE sum.slack_user_id = :slack_user_id """ @@ -230,7 +230,7 @@ CREATE TABLE IF NOT EXISTS slack_user_mapping ( slack_user_id VARCHAR(100) NOT NULL, slack_workspace_id INTEGER REFERENCES slack_workspaces(id), user_id UUID REFERENCES users(id) NOT NULL, - workspace_member_id UUID REFERENCES workspace_members(id), + workspace_member_id UUID REFERENCES workspace_member(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(slack_user_id, slack_workspace_id) diff --git a/plans/completed/250819_gmail_item_detailed_tasks.md b/plans/completed/250819_gmail_item_detailed_tasks.md index b481a60..28f0fe4 100644 --- a/plans/completed/250819_gmail_item_detailed_tasks.md +++ b/plans/completed/250819_gmail_item_detailed_tasks.md @@ -16,7 +16,7 @@ - [x] ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (rb8001, level=5) - [x] ์ƒ์„ฑ ํ™•์ธ ์ฟผ๋ฆฌ ์‹คํ–‰ -### 1.2 gmail_tokens ํ…Œ์ด๋ธ” ์ˆ˜์ • +### 1.2 gmail_token ํ…Œ์ด๋ธ” ์ˆ˜์ • - [x] is_equipped ์ปฌ๋Ÿผ ์ถ”๊ฐ€ - [x] equipped_to ์ปฌ๋Ÿผ ์ถ”๊ฐ€ - [x] ๊ธฐ์กด ๋ฐ์ดํ„ฐ is_equipped=false๋กœ ์ดˆ๊ธฐํ™” @@ -232,7 +232,7 @@ - [x] Auth ์„œ๋ฒ„ API ํ˜ธ์ถœ - [x] 5๋ถ„ ์บ์‹ฑ ๊ตฌํ˜„ - [ ] Gmail์šฉ ์ด๋ฉ”์ผ ๋งคํ•‘ ์ถ”๊ฐ€ - - [ ] workspace_members ํ…Œ์ด๋ธ”์—์„œ email ์กฐํšŒ + - [ ] workspace_member ํ…Œ์ด๋ธ”์—์„œ email ์กฐํšŒ - [ ] "์ข…ํƒœ๋‹˜" โ†’ goeun2dc@gmail.com ๋ณ€ํ™˜ ### 4-1.6 ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค diff --git a/plans/completed/250819_gmail_item_implementation_plan.md b/plans/completed/250819_gmail_item_implementation_plan.md index 2fd44f2..9b130e7 100644 --- a/plans/completed/250819_gmail_item_implementation_plan.md +++ b/plans/completed/250819_gmail_item_implementation_plan.md @@ -19,7 +19,7 @@ Gmail ์ž๊ฒฉ์ฆ๋ช…์„ "API ์•„์ดํ…œ"์œผ๋กœ ์ •์˜ํ•˜๊ณ , robeing์˜ ์žฅ์ฐฉํ˜• ### ๊ด€๋ จ ๋ฌธ์„œ - `/250817_email_skill_integration_status.md` - ํ˜„ํ™ฉ ๋ถ„์„ -- `/250818_gmail_tokens_database_setup.md` - DB ๊ตฌ์„ฑ ์™„๋ฃŒ +- `/250818_gmail_token_database_setup.md` - DB ๊ตฌ์„ฑ ์™„๋ฃŒ - `/ideas/250818_claude_robeing_๋ ˆ๋ฒจ์—…_์ฒด๊ฐ_์‹œ์Šคํ…œ_์„ค๊ณ„.md` - ์•„์ดํ…œ ์‹œ์Šคํ…œ ์„ค๊ณ„ --- @@ -40,9 +40,9 @@ Gmail ์ž๊ฒฉ์ฆ๋ช…์„ "API ์•„์ดํ…œ"์œผ๋กœ ์ •์˜ํ•˜๊ณ , robeing์˜ ์žฅ์ฐฉํ˜• ### ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ```typescript type GmailCredentialItem = { - id: string; // gmail_tokens.id - userId: string; // gmail_tokens.user_id - robeing_id?: string; // gmail_tokens.robeing_id (ํ†ต์ผ) + id: string; // gmail_token.id + userId: string; // gmail_token.user_id + robeing_id?: string; // gmail_token.robeing_id (ํ†ต์ผ) type: 'accessory'; slot: 'passport_gmail'; name: string; // metadata.display_name || email @@ -75,14 +75,14 @@ rb8001:8001 (๋ฉ”์ธ robeing) skill-email:8501 robeing-monitor:9024 (์ด๋ฉ”์ผ ๋ฐœ์†ก) (์•„์ดํ…œ ์ƒํƒœ ๊ด€๋ฆฌ) โ†“ โ†“ -PostgreSQL (gmail_tokens ํ…Œ์ด๋ธ”) +PostgreSQL (gmail_token ํ…Œ์ด๋ธ”) ``` ### ์„œ๋น„์Šค๋ณ„ ์—ญํ•  #### auth-server - Gmail OAuth ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌ -- gmail_tokens ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ +- gmail_token ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ - ํ† ํฐ ๊ฐฑ์‹  ๋กœ์ง #### robeing-monitor (9024) @@ -125,14 +125,14 @@ sequenceDiagram Gateway-->>Front: UNAUTHORIZED else ์ธ์ฆ ์„ฑ๊ณต Gateway->>Monitor: ์žฅ์ฐฉ ์š”์ฒญ ์ „๋‹ฌ - Monitor->>DB: gmail_tokens ์†Œ์œ ๊ถŒ ํ™•์ธ + Monitor->>DB: gmail_token ์†Œ์œ ๊ถŒ ํ™•์ธ Monitor->>DB: robeing_stats ์กฐํšŒ (๋ ˆ๋ฒจ ์ฒดํฌ) DB-->>Monitor: ๋ ˆ๋ฒจ ์ •๋ณด alt ๋ ˆ๋ฒจ < 5 Monitor-->>Front: INSUFFICIENT_LEVEL else ๋ ˆ๋ฒจ >= 5 - Monitor->>DB: gmail_tokens ์—…๋ฐ์ดํŠธ + Monitor->>DB: gmail_token ์—…๋ฐ์ดํŠธ Note over DB: is_equipped=true
equipped_to=robeing_id Monitor->>DB: gmail_audit_logs ๊ธฐ๋ก Monitor-->>RB: ์žฅ์ฐฉ ์™„๋ฃŒ ์•Œ๋ฆผ @@ -155,7 +155,7 @@ sequenceDiagram User->>Front: "์ด๋ฉ”์ผ ๋ณด๋‚ด์ค˜" ์š”์ฒญ Front->>RB: ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ RB->>Monitor: Gmail ์•„์ดํ…œ ์žฅ์ฐฉ ํ™•์ธ - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ DB-->>Monitor: ์žฅ์ฐฉ ์ƒํƒœ & ํ† ํฐ ์ •๋ณด alt ์•„์ดํ…œ ๋ฏธ์žฅ์ฐฉ @@ -195,7 +195,7 @@ sequenceDiagram Google->>Auth: ์ธ์ฆ ์ฝ”๋“œ ์ฝœ๋ฐฑ Auth->>Google: ํ† ํฐ ๊ตํ™˜ Google-->>Auth: access_token, refresh_token - Auth->>DB: gmail_tokens ์—…๋ฐ์ดํŠธ + Auth->>DB: gmail_token ์—…๋ฐ์ดํŠธ Auth-->>Front: ์ธ์ฆ ์™„๋ฃŒ Front->>Front: ์•„์ดํ…œ ์ƒํƒœ ๊ฐฑ์‹  ``` @@ -285,7 +285,7 @@ CREATE TABLE gmail_audit_logs ( - [x] ํ•„์š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ - robeing_stats ํ…Œ์ด๋ธ” (๋ ˆ๋ฒจ ๊ด€๋ฆฌ) - gmail_audit_logs ํ…Œ์ด๋ธ” (๊ฐ์‚ฌ ๋กœ๊ทธ) - - gmail_tokens์— is_equipped, equipped_to ์ปฌ๋Ÿผ ์ถ”๊ฐ€ + - gmail_token์— is_equipped, equipped_to ์ปฌ๋Ÿผ ์ถ”๊ฐ€ - [x] skill-email DB ์—ฐ๊ฒฐ ์ฝ”๋“œ ์ž‘์„ฑ (ํฌ์žฌ) - FileCredentialsProvider โ†’ DBCredentialsProvider ์ „ํ™˜ - PostgreSQL ์—ฐ๊ฒฐ ์„ค์ • ์ถ”๊ฐ€ (localhost:5433 SSH ํ„ฐ๋„) @@ -361,11 +361,11 @@ DATABASE_URL=postgresql://robeings:robeings@192.168.219.45:5432/main_db ## 8. ๋ฐ์ดํ„ฐ ๋งคํ•‘ (์ถ”ํ›„ ๊ตฌํ˜„) ### Slack User ID โ†” Gmail ๊ณ„์ • ๋งคํ•‘ -- ์œ„์น˜: ์ถ”ํ›„ ๊ฒฐ์ • (workspace_members ๋˜๋Š” ๋ณ„๋„ ํ…Œ์ด๋ธ”) +- ์œ„์น˜: ์ถ”ํ›„ ๊ฒฐ์ • (workspace_member ๋˜๋Š” ๋ณ„๋„ ํ…Œ์ด๋ธ”) - ๊ตฌ์กฐ: ```sql --- ์˜ต์…˜ 1: workspace_members ํ™•์žฅ -ALTER TABLE workspace_members +-- ์˜ต์…˜ 1: workspace_member ํ™•์žฅ +ALTER TABLE workspace_member ADD COLUMN gmail_account VARCHAR(255); -- ์˜ต์…˜ 2: ๋ณ„๋„ ๋งคํ•‘ ํ…Œ์ด๋ธ” @@ -443,7 +443,7 @@ CREATE TABLE user_gmail_mapping ( ## 12. ์ฐธ๊ณ ์‚ฌํ•ญ ### ํ˜„์žฌ ์ƒํƒœ (2025-08-19) -- gmail_tokens ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์™„๋ฃŒ +- gmail_token ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์™„๋ฃŒ - rb8001 ์ •์ƒ ์ž‘๋™ (GEMINI_USE_CLI=false) - skill-email ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋™์ž‘ ์ค‘ (DB ์ „ํ™˜ ํ•„์š”) - ํ”„๋ก ํŠธ ์ธ๋ฒคํ† ๋ฆฌ UI ๋ฏธ๊ตฌํ˜„ diff --git a/plans/completed/250819_rb8001_gmail_integration_completed.md b/plans/completed/250819_rb8001_gmail_integration_completed.md index f28a81c..19436e5 100644 --- a/plans/completed/250819_rb8001_gmail_integration_completed.md +++ b/plans/completed/250819_rb8001_gmail_integration_completed.md @@ -45,11 +45,11 @@ Gmail ์Šคํ‚ฌ ํ†ตํ•ฉ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ๋ชจ๋“ˆ # PostgreSQL์—์„œ ์ง์ ‘ ์žฅ์ฐฉ ์ƒํƒœ ํ™•์ธ # 5๋ถ„ ์บ์‹ฑ์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” cur.execute(""" - SELECT COUNT(*) FROM gmail_tokens + SELECT COUNT(*) FROM gmail_token WHERE user_id = %s AND is_equipped = true """, (user_id,)) ``` - - gmail_tokens ํ…Œ์ด๋ธ”์˜ is_equipped ํ™•์ธ + - gmail_token ํ…Œ์ด๋ธ”์˜ is_equipped ํ™•์ธ - ์บ์‹œ TTL: 300์ดˆ (5๋ถ„) - DB ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ False ๋ฐ˜ํ™˜ @@ -372,7 +372,7 @@ python3 -c " import psycopg2 conn = psycopg2.connect('postgresql://robeings:robeings@localhost:5433/main_db') cur = conn.cursor() -cur.execute('SELECT user_id, is_equipped FROM gmail_tokens') +cur.execute('SELECT user_id, is_equipped FROM gmail_token') for row in cur.fetchall(): print(f'{row[0]}: equipped={row[1]}') " diff --git a/plans/completed/250819_skill_email_db_connection_completed.md b/plans/completed/250819_skill_email_db_connection_completed.md index 0153c75..5eec3df 100644 --- a/plans/completed/250819_skill_email_db_connection_completed.md +++ b/plans/completed/250819_skill_email_db_connection_completed.md @@ -13,7 +13,7 @@ skill-email ์„œ๋น„์Šค๊ฐ€ Gmail OAuth ํ† ํฐ์„ ํŒŒ์ผ์ด ์•„๋‹Œ PostgreSQL ๋ฐ ### ๋ฐฐ๊ฒฝ - ๊ธฐ์กด: ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํ† ํฐ ๊ด€๋ฆฌ (FileCredentialsProvider) -- ๋ณ€๊ฒฝ: PostgreSQL gmail_tokens ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ (DBCredentialsProvider) +- ๋ณ€๊ฒฝ: PostgreSQL gmail_token ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ (DBCredentialsProvider) - ์ด์œ : ์ค‘์•™์ง‘์ค‘์‹ ํ† ํฐ ๊ด€๋ฆฌ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋‹ค์ค‘ ์„œ๋น„์Šค ํ†ตํ•ฉ --- @@ -56,12 +56,12 @@ LOG_LEVEL=INFO 2. **get_credentials() ๋ฉ”์„œ๋“œ** ```python def get_credentials(self, user_id: str) -> Optional[Credentials]: - # gmail_tokens ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ + # gmail_token ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ # is_equipped=true์ธ ํ† ํฐ๋งŒ ์กฐํšŒ # token_data + oauth_config ์ปฌ๋Ÿผ ๋ชจ๋‘ ํ™œ์šฉ ``` - - gmail_tokens ํ…Œ์ด๋ธ” ์กฐํšŒ + - gmail_token ํ…Œ์ด๋ธ” ์กฐํšŒ - token_data ์ปฌ๋Ÿผ: access_token, refresh_token - oauth_config ์ปฌ๋Ÿผ: client_id, client_secret, token_uri - Google Credentials ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ @@ -117,9 +117,9 @@ def get_gmail_service() -> GmailService: ## 3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ -### gmail_tokens ํ…Œ์ด๋ธ” +### gmail_token ํ…Œ์ด๋ธ” ```sql -CREATE TABLE gmail_tokens ( +CREATE TABLE gmail_token ( id SERIAL PRIMARY KEY, user_id VARCHAR(100), robeing_id VARCHAR(50), @@ -161,7 +161,7 @@ CREATE TABLE gmail_tokens ( cd /home/heejae/skill-email && python3 test_db.py ``` - โœ… PostgreSQL ์—ฐ๊ฒฐ ์„ฑ๊ณต -- โœ… gmail_tokens ํ…Œ์ด๋ธ” ์ ‘๊ทผ ๊ฐ€๋Šฅ +- โœ… gmail_token ํ…Œ์ด๋ธ” ์ ‘๊ทผ ๊ฐ€๋Šฅ - โœ… 3๊ฐœ ํ† ํฐ ํ™•์ธ (heejae, test, unknown) ### 4.2 Provider ํ…Œ์ŠคํŠธ @@ -212,7 +212,7 @@ sshpass -p "19800508" ssh -f -N -L 5433:localhost:5432 admin@124.55.18.179 -p 51 - **๋ฌธ์ œ**: ๋ชจ๋“  ํ† ํฐ์ด is_equipped=false ์ƒํƒœ - **ํ•ด๊ฒฐ**: ```sql - UPDATE gmail_tokens SET is_equipped=true WHERE user_id='heejae' + UPDATE gmail_token SET is_equipped=true WHERE user_id='heejae' ``` ### 6.3 oauth_config ๋ˆ„๋ฝ @@ -221,7 +221,7 @@ sshpass -p "19800508" ssh -f -N -L 5433:localhost:5432 admin@124.55.18.179 -p 51 ```python cur.execute(""" SELECT token_data, oauth_config - FROM gmail_tokens + FROM gmail_token WHERE user_id = %s AND is_equipped = true """) ``` @@ -299,7 +299,7 @@ sshpass -p "19800508" ssh -f -N -L 5433:localhost:5432 admin@124.55.18.179 -p 51 ## 12. ๊ฒ€์ฆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [x] PostgreSQL ์—ฐ๊ฒฐ ์„ฑ๊ณต -- [x] gmail_tokens ํ…Œ์ด๋ธ” ์กฐํšŒ +- [x] gmail_token ํ…Œ์ด๋ธ” ์กฐํšŒ - [x] ํ† ํฐ ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ - [x] Credentials ๊ฐ์ฒด ์ƒ์„ฑ - [x] oauth_config ํ†ตํ•ฉ @@ -328,7 +328,7 @@ python3 -c " import psycopg2 conn = psycopg2.connect('postgresql://robeings:robeings@localhost:5433/main_db') cur = conn.cursor() -cur.execute('SELECT user_id, is_equipped FROM gmail_tokens') +cur.execute('SELECT user_id, is_equipped FROM gmail_token') for row in cur.fetchall(): print(f'{row[0]}: equipped={row[1]}') " diff --git a/plans/completed/250823_4pm_email_briefing_demo_plan.md b/plans/completed/250823_4pm_email_briefing_demo_plan.md index a46edd9..28c72e2 100644 --- a/plans/completed/250823_4pm_email_briefing_demo_plan.md +++ b/plans/completed/250823_4pm_email_briefing_demo_plan.md @@ -114,7 +114,7 @@ sequenceDiagram loop ๊ฐ ์‚ฌ์šฉ์ž๋ณ„ ์ฒ˜๋ฆฌ Scheduler->>Monitor: Gmail ํ† ํฐ ํ™•์ธ
(X-User-Id) - Monitor->>DB: gmail_tokens ์กฐํšŒ + Monitor->>DB: gmail_token ์กฐํšŒ DB-->>Monitor: token_data alt ํ† ํฐ ์œ ํšจ diff --git a/plans/completed/250828_slack_integration_level3_plan.md b/plans/completed/250828_slack_integration_level3_plan.md index 801c9fe..09da635 100644 --- a/plans/completed/250828_slack_integration_level3_plan.md +++ b/plans/completed/250828_slack_integration_level3_plan.md @@ -55,7 +55,7 @@ Frontend(Slack ์•„์ดํ…œ ํš๋“) โ†’ auth-server โ†’ OAuth 2.0 โ†’ ๋ด‡ ํ† ํฐ - `GET /auth/slack/passport/install?user_id={user_id}` - ๋ด‡ ์„ค์น˜ OAuth ์‹œ์ž‘ - ํŒŒ์ผ: `/home/admin/auth-server/app/providers/slack.py:104` - ๋ณ€๊ฒฝ: workspace_id โ†’ user_id ํŒŒ๋ผ๋ฏธํ„ฐ - - ์ฒ˜๋ฆฌ: user_id๋กœ workspace_members ํ…Œ์ด๋ธ”์—์„œ workspace_id ์กฐํšŒ + - ์ฒ˜๋ฆฌ: user_id๋กœ workspace_member ํ…Œ์ด๋ธ”์—์„œ workspace_id ์กฐํšŒ - `GET /auth/slack/passport/callback` - bot_token ์ €์žฅ - `GET /auth/slack/passport/status/{workspace_id}` - ์•„์ดํ…œ ์ƒํƒœ ํ™•์ธ - `DELETE /auth/slack/passport/uninstall/{workspace_id}` - ์•„์ดํ…œ ์ทจ์†Œ @@ -91,7 +91,7 @@ Slack Event โ†’ rb8001 โ†’ DB โ†’ SSE/WebSocket โ†’ Frontend - ์ด๋ฒคํŠธ: `message.channels`, `message.groups`, `message.im`, `message.mpim`, `app_mention` - ์“ฐ๋ ˆ๋“œ: `message.message_replied` ์ด๋ฒคํŠธ ์กด์žฌํ•˜๋‚˜ `thread_ts` ํ™•์ธ ๊ถŒ์žฅ 2. ์ฑ„๋„ ํƒ€์ž…: C(๊ณต๊ฐœ), G(๋น„๊ณต๊ฐœ/๊ทธ๋ฃน), D(DM) -3. conversation_logs ์ €์žฅ: team_id, channel_id, thread_ts +3. conversation_log ์ €์žฅ: team_id, channel_id, thread_ts 4. ์ดˆ๊ธฐ ๋™๊ธฐํ™”: `conversations.history`๋กœ ๋ฐฑํ•„ ### Phase 4: ๋ช…๋ น ์ฒ˜๋ฆฌ @@ -116,14 +116,14 @@ Slack โ†’ @robeing ๋˜๋Š” /robeing โ†’ rb8001 โ†’ ์‘๋‹ต - **users**: id(UUID), email, slack_user_id, slack_team_id - **slack_workspaces**: team_id, team_name, bot_token(์•”ํ˜ธํ™”), installed_by_user_id, scopes, installed_at - **slack_user_mapping**: team_id + slack_user_id ๋ณตํ•ฉํ‚ค, user_id(UUID) -- **conversation_logs**: team_id, channel_id, channel_type, user_id, text, ts, thread_ts +- **conversation_log**: team_id, channel_id, channel_type, user_id, text, ts, thread_ts ### ํ•„์š” ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ```sql ALTER TABLE users ADD COLUMN slack_user_id VARCHAR(50); ALTER TABLE users ADD COLUMN slack_team_id VARCHAR(50); -ALTER TABLE conversation_logs ADD COLUMN thread_ts VARCHAR(20); -ALTER TABLE conversation_logs ADD COLUMN channel_type VARCHAR(20); +ALTER TABLE conversation_log ADD COLUMN thread_ts VARCHAR(20); +ALTER TABLE conversation_log ADD COLUMN channel_type VARCHAR(20); ``` --- @@ -182,4 +182,4 @@ ALTER TABLE conversation_logs ADD COLUMN channel_type VARCHAR(20); ### ๋‚ด๋ถ€ ๋ฌธ์„œ - [auth_login_sequences.md](../300_architecture/sequences/auth_login_sequences.md) - [tables.md](../300_architecture/database/tables.md) -- [250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md](../troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) \ No newline at end of file +- [250828_conversation_log_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md](../troubleshooting/250828_conversation_log_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) \ No newline at end of file diff --git a/troubleshooting/250729_happybell80_์„œ๋น„์Šค๊ตฌ์ถ•๋ฐ๋ฐฐํฌ๋ณต๊ตฌ.md b/troubleshooting/250729_happybell80_์„œ๋น„์Šค๊ตฌ์ถ•๋ฐ๋ฐฐํฌ๋ณต๊ตฌ.md index 33ad905..9f68bf6 100644 --- a/troubleshooting/250729_happybell80_์„œ๋น„์Šค๊ตฌ์ถ•๋ฐ๋ฐฐํฌ๋ณต๊ตฌ.md +++ b/troubleshooting/250729_happybell80_์„œ๋น„์Šค๊ตฌ์ถ•๋ฐ๋ฐฐํฌ๋ณต๊ตฌ.md @@ -190,7 +190,7 @@ Claude๊ฐ€ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ๋”ฐ๋ฅด์ง€ ์•Š์Œ. CLAUDE.md ์žฌ - JWT/OAuth ํ‚ค ๊ด€๋ฆฌ ์ƒํƒœ ์ ๊ฒ€ 2. **PostgreSQL main_db ์Šคํ‚ค๋งˆ ๋ถ„์„**: - - `companies` ํ…Œ์ด๋ธ”: ํšŒ์‚ฌ๋ณ„ ์„œ๋ธŒ๋„๋ฉ”์ธ ๊ด€๋ฆฌ (2๊ฐœ ํšŒ์‚ฌ ๋“ฑ๋ก) + - `company` ํ…Œ์ด๋ธ”: ํšŒ์‚ฌ๋ณ„ ์„œ๋ธŒ๋„๋ฉ”์ธ ๊ด€๋ฆฌ (2๊ฐœ ํšŒ์‚ฌ ๋“ฑ๋ก) - `slack_workspaces` ํ…Œ์ด๋ธ”: Slack ๋ด‡ ํ† ํฐ ๊ด€๋ฆฌ (2๊ฐœ ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ™œ์„ฑ) - ๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ B2B SaaS ๊ตฌ์กฐ ํ™•์ธ diff --git a/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ๋ฐฑ์—”๋“œ์—ฐ๊ฒฐ๋ฐworkspace์ „ํ™˜.md b/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ๋ฐฑ์—”๋“œ์—ฐ๊ฒฐ๋ฐworkspace์ „ํ™˜.md index d5b7ef4..b3f4466 100644 --- a/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ๋ฐฑ์—”๋“œ์—ฐ๊ฒฐ๋ฐworkspace์ „ํ™˜.md +++ b/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ๋ฐฑ์—”๋“œ์—ฐ๊ฒฐ๋ฐworkspace์ „ํ™˜.md @@ -69,8 +69,8 @@ **ํ•„์š”ํ•œ DB ํ™•์žฅ**: 1. `users` ํ…Œ์ด๋ธ”: ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž ์ •๋ณด -2. `workspace_members` ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค-๋กœ๋น™ ๋งคํ•‘ -3. `workspaces` ํ…Œ์ด๋ธ”: companies ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ +2. `workspace_member` ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค-๋กœ๋น™ ๋งคํ•‘ +3. `workspaces` ํ…Œ์ด๋ธ”: company ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ **๊ฐœ๋ฐœ ์šฐ์„ ์ˆœ์œ„**: 1. auth-server ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ํ™•์žฅ @@ -103,8 +103,8 @@ CREATE TABLE users ( ... ); --- workspace_members ํ…Œ์ด๋ธ” -CREATE TABLE workspace_members ( +-- workspace_member ํ…Œ์ด๋ธ” +CREATE TABLE workspace_member ( workspace_id UUID REFERENCES workspaces(id), user_id UUID REFERENCES users(id), role VARCHAR(50), @@ -118,7 +118,7 @@ CREATE TABLE workspace_members ( ### Company โ†’ Workspace ๋ณ€ํ™˜ ์ž‘์—… **Sequential Design ๋ถ„์„์œผ๋กœ ์˜ํ–ฅ๋ฐ›๋Š” ํŒŒ์ผ ํŒŒ์•…**: -1. `app/api/companies.py` โ†’ `app/api/workspaces.py` +1. `app/api/company.py` โ†’ `app/api/workspaces.py` 2. `app/providers/slack.py` - OAuth ์ฒ˜๋ฆฌ 3. `app/api/slack_router.py` - Slack ์ด๋ฒคํŠธ ๋ผ์šฐํŒ… 4. `app/db/init_db.py` - DB ์ดˆ๊ธฐํ™” @@ -132,9 +132,9 @@ CREATE TABLE workspace_members ( **API ์—”๋“œํฌ์ธํŠธ ๋ณ€๊ฒฝ**: ``` -/api/companies โ†’ /api/workspaces -/api/companies/{company_id} โ†’ /api/workspaces/{workspace_id} -/api/companies/subdomain/{subdomain} โ†’ /api/workspaces/subdomain/{subdomain} +/api/company โ†’ /api/workspaces +/api/company/{company_id} โ†’ /api/workspaces/{workspace_id} +/api/company/subdomain/{subdomain} โ†’ /api/workspaces/subdomain/{subdomain} ``` ## ๊ตํ›ˆ diff --git a/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ์—”๋“œ๋กœ๋น™์—ฐ๊ฒฐ.md b/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ์—”๋“œ๋กœ๋น™์—ฐ๊ฒฐ.md index 171d33c..688add7 100644 --- a/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ์—”๋“œ๋กœ๋น™์—ฐ๊ฒฐ.md +++ b/troubleshooting/250730_happybell80_ํ”„๋ก ํŠธ์—”๋“œ๋กœ๋น™์—ฐ๊ฒฐ.md @@ -170,7 +170,7 @@ const ROBEING_API_URL = import.meta.env.VITE_ROBEING_API_URL || 'https://ro-bein 3. **auth-server DB ๊ตฌ์ถ• ํ•„์š”**: - users ํ…Œ์ด๋ธ” - - workspace_members ํ…Œ์ด๋ธ” (user_id, robeing_id ๋งคํ•‘) + - workspace_member ํ…Œ์ด๋ธ” (user_id, robeing_id ๋งคํ•‘) - ๋กœ๋น™ ํ• ๋‹น API ์—”๋“œํฌ์ธํŠธ 4. **ChatInterface ์ˆ˜์ •**: diff --git a/troubleshooting/250731_admin_DOCS์ฒ ํ•™์„น์…˜์ •์ œ๋ฐauth์„œ๋ฒ„์—…๋ฐ์ดํŠธ.md b/troubleshooting/250731_admin_DOCS์ฒ ํ•™์„น์…˜์ •์ œ๋ฐauth์„œ๋ฒ„์—…๋ฐ์ดํŠธ.md index 2bec8ba..834c124 100644 --- a/troubleshooting/250731_admin_DOCS์ฒ ํ•™์„น์…˜์ •์ œ๋ฐauth์„œ๋ฒ„์—…๋ฐ์ดํŠธ.md +++ b/troubleshooting/250731_admin_DOCS์ฒ ํ•™์„น์…˜์ •์ œ๋ฐauth์„œ๋ฒ„์—…๋ฐ์ดํŠธ.md @@ -41,7 +41,7 @@ git pull ``` **์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ**: -- `companies.py` โ†’ `workspaces.py`๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ +- `company.py` โ†’ `workspaces.py`๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ - ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ ์ถ”๊ฐ€ (`add_user_workspace_tables.sql`) - ์‚ฌ์šฉ์ž ๋ชจ๋ธ ์ถ”๊ฐ€ (`user.py`) - Slack ํ†ตํ•ฉ ๊ฐœ์„  diff --git a/troubleshooting/250809_happybell80_robing-gateway๊ตฌํ˜„.md b/troubleshooting/250809_happybell80_robing-gateway๊ตฌํ˜„.md index fb1c97b..3b15196 100644 --- a/troubleshooting/250809_happybell80_robing-gateway๊ตฌํ˜„.md +++ b/troubleshooting/250809_happybell80_robing-gateway๊ตฌํ˜„.md @@ -32,14 +32,14 @@ robeing-gateway/ **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: 1. ์‚ฌ์šฉ์ž-๋กœ๋น™ ๋งคํ•‘ ๊ด€๋ฆฌ 2. ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” -3. ๊ธฐ์กด main_db ํ…Œ์ด๋ธ” ํ™œ์šฉ (workspaces, workspace_members) +3. ๊ธฐ์กด main_db ํ…Œ์ด๋ธ” ํ™œ์šฉ (workspaces, workspace_member) 4. ํ—ฌ์Šค์ฒดํฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์—”๋“œํฌ์ธํŠธ ### 23์„œ๋ฒ„ํŒ€ ํ”ผ๋“œ๋ฐฑ **์ค‘์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ - ์ƒˆ ํ…Œ์ด๋ธ” ๋ถˆํ•„์š”**: -- ๊ธฐ์กด main_db์˜ workspaces, workspace_members ํ…Œ์ด๋ธ” ํ™œ์šฉ -- workspace_members์—์„œ user_id๋กœ robeing ์ •๋ณด ์กฐํšŒ +- ๊ธฐ์กด main_db์˜ workspaces, workspace_member ํ…Œ์ด๋ธ” ํ™œ์šฉ +- workspace_member์—์„œ user_id๋กœ robeing ์ •๋ณด ์กฐํšŒ - JOIN ์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉ์ž โ†’ ์›Œํฌ์ŠคํŽ˜์ด์Šค โ†’ ๋กœ๋น™ ๋งคํ•‘ ## ์˜ค์ „ 11์‹œ 00๋ถ„ - ๋ฐฐํฌ ๋ฌธ์ œ ํ•ด๊ฒฐ @@ -144,7 +144,7 @@ fetch('http://localhost:8100/api/chat', { ### 2. ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ• ๋‹น ํ…Œ์ŠคํŠธ ```sql -- ์‚ฌ์šฉ์ž๋ฅผ ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ํ• ๋‹น -INSERT INTO workspace_members ( +INSERT INTO workspace_member ( id, user_id, workspace_id, role, robeing_id, is_active ) VALUES ( gen_random_uuid(), @@ -244,8 +244,8 @@ INSERT INTO users (id, ...) VALUES ('user-happybell80', ...); **๋‘ ๋ฒˆ์งธ ์‹œ๋„ - role ๊ฐ’ ์˜ค๋ฅ˜**: ```sql -- role์€ ๋Œ€๋ฌธ์ž์—ฌ์•ผ ํ•จ -INSERT INTO workspace_members (..., role, ...) VALUES (..., 'owner', ...); -- X -INSERT INTO workspace_members (..., role, ...) VALUES (..., 'OWNER', ...); -- O +INSERT INTO workspace_member (..., role, ...) VALUES (..., 'owner', ...); -- X +INSERT INTO workspace_member (..., role, ...) VALUES (..., 'OWNER', ...); -- O ``` **์ตœ์ข… ์ˆ˜์ • ๋ฒ„์ „**: @@ -259,7 +259,7 @@ INSERT INTO users (id, email, name) VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, '0914eagle@gmail.com', '์ „ํฌ์žฌ'), ('cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid, 'hhyong91@gmail.com', 'ํ™ฉํ•œ์šฉ'); -INSERT INTO workspace_members (..., role, ...) VALUES +INSERT INTO workspace_member (..., role, ...) VALUES (..., 'OWNER', ...), -- ๊น€์ข…ํƒœ (..., 'MEMBER', ...); -- ์ „ํฌ์žฌ, ํ™ฉํ•œ์šฉ ``` @@ -269,7 +269,7 @@ INSERT INTO workspace_members (..., role, ...) VALUES **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ**: - workspaces: 1๊ฐœ (ivada-robeing) - users: 3๊ฐœ (๊น€์ข…ํƒœ, ์ „ํฌ์žฌ, ํ™ฉํ•œ์šฉ) -- workspace_members: 3๊ฐœ (๋ชจ๋‘ rb10508_micro ํ• ๋‹น) +- workspace_member: 3๊ฐœ (๋ชจ๋‘ rb10508_micro ํ• ๋‹น) **ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต (์˜คํ›„ 2:13)**: 1. **์ธ์ฆ ํ๋ฆ„**: @@ -278,7 +278,7 @@ INSERT INTO workspace_members (..., role, ...) VALUES 2. **Gateway ๋ผ์šฐํŒ…**: - X-User-Id ํ—ค๋”๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„ - - DB ์กฐํšŒ: workspace_members โ†’ robeing_id ํ™•์ธ + - DB ์กฐํšŒ: workspace_member โ†’ robeing_id ํ™•์ธ - rb10508_micro (192.168.219.52:10508)๋กœ ๋ผ์šฐํŒ… 3. **๊ฐœ์ธํ™”๋œ ์‘๋‹ต**: @@ -289,7 +289,7 @@ INSERT INTO workspace_members (..., role, ...) VALUES ``` Frontend โ†’ nginx(/gateway/) โ†’ Gateway(8100) โ†’ DB ์กฐํšŒ โ†“ - workspace_members + workspace_member โ†“ rb10508_micro โ†’ ๋งž์ถค ์‘๋‹ต ``` diff --git a/troubleshooting/250811_happybell80_ChromaDB๋ฉ”๋ชจ๋ฆฌ์†์‹ค.md b/troubleshooting/250811_happybell80_ChromaDB๋ฉ”๋ชจ๋ฆฌ์†์‹ค.md index 07e05f1..4187de0 100644 --- a/troubleshooting/250811_happybell80_ChromaDB๋ฉ”๋ชจ๋ฆฌ์†์‹ค.md +++ b/troubleshooting/250811_happybell80_ChromaDB๋ฉ”๋ชจ๋ฆฌ์†์‹ค.md @@ -99,7 +99,7 @@ npm run build async def get_robeing_info(username: str): query = text(""" SELECT ... - FROM workspace_members wm + FROM workspace_member wm JOIN users u ON wm.user_id = u.id WHERE u.username = :username """) diff --git a/troubleshooting/250811_happybell80_Gatewayํ•„๋“œ๋ณ€ํ™˜๋ฌธ์ œ.md b/troubleshooting/250811_happybell80_Gatewayํ•„๋“œ๋ณ€ํ™˜๋ฌธ์ œ.md index d699d4b..3e1614e 100644 --- a/troubleshooting/250811_happybell80_Gatewayํ•„๋“œ๋ณ€ํ™˜๋ฌธ์ œ.md +++ b/troubleshooting/250811_happybell80_Gatewayํ•„๋“œ๋ณ€ํ™˜๋ฌธ์ œ.md @@ -34,7 +34,7 @@ async def get_robeing_info(username: str): """username์œผ๋กœ ์ง์ ‘ ์กฐํšŒ""" query = text(""" SELECT ... - FROM workspace_members wm + FROM workspace_member wm JOIN users u ON wm.user_id = u.id WHERE u.username = :username """) diff --git a/troubleshooting/250812_slack_user_mapping_๊ตฌํ˜„.md b/troubleshooting/250812_slack_user_mapping_๊ตฌํ˜„.md index 07e8670..64f750e 100644 --- a/troubleshooting/250812_slack_user_mapping_๊ตฌํ˜„.md +++ b/troubleshooting/250812_slack_user_mapping_๊ตฌํ˜„.md @@ -29,7 +29,7 @@ CREATE TABLE slack_user_mapping ( slack_user_id VARCHAR(100) NOT NULL, slack_workspace_id UUID REFERENCES slack_workspaces(id), user_id UUID REFERENCES users(id) NOT NULL, - workspace_member_id UUID REFERENCES workspace_members(id), + workspace_member_id UUID REFERENCES workspace_member(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(slack_user_id, slack_workspace_id) @@ -57,7 +57,7 @@ CREATE TABLE slack_user_mapping ( **ํ•ด๊ฒฐ**: ```sql GRANT ALL PRIVILEGES ON TABLE slack_user_mapping TO robeings; -GRANT SELECT ON users, workspace_members TO robeings; +GRANT SELECT ON users, workspace_member TO robeings; ALTER TABLE slack_user_mapping OWNER TO robeings; ``` diff --git a/troubleshooting/250817_email_skill_integration_status.md b/troubleshooting/250817_email_skill_integration_status.md index aba81ee..fd6924b 100644 --- a/troubleshooting/250817_email_skill_integration_status.md +++ b/troubleshooting/250817_email_skill_integration_status.md @@ -63,7 +63,7 @@ User โ†’ rb8001 โ†’ skill-email โ†’ Gmail API ### 2.2 ์ œ์•ˆ: PostgreSQL ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ ```sql -- Gmail ํ† ํฐ ํ…Œ์ด๋ธ” -CREATE TABLE gmail_tokens ( +CREATE TABLE gmail_token ( id SERIAL PRIMARY KEY, user_id VARCHAR(100) UNIQUE NOT NULL, robeing_id VARCHAR(50), @@ -268,7 +268,7 @@ class DBCredentialsProvider: async def get_credentials(self, user_id: str): # PostgreSQL์—์„œ ํ† ํฐ ์กฐํšŒ token = await db.query( - "SELECT * FROM gmail_tokens WHERE user_id = %s", + "SELECT * FROM gmail_token WHERE user_id = %s", user_id ) return Credentials(**token) diff --git a/troubleshooting/250817_robeing_monitor_integration.md b/troubleshooting/250817_robeing_monitor_integration.md index 14bc96d..39c31a2 100644 --- a/troubleshooting/250817_robeing_monitor_integration.md +++ b/troubleshooting/250817_robeing_monitor_integration.md @@ -118,14 +118,14 @@ pgrep -f "ssh.*5433:localhost:5432" ### PostgreSQL ์ ‘์† ```bash # SSH๋ฅผ ํ†ตํ•œ ์›๊ฒฉ ์‹คํ–‰ -sshpass -p "19800508" ssh -o StrictHostKeyChecking=no admin@124.55.18.179 -p 51123 "PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c 'SELECT * FROM gmail_tokens'" +sshpass -p "19800508" ssh -o StrictHostKeyChecking=no admin@124.55.18.179 -p 51123 "PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c 'SELECT * FROM gmail_token'" # ๋กœ์ปฌ ํ„ฐ๋„์„ ํ†ตํ•œ ์ ‘์† (psql ํด๋ผ์ด์–ธํŠธ ํ•„์š”) PGPASSWORD=robeings psql -h localhost -p 5433 -U robeings -d main_db ``` ### ์ฃผ์š” ํ…Œ์ด๋ธ” -- `gmail_tokens`: Gmail OAuth ํ† ํฐ ์ €์žฅ +- `gmail_token`: Gmail OAuth ํ† ํฐ ์ €์žฅ - `gmail_audit_logs`: Gmail ์ž‘์—… ๊ฐ์‚ฌ ๋กœ๊ทธ - `robeing_stats`: Robeing ๋ ˆ๋ฒจ ์ •๋ณด - `slack_user_mapping`: Slack-UUID ๋งคํ•‘ (ํ˜„์žฌ ๋ฏธ์‚ฌ์šฉ) diff --git a/troubleshooting/250818_gmail_tokens_database_setup.md b/troubleshooting/250818_gmail_tokens_database_setup.md index 610bd10..7a04868 100644 --- a/troubleshooting/250818_gmail_tokens_database_setup.md +++ b/troubleshooting/250818_gmail_tokens_database_setup.md @@ -16,10 +16,10 @@ User: robeings Password: robeings ``` -### 1.2 ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”: `gmail_tokens` +### 1.2 ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”: `gmail_token` ```sql -CREATE TABLE gmail_tokens ( +CREATE TABLE gmail_token ( id SERIAL PRIMARY KEY, user_id VARCHAR(100) UNIQUE NOT NULL, robeing_id VARCHAR(50), @@ -83,12 +83,12 @@ CREATE TABLE gmail_tokens ( ```sql -- ๊ธฐ๋ณธ ์ธ๋ฑ์Šค -CREATE INDEX idx_gmail_tokens_user_id ON gmail_tokens(user_id); -CREATE INDEX idx_gmail_tokens_robeing_id ON gmail_tokens(robeing_id); +CREATE INDEX idx_gmail_token_user_id ON gmail_token(user_id); +CREATE INDEX idx_gmail_token_robeing_id ON gmail_token(robeing_id); -- JSON ๊ฒ€์ƒ‰์šฉ GIN ์ธ๋ฑ์Šค -CREATE INDEX idx_gmail_tokens_token_data ON gmail_tokens USING GIN (token_data); -CREATE INDEX idx_gmail_tokens_oauth_config ON gmail_tokens USING GIN (oauth_config); +CREATE INDEX idx_gmail_token_token_data ON gmail_token USING GIN (token_data); +CREATE INDEX idx_gmail_token_oauth_config ON gmail_token USING GIN (oauth_config); ``` --- @@ -106,8 +106,8 @@ END; $$ LANGUAGE plpgsql; -- ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ -CREATE TRIGGER update_gmail_tokens_updated_at -BEFORE UPDATE ON gmail_tokens +CREATE TRIGGER update_gmail_token_updated_at +BEFORE UPDATE ON gmail_token FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); ``` @@ -144,19 +144,19 @@ EXECUTE FUNCTION update_updated_at_column(); ```sql -- ํŠน์ • ์‚ฌ์šฉ์ž ํ† ํฐ ์กฐํšŒ SELECT token_data->>'access_token' as access_token -FROM gmail_tokens +FROM gmail_token WHERE user_id = 'test'; -- ์ด๋ฉ”์ผ ๋ฐœ์†ก ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ SELECT user_id, robeing_id -FROM gmail_tokens +FROM gmail_token WHERE scopes @> '["https://www.googleapis.com/auth/gmail.send"]'; ``` ### 6.2 ํ† ํฐ ์—…๋ฐ์ดํŠธ ```sql -- ์•ก์„ธ์Šค ํ† ํฐ ๊ฐฑ์‹  -UPDATE gmail_tokens +UPDATE gmail_token SET token_data = jsonb_set( token_data, '{access_token}', @@ -165,7 +165,7 @@ SET token_data = jsonb_set( WHERE user_id = 'test'; -- ์Šค์ฝ”ํ”„ ์ถ”๊ฐ€ -UPDATE gmail_tokens +UPDATE gmail_token SET scopes = scopes || '["https://www.googleapis.com/auth/gmail.send"]'::jsonb WHERE user_id = 'heejae'; ``` @@ -173,12 +173,12 @@ WHERE user_id = 'heejae'; ### 6.3 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ™œ์šฉ ```sql -- Slack ์‚ฌ์šฉ์ž์™€ ๋งคํ•‘ -SELECT * FROM gmail_tokens +SELECT * FROM gmail_token WHERE metadata->>'slack_user_id' = 'U091UNVE41M'; -- ํŠน์ • ๋กœ๋น™์˜ Gmail ๊ณ„์ • ์ฐพ๊ธฐ SELECT user_id, metadata->>'email' as gmail_account -FROM gmail_tokens +FROM gmail_token WHERE robeing_id = 'rb8001'; ``` @@ -207,7 +207,7 @@ with conn.cursor(cursor_factory=RealDictCursor) as cur: token_data->>'refresh_token' as refresh_token, oauth_config, scopes - FROM gmail_tokens + FROM gmail_token WHERE user_id = %s """, ('test',)) diff --git a/troubleshooting/250820_happybell80_Gmail์•„์ดํ…œ์‹œ์Šคํ…œํ†ตํ•ฉ.md b/troubleshooting/250820_happybell80_Gmail์•„์ดํ…œ์‹œ์Šคํ…œํ†ตํ•ฉ.md index 922cdac..4fc0fa7 100644 --- a/troubleshooting/250820_happybell80_Gmail์•„์ดํ…œ์‹œ์Šคํ…œํ†ตํ•ฉ.md +++ b/troubleshooting/250820_happybell80_Gmail์•„์ดํ…œ์‹œ์Šคํ…œํ†ตํ•ฉ.md @@ -16,7 +16,7 @@ - `AttributeError: 'str' object has no attribute 'get'` ์—๋Ÿฌ ๋ฐœ์ƒ #### ์›์ธ ๋ถ„์„ -- gmail_tokens ํ…Œ์ด๋ธ”์˜ metadata ์ปฌ๋Ÿผ์ด JSONB ํƒ€์ž…์ด์ง€๋งŒ, asyncpg๊ฐ€ string์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ +- gmail_token ํ…Œ์ด๋ธ”์˜ metadata ์ปฌ๋Ÿผ์ด JSONB ํƒ€์ž…์ด์ง€๋งŒ, asyncpg๊ฐ€ string์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ - ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ JSON string์œผ๋กœ ์ €์žฅ๋œ ๊ฒฝ์šฐ #### ํ•ด๊ฒฐ ๊ณผ์ • diff --git a/troubleshooting/250820_happybell80_GmailํŒจ์ŠคํฌํŠธ์‹œ์Šคํ…œ์™„์„ฑ.md b/troubleshooting/250820_happybell80_GmailํŒจ์ŠคํฌํŠธ์‹œ์Šคํ…œ์™„์„ฑ.md index 52ceb9e..950cbfe 100644 --- a/troubleshooting/250820_happybell80_GmailํŒจ์ŠคํฌํŠธ์‹œ์Šคํ…œ์™„์„ฑ.md +++ b/troubleshooting/250820_happybell80_GmailํŒจ์ŠคํฌํŠธ์‹œ์Šคํ…œ์™„์„ฑ.md @@ -139,7 +139,7 @@ GMAIL_API_SCOPES = [ # PostgreSQL ์ง์ ‘ ์—ฐ๋™ await conn.execute(""" - INSERT INTO gmail_tokens (...) VALUES (...) + INSERT INTO gmail_token (...) VALUES (...) ON CONFLICT (user_id) DO UPDATE SET ... """) ``` @@ -299,7 +299,7 @@ useEffect(() => { 2. "Gmail ์—ฐ๊ฒฐ" ๋ฒ„ํŠผ ํด๋ฆญ 3. auth-server/auth/gmail/passport/ OAuth ์‹œ์ž‘ 4. Google ์ธ์ฆ ์™„๋ฃŒ -5. PostgreSQL gmail_tokens ์ €์žฅ (is_equipped = true) +5. PostgreSQL gmail_token ์ €์žฅ (is_equipped = true) 6. Frontend๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (?gmail=success) 7. ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ ๋ฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ``` diff --git a/troubleshooting/250820_happybell80_auth_db๋ฅผ_main_db๋กœ_๋ณ€๊ฒฝ.md b/troubleshooting/250820_happybell80_auth_db๋ฅผ_main_db๋กœ_๋ณ€๊ฒฝ.md index cc99676..88a21b1 100644 --- a/troubleshooting/250820_happybell80_auth_db๋ฅผ_main_db๋กœ_๋ณ€๊ฒฝ.md +++ b/troubleshooting/250820_happybell80_auth_db๋ฅผ_main_db๋กœ_๋ณ€๊ฒฝ.md @@ -101,7 +101,7 @@ CREATE INDEX idx_conversations_robeing ON robeing.conversations(robeing_id); 1. 51123 ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค ์žฌ๋ฐฐํฌ ํ™•์ธ 2. main_db์— robeing ์Šคํ‚ค๋งˆ ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ 3. rb10508_micro์— ์ด๋ฆ„โ†’์ด๋ฉ”์ผ ๋ณ€ํ™˜ ๋กœ์ง ๊ตฌํ˜„ -4. workspace_members + robeing.contacts ์กฐํ•ฉ ์กฐํšŒ +4. workspace_member + robeing.contacts ์กฐํ•ฉ ์กฐํšŒ ## ๊ตํ›ˆ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ ์šฉ๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋ฐ˜์˜ํ•ด์•ผ ํ•จ diff --git a/troubleshooting/250820_happybell80_skill-email_DBํ†ตํ•ฉ๋ฐActions๋ฐฐํฌ.md b/troubleshooting/250820_happybell80_skill-email_DBํ†ตํ•ฉ๋ฐActions๋ฐฐํฌ.md index 99184e0..bd51c36 100644 --- a/troubleshooting/250820_happybell80_skill-email_DBํ†ตํ•ฉ๋ฐActions๋ฐฐํฌ.md +++ b/troubleshooting/250820_happybell80_skill-email_DBํ†ตํ•ฉ๋ฐActions๋ฐฐํฌ.md @@ -169,7 +169,7 @@ on: ``` ์‚ฌ์šฉ์ž โ†’ rb10508_micro โ†’ skill-email(DB ์—ฐ๋™) โ†’ Gmail API โ†“ โ†“ - PostgreSQL (gmail_tokens ํ…Œ์ด๋ธ”) + PostgreSQL (gmail_token ํ…Œ์ด๋ธ”) โ†‘ robeing-monitor (์•„์ดํ…œ ๊ด€๋ฆฌ) ``` diff --git a/troubleshooting/250820_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™๋™์ ํ• ๋‹น๊ตฌํ˜„.md b/troubleshooting/250820_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™๋™์ ํ• ๋‹น๊ตฌํ˜„.md index 151b5f7..73f6cc5 100644 --- a/troubleshooting/250820_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™๋™์ ํ• ๋‹น๊ตฌํ˜„.md +++ b/troubleshooting/250820_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™๋™์ ํ• ๋‹น๊ตฌํ˜„.md @@ -23,7 +23,7 @@ โ†“ users ํ…Œ์ด๋ธ” (UUID) โ†“ -workspace_members ํ…Œ์ด๋ธ” +workspace_member ํ…Œ์ด๋ธ” (robeing_id ํ• ๋‹น) โ†“ ๋กœ๋น™ ์ปจํ…Œ์ด๋„ˆ @@ -35,7 +35,7 @@ workspace_members ํ…Œ์ด๋ธ” #### ํ•ต์‹ฌ ํ…Œ์ด๋ธ” ๊ด€๊ณ„ - **users**: ์‚ฌ์šฉ์ž UUID ์ €์žฅ -- **workspace_members**: user_id โ†’ robeing_id ๋งคํ•‘ +- **workspace_member**: user_id โ†’ robeing_id ๋งคํ•‘ - **robeing_stats**: ๊ฐ ๋กœ๋น™์˜ ๋ ˆ๋ฒจ, ๊ฒฝํ—˜์น˜, ์Šคํƒฏ #### ์„œ๋น„์Šค ๊ตฌ์กฐ @@ -74,7 +74,7 @@ export async function getUserRobeing(): Promise<{ robeing_id: string; robeing_url: string; } | null> { - // workspace_members์—์„œ ์‚ฌ์šฉ์ž์˜ ๋กœ๋น™ ์กฐํšŒ + // workspace_member์—์„œ ์‚ฌ์šฉ์ž์˜ ๋กœ๋น™ ์กฐํšŒ } export async function getRobeingStats(robeingId: string): Promise<{ @@ -177,7 +177,7 @@ async def get_stats(robeing_id: str): ### 1. ์‹œ์Šคํ…œ ๊ตฌ์กฐ ์ดํ•ด์˜ ์ค‘์š”์„ฑ - ๋‹จ์ˆœํ•œ ๋ ˆ๋ฒจ ํ‘œ์‹œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ์ดํ•ด ํ•„์š” -- users โ†’ workspace_members โ†’ robeing_stats ๊ด€๊ณ„ ํŒŒ์•… ํ•„์ˆ˜ +- users โ†’ workspace_member โ†’ robeing_stats ๊ด€๊ณ„ ํŒŒ์•… ํ•„์ˆ˜ - ๋‹ค์ค‘ ๋กœ๋น™ ์ฒด๊ณ„์™€ ์‚ฌ์šฉ์ž ๋งคํ•‘ ๊ตฌ์กฐ ์ดํ•ด ### 2. ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ์˜ ํ•„์š”์„ฑ diff --git a/troubleshooting/250821_gmail_token_auto_refresh.md b/troubleshooting/250821_gmail_token_auto_refresh.md index c40c3eb..8bb3584 100644 --- a/troubleshooting/250821_gmail_token_auto_refresh.md +++ b/troubleshooting/250821_gmail_token_auto_refresh.md @@ -21,12 +21,12 @@ Gmail OAuth ํ† ํฐ์˜ ์ž๋™ ๊ฐฑ์‹  ๊ธฐ๋Šฅ์„ auth-server์— ๊ตฌํ˜„ํ•˜์—ฌ, ๋งŒ ### 2.1 ํ˜„์žฌ DB ์ •๋ณด ``` Database: main_db (auth_db ์•„๋‹˜ ์ฃผ์˜!) -Table: gmail_tokens +Table: gmail_token ``` -### 2.2 gmail_tokens ํ…Œ์ด๋ธ” ๊ตฌ์กฐ +### 2.2 gmail_token ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ```sql -CREATE TABLE gmail_tokens ( +CREATE TABLE gmail_token ( id SERIAL PRIMARY KEY, user_id UUID UNIQUE NOT NULL, robeing_id VARCHAR(50), @@ -222,6 +222,6 @@ docker compose down && docker compose up -d --build --- ## 10. ๊ด€๋ จ ๋ฌธ์„œ -- `/home/heejae/DOCS/250818_gmail_tokens_database_setup.md` +- `/home/heejae/DOCS/250818_gmail_token_database_setup.md` - `/home/heejae/DOCS/robeing-monitor-integration.md` - `/home/heejae/DOCS/250817_slack_user_mapping_troubleshooting.md` \ No newline at end of file diff --git a/troubleshooting/250822_happybell80_Gmailํ†ตํ•ฉ_UUID๋ณ€ํ™˜_๋ฌธ์ œํ•ด๊ฒฐ.md b/troubleshooting/250822_happybell80_Gmailํ†ตํ•ฉ_UUID๋ณ€ํ™˜_๋ฌธ์ œํ•ด๊ฒฐ.md index 0604609..3e2b31a 100644 --- a/troubleshooting/250822_happybell80_Gmailํ†ตํ•ฉ_UUID๋ณ€ํ™˜_๋ฌธ์ œํ•ด๊ฒฐ.md +++ b/troubleshooting/250822_happybell80_Gmailํ†ตํ•ฉ_UUID๋ณ€ํ™˜_๋ฌธ์ œํ•ด๊ฒฐ.md @@ -36,7 +36,7 @@ asyncpg.exceptions.DataError: invalid input for query argument $1: 'U091UNVE41M' #### ์›์ธ - robeing-monitor๊ฐ€ Slack user_id๋ฅผ UUID๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ DB ์กฐํšŒ -- PostgreSQL gmail_tokens ํ…Œ์ด๋ธ”์˜ user_id ์ปฌ๋Ÿผ์€ UUID ํƒ€์ž… +- PostgreSQL gmail_token ํ…Œ์ด๋ธ”์˜ user_id ์ปฌ๋Ÿผ์€ UUID ํƒ€์ž… ### 2.2 Gateway ํ”„๋ก์‹œ ๋ฌธ์ œ diff --git a/troubleshooting/250823_happybell80_Gmail_OAuth_ํ† ํฐ_๊ฐฑ์‹ _์‹œ์Šคํ…œ_๊ตฌ์ถ•.md b/troubleshooting/250823_happybell80_Gmail_OAuth_ํ† ํฐ_๊ฐฑ์‹ _์‹œ์Šคํ…œ_๊ตฌ์ถ•.md index 5a2862e..4dfa4bf 100644 --- a/troubleshooting/250823_happybell80_Gmail_OAuth_ํ† ํฐ_๊ฐฑ์‹ _์‹œ์Šคํ…œ_๊ตฌ์ถ•.md +++ b/troubleshooting/250823_happybell80_Gmail_OAuth_ํ† ํฐ_๊ฐฑ์‹ _์‹œ์Šคํ…œ_๊ตฌ์ถ•.md @@ -24,7 +24,7 @@ ### 2.1 ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํŒŒ์•… ```sql -gmail_tokens ํ…Œ์ด๋ธ”: +gmail_token ํ…Œ์ด๋ธ”: - ๊ตฌ์กฐ ํ˜ผ์žฌ: ์‹ ๊ทœ ์ปฌ๋Ÿผ(access_token, refresh_token)๊ณผ ๊ธฐ์กด ์ปฌ๋Ÿผ(token_data, oauth_config) - ๋‘ ๊ฐ€์ง€ ํ˜•์‹ ๋ชจ๋‘ ์ง€์› ํ•„์š” ``` @@ -77,7 +77,7 @@ async def refresh_gmail_token(user_id: str): cur.execute(''' SELECT access_token, refresh_token, expires_at, token_data, oauth_config, metadata, expiry - FROM gmail_tokens + FROM gmail_token WHERE user_id = %s::uuid ''', (user_id,)) @@ -90,7 +90,7 @@ async def refresh_gmail_token(user_id: str): # 4. ์ƒˆ ํ† ํฐ์œผ๋กœ DB ์—…๋ฐ์ดํŠธ cur.execute(''' - UPDATE gmail_tokens + UPDATE gmail_token SET access_token = %s, expires_at = %s, ... ''') ``` @@ -108,7 +108,7 @@ oauth_config = { # INSERT ์ฟผ๋ฆฌ์— oauth_config ์ถ”๊ฐ€ await conn.execute(""" - INSERT INTO gmail_tokens ( + INSERT INTO gmail_token ( ..., oauth_config, ... ) VALUES (..., $8, ...) """, ..., json.dumps(oauth_config), ...) @@ -122,7 +122,7 @@ await conn.execute(""" **๋ฌธ์ œ**: `token_data` NOT NULL ์ œ์•ฝ์œผ๋กœ INSERT ์‹คํŒจ **ํ•ด๊ฒฐ**: 51123 ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์ปฌ๋Ÿผ ์ œ์•ฝ ์ œ๊ฑฐ ```sql -ALTER TABLE gmail_tokens ALTER COLUMN token_data DROP NOT NULL; +ALTER TABLE gmail_token ALTER COLUMN token_data DROP NOT NULL; ``` ### 4.2 UUID ํƒ€์ž… ์˜ค๋ฅ˜ @@ -144,14 +144,14 @@ database_url = os.getenv("DATABASE_URL", "postgresql://robeings:robeings@192.168 **๋ฌธ์ œ**: `access_token` ์ปฌ๋Ÿผ ๋ˆ„๋ฝ์œผ๋กœ "column does not exist" ์—๋Ÿฌ **ํ•ด๊ฒฐ**: ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋“ค ์ถ”๊ฐ€ ```sql -ALTER TABLE gmail_tokens +ALTER TABLE gmail_token ADD COLUMN IF NOT EXISTS access_token TEXT, ADD COLUMN IF NOT EXISTS refresh_token TEXT, ADD COLUMN IF NOT EXISTS token_type VARCHAR DEFAULT 'Bearer', ADD COLUMN IF NOT EXISTS expires_at FLOAT; -- ๊ธฐ์กด token_data์—์„œ ์ƒˆ ์ปฌ๋Ÿผ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ -UPDATE gmail_tokens +UPDATE gmail_token SET access_token = token_data->>'access_token', refresh_token = token_data->>'refresh_token' diff --git a/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md b/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md index 065c8ca..6449017 100644 --- a/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md +++ b/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md @@ -24,7 +24,7 @@ -- ํ˜„์žฌ DB ์ƒํƒœ: ๋ชจ๋“  ์‚ฌ์šฉ์ž ํ† ํฐ ๋งŒ๋ฃŒ SELECT username, access_token IS NOT NULL as has_token, expires_at < extract(epoch from now()) as is_expired -FROM gmail_tokens; +FROM gmail_token; ๊ฒฐ๊ณผ: happybell80 | t (์žˆ์Œ) | t (๋งŒ๋ฃŒ๋จ) @@ -49,7 +49,7 @@ sequenceDiagram Cron->>RB: POST /api/cron/daily-summary RB->>Email: GET /messages?user_id={slack_id} - Email->>DB: SELECT token_data FROM gmail_tokens + Email->>DB: SELECT token_data FROM gmail_token DB-->>Email: access_token: expired โŒ Email-->>RB: 500 Internal Server Error RB->>Slack: ๋ถˆ์™„์ „ํ•œ ๋ธŒ๋ฆฌํ•‘ ์ „์†ก
(์ด๋ฉ”์ผ ์—†์ด ๋‰ด์Šค๋งŒ) @@ -73,7 +73,7 @@ sequenceDiagram Google->>Auth: Callback with code Auth->>Google: Exchange code for tokens Google-->>Auth: access_token, refresh_token - Auth->>DB: UPDATE gmail_tokens
SET access_token, refresh_token + Auth->>DB: UPDATE gmail_token
SET access_token, refresh_token Auth-->>Front: ์ธ์ฆ ์™„๋ฃŒ ``` @@ -95,7 +95,7 @@ curl -X GET "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a66 # 4. ํ† ํฐ ์ €์žฅ ํ™•์ธ export PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c \ - "SELECT user_id, access_token IS NOT NULL FROM gmail_tokens WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" + "SELECT user_id, access_token IS NOT NULL FROM gmail_token WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" # 5. ๋ธŒ๋ฆฌํ•‘ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ curl -X POST http://192.168.219.52:8001/api/cron/daily-summary \ @@ -123,7 +123,7 @@ psql -h localhost -U robeings -d main_db -c \ gt.expires_at < extract(epoch from now()) as is_expired, gt.metadata->>'email' as email FROM users u - LEFT JOIN gmail_tokens gt ON u.id = gt.user_id + LEFT JOIN gmail_token gt ON u.id = gt.user_id WHERE u.username IN ('happybell80', '0914eagle', 'cdctfm');" ``` @@ -141,7 +141,7 @@ curl -s "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a661-8a # 4. ์ธ์ฆ ์„ฑ๊ณต ํ™•์ธ psql -h localhost -U robeings -d main_db -c \ "SELECT access_token IS NOT NULL as success - FROM gmail_tokens + FROM gmail_token WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" ``` @@ -190,7 +190,7 @@ curl -s "http://localhost:9000/api/gmail/auth?user_id=69ae4ea9-a15f-5110-9f5d-65 ### 7.1 ๋ฌธ์ œ ์ƒํ™ฉ - **์ฆ์ƒ**: Slack DM ๋Œ€ํ™”๊ฐ€ PostgreSQL์— ์ €์žฅ ์•ˆ๋จ - **ChromaDB**: โœ… ์ •์ƒ ์ €์žฅ -- **PostgreSQL**: โŒ ์ €์žฅ ์‹คํŒจ (conversation_logs ํ…Œ์ด๋ธ” 0 rows) +- **PostgreSQL**: โŒ ์ €์žฅ ์‹คํŒจ (conversation_log ํ…Œ์ด๋ธ” 0 rows) ### 7.2 ๋Œ€ํ™” ์ €์žฅ ํ”Œ๋กœ์šฐ (ํ˜„์žฌ: State Service ์‚ฌ์šฉ ์•ˆ ํ•จ) ```mermaid @@ -207,7 +207,7 @@ sequenceDiagram RB->>Chroma: store_memory() Chroma-->>RB: โœ… ์ €์žฅ ์„ฑ๊ณต
ID: 2a776b26... - RB->>PG: ์ง์ ‘ INSERT INTO conversation_logs + RB->>PG: ์ง์ ‘ INSERT INTO conversation_log PG-->>RB: โœ… ์ €์žฅ ์„ฑ๊ณต Note over RB: State Service ์—†์ด
์ง์ ‘ DB ์—ฐ๊ฒฐ diff --git a/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md b/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md index e4f6661..7ee7f41 100644 --- a/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md +++ b/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md @@ -22,7 +22,7 @@ username: happybell80 email: goeun2dc@gmail.com UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230 --- workspace_members ํ…Œ์ด๋ธ” +-- workspace_member ํ…Œ์ด๋ธ” happybell80 โ†’ rb8001 (ํฌํŠธ 8001) eagle0914 โ†’ rb10508_micro (ํฌํŠธ 10508) ``` diff --git a/troubleshooting/250825_robeing_stats_display_issue.md b/troubleshooting/250825_robeing_stats_display_issue.md index 9838d54..c11d5c4 100644 --- a/troubleshooting/250825_robeing_stats_display_issue.md +++ b/troubleshooting/250825_robeing_stats_display_issue.md @@ -203,7 +203,7 @@ WHERE robeing_id = 'rb8001'; - **DB ํ…Œ์ด๋ธ”**: - `robeing_stats` - ์‹ค์ œ ์Šคํƒฏ ์ €์žฅ - - `workspace_members` - ์‚ฌ์šฉ์ž-๋กœ๋น™ ๋งคํ•‘ + - `workspace_member` - ์‚ฌ์šฉ์ž-๋กœ๋น™ ๋งคํ•‘ --- diff --git a/troubleshooting/250826_frontend_rb8001_chat_endpoint_missing.md b/troubleshooting/250826_frontend_rb8001_chat_endpoint_missing.md index 70aec68..ef79405 100644 --- a/troubleshooting/250826_frontend_rb8001_chat_endpoint_missing.md +++ b/troubleshooting/250826_frontend_rb8001_chat_endpoint_missing.md @@ -142,7 +142,7 @@ Stats request from user: happybell80 for robeing: undefined ### 4.3 ๋Œ€ํ™” ์ €์žฅ ํ™•์ธ โŒ ```sql -SELECT COUNT(*) FROM conversation_logs; -- 0๊ฑด +SELECT COUNT(*) FROM conversation_log; -- 0๊ฑด -- rb8001์—์„œ DB ์ €์žฅ ๋กœ์ง ๋ฏธ๊ตฌํ˜„ ``` diff --git a/troubleshooting/250826_happybell80_frontend_rb8001_์ฑ„ํŒ…์—ฐ๊ฒฐ_๊ณ„ํš.md b/troubleshooting/250826_happybell80_frontend_rb8001_์ฑ„ํŒ…์—ฐ๊ฒฐ_๊ณ„ํš.md index 7b7b625..0719c66 100644 --- a/troubleshooting/250826_happybell80_frontend_rb8001_์ฑ„ํŒ…์—ฐ๊ฒฐ_๊ณ„ํš.md +++ b/troubleshooting/250826_happybell80_frontend_rb8001_์ฑ„ํŒ…์—ฐ๊ฒฐ_๊ณ„ํš.md @@ -100,7 +100,7 @@ async def message_endpoint(request: MessageRequest): user_id=request.user_id or "web_user", task_type="chat", context=request.context, - channel="web" # โš ๏ธ Slack DM๊ณผ ๋™์ผ (๊ฐœ์„ : 250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) + channel="web" # โš ๏ธ Slack DM๊ณผ ๋™์ผ (๊ฐœ์„ : 250828_conversation_log_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md) ) # Frontend๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์‘๋‹ต ํ˜•์‹ @@ -195,7 +195,7 @@ rb8001(8001) โ†’ /api/message ์ฒ˜๋ฆฌ - Gateway ๋กœ๊ทธ: ๋ผ์šฐํŒ… ์„ฑ๊ณต - rb8001 ๋กœ๊ทธ: ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ - ChromaDB: ๋Œ€ํ™” ์ €์žฅ -- PostgreSQL: conversation_logs ๊ธฐ๋ก +- PostgreSQL: conversation_log ๊ธฐ๋ก --- diff --git a/troubleshooting/250826_happybell80_rb8001_์ด์ค‘์ €์žฅ๊ตฌํ˜„.md b/troubleshooting/250826_happybell80_rb8001_์ด์ค‘์ €์žฅ๊ตฌํ˜„.md index a519c9d..5cac830 100644 --- a/troubleshooting/250826_happybell80_rb8001_์ด์ค‘์ €์žฅ๊ตฌํ˜„.md +++ b/troubleshooting/250826_happybell80_rb8001_์ด์ค‘์ €์žฅ๊ตฌํ˜„.md @@ -43,7 +43,7 @@ grep -r "save_conversation\|store_memory" rb8001/ PGPASSWORD=robeings psql -h 192.168.219.45 -U robeings -d main_db -c "\dt" # ๊ฒฐ๊ณผ: -# - conversation_logs ํ…Œ์ด๋ธ” ์กด์žฌ โœ… +# - conversation_log ํ…Œ์ด๋ธ” ์กด์žฌ โœ… # - robeing_stats ํ…Œ์ด๋ธ” ์กด์žฌ โœ… # - ์ง์ ‘ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ``` @@ -158,18 +158,18 @@ graph LR ``` 2. **์›์ธ ๋ถ„์„** - - conversation_logs ํ…Œ์ด๋ธ”์˜ user_id๊ฐ€ UUID ํƒ€์ž… + - conversation_log ํ…Œ์ด๋ธ”์˜ user_id๊ฐ€ UUID ํƒ€์ž… - rb8001์€ Slack user ID (๋ฌธ์ž์—ด) ์ „์†ก - UUID ๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ ์ €์žฅ ์‹คํŒจ ### DB ์Šคํ‚ค๋งˆ ์ˆ˜์ • (51123 ์„œ๋ฒ„) ```sql -- slack_user_id ์ปฌ๋Ÿผ ์ถ”๊ฐ€ -ALTER TABLE conversation_logs +ALTER TABLE conversation_log ADD COLUMN slack_user_id VARCHAR(255); -- user_id๋ฅผ nullable๋กœ ๋ณ€๊ฒฝ -ALTER TABLE conversation_logs +ALTER TABLE conversation_log ALTER COLUMN user_id DROP NOT NULL; ``` @@ -191,7 +191,7 @@ conversation_log = ConversationLog( ```python class ConversationLog(Base): """๋Œ€ํ™” ๋กœ๊ทธ ํ…Œ์ด๋ธ”""" - __tablename__ = "conversation_logs" + __tablename__ = "conversation_log" id = Column(Integer, primary_key=True, index=True) robeing_id = Column(String, index=True) @@ -223,13 +223,13 @@ docker logs rb8001 --tail 100 | grep -E "ChromaDB|PostgreSQL|saved" ### DB ํ™•์ธ ```sql -- PostgreSQL ์ €์žฅ ํ™•์ธ -SELECT COUNT(*) FROM conversation_logs +SELECT COUNT(*) FROM conversation_log WHERE robeing_id = 'rb8001' AND timestamp > NOW() - INTERVAL '1 hour'; -- ์ตœ๊ทผ ๋Œ€ํ™” ํ™•์ธ SELECT user_id, message, response, timestamp -FROM conversation_logs +FROM conversation_log WHERE robeing_id = 'rb8001' ORDER BY timestamp DESC LIMIT 5; diff --git a/troubleshooting/250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md b/troubleshooting/250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md index c671a02..5209181 100644 --- a/troubleshooting/250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md +++ b/troubleshooting/250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md @@ -1,4 +1,4 @@ -# ID ์ฒด๊ณ„ ์ •๋ฆฌ ๋ฐ conversation_logs ์ €์žฅ ๋ฌธ์ œ ํ•ด๊ฒฐ +# ID ์ฒด๊ณ„ ์ •๋ฆฌ ๋ฐ conversation_log ์ €์žฅ ๋ฌธ์ œ ํ•ด๊ฒฐ ## ์ž‘์„ฑ์ผ: 2025-08-26 (์ˆ˜์ •: 2025-08-28) ## ์ž‘์„ฑ์ž: ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž @@ -12,12 +12,12 @@ ### 1.1 ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ๋“ค 1. **user_id UUID ํƒ€์ž… ๋ฌธ์ œ** - - PostgreSQL์˜ conversation_logs ํ…Œ์ด๋ธ”์—์„œ user_id๊ฐ€ UUID ํƒ€์ž… + - PostgreSQL์˜ conversation_log ํ…Œ์ด๋ธ”์—์„œ user_id๊ฐ€ UUID ํƒ€์ž… - "system"์ด๋‚˜ Slack user_id (์˜ˆ: U0925SXQFDK)๋Š” UUID๊ฐ€ ์•„๋‹˜ - UUID ๋ณ€ํ™˜ ์‹œ๋„ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ 2. **๋Œ€ํ™” ์ €์žฅ ์ „ํ˜€ ์•ˆ๋จ** - - conversation_logs ํ…Œ์ด๋ธ” ์™„์ „ํžˆ ๋น„์–ด์žˆ์Œ (0 rows) + - conversation_log ํ…Œ์ด๋ธ” ์™„์ „ํžˆ ๋น„์–ด์žˆ์Œ (0 rows) - ๊ฒŒ์ดํŠธ์›จ์ด ๋กœ๊ทธ์— ์ €์žฅ API ํ˜ธ์ถœ ์—†์Œ - DB ์„ค์ • ์˜ค๋ฅ˜ (auth_db โ†’ main_db) @@ -27,28 +27,28 @@ ### 2.1 ๋ฌธ์ œ์  #### ๋‹ค์–‘ํ•œ ID ํƒ€์ž… ํ˜ผ์žฌ -- **UUID**: users.id, workspace_members.id, slack_user_mapping.user_id +- **UUID**: users.id, workspace_member.id, slack_user_mapping.user_id - **VARCHAR**: robeing_id, slack_user_id, slack_id, channel_id -- **INTEGER**: conversation_logs.id, gmail_tokens.id +- **INTEGER**: conversation_log.id, gmail_token.id #### 2025-08-28 ํ™•์ธ -- gmail_tokens.slack_user_id: VARCHAR(100) -- gmail_tokens.user_id: UUID (FK โ†’ users.id) +- gmail_token.slack_user_id: VARCHAR(100) +- gmail_token.user_id: UUID (FK โ†’ users.id) - Slack ID์™€ UUID ๋™์‹œ ์ €์žฅ #### ๋ณ€ํ™˜ ๋ฌธ์ œ - UUID โ†” Slack ID ๋ณ€ํ™˜ ๋กœ์ง ๋ถˆ์ผ์น˜ -- conversation_logs์˜ user_id(UUID)์— Slack ID ์ €์žฅ ์‹œ๋„๋กœ ์‹คํŒจ +- conversation_log์˜ user_id(UUID)์— Slack ID ์ €์žฅ ์‹œ๋„๋กœ ์‹คํŒจ ### 2.2 ํ…Œ์ด๋ธ”๋ณ„ ID ํ˜„ํ™ฉ | ํ…Œ์ด๋ธ” | Primary Key | ์™ธ๋ž˜ ํ‚ค/์ฐธ์กฐ ID | |--------|------------|---------------| | **users** | id (UUID) | oauth_id (VARCHAR) | -| **workspace_members** | id (UUID) | user_id (UUID), workspace_id (UUID), robeing_id (VARCHAR) | -| **gmail_tokens** | id (INT) | user_id (UUID), slack_id (VARCHAR), robeing_id (VARCHAR) | +| **workspace_member** | id (UUID) | user_id (UUID), workspace_id (UUID), robeing_id (VARCHAR) | +| **gmail_token** | id (INT) | user_id (UUID), slack_id (VARCHAR), robeing_id (VARCHAR) | | **slack_user_mapping** | id (UUID) | user_id (UUID), slack_user_id (VARCHAR), workspace_member_id (UUID) | -| **conversation_logs** | id (INT) | user_id (UUID), slack_user_id (VARCHAR)*, robeing_id (VARCHAR) | +| **conversation_log** | id (INT) | user_id (UUID), slack_user_id (VARCHAR)*, robeing_id (VARCHAR) | *slack_user_id๋Š” ์ด ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ปฌ๋Ÿผ @@ -60,13 +60,13 @@ ``` [Slack ID] โ”€โ”€โ”ฌโ”€โ”€> [slack_user_mapping] โ”€โ”€> [users.id (UUID)] โ”‚ - โ”œโ”€โ”€> [gmail_tokens.slack_id] + โ”œโ”€โ”€> [gmail_token.slack_id] โ”‚ - โ””โ”€โ”€> [conversation_logs.slack_user_id] + โ””โ”€โ”€> [conversation_log.slack_user_id] -[users.id] โ”€โ”€โ”ฌโ”€โ”€> [workspace_members.user_id] - โ”œโ”€โ”€> [gmail_tokens.user_id] - โ”œโ”€โ”€> [conversation_logs.user_id] +[users.id] โ”€โ”€โ”ฌโ”€โ”€> [workspace_member.user_id] + โ”œโ”€โ”€> [gmail_token.user_id] + โ”œโ”€โ”€> [conversation_log.user_id] โ””โ”€โ”€> [robeing_stats.user_id] ``` @@ -86,10 +86,10 @@ U092F7FQ55L | cdctfm ### 4.1 ๋‹จ๊ธฐ ํ•ด๊ฒฐ์ฑ… (์ฆ‰์‹œ ์ ์šฉ) โœ… ์™„๋ฃŒ ```sql -- 1. user_id๋ฅผ nullable๋กœ ๋ณ€๊ฒฝ -ALTER TABLE conversation_logs ALTER COLUMN user_id DROP NOT NULL; +ALTER TABLE conversation_log ALTER COLUMN user_id DROP NOT NULL; -- 2. slack_user_id ์ปฌ๋Ÿผ ์ถ”๊ฐ€ -ALTER TABLE conversation_logs ADD COLUMN slack_user_id VARCHAR(100); +ALTER TABLE conversation_log ADD COLUMN slack_user_id VARCHAR(100); ``` ### 4.2 ์ค‘๊ธฐ ํ•ด๊ฒฐ์ฑ… (ํ‘œ์ค€ํ™”) @@ -100,8 +100,8 @@ ALTER TABLE conversation_logs ADD COLUMN slack_user_id VARCHAR(100); **์ž‘์—… ํ•„์š”**: ```sql --- gmail_tokens ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ -ALTER TABLE gmail_tokens RENAME COLUMN slack_id TO slack_user_id; +-- gmail_token ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ +ALTER TABLE gmail_token RENAME COLUMN slack_id TO slack_user_id; ``` ### 4.3 ์žฅ๊ธฐ ํ•ด๊ฒฐ์ฑ… (๊ตฌ์กฐ ๊ฐœ์„ ) @@ -124,7 +124,7 @@ SELECT DISTINCT wm.robeing_id FROM users u LEFT JOIN slack_user_mapping sum ON u.id = sum.user_id -LEFT JOIN workspace_members wm ON u.id = wm.user_id; +LEFT JOIN workspace_member wm ON u.id = wm.user_id; ``` --- @@ -163,8 +163,8 @@ DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db ## 6. ์ž‘์—… ์™„๋ฃŒ ํ˜„ํ™ฉ -1. โœ… conversation_logs์— slack_user_id ์ถ”๊ฐ€ (์™„๋ฃŒ) -2. โœ… gmail_tokens์˜ slack_user_id ์ปฌ๋Ÿผ ํ™•์ธ (์ด๋ฏธ ์กด์žฌ, slack_id ์ปฌ๋Ÿผ ์—†์Œ - 2025-08-27 ํ™•์ธ) +1. โœ… conversation_log์— slack_user_id ์ถ”๊ฐ€ (์™„๋ฃŒ) +2. โœ… gmail_token์˜ slack_user_id ์ปฌ๋Ÿผ ํ™•์ธ (์ด๋ฏธ ์กด์žฌ, slack_id ์ปฌ๋Ÿผ ์—†์Œ - 2025-08-27 ํ™•์ธ) 3. โœ… **๋‰ด์Šค ํ‚ค์›Œ๋“œ ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ** (2025-08-26 21:00 ์™„๋ฃŒ) - rb8001/app/skills/dm_skill.py ์ˆ˜์ • (์ปค๋ฐ‹: aed931e) - user_preferences ํ…Œ์ด๋ธ” ํ™œ์šฉ @@ -180,7 +180,7 @@ DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db ### 7.1 ๋Œ€ํ™” ์ €์žฅ ํ™•์ธ ```sql -- ์ €์žฅ๋œ ๋Œ€ํ™” ํ™•์ธ -SELECT COUNT(*) FROM conversation_logs; +SELECT COUNT(*) FROM conversation_log; -- ์ตœ๊ทผ ๋Œ€ํ™” ๋กœ๊ทธ SELECT @@ -189,7 +189,7 @@ SELECT cl.message, cl.response, cl.timestamp -FROM conversation_logs cl +FROM conversation_log cl ORDER BY cl.timestamp DESC LIMIT 5; ``` @@ -204,7 +204,7 @@ SELECT wm.robeing_id FROM slack_user_mapping sum JOIN users u ON sum.user_id = u.id -LEFT JOIN workspace_members wm ON u.id = wm.user_id; +LEFT JOIN workspace_member wm ON u.id = wm.user_id; ``` --- diff --git a/troubleshooting/250826_rb8001_conversation_storage_failure.md b/troubleshooting/250826_rb8001_conversation_storage_failure.md index 2b41e5e..c9ea313 100644 --- a/troubleshooting/250826_rb8001_conversation_storage_failure.md +++ b/troubleshooting/250826_rb8001_conversation_storage_failure.md @@ -3,7 +3,7 @@ ## ์ž‘์„ฑ์ผ: 2025-08-26 ## ์ž‘์„ฑ์ž: 51124 ์„œ๋ฒ„ ๋‹ด๋‹น ## ์ƒํƒœ: โœ… ์™„์ „ ํ•ด๊ฒฐ (ChromaDB โœ…, PostgreSQL โœ…, Foreign key โœ…) -## ์˜ํ–ฅ: PostgreSQL conversation_logs ์ •์ƒ ์ €์žฅ +## ์˜ํ–ฅ: PostgreSQL conversation_log ์ •์ƒ ์ €์žฅ ## ์ตœ์ข… ์—…๋ฐ์ดํŠธ: 2025-08-26 19:30 --- @@ -51,12 +51,12 @@ LINE 1: ... VALUES ('rb8001', 'test_user_123', 'web', ... ### 2.3 PostgreSQL ์Šคํ‚ค๋งˆ ๋ฌธ์ œ ```sql --- conversation_logs ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ +-- conversation_log ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ user_id UUID -- ๋ฌธ์ œ: UUID ํƒ€์ž…๋งŒ ํ—ˆ์šฉ slack_user_id VARCHAR(100) -- ์ถ”๊ฐ€๋จ (250826 ๋ฌธ์„œ) -- ์‹ค์ œ ์ €์žฅ ์‹œ๋„ -INSERT INTO conversation_logs (user_id, ...) +INSERT INTO conversation_log (user_id, ...) VALUES ('test_user_123', ...) -- ์‹คํŒจ: UUID ํ˜•์‹ ์•„๋‹˜ ``` @@ -168,7 +168,7 @@ curl -X POST http://localhost:8001/api/message \ # PostgreSQL ํ™•์ธ psql -h localhost -p 5433 -U robeings -d main_db \ - -c "SELECT * FROM conversation_logs ORDER BY timestamp DESC LIMIT 1;" + -c "SELECT * FROM conversation_log ORDER BY timestamp DESC LIMIT 1;" # ChromaDB ํ™•์ธ (์ˆ˜์ • ํ›„) docker exec rb8001 python -c " @@ -204,7 +204,7 @@ print('Collections:', client.list_collections()) ### ๋ฐ์ดํ„ฐ ์œ„์น˜ - ChromaDB: `/home/admin/ivada_project/rb8001/chroma_db/` -- PostgreSQL: `main_db.conversation_logs` ํ…Œ์ด๋ธ” +- PostgreSQL: `main_db.conversation_log` ํ…Œ์ด๋ธ” --- @@ -231,7 +231,7 @@ print('Collections:', client.list_collections()) ### 12.2 โš ๏ธ ๋‚จ์€ ๋ฌธ์ œ 1. **51124 ์„œ๋ฒ„ rb8001**: - - conversation_logs ์ €์žฅ ์•ˆ๋จ (์ตœ๊ทผ ๋ฐ์ดํ„ฐ 14์‹œ๊ฐ„ ์ „) + - conversation_log ์ €์žฅ ์•ˆ๋จ (์ตœ๊ทผ ๋ฐ์ดํ„ฐ 14์‹œ๊ฐ„ ์ „) - UUID ํƒ€์ž… ์—๋Ÿฌ๋กœ PostgreSQL ์ €์žฅ ์‹คํŒจ ์ค‘ - ChromaDB๋งŒ ์ €์žฅ๋˜๊ณ  PostgreSQL์€ ์‹คํŒจ diff --git a/troubleshooting/250826_slack_id_column_standardization.md b/troubleshooting/250826_slack_id_column_standardization.md index 8cb9215..da2fa20 100644 --- a/troubleshooting/250826_slack_id_column_standardization.md +++ b/troubleshooting/250826_slack_id_column_standardization.md @@ -15,7 +15,7 @@ |--------|------------|------------|------| | slack_user_mapping | slack_user_id | slack_user_id | VARCHAR(100) | | gmail_token | ~~slack_id~~ โŒ | **slack_user_id** โœ… | VARCHAR(100) | -| conversation_logs | slack_user_id | slack_user_id | VARCHAR(100) | +| conversation_log | slack_user_id | slack_user_id | VARCHAR(100) | ### โœ… ์ ์šฉ ์™„๋ฃŒ diff --git a/troubleshooting/250827_UUID_username_ํ˜ผ์šฉ_CRITICAL.md b/troubleshooting/250827_UUID_username_ํ˜ผ์šฉ_CRITICAL.md index 43f56df..b76511c 100644 --- a/troubleshooting/250827_UUID_username_ํ˜ผ์šฉ_CRITICAL.md +++ b/troubleshooting/250827_UUID_username_ํ˜ผ์šฉ_CRITICAL.md @@ -83,7 +83,7 @@ const userId = localStorage.getItem('user_id') || 'default_user'; ### 2.5 Database ```sql --- conversation_logs ํ…Œ์ด๋ธ” +-- conversation_log ํ…Œ์ด๋ธ” user_id UUID -- UUID ํƒ€์ž… ์š”๊ตฌ slack_user_id VARCHAR(100) -- username์ด ์—ฌ๊ธฐ ์ €์žฅ๋จ @@ -179,14 +179,14 @@ SELECT id, username FROM users WHERE username='happybell80'; # database.py:184: SELECT id::text as user_id # username โ†’ UUID ๋ณ€ํ™˜ ์ •์ƒ ์ž‘๋™ -# conversation_logs ํ™•์ธ (51124 ๋ณด๊ณ ) +# conversation_log ํ™•์ธ (51124 ๋ณด๊ณ ) # user_id: NULL, slack_user_id: 'happybell80' # "Non-UUID user_id" ์—๋Ÿฌ ๋ฐœ์ƒ ``` ### 5.2 ์ˆ˜์ • ํ›„ ๊ฒ€์ฆ - JWT `sub` ํ•„๋“œ๊ฐ€ UUID ํ˜•์‹ (36์ž) -- conversation_logs.user_id์— UUID ์ €์žฅ +- conversation_log.user_id์— UUID ์ €์žฅ - ChromaDB metadata.user_id๊ฐ€ UUID --- @@ -204,7 +204,7 @@ SELECT id, username FROM users WHERE username='happybell80'; ## 7. ๊ด€๋ จ ๋ฌธ์„œ -- [ID ์ฒด๊ณ„ ์ •๋ฆฌ (250826)](./250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_logs_๋ฌธ์ œ_ํ•ด๊ฒฐ.md) +- [ID ์ฒด๊ณ„ ์ •๋ฆฌ (250826)](./250826_id_์ฒด๊ณ„_์ •๋ฆฌ_๋ฐ_conversation_log_๋ฌธ์ œ_ํ•ด๊ฒฐ.md) - [JWT ์ธ์ฆ ๊ตฌํ˜„ (250827)](./250827_JWT_์ธ์ฆ_๊ตฌํ˜„_COMPLETED.md) - [Slack ID ํ‘œ์ค€ํ™” (250826)](./250826_slack_id_column_standardization.md) diff --git a/troubleshooting/250827_frontend_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md b/troubleshooting/250827_frontend_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md index 991298a..264832e 100644 --- a/troubleshooting/250827_frontend_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md +++ b/troubleshooting/250827_frontend_backend_preferences_API_์—ฐ๋™_์™„๋ฃŒ.md @@ -82,7 +82,7 @@ const activities: ActivityLog[] = [...]; // ํ•˜๋“œ์ฝ”๋”ฉ const scheduledTasks: ScheduledTask[] = [...]; // ํ•˜๋“œ์ฝ”๋”ฉ ``` - ์‹ค์ œ ๋ฐ์ดํ„ฐ ์กฐํšŒ API ์—†์Œ -- conversation_logs ํ…Œ์ด๋ธ” ์กฐํšŒ ์—”๋“œํฌ์ธํŠธ ํ•„์š” +- conversation_log ํ…Œ์ด๋ธ” ์กฐํšŒ ์—”๋“œํฌ์ธํŠธ ํ•„์š” ### 3.4 โœ… ํ•ด๊ฒฐ๋จ: API ๊ตฌํ˜„ - **robeing-monitor**: preferences API ์™„์ „ ๊ตฌํ˜„ diff --git a/troubleshooting/250827_happybell80_๊ธด๊ธ‰์ด์Šˆ์ ๊ฒ€๋ฐ์ฝ”๋“œ์—…๋ฐ์ดํŠธ.md b/troubleshooting/250827_happybell80_๊ธด๊ธ‰์ด์Šˆ์ ๊ฒ€๋ฐ์ฝ”๋“œ์—…๋ฐ์ดํŠธ.md index a0aa3bb..00be29b 100644 --- a/troubleshooting/250827_happybell80_๊ธด๊ธ‰์ด์Šˆ์ ๊ฒ€๋ฐ์ฝ”๋“œ์—…๋ฐ์ดํŠธ.md +++ b/troubleshooting/250827_happybell80_๊ธด๊ธ‰์ด์Šˆ์ ๊ฒ€๋ฐ์ฝ”๋“œ์—…๋ฐ์ดํŠธ.md @@ -148,7 +148,7 @@ rb8001์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋Œ€ํ™”๋ฅผ ํ•˜๋‚˜์˜ ChromaDB ์ปฌ๋ ‰์…˜์— ์ €์žฅ: - ์ž๋™ ๊ฐฑ์‹  ์‹คํŒจ ์‹œ ์•Œ๋ฆผ 2. **DB ์ปฌ๋Ÿผ๋ช… ํ‘œ์ค€ํ™”** - - gmail_tokens.slack_id โ†’ slack_user_id + - gmail_token.slack_id โ†’ slack_user_id - ์„œ๋ฒ„ ์ž‘์—… ํ•„์š” --- diff --git a/troubleshooting/250828_UUID_ํ†ตํ•ฉ_๋ฐ_์‚ฌ์šฉ์ž_๊ฒฉ๋ฆฌ_๊ณ„ํš.md b/troubleshooting/250828_UUID_ํ†ตํ•ฉ_๋ฐ_์‚ฌ์šฉ์ž_๊ฒฉ๋ฆฌ_๊ณ„ํš.md index ae1eed9..1ed66e3 100644 --- a/troubleshooting/250828_UUID_ํ†ตํ•ฉ_๋ฐ_์‚ฌ์šฉ์ž_๊ฒฉ๋ฆฌ_๊ณ„ํš.md +++ b/troubleshooting/250828_UUID_ํ†ตํ•ฉ_๋ฐ_์‚ฌ์šฉ์ž_๊ฒฉ๋ฆฌ_๊ณ„ํš.md @@ -67,7 +67,7 @@ workspace (๋กœ๋น™ 1๊ฐœ) ### Phase 3: ์‚ฌ์šฉ์ž ๊ฒฉ๋ฆฌ โœ… ์™„๋ฃŒ (2025-08-28 18:15) - [x] ChromaDB ์‚ฌ์šฉ์ž๋ณ„ ์ปฌ๋ ‰์…˜ (rb8001_{user_uuid}) -- [x] conversation_logs UUID ์ €์žฅ ๊ตฌํ˜„ +- [x] conversation_log UUID ์ €์žฅ ๊ตฌํ˜„ - [x] ์™„์ „ํ•œ ์‚ฌ์šฉ์ž ๋Œ€ํ™” ๊ฒฉ๋ฆฌ --- @@ -108,7 +108,7 @@ async def get_uuid(slack_id: str): - rb8001: JWT ๊ฒ€์ฆ ๊ตฌํ˜„ โœ… - rb8001: Slack ID โ†’ UUID ์ž๋™ ๋ณ€ํ™˜ โœ… - ChromaDB: ์‚ฌ์šฉ์ž๋ณ„ ์ปฌ๋ ‰์…˜ ๊ฒฉ๋ฆฌ โœ… -- conversation_logs: UUID ์ €์žฅ โœ… +- conversation_log: UUID ์ €์žฅ โœ… --- @@ -117,7 +117,7 @@ async def get_uuid(slack_id: str): ### โœ… ๊ฒ€์ฆ ์™„๋ฃŒ 1. **JWT ์ธ์ฆ**: UUID ์ถ”์ถœ ์„ฑ๊ณต (1e16e9d5-59f3-54da-a661-8abeabff4230) 2. **ChromaDB ๊ฒฉ๋ฆฌ**: rb8001_{user_uuid} ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ ํ™•์ธ -3. **PostgreSQL**: conversation_logs์— UUID ์ €์žฅ ํ™•์ธ +3. **PostgreSQL**: conversation_log์— UUID ์ €์žฅ ํ™•์ธ 4. **Slack ๋ณ€ํ™˜**: Slack ID โ†’ UUID ์ž๋™ ๋ณ€ํ™˜ ์ž‘๋™ 5. **metadata None ์ฒ˜๋ฆฌ**: Frontend ์ ‘์† ์‹œ slack_user_id=None ํ•„ํ„ฐ๋ง ๊ตฌํ˜„ ([250828_ChromaDB_metadata_None_error.md](250828_ChromaDB_metadata_None_error.md)) diff --git a/troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md b/troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md index 299b8b0..a54f6a4 100644 --- a/troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md +++ b/troubleshooting/250828_conversation_logs_channel_๊ตฌ๋ถ„_๊ฐœ์„ .md @@ -1,7 +1,7 @@ -# conversation_logs ์ฑ„๋„ ๊ตฌ๋ถ„ ๊ฐœ์„  +# conversation_log ์ฑ„๋„ ๊ตฌ๋ถ„ ๊ฐœ์„  **๋‚ ์งœ**: 2025-08-28 -**ํ…Œ์ด๋ธ”**: conversation_logs +**ํ…Œ์ด๋ธ”**: conversation_log **์ƒํƒœ**: โœ… ํ•ด๊ฒฐ ์™„๋ฃŒ (2025-08-28) ## ํ˜„์žฌ ์ƒํ™ฉ (DB ํ™•์ธ) @@ -39,7 +39,7 @@ Slack DM์€ ์—ฌ์ „ํžˆ "D..."๋กœ ์ •์ƒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ### Phase 2: DB ์Šคํ‚ค๋งˆ ๊ฐœ์„  (์„ ํƒ) ```sql -ALTER TABLE conversation_logs +ALTER TABLE conversation_log ADD COLUMN thread_ts VARCHAR(20), -- ์“ฐ๋ ˆ๋“œ ๊ตฌ๋ถ„ ADD COLUMN channel_type VARCHAR(20); -- public_channel/private_channel/im/mpim ``` diff --git a/troubleshooting/250831_rb8001_context_race_condition_fix.md b/troubleshooting/250831_rb8001_context_race_condition_fix.md index e354b93..c0265e2 100644 --- a/troubleshooting/250831_rb8001_context_race_condition_fix.md +++ b/troubleshooting/250831_rb8001_context_race_condition_fix.md @@ -70,7 +70,7 @@ async def get_user_mapping(identifier: str, db: Session = Depends(get_db)): query = text(""" SELECT u.id as user_id, u.username, u.email, wm.robeing_id FROM users u - LEFT JOIN workspace_members wm ON u.id = wm.user_id + LEFT JOIN workspace_member wm ON u.id = wm.user_id WHERE u.id = :user_id """) result = db.execute(query, {"user_id": identifier}).first() @@ -144,7 +144,7 @@ async def route_message(self, message: str, user_id: str, ...): ### 2.7 Gateway ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ **ํŒŒ์ผ**: `robeing-gateway/app/database.py` ```python -# spaceboum ๋“ฑ workspace_members ์—†๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด +# spaceboum ๋“ฑ workspace_member ์—†๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด DEFAULT_ROBEING_PORT = int(os.getenv('DEFAULT_ROBEING_PORT', '8001')) # 10508 โ†’ 8001 DEFAULT_ROBEING_ID = os.getenv('DEFAULT_ROBEING_ID', 'rb8001') # rb10508_test โ†’ rb8001 ``` diff --git a/troubleshooting/250831_rb8001_postgresql_context_integration.md b/troubleshooting/250831_rb8001_postgresql_context_integration.md index 349f63d..db61719 100644 --- a/troubleshooting/250831_rb8001_postgresql_context_integration.md +++ b/troubleshooting/250831_rb8001_postgresql_context_integration.md @@ -10,7 +10,7 @@ ## 1. ๋ฌธ์ œ ์ƒํ™ฉ - **ํ˜„์ƒ**: rb8001์ด ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰๋งŒ ์ฐธ์กฐํ•˜์—ฌ ์—‰๋šฑํ•œ ๋‹ต๋ณ€ -- **์›์ธ**: PostgreSQL conversation_logs์˜ ์ตœ๊ทผ ๋Œ€ํ™” ๋ฏธ์ฐธ์กฐ +- **์›์ธ**: PostgreSQL conversation_log์˜ ์ตœ๊ทผ ๋Œ€ํ™” ๋ฏธ์ฐธ์กฐ - **์˜ํ–ฅ**: ์ง์ „ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ์†์‹ค, ์ผ๊ด€์„ฑ ์—†๋Š” ์‘๋‹ต - **ํ…Œ์ŠคํŠธ**: "๋‚ด ์ด๋ฆ„์€ ๊น€์ข…ํƒœ" โ†’ "๋‚ด ์ด๋ฆ„์€?" โ†’ "๋ชจ๋ฆ…๋‹ˆ๋‹ค" ์‘๋‹ต diff --git a/troubleshooting/250831_slack_login_workspace_assignment_issue.md b/troubleshooting/250831_slack_login_workspace_assignment_issue.md index cdbad0a..cf435a6 100644 --- a/troubleshooting/250831_slack_login_workspace_assignment_issue.md +++ b/troubleshooting/250831_slack_login_workspace_assignment_issue.md @@ -12,8 +12,8 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ ํ• ๋‹น๋˜์ง€ ์•Š์Œ ### ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค -- spaceboum (Google ๋กœ๊ทธ์ธ): workspace_members ์—†์Œ โ†’ ๊ธฐ๋ณธ๊ฐ’ rb8001 -- ํ™ํƒœ์ฃผ (Slack ๋กœ๊ทธ์ธ): workspace_members ์—†์Œ โ†’ ๊ธฐ๋ณธ๊ฐ’ rb8001 +- spaceboum (Google ๋กœ๊ทธ์ธ): workspace_member ์—†์Œ โ†’ ๊ธฐ๋ณธ๊ฐ’ rb8001 +- ํ™ํƒœ์ฃผ (Slack ๋กœ๊ทธ์ธ): workspace_member ์—†์Œ โ†’ ๊ธฐ๋ณธ๊ฐ’ rb8001 --- @@ -34,7 +34,7 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ - ๋งคํ•‘ ์žˆ์œผ๋ฉด: ๊ธฐ์กด User ์‚ฌ์šฉ - ๋งคํ•‘ ์—†์œผ๋ฉด: ์ƒˆ User ์ƒ์„ฑ -4. **workspace_members ์ถ”๊ฐ€**: โŒ **์—†์Œ** +4. **workspace_member ์ถ”๊ฐ€**: โŒ **์—†์Œ** - Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ• ๋‹น ๋กœ์ง ๋ถ€์žฌ - SlackWorkspace โ‰  Robeing Workspace (๋ณ„๊ฐœ ๊ฐœ๋…) @@ -45,7 +45,7 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ ### ํ•ต์‹ฌ ๊ฐœ๋…: team_id = workspace_id - **Slack team_id**: Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ ๊ณ ์œ  ID (T๋กœ ์‹œ์ž‘) -- **workspace_members.workspace_id**: team_id๋ฅผ ์ €์žฅํ•˜๋Š” ํ•„๋“œ +- **workspace_member.workspace_id**: team_id๋ฅผ ์ €์žฅํ•˜๋Š” ํ•„๋“œ - **์ฆ‰, team_id๊ฐ€ ๊ทธ๋Œ€๋กœ workspace_id๋กœ ์‚ฌ์šฉ๋จ** #### slack_workspaces ํ…Œ์ด๋ธ” @@ -53,7 +53,7 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ - **์ฃผ์š” ์ปฌ๋Ÿผ**: team_id (Slack ID), team_name, bot_token - **ํ˜„์žฌ ๋ฐ์ดํ„ฐ**: GoodGang Labs (T035VFRKCN6), test (T097FCTDVEX) -#### workspace_members ํ…Œ์ด๋ธ” +#### workspace_member ํ…Œ์ด๋ธ” - **์šฉ๋„**: ์‚ฌ์šฉ์ž์™€ Slack ์›Œํฌ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ - **์ฃผ์š” ์ปฌ๋Ÿผ**: user_id, workspace_id (=team_id), robeing_id - **๋ฌธ์ œ**: Slack ๋กœ๊ทธ์ธ ์‹œ ์ž๋™ ์ถ”๊ฐ€ ์•ˆ ๋จ @@ -64,13 +64,13 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ | users | ์‚ฌ์šฉ์ž ์ •๋ณด | โœ… ์ƒ์„ฑ๋จ | | slack_user_mapping | Slack ID โ†” UUID | โœ… ์ƒ์„ฑ๋จ | | slack_workspaces | Slack ํŒ€ ์ •๋ณด | โœ… ์กฐํšŒ๋จ | -| workspace_members | **์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„์‹ญ** | โŒ ์ถ”๊ฐ€ ์•ˆ ๋จ | +| workspace_member | **์‚ฌ์šฉ์ž-์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„์‹ญ** | โŒ ์ถ”๊ฐ€ ์•ˆ ๋จ | --- ## 4. ์˜ํ–ฅ -- ๋ชจ๋“  Slack ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๊ฐ€ workspace_members ์—†์Œ +- ๋ชจ๋“  Slack ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๊ฐ€ workspace_member ์—†์Œ - Gateway๊ฐ€ ๊ธฐ๋ณธ๊ฐ’(rb8001 ๋˜๋Š” rb10508) ์‚ฌ์šฉ - ์‚ฌ์šฉ์ž๋ณ„ Robeing ํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ @@ -82,10 +82,10 @@ Slack OAuth๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Robeing ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ž๋™ 304๋ฒˆ ์ค„ ์ดํ›„ ์ถ”๊ฐ€: ```python -# workspace_members ์ถ”๊ฐ€ (team_id = workspace_id) +# workspace_member ์ถ”๊ฐ€ (team_id = workspace_id) if team_id and user: db.execute(text(""" - INSERT INTO workspace_members (user_id, workspace_id, robeing_id) + INSERT INTO workspace_member (user_id, workspace_id, robeing_id) VALUES (:user_id, :workspace_id, :robeing_id) ON CONFLICT (user_id, workspace_id) DO UPDATE SET robeing_id = :robeing_id @@ -98,8 +98,8 @@ if team_id and user: ### ์ˆ˜๋™ ํ•ด๊ฒฐ SQL (์ฐธ๊ณ ์šฉ) ```sql --- happybell80 ์‚ฌ์šฉ์ž workspace_members ์ถ”๊ฐ€ -INSERT INTO workspace_members (user_id, workspace_id, robeing_id) +-- happybell80 ์‚ฌ์šฉ์ž workspace_member ์ถ”๊ฐ€ +INSERT INTO workspace_member (user_id, workspace_id, robeing_id) VALUES ( '1e16e9d5-59f3-54da-a661-8abeabff4230', -- happybell80 user_id 'T035VFRKCN6', -- GoodGang Labs team_id diff --git a/troubleshooting/250831_slack_oauth_login_implementation.md b/troubleshooting/250831_slack_oauth_login_implementation.md index 0128288..7c6b222 100644 --- a/troubleshooting/250831_slack_oauth_login_implementation.md +++ b/troubleshooting/250831_slack_oauth_login_implementation.md @@ -23,7 +23,7 @@ ### 1. DB ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜ โš ๏ธ **๋ฌธ์ œ์ **: -- `companies` ํ…Œ์ด๋ธ”๊ณผ `workspaces` ํ…Œ์ด๋ธ”์ด ๊ณต์กด +- `company` ํ…Œ์ด๋ธ”๊ณผ `workspaces` ํ…Œ์ด๋ธ”์ด ๊ณต์กด - `SlackWorkspace` ๋ชจ๋ธ์ด `company_id`๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ ๋ชจ๋ธ์€ `workspace_id` ๊ธฐ๋Œ€ - Relationship ์ฃผ์„ ์ฒ˜๋ฆฌ๋กœ ์ž„์‹œ ํ•ด๊ฒฐ @@ -31,13 +31,13 @@ ```python # app/models/workspace.py class SlackWorkspace(Base): - company_id = Column(UUID, ForeignKey("companies.id")) # ์‹ค์ œ DB - # workspace_id๋กœ ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ companies ํ…Œ์ด๋ธ” ์ฐธ์กฐ ์ค‘ + company_id = Column(UUID, ForeignKey("company.id")) # ์‹ค์ œ DB + # workspace_id๋กœ ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ company ํ…Œ์ด๋ธ” ์ฐธ์กฐ ์ค‘ # relationship ์ฃผ์„ ์ฒ˜๋ฆฌ๋จ ``` **ํ•ด๊ฒฐ ๋ฐฉ์•ˆ**: -1. `companies` ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ `workspaces`๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +1. `company` ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ `workspaces`๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 2. FK ๊ด€๊ณ„ ์ •๋ฆฌ 3. ๋ชจ๋ธ ํ†ต์ผ @@ -101,7 +101,7 @@ login_callback_url = "https://auth.ro-being.com/auth/slack/login/callback" # ## ํ–ฅํ›„ ์ž‘์—… ### ๊ธด๊ธ‰๋„ ๋†’์Œ ๐Ÿ”ด -1. DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (companies โ†’ workspaces) +1. DB ์Šคํ‚ค๋งˆ ํ†ต์ผ (company โ†’ workspaces) 2. Frontend ์ธ์ฆ ๋ฐฉ์‹ ํ†ต์ผ ### ์ค‘๊ฐ„ ์šฐ์„ ์ˆœ์œ„ ๐ŸŸก diff --git a/troubleshooting/250901_hongtaeju_slack_oauth_mapping_failure.md b/troubleshooting/250901_hongtaeju_slack_oauth_mapping_failure.md index e716426..548b0cd 100644 --- a/troubleshooting/250901_hongtaeju_slack_oauth_mapping_failure.md +++ b/troubleshooting/250901_hongtaeju_slack_oauth_mapping_failure.md @@ -17,7 +17,7 @@ ```sql -- ํ™•์ธ ๊ฒฐ๊ณผ: ๋ชจ๋‘ 0 rows SELECT * FROM slack_user_mapping WHERE user_id = '237494f7-061c-484c-a4f7-f500611e32f1'; -- โŒ -SELECT * FROM workspace_members WHERE user_id = '237494f7-061c-484c-a4f7-f500611e32f1'; -- โŒ +SELECT * FROM workspace_member WHERE user_id = '237494f7-061c-484c-a4f7-f500611e32f1'; -- โŒ SELECT * FROM user_preferences WHERE user_id = '237494f7-061c-484c-a4f7-f500611e32f1'; -- โŒ ``` @@ -25,11 +25,11 @@ SELECT * FROM user_preferences WHERE user_id = '237494f7-061c-484c-a4f7-f500611e auth-server์˜ Slack OAuth ์ฝœ๋ฐฑ(`/auth/slack/login/callback`)์—์„œ: 1. โœ… users ํ…Œ์ด๋ธ” ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ 2. โŒ slack_user_mapping ์ƒ์„ฑ ์•ˆ ํ•จ -3. โŒ workspace_members ์ถ”๊ฐ€ ์•ˆ ํ•จ +3. โŒ workspace_member ์ถ”๊ฐ€ ์•ˆ ํ•จ 4. โŒ user_preferences ์ดˆ๊ธฐํ™” ์•ˆ ํ•จ ## 4. ์˜ํ–ฅ -- workspace_members ์ž๋™ ์ถ”๊ฐ€ ๊ตฌํ˜„๋จ(9/11), ๊ธฐ๋ณธ robeing ํ• ๋‹น ์ •์ƒ +- workspace_member ์ž๋™ ์ถ”๊ฐ€ ๊ตฌํ˜„๋จ(9/11), ๊ธฐ๋ณธ robeing ํ• ๋‹น ์ •์ƒ - slack_user_mapping ์˜์กด ์ œ๊ฑฐ(9/11) โ†’ ์ด๋ฉ”์ผ/๊ธฐํƒ€ ์‹๋ณ„ ๋ณ‘ํ–‰ - ์ƒ์„ธ: [/DOCS/troubleshooting/250831_slack_login_workspace_assignment_issue.md](./250831_slack_login_workspace_assignment_issue.md) @@ -38,8 +38,8 @@ auth-server์˜ Slack OAuth ์ฝœ๋ฐฑ(`/auth/slack/login/callback`)์—์„œ: -- 1. username ์„ค์ • UPDATE users SET username = 'hongtj' WHERE id = '237494f7-061c-484c-a4f7-f500611e32f1'; --- 2. workspace_members ์ถ”๊ฐ€ (team_id ํ™•์ธ ํ•„์š”) -INSERT INTO workspace_members (user_id, workspace_id, robeing_id) +-- 2. workspace_member ์ถ”๊ฐ€ (team_id ํ™•์ธ ํ•„์š”) +INSERT INTO workspace_member (user_id, workspace_id, robeing_id) VALUES ('237494f7-061c-484c-a4f7-f500611e32f1', 'T035VFRKCN6', 'rb8001'); ``` diff --git a/troubleshooting/250902_slack_bot_install_url_analysis.md b/troubleshooting/250902_slack_bot_install_url_analysis.md index 0b619ee..3005e28 100644 --- a/troubleshooting/250902_slack_bot_install_url_analysis.md +++ b/troubleshooting/250902_slack_bot_install_url_analysis.md @@ -127,7 +127,7 @@ state={RANDOM_STATE} **๊ด€๋ จ ํ…Œ์ด๋ธ”:** - workspaces: robeing_port, subdomain ์ปฌ๋Ÿผ ๋ณด์œ  -- workspace_members: workspace_id, user_id, robeing_id ๋งคํ•‘ +- workspace_member: workspace_id, user_id, robeing_id ๋งคํ•‘ - slack_user_mapping: ์‚ฌ์šฉ์ž ๋งคํ•‘ ### 5.2 Slack ์„ค์ • ์ •๋ณด @@ -144,7 +144,7 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read **workspace_id ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ œ โœ… ํ•ด๊ฒฐ:** - ~~TODO ์ฃผ์„๋งŒ ์žˆ๊ณ  ๊ตฌํ˜„ ์•ˆ ๋จ~~ - ~~๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผ workspace_id ์‚ฌ์šฉ (550e8400-e29b-41d4-a716-446655440000)~~ -- ~~workspace_members ์กฐํšŒ ์ฝ”๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ๋จ~~ +- ~~workspace_member ์กฐํšŒ ์ฝ”๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ๋จ~~ **ํ•ด๊ฒฐ ๋‚ด์šฉ:** 1. ~~WorkspaceMember ์กฐํšŒ ๋กœ์ง ํ™œ์„ฑํ™” (Line 411-419)~~ โ†’ sqlalchemy text() ์ง์ ‘ ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝ @@ -161,9 +161,9 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read **WorkspaceMember ๋ชจ๋ธ ์ด์Šˆ:** - app/models/workspace.py์— WorkspaceMember ํด๋ž˜์Šค ์ •์˜ ์—†์Œ -- workspace_members ํ…Œ์ด๋ธ” ์ง์ ‘ ์ฟผ๋ฆฌ๋กœ ํ•ด๊ฒฐ -- ~~`SELECT workspace_id FROM workspace_members WHERE user_id = :user_id::uuid AND is_active = true`~~ -- `SELECT workspace_id FROM workspace_members WHERE user_id = (:user_id)::uuid AND is_active = true` (๊ด„ํ˜ธ ํ•„์ˆ˜) +- workspace_member ํ…Œ์ด๋ธ” ์ง์ ‘ ์ฟผ๋ฆฌ๋กœ ํ•ด๊ฒฐ +- ~~`SELECT workspace_id FROM workspace_member WHERE user_id = :user_id::uuid AND is_active = true`~~ +- `SELECT workspace_id FROM workspace_member WHERE user_id = (:user_id)::uuid AND is_active = true` (๊ด„ํ˜ธ ํ•„์ˆ˜) ### 5.4 ์ถ”๊ฐ€ ์ด์Šˆ ํ•ด๊ฒฐ (2025-09-02 ์ €๋…) @@ -172,10 +172,10 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read - Slack App ์„ค์ •: 3๊ฐœ URL ๋ชจ๋‘ ๋“ฑ๋ก (callback, login/callback, passport/callback) **SlackWorkspace ๋ชจ๋ธ ๋ถˆ์ผ์น˜:** -- ๋ชจ๋ธ ์ •์˜: `company_id` (Line 44, ForeignKey๋Š” companies.id) +- ๋ชจ๋ธ ์ •์˜: `company_id` (Line 44, ForeignKey๋Š” company.id) - ์ฝ”๋“œ ์‚ฌ์šฉ: `workspace_id` ์‹œ๋„ โ†’ `company_id`๋กœ ์ˆ˜์ • ํ•„์š” - Line 542, 557, 631, 674, 713: workspace_id โ†’ company_id -- DB ํ˜„์‹ค: companies ํ…Œ์ด๋ธ” ์—†์Œ, workspaces ํ…Œ์ด๋ธ” ์‚ฌ์šฉ ์ค‘ +- DB ํ˜„์‹ค: company ํ…Œ์ด๋ธ” ์—†์Œ, workspaces ํ…Œ์ด๋ธ” ์‚ฌ์šฉ ์ค‘ **Company-X ์„ค์ • ์ƒํƒœ:** - workspace_id: 99d22d6b-d327-4fa4-bd2f-d228c11056e2 @@ -186,15 +186,15 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read ### 5.5 ์ตœ์ข… ์ด์Šˆ (โœ… ํ•ด๊ฒฐ ์™„๋ฃŒ) **Foreign Key ๋ฌธ์ œ ํ•ด๊ฒฐ:** -- ๋ชจ๋ธ: `ForeignKey("companies.id")` ์ฐธ์กฐ -- ~~์‹ค์ œ DB: companies ํ…Œ์ด๋ธ” ์—†์Œ~~ โ†’ **companies ํ…Œ์ด๋ธ” ์กด์žฌ ํ™•์ธ๋จ** +- ๋ชจ๋ธ: `ForeignKey("company.id")` ์ฐธ์กฐ +- ~~์‹ค์ œ DB: company ํ…Œ์ด๋ธ” ์—†์Œ~~ โ†’ **company ํ…Œ์ด๋ธ” ์กด์žฌ ํ™•์ธ๋จ** - ํ•ด๊ฒฐ ๋‚ด์šฉ: - 1. companies ํ…Œ์ด๋ธ”์— Company-X ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ (ID: 99d22d6b-d327-4fa4-bd2f-d228c11056e2) + 1. company ํ…Œ์ด๋ธ”์— Company-X ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ (ID: 99d22d6b-d327-4fa4-bd2f-d228c11056e2) 2. ๊ธฐ์กด slack_workspaces ๋ ˆ์ฝ”๋“œ์˜ company_id ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ 3. Foreign Key ์ œ์•ฝ ์กฐ๊ฑด ์ •์ƒ ์ž‘๋™ **์ตœ์ข… DB ์ƒํƒœ (2025-09-02 20:40):** -- companies ํ…Œ์ด๋ธ”: Company-X (8001 ํฌํŠธ, active ์ƒํƒœ) +- company ํ…Œ์ด๋ธ”: Company-X (8001 ํฌํŠธ, active ์ƒํƒœ) - workspaces ํ…Œ์ด๋ธ”: Company-X (8๋ช… ๋ฉค๋ฒ„) - slack_workspaces: T097FCTDVEX โ†’ Company-X ์—ฐ๊ฒฐ ์™„๋ฃŒ - ๋ด‡ ์„ค์น˜ ์ค€๋น„ ์™„๋ฃŒ diff --git a/troubleshooting/250903_frontend_conversation_order_reversed.md b/troubleshooting/250903_frontend_conversation_order_reversed.md index 9b9de90..2f9e38a 100644 --- a/troubleshooting/250903_frontend_conversation_order_reversed.md +++ b/troubleshooting/250903_frontend_conversation_order_reversed.md @@ -68,6 +68,6 @@ response.messages // reverse() ์—†์ด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ - **๊ฒฐ๊ณผ**: ๊ณผ๊ฑฐโ†’์ตœ์‹  ์‹œ๊ฐ„์ˆœ + ์‚ฌ์šฉ์žโ†’๋กœ๋น™ ๋Œ€ํ™”์Œ ์ˆœ์„œ ๋ชจ๋‘ ์ •์ƒ ## 7. ์ถ”๊ฐ€ ํ™•์ธ ์‚ฌํ•ญ -- **DB ์ €์žฅ ๋ฌธ์ œ**: conversation_logs ํ…Œ์ด๋ธ”์— Slack ๋Œ€ํ™” ์ €์žฅ ์•ˆ ๋จ (๋ณ„๊ฐœ ์ด์Šˆ) +- **DB ์ €์žฅ ๋ฌธ์ œ**: conversation_log ํ…Œ์ด๋ธ”์— Slack ๋Œ€ํ™” ์ €์žฅ ์•ˆ ๋จ (๋ณ„๊ฐœ ์ด์Šˆ) - **API ์—”๋“œํฌ์ธํŠธ**: /api/conversations/recent 404 ์—๋Ÿฌ (51124 ์„œ๋ฒ„) - **ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ**: message, response, timestamp ์‚ฌ์šฉ (user_message ์ปฌ๋Ÿผ ์—†์Œ) \ No newline at end of file diff --git a/troubleshooting/250903_gmail_token_permission_denied_issue.md b/troubleshooting/250903_gmail_token_permission_denied_issue.md index 59e49cc..9d8eea8 100644 --- a/troubleshooting/250903_gmail_token_permission_denied_issue.md +++ b/troubleshooting/250903_gmail_token_permission_denied_issue.md @@ -20,7 +20,7 @@ ## 3. ํ™•์ธ๋œ ์‚ฌ์‹ค (๋ฌธ์„œ ๊ธฐ๋ฐ˜) - 2025-08-25 DB ๊ธฐ๋ฐ˜ ํ† ํฐ ์ €์žฅ์œผ๋กœ ์ „ํ™˜ ์™„๋ฃŒ (๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฌธ์„œ) -- auth-server๋Š” gmail_tokens ํ…Œ์ด๋ธ”์—๋งŒ ํ† ํฐ ์ €์žฅ (์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ) +- auth-server๋Š” gmail_token ํ…Œ์ด๋ธ”์—๋งŒ ํ† ํฐ ์ €์žฅ (์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ) - skill-email์€ DB์—์„œ ํ† ํฐ ์กฐํšŒํ•˜๋„๋ก ์„ค๊ณ„๋จ (์„œ๋น„์Šค ๊ฐ„ ์ง์ ‘ ์ „๋‹ฌ ์—†์Œ) - Docker ์ปจํ…Œ์ด๋„ˆ /code ๋””๋ ‰ํ† ๋ฆฌ ์“ฐ๊ธฐ ๊ถŒํ•œ ์—†์Œ (์—๋Ÿฌ ๋ฉ”์‹œ์ง€) - access_token, refresh_token์€ TEXT ํƒ€์ž…์œผ๋กœ ์•”ํ˜ธํ™” ์ €์žฅ (ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ) @@ -67,5 +67,5 @@ 1. โœ… ํ”„๋ก ํŠธ์—”๋“œ Gmail OAuth ์„ฑ๊ณต 2. โœ… Permission denied ์˜ค๋ฅ˜ ์—†์Œ 3. โœ… unknown_gmail.json ์ƒ์„ฑ ์‹œ๋„ ์—†์Œ -4. โœ… gmail_tokens ํ…Œ์ด๋ธ” ์ •์ƒ ์ €์žฅ +4. โœ… gmail_token ํ…Œ์ด๋ธ” ์ •์ƒ ์ €์žฅ 5. โœ… ํŒŒ์ผ ์‹œ์Šคํ…œ ์˜์กด์„ฑ ์™„์ „ ์ œ๊ฑฐ \ No newline at end of file diff --git a/troubleshooting/250903_slack_chat_display_indicator.md b/troubleshooting/250903_slack_chat_display_indicator.md index 8a99c58..216a29c 100644 --- a/troubleshooting/250903_slack_chat_display_indicator.md +++ b/troubleshooting/250903_slack_chat_display_indicator.md @@ -4,7 +4,7 @@ ํ”„๋ก ํŠธ์—”๋“œ ๋Œ€ํ™”์ฐฝ์—์„œ ์Šฌ๋ž™/์›น ๋Œ€ํ™” ๊ตฌ๋ถ„ ๋ถˆ๊ฐ€ ## ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• -conversation_logs ํ…Œ์ด๋ธ”์˜ slack_user_id ํ•„๋“œ(VARCHAR(100))๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์Šฌ๋ž™ ๋Œ€ํ™” ์‹œ๊ฐ์  ํ‘œ์‹œ +conversation_log ํ…Œ์ด๋ธ”์˜ slack_user_id ํ•„๋“œ(VARCHAR(100))๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์Šฌ๋ž™ ๋Œ€ํ™” ์‹œ๊ฐ์  ํ‘œ์‹œ ## ์ˆ˜์ •๋œ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ @@ -15,7 +15,7 @@ conversation_logs ํ…Œ์ด๋ธ”์˜ slack_user_id ํ•„๋“œ(VARCHAR(100))๋ฅผ ํ™œ์šฉํ•˜ # get_recent_conversations() ํ•จ์ˆ˜ query = text(""" SELECT message, response, timestamp, slack_user_id # slack_user_id ์ถ”๊ฐ€ - FROM conversation_logs + FROM conversation_log WHERE user_id = :user_id ORDER BY timestamp DESC LIMIT :limit diff --git a/troubleshooting/250909_happybell80_gmail_refresh_token_๋ถˆ์ผ์น˜.md b/troubleshooting/250909_happybell80_gmail_refresh_token_๋ถˆ์ผ์น˜.md index 01a245d..d2a6dc8 100644 --- a/troubleshooting/250909_happybell80_gmail_refresh_token_๋ถˆ์ผ์น˜.md +++ b/troubleshooting/250909_happybell80_gmail_refresh_token_๋ถˆ์ผ์น˜.md @@ -40,7 +40,7 @@ HanYong: token_data ๋น„์–ด์žˆ์Œ (8/30 ์ดํ›„) -- 166๋ฒˆ: token_data = jsonb_set(...) ์‚ฌ์šฉ -- ๊ฐœ๋ณ„ ์ปฌ๋Ÿผ ์‚ญ์ œ (์ฝ”๋“œ ์ˆ˜์ • ํ›„) -ALTER TABLE gmail_tokens +ALTER TABLE gmail_token DROP COLUMN access_token, DROP COLUMN refresh_token, DROP COLUMN token_type, diff --git a/troubleshooting/250911_happybell80_PostgreSQL_ํ…Œ์ด๋ธ”๋ช…_๋‹จ์ˆ˜ํ˜•_ํ†ต์ผ.md b/troubleshooting/250911_happybell80_PostgreSQL_ํ…Œ์ด๋ธ”๋ช…_๋‹จ์ˆ˜ํ˜•_ํ†ต์ผ.md index 80d9c8a..9786959 100644 --- a/troubleshooting/250911_happybell80_PostgreSQL_ํ…Œ์ด๋ธ”๋ช…_๋‹จ์ˆ˜ํ˜•_ํ†ต์ผ.md +++ b/troubleshooting/250911_happybell80_PostgreSQL_ํ…Œ์ด๋ธ”๋ช…_๋‹จ์ˆ˜ํ˜•_ํ†ต์ผ.md @@ -35,7 +35,7 @@ | auth-server/app/models/user.py | 21-35 | ํ…Œ์ด๋ธ” ๋ชจ๋ธ ์ •์˜ (picture ์ปฌ๋Ÿผ) | | auth-server/app/providers/gmail_passport.py | 178 | SELECT id FROM users WHERE username = $1 | | auth-server/app/providers/gmail_passport.py | 187 | SELECT username FROM users WHERE id = $1 | -| robeing-gateway/app/database.py | 98-112 | JOIN ์ฟผ๋ฆฌ (workspace_members, workspaces์™€ ํ•จ๊ป˜) | +| robeing-gateway/app/database.py | 98-112 | JOIN ์ฟผ๋ฆฌ (workspace_member, workspaces์™€ ํ•จ๊ป˜) | | robeing-gateway/app/database.py | 182-191 | SELECT * FROM users WHERE username = $1 | | robeing-gateway/app/database.py | 321-328 | SELECT * FROM users (์ „์ฒด ์กฐํšŒ) | | robeing-gateway/app/models.py | 11-24 | ํ…Œ์ด๋ธ” ๋ชจ๋ธ ์ •์˜ (avatar_url ์ปฌ๋Ÿผ) | @@ -48,14 +48,14 @@ |-----------|-----------|-----------| | auth-server/app/models/workspace.py | 15-31 | ํ…Œ์ด๋ธ” ๋ชจ๋ธ ์ •์˜ | | auth-server/scripts/run_migration.py | 54 | SELECT id, name, subdomain, robeing_id FROM workspaces | -| auth-server/migrations/add_user_workspace_tables.sql | 25-28 | ALTER TABLE companies RENAME TO workspaces | +| auth-server/migrations/add_user_workspace_tables.sql | 25-28 | ALTER TABLE company RENAME TO workspaces | | robeing-gateway/app/database.py | 98-112 | JOIN ์ฟผ๋ฆฌ | -| robeing-gateway/app/database.py | 216-230 | JOIN ์ฟผ๋ฆฌ (workspace_members์™€ ํ•จ๊ป˜) | +| robeing-gateway/app/database.py | 216-230 | JOIN ์ฟผ๋ฆฌ (workspace_member์™€ ํ•จ๊ป˜) | | robeing-gateway/app/models.py | 26-44 | ํ…Œ์ด๋ธ” ๋ชจ๋ธ ์ •์˜ | ### 2.3 workspace_member ํ…Œ์ด๋ธ” (์‹ค์ œ DB: workspace_member, ๋ ˆ์ฝ”๋“œ 0๊ฑด) **์‹ค์ œ DB ์ปฌ๋Ÿผ**: user_id(FK), role(user_role enum), created_at, updated_at -**์ฝ”๋“œ ๋ชจ๋ธ**: workspace_members ํ…Œ์ด๋ธ” ์ฐธ์กฐ (๋ณต์ˆ˜ํ˜• ์ฐจ์ด) +**์ฝ”๋“œ ๋ชจ๋ธ**: workspace_member ํ…Œ์ด๋ธ” ์ฐธ์กฐ (๋ณต์ˆ˜ํ˜• ์ฐจ์ด) | ํŒŒ์ผ ๊ฒฝ๋กœ | ๋ผ์ธ ๋ฒˆํ˜ธ | ์ž‘์—… ๋‚ด์šฉ | |-----------|-----------|-----------| @@ -90,13 +90,13 @@ ### 2.6 gmail_token ํ…Œ์ด๋ธ” (์‹ค์ œ DB: gmail_token, 3๊ฑด) **์‹ค์ œ DB ์ปฌ๋Ÿผ**: user_id(FK), token_data(jsonb), oauth_config(jsonb), created_at, updated_at -**์ฝ”๋“œ ํ˜ผ์šฉ**: auth-server๋Š” gmail_tokens(๋ณต์ˆ˜)์™€ gmail_token(๋‹จ์ˆ˜) ํ˜ผ์šฉ +**์ฝ”๋“œ ํ˜ผ์šฉ**: auth-server๋Š” gmail_token(๋ณต์ˆ˜)์™€ gmail_token(๋‹จ์ˆ˜) ํ˜ผ์šฉ | ํŒŒ์ผ ๊ฒฝ๋กœ | ๋ผ์ธ ๋ฒˆํ˜ธ | ์ž‘์—… ๋‚ด์šฉ | |-----------|-----------|-----------| | auth-server/app/providers/gmail_passport.py | 193 | INSERT INTO gmail_token (๋‹จ์ˆ˜) | | auth-server/app/providers/gmail_passport.py | 264, 313, 354, 370 | gmail_token (๋‹จ์ˆ˜) ์‚ฌ์šฉ | -| auth-server/app/api/gmail_refresh.py | 36, 43, 115, 124, 173, 179 | gmail_tokens (๋ณต์ˆ˜) ์‚ฌ์šฉ | +| auth-server/app/api/gmail_refresh.py | 36, 43, 115, 124, 173, 179 | gmail_token (๋ณต์ˆ˜) ์‚ฌ์šฉ | | skill-email/services/db_credentials_provider.py | 60-70 | SELECT ์ฟผ๋ฆฌ (is_equipped ํ•„ํ„ฐ) | | skill-email/services/db_credentials_provider.py | 163-177 | UPDATE ์ฟผ๋ฆฌ | | skill-email/services/db_credentials_provider.py | 231-235 | COUNT ์ฟผ๋ฆฌ | @@ -214,7 +214,7 @@ ## 4. ์œ„ํ—˜ ์š”์†Œ - ์น˜๋ช…์  ๋ถˆ์ผ์น˜ 1. **ํ…Œ์ด๋ธ”๋ช… ์ „์ฒด ๋ถˆ์ผ์น˜**: - - ์ฝ”๋“œ: users, workspaces, workspace_members (๋ณต์ˆ˜ํ˜•) + - ์ฝ”๋“œ: users, workspaces, workspace_member (๋ณต์ˆ˜ํ˜•) - DB: user, company/team, workspace_member (๋‹จ์ˆ˜ํ˜•) 2. **์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ” ์ฐธ์กฐ**: diff --git a/troubleshooting/250918_gmail_token_slack_user_id_column_missing.md b/troubleshooting/250918_gmail_token_slack_user_id_column_missing.md index 02e53ac..aa02929 100644 --- a/troubleshooting/250918_gmail_token_slack_user_id_column_missing.md +++ b/troubleshooting/250918_gmail_token_slack_user_id_column_missing.md @@ -11,7 +11,7 @@ ```python # ํ˜„์žฌ ์ฝ”๋“œ (์ž˜๋ชป๋จ) cur.execute(""" - SELECT ... FROM gmail_tokens + SELECT ... FROM gmail_token WHERE slack_user_id = %s # ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ """, (user_id,)) diff --git a/troubleshooting/250926_happybell80_UUID_์›์น™_์œ„๋ฐ˜_email_integration.md b/troubleshooting/250926_happybell80_UUID_์›์น™_์œ„๋ฐ˜_email_integration.md index f4f3560..795fa05 100644 --- a/troubleshooting/250926_happybell80_UUID_์›์น™_์œ„๋ฐ˜_email_integration.md +++ b/troubleshooting/250926_happybell80_UUID_์›์น™_์œ„๋ฐ˜_email_integration.md @@ -13,7 +13,7 @@ ### ๋ฐœ๊ฒฌ๋œ ์œ„๋ฐ˜ ์‚ฌํ•ญ #### 1. rb8001/app/skills/email_integration.py -- **์ž˜๋ชป๋œ ํ…Œ์ด๋ธ”๋ช…**: `gmail_tokens` โ†’ ์‹ค์ œ๋Š” `gmail_token` +- **์ž˜๋ชป๋œ ํ…Œ์ด๋ธ”๋ช…**: `gmail_token` โ†’ ์‹ค์ œ๋Š” `gmail_token` - **Slack ID ์‚ฌ์šฉ**: skill-email ํ˜ธ์ถœ ์‹œ Slack ID ์ „๋‹ฌ - **๋ฏธ์ •์˜ ๋ณ€์ˆ˜**: `user_uuid` ๋ณ€์ˆ˜ ์ •์˜ ์—†์ด ์‚ฌ์šฉ (136์ค„) @@ -44,7 +44,7 @@ else: ``` ### ํ…Œ์ด๋ธ”๋ช… ์ˆ˜์ • (์™„๋ฃŒ) -- `gmail_tokens` โ†’ `gmail_token` +- `gmail_token` โ†’ `gmail_token` - `SELECT COUNT(*) FROM gmail_token WHERE user_id = %s` ## ๋‚จ์€ ์ž‘์—