| 1 | -- Delete tables if they exist
|
|---|
| 2 | DROP TABLE IF EXISTS NEED_APPROVAL CASCADE;
|
|---|
| 3 | DROP TABLE IF EXISTS NOTIFY CASCADE;
|
|---|
| 4 | DROP TABLE IF EXISTS ROLES CASCADE;
|
|---|
| 5 | DROP TABLE IF EXISTS PERMISSION_LEVEL CASCADE;
|
|---|
| 6 | DROP TABLE IF EXISTS SUGGESTION_TYPE CASCADE;
|
|---|
| 7 | DROP TABLE IF EXISTS CONTENT_TYPE CASCADE;
|
|---|
| 8 | DROP TABLE IF EXISTS READING_LIST_ITEMS CASCADE;
|
|---|
| 9 | DROP TABLE IF EXISTS HAS_GENRE CASCADE;
|
|---|
| 10 | DROP TABLE IF EXISTS COLLABORATION CASCADE;
|
|---|
| 11 | DROP TABLE IF EXISTS COMMENT CASCADE;
|
|---|
| 12 | DROP TABLE IF EXISTS LIKES CASCADE;
|
|---|
| 13 | DROP TABLE IF EXISTS AI_SUGGESTION CASCADE;
|
|---|
| 14 | DROP TABLE IF EXISTS NOTIFICATION CASCADE;
|
|---|
| 15 | DROP TABLE IF EXISTS READING_LIST CASCADE;
|
|---|
| 16 | DROP TABLE IF EXISTS CHAPTER CASCADE;
|
|---|
| 17 | DROP TABLE IF EXISTS STATUS CASCADE;
|
|---|
| 18 | DROP TABLE IF EXISTS STORY CASCADE;
|
|---|
| 19 | DROP TABLE IF EXISTS WRITER CASCADE;
|
|---|
| 20 | DROP TABLE IF EXISTS REGULAR_USER CASCADE;
|
|---|
| 21 | DROP TABLE IF EXISTS ADMINS CASCADE;
|
|---|
| 22 | DROP TABLE IF EXISTS GENRE CASCADE;
|
|---|
| 23 | DROP TABLE IF EXISTS USERS CASCADE;
|
|---|
| 24 |
|
|---|
| 25 | -- Tables
|
|---|
| 26 |
|
|---|
| 27 | CREATE TABLE USERS(
|
|---|
| 28 | user_id SERIAL PRIMARY KEY,
|
|---|
| 29 | username VARCHAR(255) NOT NULL UNIQUE,
|
|---|
| 30 | email VARCHAR(255) NOT NULL UNIQUE,
|
|---|
| 31 | name VARCHAR(100) NOT NULL,
|
|---|
| 32 | surname VARCHAR(100) NOT NULL,
|
|---|
| 33 | password VARCHAR(255) NOT NULL,
|
|---|
| 34 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 35 | updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 36 | CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
|
|---|
| 37 | );
|
|---|
| 38 |
|
|---|
| 39 | CREATE TABLE ADMINS(
|
|---|
| 40 | user_id INTEGER PRIMARY KEY,
|
|---|
| 41 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 42 | ON DELETE CASCADE
|
|---|
| 43 | ON UPDATE CASCADE
|
|---|
| 44 | );
|
|---|
| 45 |
|
|---|
| 46 | CREATE TABLE REGULAR_USER(
|
|---|
| 47 | user_id INTEGER PRIMARY KEY,
|
|---|
| 48 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 49 | ON DELETE CASCADE
|
|---|
| 50 | ON UPDATE CASCADE
|
|---|
| 51 | );
|
|---|
| 52 |
|
|---|
| 53 | CREATE TABLE WRITER(
|
|---|
| 54 | user_id INTEGER PRIMARY KEY,
|
|---|
| 55 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 56 | ON DELETE CASCADE
|
|---|
| 57 | ON UPDATE CASCADE
|
|---|
| 58 | );
|
|---|
| 59 |
|
|---|
| 60 | CREATE TABLE STORY(
|
|---|
| 61 | story_id SERIAL PRIMARY KEY,
|
|---|
| 62 | mature_content BOOLEAN NOT NULL,
|
|---|
| 63 | short_description VARCHAR(500) NOT NULL,
|
|---|
| 64 | image VARCHAR(2048),
|
|---|
| 65 | content TEXT NOT NULL,
|
|---|
| 66 | user_id INTEGER NOT NULL,
|
|---|
| 67 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 68 | updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 69 | FOREIGN KEY (user_id) REFERENCES WRITER(user_id)
|
|---|
| 70 | ON DELETE CASCADE
|
|---|
| 71 | ON UPDATE CASCADE
|
|---|
| 72 | );
|
|---|
| 73 |
|
|---|
| 74 | CREATE TABLE STATUS(
|
|---|
| 75 | story_id INTEGER,
|
|---|
| 76 | status VARCHAR(50) NOT NULL,
|
|---|
| 77 | CONSTRAINT status_pk PRIMARY KEY(story_id, status),
|
|---|
| 78 | CONSTRAINT status_values CHECK (status IN ('draft', 'published', 'archived')),
|
|---|
| 79 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 80 | ON DELETE CASCADE
|
|---|
| 81 | ON UPDATE CASCADE
|
|---|
| 82 | );
|
|---|
| 83 |
|
|---|
| 84 | CREATE TABLE CHAPTER(
|
|---|
| 85 | chapter_id SERIAL PRIMARY KEY,
|
|---|
| 86 | chapter_number INTEGER NOT NULL,
|
|---|
| 87 | chapter_name VARCHAR(100) NOT NULL,
|
|---|
| 88 | title VARCHAR(200) NOT NULL,
|
|---|
| 89 | content TEXT NOT NULL,
|
|---|
| 90 | word_count INTEGER CHECK (word_count >= 0),
|
|---|
| 91 | rating DECIMAL(3,2) CHECK (rating >= 0 AND rating <= 5),
|
|---|
| 92 | published_at TIMESTAMPTZ NOT NULL,
|
|---|
| 93 | view_count INTEGER DEFAULT 0 CHECK (view_count >= 0),
|
|---|
| 94 | story_id INTEGER NOT NULL,
|
|---|
| 95 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 96 | updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 97 | CONSTRAINT unique_chapter_number UNIQUE(story_id, chapter_number),
|
|---|
| 98 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 99 | ON DELETE CASCADE
|
|---|
| 100 | ON UPDATE CASCADE
|
|---|
| 101 | );
|
|---|
| 102 |
|
|---|
| 103 | CREATE TABLE GENRE(
|
|---|
| 104 | genre_id SERIAL PRIMARY KEY,
|
|---|
| 105 | name VARCHAR(100) NOT NULL UNIQUE
|
|---|
| 106 | );
|
|---|
| 107 |
|
|---|
| 108 | CREATE TABLE READING_LIST(
|
|---|
| 109 | list_id SERIAL PRIMARY KEY,
|
|---|
| 110 | name VARCHAR(100) NOT NULL,
|
|---|
| 111 | content TEXT,
|
|---|
| 112 | is_public BOOLEAN NOT NULL,
|
|---|
| 113 | user_id INTEGER NOT NULL,
|
|---|
| 114 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 115 | updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 116 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 117 | ON DELETE CASCADE
|
|---|
| 118 | ON UPDATE CASCADE
|
|---|
| 119 | );
|
|---|
| 120 |
|
|---|
| 121 | CREATE TABLE NOTIFICATION(
|
|---|
| 122 | notification_id SERIAL PRIMARY KEY,
|
|---|
| 123 | content TEXT NOT NULL,
|
|---|
| 124 | is_read BOOLEAN DEFAULT FALSE,
|
|---|
| 125 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|---|
| 126 | );
|
|---|
| 127 |
|
|---|
| 128 | CREATE TABLE CONTENT_TYPE(
|
|---|
| 129 | notification_id INTEGER,
|
|---|
| 130 | content_type VARCHAR(50) NOT NULL,
|
|---|
| 131 | CONSTRAINT content_type_pk PRIMARY KEY(notification_id, content_type),
|
|---|
| 132 | FOREIGN KEY (notification_id) REFERENCES NOTIFICATION(notification_id)
|
|---|
| 133 | ON DELETE CASCADE
|
|---|
| 134 | ON UPDATE CASCADE
|
|---|
| 135 | );
|
|---|
| 136 |
|
|---|
| 137 | CREATE TABLE AI_SUGGESTION(
|
|---|
| 138 | suggestion_id SERIAL PRIMARY KEY,
|
|---|
| 139 | original_text TEXT NOT NULL,
|
|---|
| 140 | suggested_text TEXT NOT NULL,
|
|---|
| 141 | accepted BOOLEAN NOT NULL DEFAULT FALSE,
|
|---|
| 142 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 143 | applied_at TIMESTAMPTZ
|
|---|
| 144 | );
|
|---|
| 145 |
|
|---|
| 146 | CREATE TABLE SUGGESTION_TYPE(
|
|---|
| 147 | suggestion_id INTEGER,
|
|---|
| 148 | suggestion_type VARCHAR(50) NOT NULL,
|
|---|
| 149 | CONSTRAINT suggestion_type_pk PRIMARY KEY(suggestion_id, suggestion_type),
|
|---|
| 150 | FOREIGN KEY (suggestion_id) REFERENCES AI_SUGGESTION(suggestion_id)
|
|---|
| 151 | ON DELETE CASCADE
|
|---|
| 152 | ON UPDATE CASCADE
|
|---|
| 153 | );
|
|---|
| 154 |
|
|---|
| 155 | CREATE TABLE LIKES(
|
|---|
| 156 | user_id INTEGER,
|
|---|
| 157 | story_id INTEGER,
|
|---|
| 158 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 159 | CONSTRAINT like_pk PRIMARY KEY(user_id, story_id),
|
|---|
| 160 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 161 | ON DELETE CASCADE
|
|---|
| 162 | ON UPDATE CASCADE,
|
|---|
| 163 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 164 | ON DELETE CASCADE
|
|---|
| 165 | ON UPDATE CASCADE
|
|---|
| 166 | );
|
|---|
| 167 |
|
|---|
| 168 | CREATE TABLE COMMENT(
|
|---|
| 169 | comment_id SERIAL PRIMARY KEY,
|
|---|
| 170 | content TEXT NOT NULL,
|
|---|
| 171 | story_id INTEGER NOT NULL,
|
|---|
| 172 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 173 | updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 174 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 175 | ON DELETE CASCADE
|
|---|
| 176 | ON UPDATE CASCADE
|
|---|
| 177 | );
|
|---|
| 178 |
|
|---|
| 179 | CREATE TABLE COLLABORATION(
|
|---|
| 180 | user_id INTEGER,
|
|---|
| 181 | story_id INTEGER,
|
|---|
| 182 | created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 183 | CONSTRAINT collaboration_pk PRIMARY KEY(user_id, story_id),
|
|---|
| 184 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 185 | ON DELETE CASCADE
|
|---|
| 186 | ON UPDATE CASCADE,
|
|---|
| 187 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 188 | ON DELETE CASCADE
|
|---|
| 189 | ON UPDATE CASCADE
|
|---|
| 190 | );
|
|---|
| 191 |
|
|---|
| 192 | CREATE TABLE ROLES(
|
|---|
| 193 | user_id INTEGER,
|
|---|
| 194 | story_id INTEGER,
|
|---|
| 195 | roles VARCHAR(50) NOT NULL,
|
|---|
| 196 | CONSTRAINT role_pk PRIMARY KEY(user_id, story_id, roles),
|
|---|
| 197 | FOREIGN KEY (user_id, story_id) REFERENCES COLLABORATION(user_id, story_id)
|
|---|
| 198 | ON DELETE CASCADE
|
|---|
| 199 | ON UPDATE CASCADE
|
|---|
| 200 | );
|
|---|
| 201 |
|
|---|
| 202 | CREATE TABLE PERMISSION_LEVEL(
|
|---|
| 203 | user_id INTEGER,
|
|---|
| 204 | story_id INTEGER,
|
|---|
| 205 | permission_level INTEGER NOT NULL,
|
|---|
| 206 | CONSTRAINT permission_level_pk PRIMARY KEY(user_id, story_id, permission_level),
|
|---|
| 207 | FOREIGN KEY (user_id, story_id) REFERENCES COLLABORATION(user_id, story_id)
|
|---|
| 208 | ON DELETE CASCADE
|
|---|
| 209 | ON UPDATE CASCADE
|
|---|
| 210 | );
|
|---|
| 211 |
|
|---|
| 212 | CREATE TABLE HAS_GENRE(
|
|---|
| 213 | story_id INTEGER,
|
|---|
| 214 | genre_id INTEGER,
|
|---|
| 215 | CONSTRAINT has_genre_pk PRIMARY KEY(story_id, genre_id),
|
|---|
| 216 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 217 | ON DELETE CASCADE
|
|---|
| 218 | ON UPDATE CASCADE,
|
|---|
| 219 | FOREIGN KEY (genre_id) REFERENCES GENRE(genre_id)
|
|---|
| 220 | ON DELETE CASCADE
|
|---|
| 221 | ON UPDATE CASCADE
|
|---|
| 222 | );
|
|---|
| 223 |
|
|---|
| 224 | CREATE TABLE READING_LIST_ITEMS(
|
|---|
| 225 | list_id INTEGER,
|
|---|
| 226 | story_id INTEGER,
|
|---|
| 227 | added_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 228 | CONSTRAINT reading_list_items_pk PRIMARY KEY(list_id, story_id),
|
|---|
| 229 | FOREIGN KEY (list_id) REFERENCES READING_LIST(list_id)
|
|---|
| 230 | ON DELETE CASCADE
|
|---|
| 231 | ON UPDATE CASCADE,
|
|---|
| 232 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 233 | ON DELETE CASCADE
|
|---|
| 234 | ON UPDATE CASCADE
|
|---|
| 235 | );
|
|---|
| 236 |
|
|---|
| 237 | CREATE TABLE NOTIFY(
|
|---|
| 238 | user_id INTEGER,
|
|---|
| 239 | story_id INTEGER,
|
|---|
| 240 | notification_id INTEGER,
|
|---|
| 241 | CONSTRAINT notify_pk PRIMARY KEY(user_id, story_id, notification_id),
|
|---|
| 242 | FOREIGN KEY (user_id) REFERENCES USERS(user_id)
|
|---|
| 243 | ON DELETE CASCADE
|
|---|
| 244 | ON UPDATE CASCADE,
|
|---|
| 245 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 246 | ON DELETE CASCADE
|
|---|
| 247 | ON UPDATE CASCADE,
|
|---|
| 248 | FOREIGN KEY (notification_id) REFERENCES NOTIFICATION(notification_id)
|
|---|
| 249 | ON DELETE CASCADE
|
|---|
| 250 | ON UPDATE CASCADE
|
|---|
| 251 | );
|
|---|
| 252 |
|
|---|
| 253 | CREATE TABLE NEED_APPROVAL(
|
|---|
| 254 | suggestion_id INTEGER,
|
|---|
| 255 | story_id INTEGER,
|
|---|
| 256 | chapter_id INTEGER,
|
|---|
| 257 | CONSTRAINT need_approval_pk PRIMARY KEY(suggestion_id, story_id, chapter_id),
|
|---|
| 258 | FOREIGN KEY (suggestion_id) REFERENCES AI_SUGGESTION(suggestion_id)
|
|---|
| 259 | ON DELETE CASCADE
|
|---|
| 260 | ON UPDATE CASCADE,
|
|---|
| 261 | FOREIGN KEY (story_id) REFERENCES STORY(story_id)
|
|---|
| 262 | ON DELETE CASCADE
|
|---|
| 263 | ON UPDATE CASCADE,
|
|---|
| 264 | FOREIGN KEY (chapter_id) REFERENCES CHAPTER(chapter_id)
|
|---|
| 265 | ON DELETE CASCADE
|
|---|
| 266 | ON UPDATE CASCADE
|
|---|
| 267 | ); |
|---|