go-guess/backend/migrations/00002_question_library_and_invitations.sql

62 lines
2.3 KiB
MySQL
Raw Normal View History

2026-09-19 20:31:14 +02:00
-- +goose Up
ALTER TABLE job_postings
ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT 'draft'
CHECK (status IN ('draft', 'published', 'deprecated')),
ADD COLUMN duration_minutes INTEGER NOT NULL DEFAULT 60
CHECK (duration_minutes BETWEEN 1 AND 480);
UPDATE job_postings SET status = 'published';
ALTER TABLE questions ADD COLUMN deprecated BOOLEAN NOT NULL DEFAULT false;
CREATE TABLE job_posting_questions (
job_posting_id BIGINT NOT NULL REFERENCES job_postings(id) ON DELETE CASCADE,
question_id BIGINT NOT NULL REFERENCES questions(id) ON DELETE RESTRICT,
PRIMARY KEY (job_posting_id, question_id)
);
INSERT INTO job_posting_questions (job_posting_id, question_id)
SELECT job_id, id FROM questions WHERE job_id IS NOT NULL;
ALTER TABLE questions DROP COLUMN job_id;
CREATE TABLE invitations (
id BIGSERIAL PRIMARY KEY,
job_id BIGINT NOT NULL REFERENCES job_postings(id) ON DELETE CASCADE,
participant_id BIGINT NOT NULL REFERENCES participants(id) ON DELETE CASCADE,
token VARCHAR(64) NOT NULL UNIQUE,
status VARCHAR(32) NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'accepted', 'completed')),
accepted_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (job_id, participant_id)
);
CREATE TABLE invitation_answers (
id BIGSERIAL PRIMARY KEY,
invitation_id BIGINT NOT NULL REFERENCES invitations(id) ON DELETE CASCADE,
question_id BIGINT NOT NULL REFERENCES questions(id) ON DELETE RESTRICT,
answer TEXT NOT NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (invitation_id, question_id)
);
-- +goose Down
DROP TABLE IF EXISTS invitation_answers;
DROP TABLE IF EXISTS invitations;
ALTER TABLE questions ADD COLUMN job_id BIGINT REFERENCES job_postings(id) ON DELETE CASCADE;
UPDATE questions q
SET job_id = links.job_posting_id
FROM (
SELECT question_id, min(job_posting_id) AS job_posting_id
FROM job_posting_questions
GROUP BY question_id
) links
WHERE links.question_id = q.id;
DROP TABLE IF EXISTS job_posting_questions;
ALTER TABLE questions DROP COLUMN deprecated;
ALTER TABLE job_postings DROP COLUMN duration_minutes;
ALTER TABLE job_postings DROP COLUMN status;