From 2d8c44c5292de6f6faf94787c2529d6bc95b525b Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Mon, 18 May 2026 12:45:06 -0400 Subject: [PATCH] feat(mam-api): add groups and API tokens schema patch --- .../src/db/schema_patch_groups_tokens.sql | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 services/mam-api/src/db/schema_patch_groups_tokens.sql diff --git a/services/mam-api/src/db/schema_patch_groups_tokens.sql b/services/mam-api/src/db/schema_patch_groups_tokens.sql new file mode 100644 index 0000000..fe0b9c6 --- /dev/null +++ b/services/mam-api/src/db/schema_patch_groups_tokens.sql @@ -0,0 +1,36 @@ +-- Wild Dragon MAM – Groups & API Tokens schema patch +-- Run with: psql $DATABASE_URL -f schema_patch_groups_tokens.sql + +-- User groups +CREATE TABLE IF NOT EXISTS groups ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + name TEXT UNIQUE NOT NULL, + description TEXT, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- User ↔ group memberships +CREATE TABLE IF NOT EXISTS user_groups ( + user_id UUID NOT NULL REFERENCES users ON DELETE CASCADE, + group_id UUID NOT NULL REFERENCES groups ON DELETE CASCADE, + PRIMARY KEY (user_id, group_id) +); + +-- Personal API tokens (Bearer auth alternative to session cookies) +-- token_hash : SHA-256(raw_token) stored as hex +-- token_prefix: first 8 chars of raw token for display only +CREATE TABLE IF NOT EXISTS api_tokens ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + user_id UUID NOT NULL REFERENCES users ON DELETE CASCADE, + name TEXT NOT NULL, + token_hash TEXT NOT NULL UNIQUE, + token_prefix TEXT NOT NULL, + last_used_at TIMESTAMPTZ, + expires_at TIMESTAMPTZ, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_api_tokens_user_id ON api_tokens(user_id); +CREATE INDEX IF NOT EXISTS idx_api_tokens_hash ON api_tokens(token_hash); +CREATE INDEX IF NOT EXISTS idx_user_groups_user ON user_groups(user_id); +CREATE INDEX IF NOT EXISTS idx_user_groups_group ON user_groups(group_id);