- FastAPI 라우터에서 슬래시 문제로 인한 307 리다이렉트 수정 - Nginx 프록시 설정에서 경로 중복 문제 해결 - 계정 관리 시스템 구현 (로그인, 사용자 관리, 권한 설정) - 노트북 연결 기능 수정 (notebook_id 필드 추가) - 메모 트리 UI 개선 (수평 레이아웃, 드래그 기능 제거) - 헤더 UI 개선 및 고정 위치 설정 - 백업/복원 스크립트 추가 - PDF 미리보기 토큰 인증 지원
76 lines
3.0 KiB
PL/PgSQL
76 lines
3.0 KiB
PL/PgSQL
-- 노트 링크 테이블 생성
|
|
-- 노트 문서 간 또는 노트-문서 간 링크를 관리하는 테이블
|
|
|
|
CREATE TABLE IF NOT EXISTS note_links (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
-- 링크 출발점 (노트 또는 문서 중 하나)
|
|
source_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE,
|
|
source_document_id UUID REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
-- 링크 도착점 (노트 또는 문서 중 하나)
|
|
target_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE,
|
|
target_document_id UUID REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
-- 출발점 텍스트 정보
|
|
selected_text TEXT NOT NULL,
|
|
start_offset INTEGER NOT NULL,
|
|
end_offset INTEGER NOT NULL,
|
|
|
|
-- 도착점 텍스트 정보 (선택사항)
|
|
target_text TEXT,
|
|
target_start_offset INTEGER,
|
|
target_end_offset INTEGER,
|
|
|
|
-- 링크 메타데이터
|
|
link_text VARCHAR(500),
|
|
description TEXT,
|
|
link_type VARCHAR(20) DEFAULT 'note' NOT NULL,
|
|
|
|
-- 생성자 및 시간 정보
|
|
created_by UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
updated_at TIMESTAMP WITH TIME ZONE,
|
|
|
|
-- 제약 조건
|
|
CONSTRAINT note_links_source_check CHECK (
|
|
(source_note_id IS NOT NULL AND source_document_id IS NULL) OR
|
|
(source_note_id IS NULL AND source_document_id IS NOT NULL)
|
|
),
|
|
CONSTRAINT note_links_target_check CHECK (
|
|
(target_note_id IS NOT NULL AND target_document_id IS NULL) OR
|
|
(target_note_id IS NULL AND target_document_id IS NOT NULL)
|
|
)
|
|
);
|
|
|
|
-- 인덱스 생성
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_source_note ON note_links(source_note_id);
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_source_document ON note_links(source_document_id);
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_target_note ON note_links(target_note_id);
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_target_document ON note_links(target_document_id);
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_created_by ON note_links(created_by);
|
|
CREATE INDEX IF NOT EXISTS idx_note_links_created_at ON note_links(created_at);
|
|
|
|
-- updated_at 자동 업데이트 트리거
|
|
CREATE OR REPLACE FUNCTION update_note_links_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trigger_note_links_updated_at
|
|
BEFORE UPDATE ON note_links
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_note_links_updated_at();
|
|
|
|
-- 코멘트 추가
|
|
COMMENT ON TABLE note_links IS '노트 문서 간 링크 관리 테이블';
|
|
COMMENT ON COLUMN note_links.source_note_id IS '출발점 노트 ID (노트에서 시작하는 링크)';
|
|
COMMENT ON COLUMN note_links.source_document_id IS '출발점 문서 ID (문서에서 시작하는 링크)';
|
|
COMMENT ON COLUMN note_links.target_note_id IS '도착점 노트 ID';
|
|
COMMENT ON COLUMN note_links.target_document_id IS '도착점 문서 ID';
|
|
COMMENT ON COLUMN note_links.link_type IS '링크 타입: note, document, text_fragment';
|
|
|