diff --git a/server/migrations_pg/0003_comments_table.sql b/server/migrations_pg/0003_comments_table.sql new file mode 100644 index 0000000..19cdf61 --- /dev/null +++ b/server/migrations_pg/0003_comments_table.sql @@ -0,0 +1,51 @@ +CREATE TABLE IF NOT EXISTS comments ( + id BIGSERIAL PRIMARY KEY, + parent_post_id BIGINT NOT NULL, + parent_comment_id BIGINT, + author_user_id BIGINT NOT NULL, + content TEXT NOT NULL, + upvotes INTEGER NOT NULL DEFAULT 0, + downvotes INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (parent_post_id) REFERENCES posts (id), + FOREIGN KEY (parent_comment_id) REFERENCES comments (id), + FOREIGN KEY (author_user_id) REFERENCES users (id) +); + +-- Create a function to set created_at and updated_at on INSERT +CREATE OR REPLACE FUNCTION comments_set_timestamps_on_insert() RETURNS TRIGGER AS $$ +BEGIN + NEW.created_at = NOW(); + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create a trigger to call the function after INSERT +CREATE TRIGGER comments_set_timestamps_on_insert +BEFORE INSERT ON posts +FOR EACH ROW +EXECUTE FUNCTION set_timestamps_on_insert(); + +-- Create a function to set updated_at on UPDATE +CREATE OR REPLACE FUNCTION comments_set_updated_at() RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create a trigger to call the function after UPDATE +CREATE TRIGGER comments_set_updated_at +BEFORE UPDATE ON posts +FOR EACH ROW +EXECUTE FUNCTION comments_set_updated_at(); + +CREATE INDEX comments_parent_post_id_index ON comments (parent_post_id); +CREATE INDEX comments_parent_comment_id_index ON comments (parent_comment_id); +CREATE INDEX comments_user_id_index ON comments (author_user_id); + +-- CREATE INDEX posts_user_id_index ON posts (user_id); +-- CREATE INDEX posts_id_index ON posts (id); +-- CREATE INDEX idx_created_at_desc ON posts (created_at DESC); \ No newline at end of file