78 lines
2.9 KiB
PL/PgSQL
78 lines
2.9 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,
|
|
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" (
|
|
"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");
|