Skip to content

Реалізація інформаційного та програмного забезпечення

SQL скрипти для ініціалізації та наповнення бази даних

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE IF NOT EXISTS User (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  first_name VARCHAR(255) NOT NULL,
  last_name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  phone_number VARCHAR(20),
  age SMALLINT
);

CREATE TABLE IF NOT EXISTS Role (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  name VARCHAR(255) NOT NULL,
  description TEXT
);

CREATE TABLE IF NOT EXISTS user_roles (
  user_id UUID NOT NULL,
  role_id UUID NOT NULL,
  PRIMARY KEY (user_id, role_id),

  FOREIGN KEY (user_id) REFERENCES User(id) ON DELETE CASCADE,
  FOREIGN KEY (role_id) REFERENCES Role(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS role_permissions (
  role_id UUID NOT NULL,
  permission_id UUID NOT NULL,
  PRIMARY KEY (role_id, permission_id),

  FOREIGN KEY (role_id) REFERENCES Role(id) ON DELETE CASCADE,
  FOREIGN KEY (permission_id) REFERENCES Permission(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Permission (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  name VARCHAR(255) NOT NULL,
  description TEXT
);

CREATE TABLE IF NOT EXISTS Quiz (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  title VARCHAR(255) NOT NULL,
  description TEXT,
  creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  close_date TIMESTAMP,
  is_active BOOLEAN DEFAULT TRUE,
  owner_id UUID NOT NULL,

  FOREIGN KEY (owner_id) REFERENCES User(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Question (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  header VARCHAR(255),
  description TEXT,
  quiz_id UUID NOT NULL,

  FOREIGN KEY (quiz_id) REFERENCES Quiz(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Type (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  description TEXT,
  question_id UUID NOT NULL,

  FOREIGN KEY (question_id) REFERENCES Question(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS EventParticipant (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  role TEXT NOT NULL,
  user_id UUID NOT NULL,
  event_id UUID NOT NULL,

  FOREIGN KEY (user_id) REFERENCES User(id) ON DELETE CASCADE,
  FOREIGN KEY (event_id) REFERENCES WorkflowEvent(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Variant (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  question_id UUID NOT NULL,
  text TEXT NOT NULL,

  FOREIGN KEY (question_id) REFERENCES Question(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS SelectedVar (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  variant_id UUID NOT NULL,
  answer_id UUID NOT NULL,

  FOREIGN KEY (variant_id) REFERENCES Variant(id) ON DELETE CASCADE,
  FOREIGN KEY (answer_id) REFERENCES Answer(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Feedback (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  description TEXT NOT NULL,
  date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  user_id  NOT NULL,
  survey_id,

  CONSTRAINT fk_feedback_user FOREIGN KEY (user_id)
    REFERENCES User(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT fk_feedback_survey FOREIGN KEY (survey_id)
    REFERENCES Survey(id)
    ON DELETE SET NULL
    ON UPDATE CASCADE
);

CREATE INDEX IF NOT EXISTS idx_feedback_user ON Feedback(user_id);
CREATE INDEX IF NOT EXISTS idx_feedback_survey ON Feedback(survey_id);

CREATE TABLE IF NOT EXISTS WorkflowEvent (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  datetime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  state TEXT NOT NULL CHECK (state IN ('pending', 'approved', 'rejected', 'completed')),
  description TEXT,
  initiator_id UUID NOT NULL,
  quiz_id UUID NOT NULL,

  FOREIGN KEY (initiator_id) REFERENCES "User"(id) ON DELETE CASCADE,
  FOREIGN KEY (quiz_id) REFERENCES "Quiz"(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS Answer (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  content TEXT NOT NULL,
  user_id UUID NOT NULL,
  question_id UUID NOT NULL,
  answer_id UUID NOT NULL,

  CONSTRAINT fk_answer_self FOREIGN KEY (answer_id) REFERENCES Answer(id)
);

CREATE TABLE IF NOT EXISTS Result (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  content TEXT NOT NULL,
  name VARCHAR(255) NOT NULL,
  answer_id UUID NOT NULL,

  CONSTRAINT fk_result_answer FOREIGN KEY (answer_id) REFERENCES Answer(id)
);

INSERT INTO Role (name, description)
VALUES
  ('Admin', 'Administrator role with full access'),
  ('Editor', 'Editor role with content editing permissions'),
  ('Viewer', 'Viewer role with read-only access');

INSERT INTO Permission (name, description)
VALUES
  ('Manage Users', 'Permission to manage users'),
  ('Edit Content', 'Permission to edit content'),
  ('View Content', 'Permission to view content');

INSERT INTO User (first_name, last_name, email, password, phone_number, age)
VALUES
  ('Alice', 'Smith', 'alice@example.com', 'hashedpassword1', '+123456789', 30),
  ('Bob', 'Johnson', 'bob@example.com', 'hashedpassword2', '+987654321', 25),
  ('Charlie', 'Brown', 'charlie@example.com', 'hashedpassword3', '+192837465', 35);

INSERT INTO user_roles (user_id, role_id)
VALUES
  ((SELECT id FROM "User" WHERE email = 'alice@example.com'), (SELECT id FROM "Role" WHERE name = 'Admin')),
  ((SELECT id FROM "User" WHERE email = 'bob@example.com'), (SELECT id FROM "Role" WHERE name = 'Editor')),
  ((SELECT id FROM "User" WHERE email = 'charlie@example.com'), (SELECT id FROM "Role" WHERE name = 'Viewer'));

INSERT INTO role_permissions (role_id, permission_id)
VALUES
  ((SELECT id FROM "Role" WHERE name = 'Admin'), (SELECT id FROM "Permission" WHERE name = 'Manage Users')),
  ((SELECT id FROM "Role" WHERE name = 'Editor'), (SELECT id FROM "Permission" WHERE name = 'Edit Content')),
  ((SELECT id FROM "Role" WHERE name = 'Viewer'), (SELECT id FROM "Permission" WHERE name = 'View Content'));

INSERT INTO Quiz (title, description, creation_date, close_date, is_active, owner_id)
VALUES
  ('Customer Satisfaction Quiz', 'Quiz about customer satisfaction', '2025-04-20 10:00:00', '2025-04-30 23:59:59', TRUE, 'e7b3f5b4-8a63-4e2e-baad-5a8c5c5b1234'),
  ('Employee Feedback Quiz', 'Quiz to collect employee feedback', '2025-04-21 12:00:00', NULL, TRUE, '0e00b3e1-2c66-4f56-9332-9e20bfcdb812'),
  ('Website Usability Quiz', 'Quiz to evaluate website usability', '2025-04-22 14:00:00', '2025-05-01 20:00:00', FALSE, '7f6c9aee-681c-4f61-812d-dcd7edb7b029');

INSERT INTO Question (quiz_id, header, description)
VALUES
  ('827487ea-227a-4847-9bf7-e0ada468c87e', 'How satisfied are you?', 'Please rate your satisfaction from 1 to 5'),
  ('827487ea-227a-4847-9bf7-e0ada468c87e', 'Would you recommend us?', ''),
  ('827487ea-227a-4847-9bf7-e0ada468c87e', 'What could we improve?', 'Open-ended feedback welcome'),
  ('827487ea-227a-4847-9bf7-e0ada468c87e', 'How easy was it to use our product?', 'Rate from 1 (hard) to 5 (easy)'),
  ('827487ea-227a-4847-9bf7-e0ada468c87e', 'Did everything work as expected?', '');

INSERT INTO Type (question_id, description)
VALUES
  ('f1b5084c-3e9a-485d-92e4-9b4696c2f953', '1TO5RATING'),
  ('11a6f19f-612c-4562-acba-a4573decb6ef', 'YES/NO'),
  ('68d46927-04b7-4d88-bf3d-6cd2d61e0756', 'TEXT'),
  ('654d25da-b39f-4bf0-9731-4872b7c3b5b3', '1TO5RATING'),
  ('b7135385-ca55-458c-b3f7-8c56c6449117', 'YES/NO');

INSERT INTO EventParticipant (role, user_id, event_id)
VALUES
  ('Reviewer', '359d3c13-30b6-4614-a54f-6d30bb5bd4ac', '20a8461b-03a6-4d4a-bd53-f33da214dbfc'),
  ('Submitter', '959d7ddf-12bb-4a3c-ae25-df4dbf60867e', 'c69418e5-38ae-4bc5-b6e8-ea98fc249aaf'),
  ('Observer', '959d7ddf-12bb-4a3c-ae25-df4dbf60867e', 'b5571635-803c-4fe0-95b1-382461510871');

INSERT INTO Feedback (content, date, user_id, survey_id)
VALUES
  ('This is some feedback content.', NOW(), 'dcd73fec-10fb-4bc5-8c01-938fa329af46', NULL);

INSERT INTO Variant (question_id, text)
VALUES
  ('f1b5084c-3e9a-485d-92e4-9b4696c2f953', 'Option 1'),
  ('f1b5084c-3e9a-485d-92e4-9b4696c2f953', 'Option 2'),
  ('11a6f19f-612c-4562-acba-a4573decb6ef', 'Yes'),
  ('11a6f19f-612c-4562-acba-a4573decb6ef', 'No');

INSERT INTO SelectedVar (variant_id, answer_id)
VALUES
  ('550e8400-e29b-41d4-a716-446655440000', '123e4567-e89b-12d3-a456-426614174000'),
  ('6ba7b810-9dad-11d1-80b4-00c04fd430c8', '123e4567-e89b-12d3-a456-426614174001');

INSERT INTO "WorkflowEvent" (datetime, state, description, initiator_id, quiz_id)
VALUES
  (NOW(), 'pending', 'Перевірка квізу про SQL',
    (SELECT id FROM "User" WHERE email='admin@example.com'),
    (SELECT id FROM "Quiz" WHERE title='Основи SQL')),

  (NOW(), 'approved', 'Затвердження квізу для початківців',
    (SELECT id FROM "User" WHERE email='reviewer@example.com'),
    (SELECT id FROM "Quiz" WHERE title='Бази даних 101'));

INSERT INTO Answer (content, user_id, question_id)
VALUES
  ('The answer to life is 42.', 'd3e1b89e-23f5-4de1-a37d-5243f16f9b8c', 'aa2d1f4a-bc65-4e6e-bc63-f589ef2b1f1f'),
  ('The second possible answer is 24.', 'e6d3b15e-29c4-49ad-97d3-61ad1234ac9b', 'bb4c2d4b-bc65-4e6e-bc63-f589ef2b1f2g');

INSERT INTO Result (content, nameanswer_id)
VALUES
  ('User successfully answered the question.', 'First Attempt', 'the-uuid-of-the-answer-above');
  ('The second possible answer is 24.', 'e6d3b15e-29c4-49ad-97d3-61ad1234ac9b', 'bb4c2d4b-bc65-4e6e-bc63-f589ef2b1f2g'),
  ('A comment on the first answer.', 'f9b1d52e-8931-4cba-8a3d-243c4ed3b456', 'aa2d1f4a-bc65-4e6e-bc63-f589ef2b1f1f');