✨ 주요 기능 - 노트 ↔ 서적 문서 간 양방향 링크 생성 및 이동 - 링크 대상 타입 선택 UI (서적 문서/노트북 노트) - 통합 백링크 시스템 (일반 문서에서 노트 백링크도 표시) - 링크 목록 UI 개선 (상세 정보 표시, 타입 구분) 🔧 백엔드 개선 - NoteLink 모델 및 API 추가 (/note-documents/{id}/links, /note-documents/{id}/backlinks) - 일반 문서 백링크 API에서 노트 링크도 함께 조회 - target_content_type, source_content_type 필드 추가 - 노트 문서 콘텐츠 API 추가 (/note-documents/{id}/content) 🎨 프론트엔드 개선 - text-selector.html에서 노트 문서 지원 - 링크 이동 시 contentType에 따른 올바른 URL 생성 - URL 파라미터 파싱 수정 (contentType 지원) - 링크 타입 자동 추론 로직 - 링크 목록 UI 대폭 개선 (출발점/도착점 텍스트, 타입 배지 등) 🐛 버그 수정 - 서적 목록 로드 실패 문제 해결 - 노트에서 링크 생성 시 대상 문서 열기 문제 해결 - 더미 문서로 이동하는 문제 해결 - 캐시 관련 문제 해결
75 lines
3.0 KiB
PL/PgSQL
75 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';
|