/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
db/PostgreSQL/01-init.sql
209 строк
14 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
-- Инициализация основной БД для Core данных -- ВАЖНО: Этот скрипт выполняется в контексте БД gridient_db \c gridient_db SET search_path TO public; -- Таблица пользователей. Хранит информацию о пользователях системы. Каждый пользователь может иметь свой уникальный аккаунт, который позволяет ему взаимодействовать с модульной системой управления списками -- ВАЖНО: Данные аутентификации (пароли, токены) теперь хранятся в отдельной БД gridient_authentication CREATE TABLE user_data ( id SERIAL PRIMARY KEY, user_login VARCHAR(255), -- Логин (используется для связи с auth_users через логин) display_name VARCHAR(255), -- Отображаемое имя email VARCHAR(255), -- email access_right_role INT, -- Уровень прав доступа -- user_pass_hash удален - теперь в auth_users (БД gridient_authentication) created_by_id INT NOT NULL, -- Создавший пользователь - внешний ключ к user_data created_utc TIMESTAMP NOT NULL, -- Дата создания last_login TIMESTAMP, -- Дата последнего входа first_name varchar(250) NULL, last_name varchar(250) NULL, middle_name varchar(250) NULL, CONSTRAINT fk_user_data_created_by FOREIGN KEY (created_by_id) REFERENCES user_data(id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED ); -- Таблица списков. Хранит все списки, созданные пользователями в системе. Списки могут содержать различную структуру данных и настраиваемую конфигурацию. CREATE TABLE lists ( id SERIAL PRIMARY KEY, title VARCHAR(255), -- Название last_item_id INT NOT NULL, -- Идентификатор последнего элемента list_type INT NOT NULL DEFAULT 0, -- Тип списка: 0=List, 1=Dictionary, 2=Calendar version_max INT NOT NULL DEFAULT 1, -- Максимальное число версий deleted_utc TIMESTAMP, -- Время удаления deleted_by_id INT, -- Удаливший пользователь - внешний ключ к user_data read_only_author BOOLEAN, -- Чтение только элементов, созданных автором edit_only_author BOOLEAN, -- Редактирование только элементов, созданных автором FOREIGN KEY (deleted_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE ); -- Таблица групп полей. Хранит группы полей для списков. Поля могут быть сгруппированы и отсортированны для упрощения визуализации и управления данными. CREATE TABLE field_groups ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists name VARCHAR(255), -- Название группы sort_order INT NOT NULL, -- Порядок сортировки deleted_utc TIMESTAMP, -- Время удаления deleted_by_id INT, -- Удаливший пользователь - внешний ключ к user_data is_subtitle BOOLEAN, -- ? preceding_title VARCHAR(255), -- Предыдущий заголовок FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (deleted_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE ); -- Таблица полей. Хранит описание отдельных полей, которые могут быть использованы в списках. Поля могут иметь различные типы (текст, число, дата). CREATE TABLE fields ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists name VARCHAR(255) NOT NULL, -- Название title VARCHAR(255) NOT NULL, -- Отображаемое имя default_value VARCHAR(255), -- Значение по умолчанию field_type VARCHAR(20) NOT NULL, -- Тип поля group_id INT NOT NULL, -- Идентификатор группы - внешний ключ к field_groups sort_order INT NOT NULL, -- Порядок сортировки options TEXT, -- Возможные варианты visible_condition TEXT, -- Условия отображения required_condition TEXT, -- Обязательность заполнения validation_condition TEXT, -- Условия валидации calculating_condition TEXT, -- Условия подсчёта deleted_utc TIMESTAMP, -- Время удаления deleted_by_id INT, -- Удаливший пользователь - внешний ключ к user_data enable_filter BOOLEAN, -- Можно ли применять фильтр is_decimal BOOLEAN, -- Является ли дробным числом view_order INT, -- Порядок отображения lookup_list_id INT, -- Идентификатор lookup-списка - внешний ключ к lists lookup_field_id INT, -- Идентификатор lookup-поля unique_values BOOLEAN, -- Содержит уникальные значения FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (group_id) REFERENCES field_groups(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (lookup_list_id) REFERENCES lists(id) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (deleted_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE ); -- Таблица значений полей. Хранит значения, присвоенные уникальным полям в списках. Каждое значение соответствует определенному элементу списка CREATE TABLE field_values ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists item_id INT NOT NULL, -- Идентификатор сущности field_id INT NOT NULL, -- Идентификатор поля - внешний ключ к fields text_value VARCHAR(255), -- Текстовое значение number_value NUMERIC(18,2), -- Числовое значение date_value TIMESTAMPTZ, -- Значение даты lookup_id INT, -- Идентификатор lookup lookup_value VARCHAR(255), -- Значение lookup FOREIGN KEY (field_id) REFERENCES fields(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица вложений. Хранит информацию о вложенных файлах, связанных с элементами списка CREATE TABLE attachments ( id SERIAL PRIMARY KEY, name VARCHAR(255), -- Название content BYTEA -- Содержание вложения ); -- Таблица системной информации элементов списка. Содержит системную информацию о каждом элементе списка, включая данные о состоянии, метаданные и дату создания CREATE TABLE list_items_sys_info ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists item_id INT NOT NULL, -- Идентификатор сущности created_by_id INT NOT NULL, -- Создавший пользователь - внешний ключ к user_data updated_by_id INT, -- Изменивший пользователь - внешний ключ к user_data deleted_by_id INT, -- Удаливший пользователь - внешний ключ к user_data created_utc TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Дата создания updated_utc TIMESTAMP, -- Дата обновления deleted_utc TIMESTAMP, -- Дата удаления FOREIGN KEY (created_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (updated_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (deleted_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица версий элементов списка. Хранит историю изменений каждого элемента списка. Важно для отслеживания версий и восстановления предыдущих данных. CREATE TABLE list_item_versions ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists item_id INT NOT NULL, -- Идентификатор сущности version_id INT NOT NULL, -- Порядковый номер версии created_by_id INT NOT NULL, -- Создавший пользователь - внешний ключ к user_data created_utc TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Дата создания версии item_data TEXT, -- Данные о версии FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (created_by_id) REFERENCES user_data(id) ON DELETE SET NULL ON UPDATE CASCADE ); -- Таблица пользовательских фильтров. Таблица для хранения пользовательских фильтров, настроенных для списков. Позволяет каждому пользователю адаптировать отображение данных по своим требованиям. CREATE TABLE user_filters ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists user_id INT NOT NULL, -- Идентификатор пользователя - внешний ключ к user_data filter_name VARCHAR(255) NOT NULL, -- Название фильтра filter_value TEXT NOT NULL, -- Значение фильтра FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (user_id) REFERENCES user_data(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица пользовательских полей отчетов. Таблица для хранения настроек, связанных с полями, которые пользователь хочет видеть в отчетах. Позволяет пользователям кастомизировать свои отчеты. CREATE TABLE user_report_fields ( id SERIAL PRIMARY KEY, list_id INT NOT NULL, -- Идентификатор списка - внешний ключ к lists user_id INT NOT NULL, -- Идентификатор пользователя - внешний ключ к user_data name VARCHAR(255) NOT NULL, -- Название поля field_ids TEXT NOT NULL, -- Список полей отчёта FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (user_id) REFERENCES user_data(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица представлений списков. CREATE TABLE "views" ( id SERIAL PRIMARY KEY, list_id int4 NOT NULL, -- Идентификатор списка - внешний ключ к lists title VARCHAR(255) NOT NULL, -- Наименование представления FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица полей представлений. Связь многие ко многим. CREATE TABLE view_fields ( view_id int4 NOT NULL, field_id int4 NOT NULL, field_order int4, FOREIGN KEY (view_id) REFERENCES views(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (field_id) REFERENCES fields(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- Таблица user_tokens удалена -- Refresh токены теперь хранятся в отдельной БД gridient_authentication в таблице refresh_tokens -- CREATE TABLE user_tokens ( -- id SERIAL PRIMARY KEY, -- user_login VARCHAR(255) NOT NULL UNIQUE, -- token VARCHAR NOT NULL UNIQUE, -- created_at TIMESTAMP NOT NULL, -- expires_at TIMESTAMP NOT NULL -- ); -- Создание системного пользователя для использования в скриптах импорта -- Используем отложенную проверку внешнего ключа для создания первого пользователя BEGIN; -- Создаем системного пользователя с id=0, который ссылается сам на себя -- Используем явное указание id и устанавливаем последовательность INSERT INTO user_data (id, user_login, display_name, email, access_right_role, created_by_id, created_utc) VALUES (0, 'system', 'System User', 'system@gridient.local', 0, 0, CURRENT_TIMESTAMP) ON CONFLICT (id) DO NOTHING; -- Устанавливаем последовательность так, чтобы следующий id был 1 SELECT setval('user_data_id_seq', 1, false); COMMIT; -- Создание административного пользователя -- ВАЖНО: Пользователь admin должен существовать в gridient_authentication (создается в 01-init-auth.sql) -- Здесь создаем его в основной БД gridient_db BEGIN; -- Создаем пользователя admin в основной БД (если еще не существует) INSERT INTO user_data (user_login, display_name, email, access_right_role, created_by_id, created_utc) SELECT 'admin', 'Администратор', 'admin@example.com', 0, 0, CURRENT_TIMESTAMP WHERE NOT EXISTS (SELECT 1 FROM user_data WHERE user_login = 'admin'); COMMIT;