-- V17: Enhanced Sharing System -- Replaces simple share_links with comprehensive sharing capabilities -- Enhanced shares table CREATE TABLE shares ( id TEXT PRIMARY KEY NOT NULL, target_type TEXT NOT NULL CHECK ( target_type IN ('media', 'collection', 'tag', 'saved_search') ), target_id TEXT NOT NULL, owner_id TEXT NOT NULL, recipient_type TEXT NOT NULL CHECK ( recipient_type IN ('public_link', 'user', 'group', 'federated') ), recipient_user_id TEXT, recipient_group_id TEXT, recipient_federated_handle TEXT, recipient_federated_server TEXT, public_token TEXT UNIQUE, public_password_hash TEXT, perm_view INTEGER NOT NULL DEFAULT 1, perm_download INTEGER NOT NULL DEFAULT 0, perm_edit INTEGER NOT NULL DEFAULT 0, perm_delete INTEGER NOT NULL DEFAULT 0, perm_reshare INTEGER NOT NULL DEFAULT 0, perm_add INTEGER NOT NULL DEFAULT 0, note TEXT, expires_at TEXT, access_count INTEGER NOT NULL DEFAULT 0, last_accessed TEXT, inherit_to_children INTEGER NOT NULL DEFAULT 1, parent_share_id TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, FOREIGN KEY (owner_id) REFERENCES users (id) ON DELETE CASCADE, FOREIGN KEY (recipient_user_id) REFERENCES users (id) ON DELETE CASCADE, FOREIGN KEY (parent_share_id) REFERENCES shares (id) ON DELETE CASCADE, UNIQUE ( owner_id, target_type, target_id, recipient_type, recipient_user_id ) ); CREATE INDEX idx_shares_owner ON shares (owner_id); CREATE INDEX idx_shares_recipient_user ON shares (recipient_user_id); CREATE INDEX idx_shares_target ON shares (target_type, target_id); CREATE INDEX idx_shares_token ON shares (public_token); CREATE INDEX idx_shares_expires ON shares (expires_at); -- Share activity log CREATE TABLE share_activity ( id TEXT PRIMARY KEY NOT NULL, share_id TEXT NOT NULL, actor_id TEXT, actor_ip TEXT, action TEXT NOT NULL, details TEXT, timestamp TEXT NOT NULL, FOREIGN KEY (share_id) REFERENCES shares (id) ON DELETE CASCADE, FOREIGN KEY (actor_id) REFERENCES users (id) ON DELETE SET NULL ); CREATE INDEX idx_share_activity_share ON share_activity (share_id); CREATE INDEX idx_share_activity_timestamp ON share_activity (timestamp); -- Share notifications CREATE TABLE share_notifications ( id TEXT PRIMARY KEY NOT NULL, user_id TEXT NOT NULL, share_id TEXT NOT NULL, notification_type TEXT NOT NULL, is_read INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, FOREIGN KEY (share_id) REFERENCES shares (id) ON DELETE CASCADE ); CREATE INDEX idx_share_notifications_user ON share_notifications (user_id); CREATE INDEX idx_share_notifications_unread ON share_notifications (user_id, is_read) WHERE is_read = 0; -- Migrate existing share_links to new shares table (if share_links exists) INSERT OR IGNORE INTO shares ( id, target_type, target_id, owner_id, recipient_type, public_token, public_password_hash, perm_view, perm_download, access_count, expires_at, created_at, updated_at ) SELECT id, 'media', media_id, created_by, 'public_link', token, password_hash, 1, 1, view_count, expires_at, created_at, created_at FROM share_links WHERE EXISTS ( SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'share_links' );