Files
ScommettiApp/backend-node/init.sql
T
2026-04-01 23:49:19 +02:00

80 lines
3.0 KiB
PL/PgSQL

-- PostgreSQL schema initialization for core models
-- Derived from Sequelize models: User, Group, Friendship, FriendRequest, and the User<->Group join table
-- Drop tables in dependency order
DROP TABLE IF EXISTS "UserGroups" CASCADE;
DROP TABLE IF EXISTS friend_requests CASCADE;
DROP TABLE IF EXISTS friendships CASCADE;
DROP TABLE IF EXISTS groups CASCADE;
DROP TABLE IF EXISTS users CASCADE;
-- users table
CREATE TABLE users (
id SERIAL PRIMARY KEY,
"keycloakId" VARCHAR(255) UNIQUE,
name VARCHAR(255) NOT NULL,
"email" VARCHAR(255) NOT NULL UNIQUE,
"avatarUrl" VARCHAR(255) NOT NULL,
score INTEGER NOT NULL DEFAULT 0
);
-- groups table
CREATE TABLE groups (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
-- friendships table
-- In-model hook ensures user1Id < user2Id at application level; we also add a DB check for safety.
CREATE TABLE friendships (
id SERIAL PRIMARY KEY,
"user1Id" INTEGER NOT NULL,
"user2Id" INTEGER NOT NULL,
CONSTRAINT friendships_user_order_chk CHECK ("user1Id" < "user2Id"),
CONSTRAINT friendships_user_pair_uniq UNIQUE ("user1Id", "user2Id"),
CONSTRAINT friendships_user1_fk FOREIGN KEY ("user1Id") REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT friendships_user2_fk FOREIGN KEY ("user2Id") REFERENCES users(id) ON DELETE CASCADE
);
-- friend_requests table (with Sequelize default timestamps)
CREATE TABLE friend_requests (
id SERIAL PRIMARY KEY,
status VARCHAR(50) NOT NULL DEFAULT 'PENDING',
"fromUserId" INTEGER NOT NULL,
"toUserId" INTEGER NOT NULL,
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT friend_requests_from_fk FOREIGN KEY ("fromUserId") REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT friend_requests_to_fk FOREIGN KEY ("toUserId") REFERENCES users(id) ON DELETE CASCADE
);
-- Optional: keep updatedAt current via trigger (Sequelize usually updates it in app code)
-- You can uncomment the below if you want DB-side auto update
-- CREATE OR REPLACE FUNCTION set_updated_at()
-- RETURNS TRIGGER AS $$
-- BEGIN
-- NEW."updatedAt" = NOW();
-- RETURN NEW;
-- END;
-- $$ LANGUAGE plpgsql;
-- CREATE TRIGGER friend_requests_set_updated_at
-- BEFORE UPDATE ON friend_requests
-- FOR EACH ROW
-- EXECUTE FUNCTION set_updated_at();
-- User <-> Group many-to-many join table
CREATE TABLE "UserGroups" (
id SERIAL PRIMARY KEY,
"userId" INTEGER NOT NULL,
"groupId" INTEGER NOT NULL,
CONSTRAINT usergroups_user_fk FOREIGN KEY ("userId") REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT usergroups_group_fk FOREIGN KEY ("groupId") REFERENCES groups(id) ON DELETE CASCADE,
CONSTRAINT usergroups_user_group_uniq UNIQUE ("userId", "groupId")
);
-- Helpful indexes
CREATE INDEX IF NOT EXISTS idx_friend_requests_from ON friend_requests ("fromUserId");
CREATE INDEX IF NOT EXISTS idx_friend_requests_to ON friend_requests ("toUserId");
CREATE INDEX IF NOT EXISTS idx_friendships_user1 ON friendships ("user1Id");
CREATE INDEX IF NOT EXISTS idx_friendships_user2 ON friendships ("user2Id");