Files
iistwin/migrations/0026_app_role_permissions.sql
Ильяс Султанов 1f5ecb6da4 fix(number-fields): избегаем потери точности длинных чисел
- number-поля теперь рендерятся как text + inputMode=numeric,
  чтобы браузер не округлял значения через input type=number
- пробелы при вставке в number-поля удаляются
- бэкенд нормализует значения number-полей в строку перед сохранением
- добавлен хелпер normalizeFieldValueForStorage

Closes: искажение расчётного счёта и других длинных числовых полей
2026-07-07 21:03:40 +03:00

88 lines
4.9 KiB
SQL

-- Migration: Application Roles + Permission Matrix
-- Rename users.role -> users.app_role, create app_roles/permissions/app_role_permissions
-- NOTE: users.role column is kept as-is. Do NOT rename it to app_role.
-- The app_roles/permissions tables are additive and coexist with the legacy role column.
-- 1. Create app_roles table
CREATE TABLE IF NOT EXISTS app_roles (
id SERIAL PRIMARY KEY,
slug VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
description TEXT,
is_system BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- 3. Create permissions table
CREATE TABLE IF NOT EXISTS permissions (
id SERIAL PRIMARY KEY,
code VARCHAR(100) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
description TEXT,
module VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW()
);
-- 4. Create app_role_permissions table
CREATE TABLE IF NOT EXISTS app_role_permissions (
id SERIAL PRIMARY KEY,
app_role_id INTEGER NOT NULL REFERENCES app_roles(id) ON DELETE CASCADE,
permission_id INTEGER NOT NULL REFERENCES permissions(id) ON DELETE CASCADE,
CONSTRAINT app_role_permissions_role_perm_key UNIQUE (app_role_id, permission_id)
);
-- 5. Seed app_roles
INSERT INTO app_roles (slug, name, description, is_system) VALUES
('admin', 'Администратор', 'Полный доступ ко всем функциям приложения', TRUE),
('user', 'Пользователь', 'Базовый доступ к задачам и чату', TRUE)
ON CONFLICT (slug) DO NOTHING;
-- 6. Seed permissions
INSERT INTO permissions (code, name, description, module) VALUES
('super_admin.access', 'Доступ к супер-админке', 'Управление организациями на уровне супер-админа', 'system'),
('users.manage', 'Управление пользователями', 'Создание, редактирование и удаление пользователей', 'users'),
('roles.manage', 'Управление ролями', 'Создание и редактирование организационных ролей', 'users'),
('forms.manage', 'Управление формами', 'Создание и редактирование форм и полей', 'forms'),
('tasks.view_all', 'Видеть все задачи', 'Доступ ко всем задачам организации', 'tasks'),
('tasks.edit_all', 'Редактировать все задачи', 'Редактирование любых задач', 'tasks'),
('directories.manage', 'Управление справочниками', 'Создание и редактирование справочников', 'directories'),
('finance.view', 'Просмотр финансов', 'Доступ к модулю Финансы', 'finance'),
('finance.manage', 'Управление финансами', 'Редактирование финансовых данных', 'finance'),
('billing.view', 'Просмотр биллинга', 'Просмотр биллинговой информации', 'billing'),
('billing.manage', 'Управление биллингом', 'Управление биллингом и оплатой', 'billing'),
('settings.manage', 'Управление настройками', 'Настройки организации', 'settings'),
('automations.manage', 'Управление автоматизациями', 'Создание и редактирование автоматизаций', 'automations'),
('bots.manage', 'Управление ботами', 'Создание и настройка ботов', 'bots'),
('chat.manage', 'Управление чатами', 'Администрирование групповых чатов', 'chat'),
('reports.view', 'Просмотр отчётов', 'Доступ к отчётам', 'reports'),
('profile.edit', 'Редактирование профиля', 'Изменение собственного профиля', 'profile'),
('inbox.view', 'Доступ к inbox', 'Просмотр inbox и главной страницы', 'inbox')
ON CONFLICT (code) DO NOTHING;
-- 7. Assign permissions to admin (all permissions)
INSERT INTO app_role_permissions (app_role_id, permission_id)
SELECT ar.id, p.id
FROM app_roles ar
CROSS JOIN permissions p
WHERE ar.slug = 'admin'
ON CONFLICT ON CONSTRAINT app_role_permissions_role_perm_key DO NOTHING;
-- 8. Assign minimal permissions to user
INSERT INTO app_role_permissions (app_role_id, permission_id)
SELECT ar.id, p.id
FROM app_roles ar
JOIN permissions p ON p.code IN (
'profile.edit', 'inbox.view', 'chat.use', 'tasks.view_own'
)
WHERE ar.slug = 'user'
ON CONFLICT ON CONSTRAINT app_role_permissions_role_perm_key DO NOTHING;
-- 9. Migrate existing users: fix corrupted roles from UserModal bug
UPDATE users
SET app_role = 'user'
WHERE app_role NOT IN ('admin', 'user');
-- 10. Ensure all existing users have a valid app_role
UPDATE users SET app_role = COALESCE(app_role, 'user');