Merge pull request #28 from hwanny1128/feat/rag-setting

push meeting mig sql
This commit is contained in:
Daewoong Jeon 2025-10-29 10:05:54 +09:00 committed by GitHub
commit e3f75907e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 214 additions and 40 deletions

View File

@ -0,0 +1,177 @@
-- =====================================================
-- HGZero Meeting Service - Initial Schema
-- Version: V1
-- Description: 초기 데이터베이스 스키마 생성
-- =====================================================
-- Note: 기존 테이블이 있으면 유지하고, 없으면 새로 생성
-- CREATE TABLE IF NOT EXISTS를 사용하여 안전하게 처리
-- 2. Templates 테이블
CREATE TABLE IF NOT EXISTS templates (
template_id VARCHAR(50) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
category VARCHAR(50) NOT NULL,
sections TEXT,
is_public BOOLEAN NOT NULL DEFAULT true,
created_by VARCHAR(50) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 3. Meetings 테이블
CREATE TABLE IF NOT EXISTS meetings (
meeting_id VARCHAR(50) PRIMARY KEY,
title VARCHAR(200) NOT NULL,
purpose VARCHAR(500),
description TEXT,
scheduled_at TIMESTAMP NOT NULL,
end_time TIMESTAMP,
location VARCHAR(200),
started_at TIMESTAMP,
ended_at TIMESTAMP,
status VARCHAR(20) NOT NULL DEFAULT 'SCHEDULED',
organizer_id VARCHAR(50) NOT NULL,
template_id VARCHAR(50),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_meetings_template FOREIGN KEY (template_id) REFERENCES templates(template_id)
);
-- 4. Meeting Participants 테이블 (기존 V2 마이그레이션 통합)
CREATE TABLE IF NOT EXISTS meeting_participants (
meeting_id VARCHAR(50) NOT NULL,
user_id VARCHAR(100) NOT NULL,
invitation_status VARCHAR(20) DEFAULT 'PENDING',
attended BOOLEAN DEFAULT false,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (meeting_id, user_id),
CONSTRAINT fk_participants_meeting FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id) ON DELETE CASCADE
);
-- 5. Sessions 테이블
CREATE TABLE IF NOT EXISTS sessions (
session_id VARCHAR(50) PRIMARY KEY,
meeting_id VARCHAR(50) NOT NULL,
minutes_id VARCHAR(50),
started_by VARCHAR(50) NOT NULL,
started_at TIMESTAMP NOT NULL,
ended_at TIMESTAMP,
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_sessions_meeting FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id)
);
-- 6. Minutes 테이블
CREATE TABLE IF NOT EXISTS minutes (
minutes_id VARCHAR(50) PRIMARY KEY,
meeting_id VARCHAR(50) NOT NULL,
title VARCHAR(200) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT',
version INTEGER NOT NULL DEFAULT 1,
created_by VARCHAR(50) NOT NULL,
finalized_by VARCHAR(50),
finalized_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_minutes_meeting FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id)
);
-- 7. Minutes Sections 테이블
CREATE TABLE IF NOT EXISTS minutes_sections (
section_id VARCHAR(50) PRIMARY KEY,
minutes_id VARCHAR(50) NOT NULL,
type VARCHAR(50) NOT NULL,
title VARCHAR(200) NOT NULL,
content TEXT,
"order" INTEGER DEFAULT 0,
verified BOOLEAN NOT NULL DEFAULT false,
locked BOOLEAN NOT NULL DEFAULT false,
locked_by VARCHAR(50),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_sections_minutes FOREIGN KEY (minutes_id) REFERENCES minutes(minutes_id) ON DELETE CASCADE
);
-- 8. Todos 테이블
CREATE TABLE IF NOT EXISTS todos (
todo_id VARCHAR(50) PRIMARY KEY,
minutes_id VARCHAR(50),
meeting_id VARCHAR(50) NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
assignee_id VARCHAR(50) NOT NULL,
assignee_name VARCHAR(100),
due_date DATE,
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
priority VARCHAR(20) DEFAULT 'MEDIUM',
completed_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_todos_meeting FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id)
);
-- 9. Meeting Analysis 테이블
CREATE TABLE IF NOT EXISTS meeting_analysis (
analysis_id VARCHAR(50) PRIMARY KEY,
meeting_id VARCHAR(50) NOT NULL,
minutes_id VARCHAR(50) NOT NULL,
agenda_analyses TEXT,
status VARCHAR(20),
completed_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_analysis_meeting FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id),
CONSTRAINT fk_analysis_minutes FOREIGN KEY (minutes_id) REFERENCES minutes(minutes_id)
);
-- 10. Meeting Keywords 테이블 (ElementCollection)
CREATE TABLE IF NOT EXISTS meeting_keywords (
analysis_id VARCHAR(50) NOT NULL,
keyword VARCHAR(255),
CONSTRAINT fk_keywords_analysis FOREIGN KEY (analysis_id) REFERENCES meeting_analysis(analysis_id) ON DELETE CASCADE
);
-- 11. 인덱스 생성
CREATE INDEX IF NOT EXISTS idx_meetings_organizer ON meetings(organizer_id);
CREATE INDEX IF NOT EXISTS idx_meetings_status ON meetings(status);
CREATE INDEX IF NOT EXISTS idx_meetings_scheduled ON meetings(scheduled_at);
CREATE INDEX IF NOT EXISTS idx_participants_user ON meeting_participants(user_id);
CREATE INDEX IF NOT EXISTS idx_sessions_meeting ON sessions(meeting_id);
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
CREATE INDEX IF NOT EXISTS idx_minutes_meeting ON minutes(meeting_id);
CREATE INDEX IF NOT EXISTS idx_minutes_status ON minutes(status);
CREATE INDEX IF NOT EXISTS idx_sections_minutes ON minutes_sections(minutes_id);
CREATE INDEX IF NOT EXISTS idx_sections_order ON minutes_sections("order");
CREATE INDEX IF NOT EXISTS idx_todos_meeting ON todos(meeting_id);
CREATE INDEX IF NOT EXISTS idx_todos_assignee ON todos(assignee_id);
CREATE INDEX IF NOT EXISTS idx_todos_status ON todos(status);
CREATE INDEX IF NOT EXISTS idx_todos_due_date ON todos(due_date);
CREATE INDEX IF NOT EXISTS idx_analysis_meeting ON meeting_analysis(meeting_id);
CREATE INDEX IF NOT EXISTS idx_analysis_minutes ON meeting_analysis(minutes_id);
-- 12. Sessions에 minutes 외래키 추가 (minutes 테이블 생성 후)
-- 기존 데이터 무결성 이슈로 인해 외래키 제약조건 비활성화
-- ALTER TABLE sessions DROP CONSTRAINT IF EXISTS fk_sessions_minutes;
-- ALTER TABLE sessions ADD CONSTRAINT fk_sessions_minutes
-- FOREIGN KEY (minutes_id) REFERENCES minutes(minutes_id);
-- 13. Todos에 minutes 외래키 추가
-- 기존 데이터 무결성 이슈로 인해 외래키 제약조건 비활성화
-- ALTER TABLE todos DROP CONSTRAINT IF EXISTS fk_todos_minutes;
-- ALTER TABLE todos ADD CONSTRAINT fk_todos_minutes
-- FOREIGN KEY (minutes_id) REFERENCES minutes(minutes_id);
-- 완료 메시지
DO $$
BEGIN
RAISE NOTICE 'Initial schema created successfully';
END $$;

View File

@ -1,41 +1,5 @@
-- 회의 참석자 테이블 생성
CREATE TABLE IF NOT EXISTS meeting_participants (
meeting_id VARCHAR(50) NOT NULL,
user_id VARCHAR(100) NOT NULL,
invitation_status VARCHAR(20) DEFAULT 'PENDING',
attended BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (meeting_id, user_id),
CONSTRAINT fk_meeting_participants_meeting
FOREIGN KEY (meeting_id) REFERENCES meetings(meeting_id)
ON DELETE CASCADE
);
-- V2 마이그레이션은 V1에 통합되었습니다.
-- meeting_participants 테이블은 V1__create_initial_schema.sql에서 생성됩니다.
-- 이 파일은 Flyway 버전 순서 유지를 위해 빈 상태로 유지됩니다.
-- 기존 meetings 테이블의 participants 데이터를 meeting_participants 테이블로 마이그레이션
INSERT INTO meeting_participants (meeting_id, user_id, invitation_status, attended, created_at, updated_at)
SELECT
m.meeting_id,
TRIM(participant) as user_id,
'PENDING' as invitation_status,
FALSE as attended,
m.created_at,
m.updated_at
FROM meetings m
CROSS JOIN LATERAL unnest(string_to_array(m.participants, ',')) AS participant
WHERE m.participants IS NOT NULL AND m.participants != '';
-- meetings 테이블에서 participants 컬럼 삭제
ALTER TABLE meetings DROP COLUMN IF EXISTS participants;
-- 인덱스 생성
CREATE INDEX idx_meeting_participants_user_id ON meeting_participants(user_id);
CREATE INDEX idx_meeting_participants_invitation_status ON meeting_participants(invitation_status);
CREATE INDEX idx_meeting_participants_meeting_id_status ON meeting_participants(meeting_id, invitation_status);
-- 코멘트 추가
COMMENT ON TABLE meeting_participants IS '회의 참석자 정보';
COMMENT ON COLUMN meeting_participants.meeting_id IS '회의 ID';
COMMENT ON COLUMN meeting_participants.user_id IS '사용자 ID (이메일)';
COMMENT ON COLUMN meeting_participants.invitation_status IS '초대 상태 (PENDING, ACCEPTED, DECLINED)';
COMMENT ON COLUMN meeting_participants.attended IS '참석 여부';
SELECT 1; -- No-op statement to make Flyway happy

View File

@ -0,0 +1,33 @@
-- V4: 누락된 컬럼 추가 및 스키마 수정
-- 기존 테이블에 누락된 컬럼들을 추가합니다.
-- 1. 시퀀스 생성 (먼저)
CREATE SEQUENCE IF NOT EXISTS minutes_sections_temp_seq;
-- 2. minutes_sections 테이블에 section_id 컬럼 추가 (Primary Key)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_name = 'minutes_sections' AND column_name = 'section_id') THEN
-- 임시 ID 컬럼으로 시작
ALTER TABLE minutes_sections ADD COLUMN temp_section_id VARCHAR(50);
UPDATE minutes_sections SET temp_section_id = 'section-' || nextval('minutes_sections_temp_seq'::regclass)
WHERE temp_section_id IS NULL;
-- 기존 Primary Key 제거 (있다면)
ALTER TABLE minutes_sections DROP CONSTRAINT IF EXISTS minutes_sections_pkey;
-- temp_section_id를 section_id로 변경
ALTER TABLE minutes_sections RENAME COLUMN temp_section_id TO section_id;
ALTER TABLE minutes_sections ALTER COLUMN section_id SET NOT NULL;
-- 새로운 Primary Key 설정
ALTER TABLE minutes_sections ADD PRIMARY KEY (section_id);
END IF;
END $$;
-- 완료 메시지
DO $$
BEGIN
RAISE NOTICE 'Missing columns fixed successfully';
END $$;