Update BookProgress model and schemas

Updated book progress model in anticipation of the KOReader sync
feature.

Renamed properties:
 - renamed "progress" to "percentage"
 - renamed "pdf_loc" to "pdf_page"
 - renamed "epub_loc" to "epub_cfi"

New properties:
 - "epub_xpointer", marks the location of an epub in KOReader
 - "device", the device type that updated the progress
 - "device_id", the id of the device that updated the progress
This commit is contained in:
hiperman
2025-12-12 14:19:16 -05:00
parent 7ca0a21283
commit 766fca2c39
5 changed files with 25 additions and 15 deletions

View File

@@ -14,7 +14,11 @@ class BookProgress(BigIntAuditBase):
book_id: Mapped[int] = mapped_column( book_id: Mapped[int] = mapped_column(
ForeignKey("books.id", ondelete="cascade"), nullable=False ForeignKey("books.id", ondelete="cascade"), nullable=False
) )
epub_loc: Mapped[Optional[str]]
pdf_loc: Mapped[Optional[int]] epub_cfi: Mapped[Optional[str]]
progress: Mapped[float] epub_xpointer: Mapped[Optional[str]]
pdf_page: Mapped[Optional[int]]
percentage: Mapped[float]
completed: Mapped[Optional[bool]] completed: Mapped[Optional[bool]]
device: Mapped[Optional[str]] # Device that updated the progress
device_id: Mapped[Optional[str]]

View File

@@ -161,14 +161,20 @@ class BookMetadataUpdate(BaseModel):
class BookProgressCreate(BaseModel): class BookProgressCreate(BaseModel):
progress: float percentage: float
epub_loc: str | None = None epub_cfi: str | None = None
pdf_loc: int | None = None epub_xpointer: str | None = None
pdf_page: int | None = None
completed: bool | None = None completed: bool | None = None
device_type: str | None = None
device_id: str | None = None
class BookProgressRead(BaseModel): class BookProgressRead(BaseModel):
progress: float percentage: float
epub_loc: str | None = None epub_cfi: str | None = None
pdf_loc: int | None = None epub_xpointer: str | None = None
pdf_page: int | None = None
completed: bool | None = False completed: bool | None = False
device_type: str | None = None
device_id: str | None = None

View File

@@ -79,8 +79,8 @@
await fetch(`/api/books/progress/${bookId}`, { await fetch(`/api/books/progress/${bookId}`, {
method: 'POST', method: 'POST',
body: JSON.stringify({ body: JSON.stringify({
progress: currentProgress, percentage: currentProgress,
epub_loc: currentLocation, epub_cfi: currentLocation,
completed: currentProgress === 1 completed: currentProgress === 1
}) })
}); });

View File

@@ -38,9 +38,9 @@
: ''}" : ''}"
/> />
</a> </a>
{#if book.progress?.progress && !selected && !darkened} {#if book.progress?.percentage && !selected && !darkened}
<Progress <Progress
value={book.progress.progress} value={book.progress.percentage}
max={1} max={1}
class="mt-[-8px] h-1 rounded {book.progress.completed class="mt-[-8px] h-1 rounded {book.progress.completed
? '[&>div]:bg-green-600' ? '[&>div]:bg-green-600'

View File

@@ -68,9 +68,9 @@
class="h-full w-full overflow-hidden rounded object-cover" class="h-full w-full overflow-hidden rounded object-cover"
/> />
{#if book?.progress?.progress} {#if book?.progress?.percentage}
<Progress <Progress
value={book?.progress.progress} value={book?.progress.percentage}
max={1} max={1}
color={book?.progress.completed ? 'bg-green-600' : 'bg-yellow-500'} color={book?.progress.completed ? 'bg-green-600' : 'bg-yellow-500'}
class="mt-[-8px] h-2 rounded {book?.progress.completed class="mt-[-8px] h-2 rounded {book?.progress.completed