85 lines
3.1 KiB
PL/PgSQL
85 lines
3.1 KiB
PL/PgSQL
-- Проверяем существование типа user_role
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'user_role') THEN
|
||
CREATE TYPE user_role AS ENUM ('user', 'readonly', 'editor');
|
||
END IF;
|
||
END $$;
|
||
|
||
-- Удаляем лишние колонки и связи
|
||
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_role_id_fkey;
|
||
ALTER TABLE users DROP COLUMN IF EXISTS role_id;
|
||
|
||
-- Добавляем колонку role если её нет
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (
|
||
SELECT 1 FROM information_schema.columns
|
||
WHERE table_name = 'users' AND column_name = 'role'
|
||
) THEN
|
||
ALTER TABLE users ADD COLUMN role user_role DEFAULT 'user'::user_role;
|
||
END IF;
|
||
END $$;
|
||
|
||
-- Удаляем лишние триггеры и функции
|
||
DROP TRIGGER IF EXISTS sync_identity_type_trigger ON user_identities;
|
||
DROP TRIGGER IF EXISTS user_identity_role_check ON user_identities;
|
||
DROP TRIGGER IF EXISTS check_admin_role_trigger ON user_identities;
|
||
DROP FUNCTION IF EXISTS sync_identity_type() CASCADE;
|
||
DROP FUNCTION IF EXISTS update_user_role() CASCADE;
|
||
DROP FUNCTION IF EXISTS check_admin_role() CASCADE;
|
||
|
||
-- Создаем функцию для проверки баланса токенов
|
||
CREATE OR REPLACE FUNCTION check_token_balance(wallet_address VARCHAR)
|
||
RETURNS BOOLEAN AS $$
|
||
BEGIN
|
||
-- Эта функция будет вызываться из auth-service.js
|
||
-- Здесь только заглушка, реальная проверка в JavaScript
|
||
RETURN FALSE;
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
-- Создаем функцию проверки роли
|
||
CREATE OR REPLACE FUNCTION check_admin_role()
|
||
RETURNS TRIGGER AS $$
|
||
BEGIN
|
||
-- Не меняем роль при обновлении других типов идентификаторов
|
||
IF NEW.provider != 'wallet' THEN
|
||
RETURN NEW;
|
||
END IF;
|
||
|
||
-- По умолчанию устанавливаем роль user
|
||
UPDATE users
|
||
SET role = 'user'::user_role
|
||
WHERE id = NEW.user_id;
|
||
|
||
-- Роль админа будет назначаться через auth-service.js после проверки баланса токенов
|
||
RETURN NEW;
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
-- Создаем триггер
|
||
-- CREATE TRIGGER check_admin_role_trigger
|
||
-- AFTER INSERT OR UPDATE ON user_identities
|
||
-- FOR EACH ROW
|
||
-- EXECUTE FUNCTION check_admin_role();
|
||
|
||
-- Триггер отключен, так как проверка роли админа происходит в JavaScript коде
|
||
-- и триггер вызывает ошибку с зашифрованными полями provider_encrypted
|
||
|
||
-- Сбрасываем все роли на user
|
||
UPDATE users SET role = 'user'::user_role;
|
||
|
||
-- Создаем индекс для оптимизации поиска по роли
|
||
CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
|
||
|
||
-- Создаем функцию для безопасного обновления роли
|
||
CREATE OR REPLACE FUNCTION update_user_role(p_user_id INTEGER, p_role user_role)
|
||
RETURNS VOID AS $$
|
||
BEGIN
|
||
UPDATE users
|
||
SET role = p_role,
|
||
updated_at = NOW()
|
||
WHERE id = p_user_id;
|
||
END;
|
||
$$ LANGUAGE plpgsql; |