From c17b42bf8312c31ae563a93bccd7d0061e8d77f7 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sat, 31 Jan 2026 00:29:36 -0500 Subject: [PATCH] feat: add Kobo shelf and entitlements tables to schema --- database/schema/schema.sql | 50 +++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/database/schema/schema.sql b/database/schema/schema.sql index 332b363..a1cafdc 100644 --- a/database/schema/schema.sql +++ b/database/schema/schema.sql @@ -110,7 +110,12 @@ CREATE TABLE media_items ( is_reflowable BOOLEAN DEFAULT TRUE, has_fixed_layout BOOLEAN DEFAULT FALSE, total_characters BIGINT, - chapter_count INTEGER + chapter_count INTEGER, + -- Kobo-Specific Metadata (Phase 4) + entitlement_id VARCHAR(255) UNIQUE, + revision_number INTEGER DEFAULT 1, + kobo_content_id VARCHAR(255), + kobo_metadata JSONB ); -- Create ebooks view for backward compatibility @@ -271,6 +276,49 @@ CREATE TABLE sync_conflicts ( created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); +-- ============================================ +-- KOBO SHELF MANAGEMENT (Phase 4) +-- ============================================ +CREATE TABLE kobo_shelves ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE, + media_item_id UUID NOT NULL REFERENCES media_items(id) ON DELETE CASCADE, + shelf_name VARCHAR(100) DEFAULT 'Default', + shelf_position INTEGER DEFAULT 0, + added_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + last_synced_at TIMESTAMP WITH TIME ZONE, + UNIQUE(device_id, media_item_id) +); + +CREATE INDEX idx_kobo_shelves_device_id ON kobo_shelves(device_id); +CREATE INDEX idx_kobo_shelves_media_item_id ON kobo_shelves(media_item_id); +CREATE INDEX idx_kobo_shelves_shelf_name ON kobo_shelves(shelf_name); + +-- ============================================ +-- KOBO ENTITLEMENTS TRACKING (Phase 4) +-- ============================================ +CREATE TABLE kobo_entitlements ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE, + media_item_id UUID NOT NULL REFERENCES media_items(id) ON DELETE CASCADE, + entitlement_id VARCHAR(255) NOT NULL, + content_id VARCHAR(255) NOT NULL, + revision_number INTEGER DEFAULT 1, + purchase_date TIMESTAMP WITH TIME ZONE, + accession_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + book_status VARCHAR(20) DEFAULT 'installed', + sync_status VARCHAR(20) DEFAULT 'synced', + kobo_metadata JSONB, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + UNIQUE(device_id, entitlement_id) +); + +CREATE INDEX idx_kobo_entitlements_device_id ON kobo_entitlements(device_id); +CREATE INDEX idx_kobo_entitlements_media_item_id ON kobo_entitlements(media_item_id); +CREATE INDEX idx_kobo_entitlements_entitlement_id ON kobo_entitlements(entitlement_id); +CREATE INDEX idx_kobo_entitlements_content_id ON kobo_entitlements(content_id); + -- ============================================ -- READING HISTORY (Phase 1) -- ============================================