-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase_structure.sql
More file actions
117 lines (111 loc) · 4.04 KB
/
database_structure.sql
File metadata and controls
117 lines (111 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE IF NOT EXISTS Roles(
id SERIAL PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
description TEXT
);
CREATE TABLE IF NOT EXISTS Statuses(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS Types(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS Users(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
username TEXT NOT NULL CHECK(LENGTH(username) >= 5),
user_role SERIAL REFERENCES Roles NOT NULL,
password_hash TEXT NOT NULL,
firstname TEXT NOT NULL,
lastname TEXT NOT NULL,
email TEXT CHECK(email LIKE '%@%.%'),
UNIQUE(username)
);
CREATE TABLE IF NOT EXISTS ProfileImages(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
user_id uuid REFERENCES Users ON DELETE CASCADE NOT NULL,
image_type TEXT NOT NULL,
image_data BYTEA NOT NULL,
UNIQUE(user_id)
);
CREATE TABLE IF NOT EXISTS Teams(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
name TEXT NOT NULL,
description TEXT,
team_leader uuid REFERENCES Users NOT NULL
);
CREATE TABLE IF NOT EXISTS Projects(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
project_owner uuid REFERENCES Users NOT NULL,
name TEXT NOT NULL,
description TEXT,
flags TEXT,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS Features(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
project_id uuid REFERENCES Projects ON DELETE CASCADE NOT NULL,
feature_owner uuid REFERENCES Users NOT NULL,
name TEXT NOT NULL,
description TEXT,
flags TEXT,
status uuid REFERENCES Statuses,
type uuid REFERENCES Types,
priority INTEGER,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS Tasks(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
feature_id uuid REFERENCES Features ON DELETE CASCADE NOT NULL,
assignee uuid REFERENCES Users NOT NULL,
name TEXT NOT NULL,
description TEXT,
flags TEXT,
status uuid REFERENCES Statuses,
type uuid REFERENCES Types,
priority INTEGER,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS Comments(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
feature_id uuid REFERENCES Features ON DELETE CASCADE,
task_id uuid REFERENCES Tasks ON DELETE CASCADE,
comment TEXT NOT NULL,
time_spent NUMERIC NOT NULL,
assignee uuid REFERENCES Users,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS Teamsusers(
user_id uuid NOT NULL PRIMARY KEY REFERENCES Users ON DELETE CASCADE,
team_id uuid NOT NULL REFERENCES Teams ON DELETE CASCADE,
UNIQUE(user_id)
);
CREATE OR REPLACE FUNCTION updated_on() RETURNS trigger AS $$ BEGIN NEW.updated_on = now();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER updated_on BEFORE
UPDATE ON Projects FOR EACH ROW EXECUTE PROCEDURE updated_on();
CREATE TRIGGER updated_on BEFORE
UPDATE ON Features FOR EACH ROW EXECUTE PROCEDURE updated_on();
CREATE TRIGGER updated_on BEFORE
UPDATE ON Tasks FOR EACH ROW EXECUTE PROCEDURE updated_on();
CREATE TRIGGER updated_on BEFORE
UPDATE ON Comments FOR EACH ROW EXECUTE PROCEDURE updated_on();
INSERT INTO Roles (name, description) VALUES ('user','default user role');
INSERT INTO Roles (name, description) VALUES ('leader', 'default leader role');
INSERT INTO Roles (name, description) VALUES ('admin', 'default admin role');
INSERT INTO Statuses (name) VALUES ('not started');
INSERT INTO Statuses (name) VALUES ('in progress');
INSERT INTO Statuses (name) VALUES ('blocked');
INSERT INTO Statuses (name) VALUES ('postponed');
INSERT INTO Statuses (name) VALUES ('ready');
INSERT INTO Types (name) VALUES ('new feature');
INSERT INTO Types (name) VALUES ('bugfixes');
INSERT INTO Types (name) VALUES ('extending feature');
INSERT INTO Types (name) VALUES ('refactoring');