feat(subscriptions): gestion des abonnements par groupes façon PocketTube
CI / build-and-test (push) Failing after 8m18s

- Tables subscription_groups + subscription_group_members (migration + schema)
- API CRUD groupes, membres par groupe, groupes par abonnement
- Page Abonnements: onglets Groupes/Chaines, modale creation/edition (icone/couleur), assignation unitaire + lot, filtre par groupe + recherche
- Sidebar: section Groupes avec navigation directe (queryParams)
- i18n nav.groups FR/EN + 4 tests unitaires service
This commit is contained in:
2026-09-26 10:45:34 -04:00
parent 95e4358b01
commit 49c3b5dfdf
11 changed files with 1058 additions and 28 deletions
@@ -0,0 +1,28 @@
BEGIN TRANSACTION;
-- Groupes d'abonnements (façon PocketTube) : dossiers thématiques par utilisateur.
CREATE TABLE IF NOT EXISTS subscription_groups (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#ef4444',
icon TEXT NOT NULL DEFAULT '📁',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE(user_id, name)
);
CREATE INDEX IF NOT EXISTS idx_sub_groups_user ON subscription_groups(user_id);
-- Relation plusieurs-à-plusieurs : une chaîne (abonnement) dans plusieurs groupes.
CREATE TABLE IF NOT EXISTS subscription_group_members (
group_id TEXT NOT NULL REFERENCES subscription_groups(id) ON DELETE CASCADE,
subscription_id INTEGER NOT NULL REFERENCES subscriptions(id) ON DELETE CASCADE,
added_at INTEGER NOT NULL,
PRIMARY KEY (group_id, subscription_id)
);
CREATE INDEX IF NOT EXISTS idx_sub_group_members_sub ON subscription_group_members(subscription_id);
CREATE INDEX IF NOT EXISTS idx_sub_group_members_group ON subscription_group_members(group_id);
COMMIT;
+24
View File
@@ -109,6 +109,30 @@ CREATE TABLE IF NOT EXISTS subscriptions (
CREATE INDEX IF NOT EXISTS idx_subs_user ON subscriptions(user_id);
-- Groupes d'abonnements (façon PocketTube) -----------------------------------
CREATE TABLE IF NOT EXISTS subscription_groups (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#ef4444',
icon TEXT NOT NULL DEFAULT '📁',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE(user_id, name)
);
CREATE INDEX IF NOT EXISTS idx_sub_groups_user ON subscription_groups(user_id);
CREATE TABLE IF NOT EXISTS subscription_group_members (
group_id TEXT NOT NULL REFERENCES subscription_groups(id) ON DELETE CASCADE,
subscription_id INTEGER NOT NULL REFERENCES subscriptions(id) ON DELETE CASCADE,
added_at INTEGER NOT NULL,
PRIMARY KEY (group_id, subscription_id)
);
CREATE INDEX IF NOT EXISTS idx_sub_group_members_sub ON subscription_group_members(subscription_id);
CREATE INDEX IF NOT EXISTS idx_sub_group_members_group ON subscription_group_members(group_id);
-- Playlists -----------------------------------------------------------------
CREATE TABLE IF NOT EXISTS playlists (
id TEXT PRIMARY KEY,