diff --git a/migrations/staging/20230312161230-add-course.sql b/migrations/staging/20230312161230-add-course.sql new file mode 100644 index 0000000000000000000000000000000000000000..0fda2eaabf815773b9a867d59e2b2204a390f216 --- /dev/null +++ b/migrations/staging/20230312161230-add-course.sql @@ -0,0 +1,33 @@ + +-- +migrate Up +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TABLE public."major" ( + id UUID DEFAULT uuid_generate_v4(), + name varchar(250) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE public."course" ( + id varchar(30) NOT NULL, + name varchar(255) NOT NULL, + major_id UUID NOT NULL, + description TEXT, + PRIMARY KEY (id), + FOREIGN KEY (major_id) REFERENCES public."major"(id) +); + +CREATE TABLE public."course_contributor" ( + course_id varchar(30) NOT NULL, + email varchar(100) NOT NULL, + PRIMARY KEY (course_id, email), + FOREIGN KEY (course_id) + REFERENCES public."course"(id) + ON UPDATE CASCADE ON DELETE CASCADE, + FOREIGN KEY (email) REFERENCES public."user"(email) ON DELETE CASCADE +); + +-- +migrate Down +DROP TABLE public."course_contributor"; +DROP TABLE public."course"; +DROP TABLE public."major"; \ No newline at end of file diff --git a/migrations/staging/20230312161234-add-materials.sql b/migrations/staging/20230312161234-add-materials.sql new file mode 100644 index 0000000000000000000000000000000000000000..b41922ad5c9d6758fede10d32e618c35fd846fcf --- /dev/null +++ b/migrations/staging/20230312161234-add-materials.sql @@ -0,0 +1,30 @@ +-- +migrate Up +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TYPE MATERIAL_TYPE AS ENUM('video','handout','external'); + +CREATE TABLE public."material" ( + id UUID DEFAULT uuid_generate_v4(), + course_id varchar(30) NOT NULL, + creator_email varchar(100) NOT NULL, + name varchar(250) NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY (course_id, creator_email) + REFERENCES public."course_contributor"(course_id, email) + ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE public."material_data" ( + id UUID DEFAULT uuid_generate_v4(), + "type" MATERIAL_TYPE NOT NULL, + link TEXT NOT NULL, + material_id UUID NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY(material_id) + REFERENCES public."material"(id) +); + +-- +migrate Down +DROP TABLE public."material_data"; +DROP TABLE public."material"; +DROP TYPE MATERIAL_TYPE; diff --git a/migrations/staging/20230312161407-add-quiz.sql b/migrations/staging/20230312161407-add-quiz.sql new file mode 100644 index 0000000000000000000000000000000000000000..3e60819a84ea3695e32d6392e91bf36686a1a072 --- /dev/null +++ b/migrations/staging/20230312161407-add-quiz.sql @@ -0,0 +1,43 @@ + +-- +migrate Up +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TYPE PROBLEM_TYPE AS ENUM('choice'); + +CREATE TABLE public."quiz" ( + id UUID DEFAULT uuid_generate_v4(), + name varchar(255) NOT NULL, + course_id varchar(30) NOT NULL, + creator_email varchar(100) NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY (course_id, creator_email) + REFERENCES public."course_contributor"(course_id, email) + ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE public."quiz_problem" ( + id UUID DEFAULT uuid_generate_v4(), + statement TEXT NOT NULL, + "type" PROBLEM_TYPE NOT NULL, + quiz_id UUID NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY(quiz_id) + REFERENCES public."quiz"(id) +); + +CREATE TABLE public."quiz_choice_option" ( + id UUID DEFAULT uuid_generate_v4(), + quiz_problem_id UUID NOT NULL, + statement TEXT NOT NULL, + is_answer BOOLEAN DEFAULT false, + PRIMARY KEY(id, quiz_problem_id), + FOREIGN KEY (quiz_problem_id) + REFERENCES public."quiz_problem"(id) + ON DELETE CASCADE +); + +-- +migrate Down +DROP TABLE public."quiz_choice_option"; +DROP TABLE public."quiz_problem"; +DROP TABLE public."quiz"; +DROP TYPE PROBLEM_TYPE; diff --git a/migrations/staging/20230312172631-add-quiz-take.sql b/migrations/staging/20230312172631-add-quiz-take.sql new file mode 100644 index 0000000000000000000000000000000000000000..3104bb9ca69b0874750951f077ca7d92b524bfd2 --- /dev/null +++ b/migrations/staging/20230312172631-add-quiz-take.sql @@ -0,0 +1,32 @@ + +-- +migrate Up +CREATE TABLE public."quiz_take" ( + id UUID DEFAULT uuid_generate_v4(), + quiz_id UUID NOT NULL, + email varchar(100) NOT NULL, + start_time TIMESTAMP DEFAULT NOW(), + is_finished BOOLEAN DEFAULT false, + score INT DEFAULT 0, + PRIMARY KEY(id), + FOREIGN KEY (quiz_id) + REFERENCES public."quiz"(id), + FOREIGN KEY (email) + REFERENCES public."user"(email) + ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE public."quiz_take_choice_answer" ( + quiz_take_id UUID NOT NULL, + answer_choice_id UUID NOT NULL, + quiz_problem_id UUID NOT NULL, + PRIMARY KEY (quiz_take_id, quiz_problem_id), + FOREIGN KEY (quiz_take_id) + REFERENCES public."quiz_take"(id) + ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (answer_choice_id, quiz_problem_id) + REFERENCES public."quiz_choice_option"(id, quiz_problem_id) +); + +-- +migrate Down +DROP TABLE public."quiz_take_choice_answer"; +DROP TABLE public."quiz_take"; \ No newline at end of file diff --git a/migrations/staging/20230314061153-extend-course.sql b/migrations/staging/20230314061153-extend-course.sql new file mode 100644 index 0000000000000000000000000000000000000000..df6033650e22326337fd4dab0c68ad92d7bb7f51 --- /dev/null +++ b/migrations/staging/20230314061153-extend-course.sql @@ -0,0 +1,26 @@ + +-- +migrate Up + +CREATE TABLE public."faculty" ( + id UUID DEFAULT uuid_generate_v4(), + name varchar(250) NOT NULL, + PRIMARY KEY (id) +); + +ALTER TABLE public."major" + ADD COLUMN fac_id UUID NOT NULL, + ADD FOREIGN KEY (fac_id) REFERENCES public."faculty"(id); + +ALTER TABLE public."course" + ADD COLUMN email varchar(100) NOT NULL, + ADD FOREIGN KEY (email) REFERENCES public."user"(email); + +-- +migrate Down + +ALTER TABLE public."course" + DROP COLUMN email; + +ALTER TABLE public."major" + DROP COLUMN fac_id; + +DROP TABLE public."faculty"; \ No newline at end of file diff --git a/migrations/staging/20230314062152-course-flavor.sql b/migrations/staging/20230314062152-course-flavor.sql new file mode 100644 index 0000000000000000000000000000000000000000..0b467420032b8253090cb862e4f12754f5ffedb6 --- /dev/null +++ b/migrations/staging/20230314062152-course-flavor.sql @@ -0,0 +1,43 @@ + +-- +migrate Up +ALTER TABLE public."faculty" + ADD COLUMN abbreviation VARCHAR(20) DEFAULT NULL; + +ALTER TABLE public."major" + ADD COLUMN abbreviation VARCHAR(20) DEFAULT NULL; + +ALTER TABLE public."course" + ADD COLUMN abbreviation VARCHAR(20) DEFAULT NULL, + ADD COLUMN lecturer VARCHAR(250) DEFAULT NULL; + +-- +migrate StatementBegin +CREATE OR REPLACE FUNCTION assign_lecturer() +RETURNS TRIGGER +AS $assign$ +BEGIN + IF NEW.lecturer is NULL THEN + NEW.lecturer = (SELECT name FROM public."user" WHERE email = NEW.email); + END IF; + RETURN NEW; +END; +$assign$ LANGUAGE plpgsql; +-- +migrate StatementEnd + +CREATE TRIGGER assign_lecturer +BEFORE INSERT ON public."course" +FOR EACH ROW EXECUTE PROCEDURE assign_lecturer(); + +-- +migrate Down +DROP TRIGGER IF EXISTS assign_lecturer ON public."course" + +DROP FUNCTION IF EXISTS assign_lecturer(); + +ALTER TABLE public."course" + DROP COLUMN abbreviation, + DROP COLUMN lecturer; + +ALTER TABLE public."major" + DROP COLUMN abbreviation; + +ALTER TABLE public."faculty" + DROP COLUMN abbreviation; \ No newline at end of file diff --git a/migrations/staging/20230314062806-course-example.sql b/migrations/staging/20230314062806-course-example.sql new file mode 100644 index 0000000000000000000000000000000000000000..a5922b1b366c2bfe541934e8c802ea5d2788d89c --- /dev/null +++ b/migrations/staging/20230314062806-course-example.sql @@ -0,0 +1,36 @@ + +-- +migrate Up +UPDATE public."user" SET + name = 'Dr. Yani Widyani, S.T, M.T.' + WHERE email = 'contributor@example.com'; + +INSERT INTO public."faculty" ("name", "abbreviation") +VALUES + ('Sekolah Teknik Elektro dan Informatika', 'STEI'); + +INSERT INTO public."major" ("name", "fac_id", "abbreviation") +VALUES + ('Teknik Informatika', (SELECT id FROM public."faculty" WHERE abbreviation='STEI'), 'IF'); + +INSERT INTO public."course" ("id", "name", "major_id", "description", "email", "abbreviation") +VALUES + ('IF3250', 'Proyek Perangkat Lunak', (SELECT id FROM public."major" WHERE abbreviation='IF'), 'Kuliah ini memberikan gambaran kompleksitas dan pengalaman mengenai pengembangan perangkat lunak skala besar. Mahasiswa memanfaatkan/ menggunakan berbagai platform, framework, dan tools yang biasa dipakai untuk proyek berskala besar. Kuliah ini juga memberikan pengetahuan rekayasa perangkat lunak tingkat lanjut, mencakup Domain Specific Language (DSL), Domain-oriented Design/Analysis/Architecture, Large Scale Software development, dan Performance Engineering.', 'contributor@example.com', 'PPL'), + ('IF3270', 'Pembelajaran Mesin', (SELECT id FROM public."major" WHERE abbreviation='IF'), 'Kuliah ini membahas berbagai teknik pembelajaran oleh mesin serta pengenalan pola. Pendekatan yang diberikan mencakup supervised learning dan unsupervised learning.', 'contributor@example.com', 'ML'); + +-- +migrate Down +DELETE FROM public."course" WHERE id IN ( + 'IF3250', + 'IF3270' +); + +DELETE FROM public."major" WHERE abbreviation IN ( + 'IF' +); + +DELETE FROM public."faculty" WHERE abbreviation IN ( + 'STEI' +); + +UPDATE public."user" SET + name = 'contributor' + WHERE email = 'contributor@example.com'; \ No newline at end of file diff --git a/migrations/staging/20230314101130-normal-user.sql b/migrations/staging/20230314101130-normal-user.sql new file mode 100644 index 0000000000000000000000000000000000000000..401d22ed5d0cbc9e06215792bea05cc478220f70 --- /dev/null +++ b/migrations/staging/20230314101130-normal-user.sql @@ -0,0 +1,13 @@ + +-- +migrate Up +INSERT INTO public."user" ("email", "password", "name", "role", "is_activated") +VALUES + ('ucok@example.com', '$2a$10$J4POz3KQESxzA.d9S8rHRu3ZuJSRdcJkVQcx1SRdMNQqtD8gHfccy', 'Ucok', 'student', true), + ('udin@example.com', '$2a$10$J4POz3KQESxzA.d9S8rHRu3ZuJSRdcJkVQcx1SRdMNQqtD8gHfccy', 'Udin', 'student', false); + +-- +migrate Down + +DELETE FROM public."user" WHERE email IN ( + 'ucok@example.com', + 'udin@example.com' +); diff --git a/migrations/staging/20230316185603-add-contraint-unique-abbr.sql b/migrations/staging/20230316185603-add-contraint-unique-abbr.sql new file mode 100644 index 0000000000000000000000000000000000000000..f1a4443eb3d91993a122e08b5356a508575d338b --- /dev/null +++ b/migrations/staging/20230316185603-add-contraint-unique-abbr.sql @@ -0,0 +1,14 @@ + +-- +migrate Up +ALTER TABLE public."course" ADD UNIQUE (abbreviation); + +ALTER TABLE public."major" ADD UNIQUE (abbreviation); + +ALTER TABLE public."faculty" ADD UNIQUE (abbreviation); +-- +migrate Down + +ALTER TABLE public."course" DROP CONSTRAINT course_abbreviation_key; + +ALTER TABLE public."major" DROP CONSTRAINT major_abbreviation_key; + +ALTER TABLE public."faculty" DROP CONSTRAINT faculty_abbreviation_key; \ No newline at end of file diff --git a/migrations/staging/20230329064016-delete-course-contributor.sql b/migrations/staging/20230329064016-delete-course-contributor.sql new file mode 100644 index 0000000000000000000000000000000000000000..d3f391c45f617508e4711d3500a9faad6b25d9b2 --- /dev/null +++ b/migrations/staging/20230329064016-delete-course-contributor.sql @@ -0,0 +1,43 @@ + +-- +migrate Up +ALTER TABLE material + DROP CONSTRAINT IF EXISTS material_course_id_creator_email_fkey; +ALTER TABLE quiz + DROP CONSTRAINT IF EXISTS quiz_course_id_creator_email_fkey; + +DROP TABLE IF EXISTS course_contributor; + +ALTER TABLE material + ADD FOREIGN KEY (creator_email) REFERENCES public."user"(email); + +ALTER TABLE quiz + ADD FOREIGN KEY (creator_email) REFERENCES public."user"(email); + + +-- +migrate Down + +ALTER TABLE material + DROP CONSTRAINT IF EXISTS material_creator_email_fkey; + +ALTER TABLE quiz + DROP CONSTRAINT IF EXISTS quiz_creator_email_fkey; + +CREATE TABLE public."course_contributor" ( + course_id varchar(30) NOT NULL, + email varchar(100) NOT NULL, + PRIMARY KEY (course_id, email), + FOREIGN KEY (course_id) + REFERENCES public."course"(id) + ON UPDATE CASCADE ON DELETE CASCADE, + FOREIGN KEY (email) REFERENCES public."user"(email) ON DELETE CASCADE +); + +ALTER TABLE material + ADD FOREIGN KEY (course_id, creator_email) + REFERENCES public."course_contributor"(course_id, email) + ON DELETE CASCADE ON UPDATE CASCADE; + +ALTER TABLE quiz + ADD FOREIGN KEY (course_id, creator_email) + REFERENCES public."course_contributor"(course_id, email) + ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/migrations/staging/20230401130532-update-material.sql b/migrations/staging/20230401130532-update-material.sql new file mode 100644 index 0000000000000000000000000000000000000000..b739bd7857c582f7bde3b4f428d3bf759907e35f --- /dev/null +++ b/migrations/staging/20230401130532-update-material.sql @@ -0,0 +1,8 @@ + +-- +migrate Up +ALTER TABLE material + ADD COLUMN week INT; + +-- +migrate Down +ALTER TABLE material + DROP COLUMN week; \ No newline at end of file diff --git a/migrations/staging/20230401130806-update-quiz.sql b/migrations/staging/20230401130806-update-quiz.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2e012658962aa68b06109f1e7437e29a68417c6 --- /dev/null +++ b/migrations/staging/20230401130806-update-quiz.sql @@ -0,0 +1,47 @@ + +-- +migrate Up +DROP TABLE quiz_take_choice_answer; +DROP TABLE quiz_choice_option; +DROP TABLE quiz_problem; + +ALTER TABLE quiz + ADD COLUMN quiz_path TEXT; + +-- +migrate Down + +ALTER TABLE quiz + DROP COLUMN quiz_path; + +CREATE TABLE public."quiz_problem" ( + id UUID DEFAULT uuid_generate_v4(), + statement TEXT NOT NULL, + "type" PROBLEM_TYPE NOT NULL, + quiz_id UUID NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY(quiz_id) + REFERENCES public."quiz"(id) +); + +CREATE TABLE public."quiz_choice_option" ( + id UUID DEFAULT uuid_generate_v4(), + quiz_problem_id UUID NOT NULL, + statement TEXT NOT NULL, + is_answer BOOLEAN DEFAULT false, + PRIMARY KEY(id, quiz_problem_id), + FOREIGN KEY (quiz_problem_id) + REFERENCES public."quiz_problem"(id) + ON DELETE CASCADE +); + + +CREATE TABLE public."quiz_take_choice_answer" ( + quiz_take_id UUID NOT NULL, + answer_choice_id UUID NOT NULL, + quiz_problem_id UUID NOT NULL, + PRIMARY KEY (quiz_take_id, quiz_problem_id), + FOREIGN KEY (quiz_take_id) + REFERENCES public."quiz_take"(id) + ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (answer_choice_id, quiz_problem_id) + REFERENCES public."quiz_choice_option"(id, quiz_problem_id) +);