diff --git a/.github/workflows/sqlite3-migrations.yml b/.github/workflows/sqlite3-migrations.yml deleted file mode 100644 index 0e53b98..0000000 --- a/.github/workflows/sqlite3-migrations.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: SQLite3 Migrations - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -jobs: - build: - - runs-on: ubuntu-latest - - defaults: - run: - working-directory: ./backend - - steps: - - uses: actions/checkout@v3 - - name: Install SQLite3 - run: sudo apt-get install sqlite3 - - name: Install Make - run: sudo apt-get install make - - name: Run Migrations - run: make migrate diff --git a/backend/Makefile b/backend/Makefile index cb0bb64..dcc79b4 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -43,7 +43,6 @@ update: # Migration target migrate: - @echo "If this ever fails, run make clean and try again" @echo "Migrating database $(DB_FILE) using SQL scripts in $(MIGRATIONS_DIR)" @for file in $(wildcard $(MIGRATIONS_DIR)/*.sql); do \ echo "Applying migration: $$file"; \ diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index 6bb113b..84937f1 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -2,6 +2,7 @@ package database import ( "embed" + "log" "os" "path/filepath" @@ -32,7 +33,7 @@ type Db struct { var scripts embed.FS const userInsert = "INSERT INTO users (username, password) VALUES (?, ?)" -const projectInsert = "INSERT INTO projects (name, description, owner_user_id) SELECT ?, ?, id FROM users WHERE username = ?" +const projectInsert = "INSERT INTO projects (name, description, user_id) SELECT ?, ?, id FROM users WHERE username = ?" const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users WHERE username = ?" // const addTimeReport = "" @@ -126,6 +127,7 @@ func (d *Db) Migrate(dirname string) error { if err != nil { return err } + log.Println("Executed SQL file:", file.Name()) } if tr.Commit() != nil { diff --git a/backend/internal/database/migrations/0020_projects.sql b/backend/internal/database/migrations/0020_projects.sql index adfb818..8592e75 100644 --- a/backend/internal/database/migrations/0020_projects.sql +++ b/backend/internal/database/migrations/0020_projects.sql @@ -3,9 +3,9 @@ CREATE TABLE IF NOT EXISTS projects ( projectId TEXT DEFAULT (HEX(RANDOMBLOB(4))) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL UNIQUE, description TEXT NOT NULL, - owner_user_id INTEGER NOT NULL, - FOREIGN KEY (owner_user_id) REFERENCES users (id) + user_id INTEGER NOT NULL, + FOREIGN KEY (user_id) REFERENCES users (id) ); CREATE INDEX IF NOT EXISTS projects_projectId_index ON projects (projectId); -CREATE INDEX IF NOT EXISTS projects_user_id_index ON projects (owner_user_id); \ No newline at end of file +CREATE INDEX IF NOT EXISTS projects_user_id_index ON projects (user_id); \ No newline at end of file diff --git a/backend/internal/database/migrations/0049_project_role.sql b/backend/internal/database/migrations/0049_project_role.sql deleted file mode 100644 index 8716800..0000000 --- a/backend/internal/database/migrations/0049_project_role.sql +++ /dev/null @@ -1,9 +0,0 @@ --- This table represents the possible role a user can have in a project. --- It has nothing to do with the site admin table. -CREATE TABLE IF NOT EXISTS project_role ( - p_role TEXT PRIMARY KEY -); - --- Insert the possible roles a user can have in a project. -INSERT OR IGNORE INTO project_role (p_role) VALUES ('admin'); -INSERT OR IGNORE INTO project_role (p_role) VALUES ('member'); diff --git a/backend/internal/database/migrations/0050_user_roles.sql b/backend/internal/database/migrations/0050_user_roles.sql index aad25f7..56e597b 100644 --- a/backend/internal/database/migrations/0050_user_roles.sql +++ b/backend/internal/database/migrations/0050_user_roles.sql @@ -1,9 +1,16 @@ CREATE TABLE IF NOT EXISTS user_roles ( user_id INTEGER NOT NULL, project_id INTEGER NOT NULL, - p_role TEXT NOT NULL, -- 'admin' or 'member' + role STRING NOT NULL, -- 'admin' or 'member' FOREIGN KEY (user_id) REFERENCES users (id) FOREIGN KEY (project_id) REFERENCES projects (id) - FOREIGN KEY (p_role) REFERENCES project_role (p_role) PRIMARY KEY (user_id, project_id) -); \ No newline at end of file +); + +-- Make sure that the role is either 'admin' or 'member' +CREATE TRIGGER IF NOT EXISTS user_role_admin_or_member + BEFORE INSERT ON user_roles + FOR EACH ROW + BEGIN + SELECT RAISE(ABORT, 'Invalid role') WHERE NEW.role NOT IN ('admin', 'member'); + END; \ No newline at end of file