- 백엔드 API 완전 구현 (FastAPI + SQLAlchemy + PostgreSQL) - 사용자 인증 (JWT 토큰 기반) - 문서 CRUD (업로드, 조회, 목록, 삭제) - 하이라이트, 메모, 책갈피 관리 - 태그 시스템 및 검색 기능 - Pydantic v2 호환성 수정 - 프론트엔드 완전 구현 (Alpine.js + Tailwind CSS) - 로그인/로그아웃 기능 - 문서 업로드 모달 (드래그앤드롭, 파일 검증) - 문서 목록 및 필터링 - 뷰어 페이지 (하이라이트, 메모, 책갈피 UI) - 실시간 목록 새로고침 - 시스템 안정성 개선 - Alpine.js 컴포넌트 간 안전한 통신 (이벤트 기반) - API 오류 처리 및 사용자 피드백 - 파비콘 추가로 404 오류 해결 - 포트 구성: Frontend(24100), Backend(24102), DB(24101), Redis(24103)
43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""
|
|
책갈피 모델
|
|
"""
|
|
from sqlalchemy import Column, String, DateTime, Text, Integer, ForeignKey
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
import uuid
|
|
|
|
from ..core.database import Base
|
|
|
|
|
|
class Bookmark(Base):
|
|
"""책갈피 테이블"""
|
|
__tablename__ = "bookmarks"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
|
|
# 연결 정보
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
|
|
document_id = Column(UUID(as_uuid=True), ForeignKey("documents.id"), nullable=False)
|
|
|
|
# 책갈피 정보
|
|
title = Column(String(200), nullable=False) # 책갈피 제목
|
|
description = Column(Text, nullable=True) # 설명
|
|
|
|
# 위치 정보
|
|
page_number = Column(Integer, nullable=True) # 페이지 번호 (추정)
|
|
scroll_position = Column(Integer, default=0) # 스크롤 위치 (픽셀)
|
|
element_id = Column(String(100), nullable=True) # 특정 요소 ID
|
|
element_selector = Column(Text, nullable=True) # CSS 선택자
|
|
|
|
# 메타데이터
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
# 관계
|
|
user = relationship("User", backref="bookmarks")
|
|
document = relationship("Document", back_populates="bookmarks")
|
|
|
|
def __repr__(self):
|
|
return f"<Bookmark(title='{self.title}', document='{self.document_id}')>"
|