Add SQL scripts.

This commit is contained in:
Florian
2018-05-14 21:05:01 +02:00
parent a1fb3298f9
commit a5b1747592
4 changed files with 268 additions and 0 deletions

256
src/main/sql/ddl.sql Normal file
View File

@@ -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);

View File

@@ -0,0 +1 @@
alter table "user" add column image varchar;

View File

@@ -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")
);

View File

@@ -0,0 +1,2 @@
-- As root
create extension unaccent;