diff --git a/justfile b/justfile index 0b6f273..20a3fa9 100644 --- a/justfile +++ b/justfile @@ -39,7 +39,7 @@ start-release: start-postgres-dev clean-podman init-sqlx build-container-release init-sqlx: echo {{env_local}} > server/.env cd server && sqlx database create --connect-timeout 40 # Postgres takes a while to start up - cd server && sqlx migrate run + cd server && sqlx migrate run --source migrations_pg cd server && cargo sqlx prepare # Starts a postgres container for development @@ -72,4 +72,4 @@ clean: clean-podman clean-images rm -rf client-solid/node_modules rm -rf server/public rm -rf server/target - @echo "Cleaned up! Make sure to clean up podman volumes and networks." + @echo "Cleaned up! Make sure to clean up podman volumes and networks." \ No newline at end of file diff --git a/server/migrations/0001_users_table.sql b/server/migrations/0001_users_table.sql index bdeee93..b9ccfdb 100644 --- a/server/migrations/0001_users_table.sql +++ b/server/migrations/0001_users_table.sql @@ -1,38 +1,31 @@ -CREATE TABLE IF NOT EXISTS users ( - id BIGSERIAL PRIMARY KEY, - username TEXT NOT NULL UNIQUE, - password TEXT NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); +CREATE TABLE + IF NOT EXISTS users ( + id INTEGER PRIMARY KEY NOT NULL, + username TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + +-- Create a trigger to set created_at and updated_at on INSERT +CREATE TRIGGER IF NOT EXISTS set_created_at AFTER INSERT ON users BEGIN +UPDATE users +SET + created_at = CURRENT_TIMESTAMP +WHERE + id = NEW.id; --- Create a function to set created_at and updated_at on INSERT -CREATE OR REPLACE FUNCTION 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 set_timestamps_on_insert -BEFORE INSERT ON users -FOR EACH ROW -EXECUTE FUNCTION set_timestamps_on_insert(); +-- Create a trigger to set updated_at on UPDATE +CREATE TRIGGER IF NOT EXISTS set_updated_at AFTER +UPDATE ON users BEGIN +UPDATE users +SET + updated_at = CURRENT_TIMESTAMP +WHERE + id = NEW.id; --- Create a function to set updated_at on UPDATE -CREATE OR REPLACE FUNCTION 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 set_updated_at -BEFORE UPDATE ON users -FOR EACH ROW -EXECUTE FUNCTION set_updated_at(); CREATE INDEX users_username_index ON users (username); \ No newline at end of file diff --git a/server/migrations/0002_posts_table.sql b/server/migrations/0002_posts_table.sql index 5042a86..1b9601b 100644 --- a/server/migrations/0002_posts_table.sql +++ b/server/migrations/0002_posts_table.sql @@ -1,43 +1,38 @@ -CREATE TABLE IF NOT EXISTS posts ( - id BIGSERIAL PRIMARY KEY, - 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 (user_id) REFERENCES users (id) -); +CREATE TABLE + IF NOT EXISTS posts ( + id INTEGER PRIMARY KEY NOT NULL, + user_id INTEGER 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 (user_id) REFERENCES users (id) + ); + +-- Create a trigger to set created_at and updated_at on INSERT +CREATE TRIGGER IF NOT EXISTS set_created_at AFTER INSERT ON posts BEGIN +UPDATE posts +SET + created_at = CURRENT_TIMESTAMP +WHERE + id = NEW.id; --- Create a function to set created_at and updated_at on INSERT -CREATE OR REPLACE FUNCTION 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 set_timestamps_on_insert -BEFORE INSERT ON posts -FOR EACH ROW -EXECUTE FUNCTION set_timestamps_on_insert(); +-- Create a trigger to set updated_at on UPDATE +CREATE TRIGGER IF NOT EXISTS set_updated_at AFTER +UPDATE ON posts BEGIN +UPDATE posts +SET + updated_at = CURRENT_TIMESTAMP +WHERE + id = NEW.id; --- Create a function to set updated_at on UPDATE -CREATE OR REPLACE FUNCTION 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 set_updated_at -BEFORE UPDATE ON posts -FOR EACH ROW -EXECUTE FUNCTION set_updated_at(); +create INDEX IF NOT EXISTS posts_user_id_index ON posts (user_id); + +create INDEX IF NOT EXISTS posts_id_index ON posts (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 diff --git a/server/migrations_pg/0001_users_table.sql b/server/migrations_pg/0001_users_table.sql new file mode 100644 index 0000000..bdeee93 --- /dev/null +++ b/server/migrations_pg/0001_users_table.sql @@ -0,0 +1,38 @@ +CREATE TABLE IF NOT EXISTS users ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- Create a function to set created_at and updated_at on INSERT +CREATE OR REPLACE FUNCTION 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 set_timestamps_on_insert +BEFORE INSERT ON users +FOR EACH ROW +EXECUTE FUNCTION set_timestamps_on_insert(); + +-- Create a function to set updated_at on UPDATE +CREATE OR REPLACE FUNCTION 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 set_updated_at +BEFORE UPDATE ON users +FOR EACH ROW +EXECUTE FUNCTION set_updated_at(); + +CREATE INDEX users_username_index ON users (username); \ No newline at end of file diff --git a/server/migrations_pg/0002_posts_table.sql b/server/migrations_pg/0002_posts_table.sql new file mode 100644 index 0000000..5042a86 --- /dev/null +++ b/server/migrations_pg/0002_posts_table.sql @@ -0,0 +1,43 @@ +CREATE TABLE IF NOT EXISTS posts ( + id BIGSERIAL PRIMARY KEY, + 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 (user_id) REFERENCES users (id) +); + +-- Create a function to set created_at and updated_at on INSERT +CREATE OR REPLACE FUNCTION 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 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 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 set_updated_at +BEFORE UPDATE ON posts +FOR EACH ROW +EXECUTE FUNCTION set_updated_at(); + +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 diff --git a/server/migrations/0003_comments_table.sql b/server/migrations_pg/0003_comments_table.sql similarity index 100% rename from server/migrations/0003_comments_table.sql rename to server/migrations_pg/0003_comments_table.sql diff --git a/server/src/state.rs b/server/src/state.rs index ae75e23..aafca2b 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -43,7 +43,7 @@ impl ServerState { .await .unwrap(); - sqlx::migrate!("./migrations").run(&pool).await.unwrap(); + sqlx::migrate!("./migrations_pg").run(&pool).await.unwrap(); match crate::db::db_new_user("imbus".to_string(), "kartellen1234".to_string(), &pool).await {