Merge branch 'main' of https://git.ro-being.com/ivada_Ro-being/DOCS
This commit is contained in:
commit
61cc6f340c
@ -1,53 +0,0 @@
|
||||
-- Slack 채널 정보 저장 테이블 생성
|
||||
-- 작성일: 2025-12-06
|
||||
-- 목적: Slack 워크스페이스별 채널 정보 및 robeing CRUD 권한 관리
|
||||
-- 마이그레이션 파일 위치: auth-server/migrations/add_slack_channel_table.sql
|
||||
|
||||
CREATE TABLE IF NOT EXISTS slack_channel (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
slack_workspace_id UUID NOT NULL REFERENCES slack_workspace(id) ON DELETE CASCADE,
|
||||
channel_id VARCHAR(32) NOT NULL, -- Slack 채널 ID (예: C09C98KK2TT)
|
||||
channel_name VARCHAR(255) NOT NULL, -- 채널명 (예: company-x-전체)
|
||||
is_private BOOLEAN NOT NULL DEFAULT false, -- 비공개 채널 여부
|
||||
is_archived BOOLEAN NOT NULL DEFAULT false, -- 아카이브 여부
|
||||
is_member BOOLEAN NOT NULL DEFAULT false, -- robeing 봇이 멤버인지
|
||||
robeing_can_read BOOLEAN NOT NULL DEFAULT false, -- 읽기 가능 여부
|
||||
robeing_can_create BOOLEAN NOT NULL DEFAULT false, -- 전송 가능 여부
|
||||
robeing_can_update BOOLEAN NOT NULL DEFAULT false, -- 수정 가능 여부
|
||||
robeing_can_delete BOOLEAN NOT NULL DEFAULT false, -- 삭제 가능 여부 (현재 미구현)
|
||||
status VARCHAR(32) DEFAULT 'active', -- active, inactive 등
|
||||
metadata JSONB, -- 추가 메타데이터 (용도, 설명 등)
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(slack_workspace_id, channel_id) -- 워크스페이스 내 채널 ID 중복 방지
|
||||
);
|
||||
|
||||
-- 인덱스 생성
|
||||
CREATE INDEX IF NOT EXISTS idx_slack_channel_workspace ON slack_channel(slack_workspace_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_slack_channel_channel_id ON slack_channel(channel_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_slack_channel_status ON slack_channel(status);
|
||||
|
||||
-- updated_at 자동 업데이트 트리거
|
||||
CREATE OR REPLACE FUNCTION update_slack_channel_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER trigger_update_slack_channel_updated_at
|
||||
BEFORE UPDATE ON slack_channel
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_slack_channel_updated_at();
|
||||
|
||||
-- 코멘트 추가
|
||||
COMMENT ON TABLE slack_channel IS 'Slack 워크스페이스별 채널 정보 및 robeing CRUD 권한 관리';
|
||||
COMMENT ON COLUMN slack_channel.slack_workspace_id IS 'slack_workspace 테이블 참조';
|
||||
COMMENT ON COLUMN slack_channel.channel_id IS 'Slack 채널 ID (예: C09C98KK2TT)';
|
||||
COMMENT ON COLUMN slack_channel.channel_name IS '채널명 (예: company-x-전체)';
|
||||
COMMENT ON COLUMN slack_channel.robeing_can_read IS 'robeing 봇이 채널 메시지 읽기 가능 여부';
|
||||
COMMENT ON COLUMN slack_channel.robeing_can_create IS 'robeing 봇이 채널에 메시지 전송 가능 여부';
|
||||
COMMENT ON COLUMN slack_channel.robeing_can_update IS 'robeing 봇이 채널 메시지 수정 가능 여부';
|
||||
COMMENT ON COLUMN slack_channel.robeing_can_delete IS 'robeing 봇이 채널 메시지 삭제 가능 여부 (현재 미구현)';
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
# 감정 패턴 분석 시스템 Phase 2 구현
|
||||
|
||||
**날짜**: 2026-01-04
|
||||
**작성자**: Claude
|
||||
**관련 파일**:
|
||||
- `app/core/emotion/pattern_analysis.py`
|
||||
- `app/services/emotion/pattern_service.py`
|
||||
- `app/state/database.py` (query_user_entropy_pattern, query_user_emotion_readings 추가)
|
||||
- `tests/test_emotion_pattern_analysis.py`
|
||||
|
||||
---
|
||||
|
||||
## 구현 완료
|
||||
|
||||
### 1. 순수 함수 모듈 (app/core/emotion/pattern_analysis.py)
|
||||
- `calculate_entropy_stats()`: entropy 통계 계산
|
||||
- `analyze_emotion_probability_pattern()`: 특정 감정 확률 패턴 분석
|
||||
- `detect_depression_risk_pattern()`: 우울증 조기 감지 패턴 분석
|
||||
|
||||
### 2. DB 쿼리 함수 (app/state/database.py)
|
||||
- `query_user_entropy_pattern()`: 사용자별 entropy 패턴 조회
|
||||
- `query_user_emotion_readings()`: 사용자 감정 기록 조회
|
||||
|
||||
### 3. 서비스 레이어 (app/services/emotion/pattern_service.py)
|
||||
- `analyze_user_entropy_pattern()`: 사용자별 entropy 패턴 분석
|
||||
- `get_hourly_emotion_trends()`: 시간별 감정 변화 추적
|
||||
- `detect_depression_risk()`: 우울증 조기 감지
|
||||
|
||||
### 4. 테스트 (tests/test_emotion_pattern_analysis.py)
|
||||
- 순수 함수 테스트: entropy 통계, 우울증 위험도 패턴
|
||||
- 비즈니스 로직 테스트: 사용자별 패턴 분석, 우울증 감지
|
||||
- **결과**: 6개 테스트 모두 통과
|
||||
|
||||
---
|
||||
|
||||
## 구현 방식
|
||||
|
||||
### TDD 원칙 준수
|
||||
1. 테스트 먼저 작성 (test_emotion_pattern_analysis.py)
|
||||
2. 순수 함수 모듈 구현 (pattern_analysis.py)
|
||||
3. DB 쿼리 함수 추가 (database.py)
|
||||
4. 서비스 레이어 구현 (pattern_service.py)
|
||||
5. 테스트 실행 및 검증 (6개 테스트 모두 통과)
|
||||
|
||||
### 함수형 프로그래밍 원칙
|
||||
- 순수 함수: `pattern_analysis.py`의 모든 함수는 부수 효과 없음
|
||||
- I/O 함수: `database.py`의 DB 접근 함수만 부수 효과 있음
|
||||
- 계층 분리: router → services → state/repositories
|
||||
|
||||
---
|
||||
|
||||
## 교훈
|
||||
|
||||
### 파일 수정 시 주의사항
|
||||
- **문제**: heredoc으로 파일에 추가할 때 f-string 내부의 triple-quoted string 처리 실패
|
||||
- **해결**: 문자열 연결 방식으로 변경 (`\"\"\" ... \"\"\" + str(days) + \" ...\"`)
|
||||
- **교훈**: 복잡한 문자열 포맷팅은 heredoc 대신 Python 스크립트로 직접 작성 권장
|
||||
|
||||
### TDD 진행 순서
|
||||
1. 테스트 작성 → 실패 확인
|
||||
2. 최소 구현 → 테스트 통과
|
||||
3. 리팩토링 → 테스트 재실행
|
||||
4. 문서 작성
|
||||
|
||||
---
|
||||
|
||||
## 참고
|
||||
|
||||
- 계획 문서: `plans/260102_실제_필요한_플랜_정리.md` (Phase 2)
|
||||
- 원칙 문서: `book/300_architecture/311_백엔드_구조_원칙.md`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user