✨ 주요 개선사항: - PDF API 500 에러 수정 (한글 파일명 UTF-8 인코딩 처리) - PDF 뷰어 기능 완전 구현 (PDF.js 통합, 네비게이션, 확대/축소) - 서적별 문서 그룹화 UI 데본씽크 스타일로 개선 - PDF Manager 페이지 서적별 보기 기능 추가 - Alpine.js 로드 순서 최적화로 JavaScript 에러 해결 🎨 UI/UX 개선: - 확장/축소 가능한 아코디언 스타일 서적 목록 - 간결하고 직관적인 데본씽크 스타일 인터페이스 - PDF 상태 표시 (HTML 연결, 서적 분류) - 반응형 디자인 및 부드러운 애니메이션 🔧 기술적 개선: - PDF.js 워커 설정 및 토큰 인증 처리 - 서적별 PDF 자동 그룹화 로직 - Alpine.js 컴포넌트 초기화 최적화
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';
|
|
|