From a5b17475927c2cb066347b2b43a0ea0921fa1127 Mon Sep 17 00:00:00 2001 From: Florian Date: Mon, 14 May 2018 21:05:01 +0200 Subject: [PATCH] Add SQL scripts. --- src/main/sql/ddl.sql | 256 +++++++++++++++++++++++++++++++ src/main/sql/update_beta_0.3.sql | 1 + src/main/sql/update_beta_0.4.sql | 9 ++ src/main/sql/update_beta_0.5.sql | 2 + 4 files changed, 268 insertions(+) create mode 100644 src/main/sql/ddl.sql create mode 100644 src/main/sql/update_beta_0.3.sql create mode 100644 src/main/sql/update_beta_0.4.sql create mode 100644 src/main/sql/update_beta_0.5.sql diff --git a/src/main/sql/ddl.sql b/src/main/sql/ddl.sql new file mode 100644 index 0000000..6607e42 --- /dev/null +++ b/src/main/sql/ddl.sql @@ -0,0 +1,256 @@ +-- ****************************************************************** +-- T A B L E S +-- ****************************************************************** + +drop table if exists "comment_history"; +drop table if exists "comment"; +drop table if exists "post_history"; +drop table if exists "post"; +drop table if exists "sub_category"; +drop table if exists "category"; +drop table if exists "user"; +drop table if exists "role"; + +-- creation of table "role" +create table "role" ( + "id" serial, + "name" varchar, + constraint role_pk primary key ("id"), + constraint role_name_unique unique ("name") +); + +-- creation of table "user" +create table "user" ( + "id" serial, + "key" varchar, + "name" varchar, + "email" varchar, + "password" varchar, + "image" varchar, + "inscription_date" timestamp, + "role_id" integer, + constraint user_pk primary key ("id"), + constraint user_fk_role_id foreign key ("role_id") references role ("id"), + constraint user_key_unique unique ("key"), + constraint user_email_unique unique ("email") +); + +-- creation of table "image" +create table "image" ( + "id" serial, + "link" varchar, + "date" timestamp, + "user_id" integer, + constraint image_pk primary key ("id"), + constraint image_link_unique unique ("link"), + constraint image_fk_user_id foreign key ("user_id") references "user" ("id") +); + +-- creation of table "category" +create table "category" ( + "id" serial, + "name" varchar, + "creator_id" integer, + constraint category_pk primary key ("id"), + constraint category_fk_creator_id foreign key ("creator_id") references "user" ("id"), + constraint category_name_unique unique ("name") +); + +-- creation of table "sub_category" +create table "sub_category" ( + "id" serial, + "main_category" integer, + constraint sub_category_pk primary key ("id"), + constraint sub_category_fk_id foreign key ("id") references "category" ("id"), + constraint sub_category_fk_main_category foreign key ("main_category") references "category" ("id") +); + +-- creation of table "post" +create table "post" ( + "id" serial, + "key" varchar, + "title" varchar, + "text" varchar, + "description" varchar(250), + "creation_date" timestamp, + "image" varchar, + "creator_id" integer, + "category_id" integer, + constraint post_pk primary key ("id"), + constraint post_fk_creator_id foreign key ("creator_id") references "user" ("id"), + constraint post_fk_category_id foreign key ("category_id") references "category" ("id"), + constraint post_key_unique unique ("key") +); + +-- creation of table "post_history" +create table "post_history" ( + "id" serial, + "title" varchar, + "image" varchar, + "description" varchar, + "text" varchar, + "update_date" timestamp, + "post_id" integer, + constraint post_history_pk primary key ("id"), + constraint post_history_fk_post_id foreign key ("post_id") references "post" ("id") +); + +-- creation of table "comment" +create table "comment" ( + "id" serial , + "key" varchar, + "text" varchar , + "creation_date" timestamp , + "author" integer , + "post_id" integer , + constraint comment_pk primary key ("id"), + constraint comment_fk_author foreign key ("author") references "user" ("id"), + constraint comment_fk_post_id foreign key ("post_id") references "post" ("id"), + constraint comment_key_unique unique ("key") +); + +create table "comment_history" ( + "id" serial , + "text" varchar , + "update_date" timestamp , + "comment_id" integer , + constraint comment_history_pk primary key ("id"), + constraint comment_history_fk_comment_id foreign key ("comment_id") references "comment" ("id") +); + +-- ****************************************************************** +-- F U N C T I O N S +-- ****************************************************************** + +-- Function which generate a random number in the given range in parameters. +CREATE OR REPLACE FUNCTION random_range(min INTEGER, max INTEGER) RETURNS INTEGER AS $random_range$ + SELECT (min + FLOOR((max - min + 1) * RANDOM()))::INTEGER; +$random_range$ LANGUAGE sql; + +-- Function which generate a random string of 10 chars. +CREATE OR REPLACE FUNCTION random_string(prefix VARCHAR) RETURNS TEXT AS $random_string$ + DECLARE + possible_chars TEXT := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + length INTEGER := 10; + result TEXT := ''; + i INTEGER; + pos INTEGER; + BEGIN + IF prefix IS NOT NULL THEN + result := prefix; + END IF; + + FOR i IN 1..length LOOP + pos := random_range(1, length(possible_chars)); + result := result || substr(possible_chars, pos, 1); + END LOOP; + + RETURN result; + END +$random_string$ LANGUAGE plpgsql; + +-- Before inserts into "user", if the new user to insert don't have +-- any value for "role_id", this procedure adds the "user" role id +-- for this column. +-- It generate the "key" attribute too. +CREATE OR REPLACE FUNCTION set_role_and_key_for_users() RETURNS TRIGGER AS $set_role_and_key_for_users$ + DECLARE + prefix TEXT := 'USER'; + BEGIN + -- Association of role "user" for the new user to insert. + IF NEW.role_id IS NULL THEN + NEW.role_id := (SELECT id FROM "role" WHERE name = 'user'); + END IF; + + -- Generation of the "key" attribute for new user + NEW.key := random_string(prefix); + + RETURN NEW; + END +$set_role_and_key_for_users$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS set_role_and_key_for_users ON "user"; + +CREATE TRIGGER set_role_and_key_for_users BEFORE INSERT ON "user" + FOR EACH ROW EXECUTE PROCEDURE set_role_and_key_for_users(); + +-- Before inserts into "post", it generates the "key" attribute. +CREATE OR REPLACE FUNCTION set_key_for_posts() RETURNS TRIGGER AS $set_key_for_posts$ + DECLARE + prefix TEXT := 'POST'; + BEGIN + -- Generation of the "key" attribute for new user + NEW.key := random_string(prefix); + + RETURN NEW; + END +$set_key_for_posts$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS set_key_for_posts ON "post"; + +CREATE TRIGGER set_key_for_posts BEFORE INSERT ON "post" + FOR EACH ROW EXECUTE PROCEDURE set_key_for_posts(); + +-- Before update into "post", it populates the table "post_history". +CREATE OR REPLACE FUNCTION create_post_history() RETURNS TRIGGER AS $create_post_history$ + BEGIN + INSERT INTO "post_history" (title, image, description, update_date, text, post_id) VALUES (OLD.title, OLD.image, OLD.description, OLD.creation_date, OLD.text, NEW.id); + + RETURN NEW; + END +$create_post_history$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS create_post_history ON "post"; + +CREATE TRIGGER create_post_history BEFORE UPDATE ON "post" + FOR EACH ROW EXECUTE PROCEDURE create_post_history(); + +-- Before inserts into "comment", it generates the "key" attribute. +CREATE OR REPLACE FUNCTION set_key_for_comments() RETURNS TRIGGER AS $set_key_for_comments$ + DECLARE + prefix TEXT := 'COMM'; + BEGIN + -- Generation of the "key" attribute for new user + NEW.key := random_string(prefix); + + RETURN NEW; + END +$set_key_for_comments$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS set_key_for_comments ON "comment"; + +CREATE TRIGGER set_key_for_comments BEFORE INSERT ON "comment" + FOR EACH ROW EXECUTE PROCEDURE set_key_for_comments(); + +-- ****************************************************************** +-- D E F A U L T D A T A I N T A B L E S +-- ****************************************************************** + +insert into "role" (name) values +('admin'), +('user'); + +insert into "user" (name, email, password, inscription_date, role_id) values +('Administrator','admin@admin.adm','$2a$10$0StXSF/n9fbLM8onEmzjAOUdUqX1uIo5u.IdE22C5NlB1ue5KzYaa','2017-09-25 12:42:44.952', 1); + +insert into category (name, creator_id) values +('Développement', 1), +('Administration système', 1), +('Administration réseau', 1), +('Divers', 1), +('Java', 1), +('C++', 1), +('Android', 1), +('Sql', 1), +('Linux', 1), +('Autre', 1), +('TypeScript', 1); + +insert into sub_category (id, main_category) values +(5, 1), +(6, 1), +(7, 1), +(8, 1), +(9, 2), +(10, 4), +(11, 1); diff --git a/src/main/sql/update_beta_0.3.sql b/src/main/sql/update_beta_0.3.sql new file mode 100644 index 0000000..408c760 --- /dev/null +++ b/src/main/sql/update_beta_0.3.sql @@ -0,0 +1 @@ +alter table "user" add column image varchar; \ No newline at end of file diff --git a/src/main/sql/update_beta_0.4.sql b/src/main/sql/update_beta_0.4.sql new file mode 100644 index 0000000..e3f572e --- /dev/null +++ b/src/main/sql/update_beta_0.4.sql @@ -0,0 +1,9 @@ +create table "image" ( + "id" serial, + "link" varchar, + "date" timestamp, + "user_id" integer, + constraint image_pk primary key ("id"), + constraint image_link_unique unique ("link"), + constraint image_fk_user_id foreign key ("user_id") references "user" ("id") +); \ No newline at end of file diff --git a/src/main/sql/update_beta_0.5.sql b/src/main/sql/update_beta_0.5.sql new file mode 100644 index 0000000..723f011 --- /dev/null +++ b/src/main/sql/update_beta_0.5.sql @@ -0,0 +1,2 @@ +-- As root +create extension unaccent; \ No newline at end of file