From 60c08db51894d0aec728260fd9cd7d4b4f1509d2 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 10 Apr 2025 20:52:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D1=88=D0=B5=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/db/migrations/010_cleanup_roles.sql | 51 +++++++++++++-------- backend/services/auth-service.js | 2 +- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/backend/db/migrations/010_cleanup_roles.sql b/backend/db/migrations/010_cleanup_roles.sql index 65dd674..84a24e4 100644 --- a/backend/db/migrations/010_cleanup_roles.sql +++ b/backend/db/migrations/010_cleanup_roles.sql @@ -29,26 +29,31 @@ 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 $$ -DECLARE - v_wallet_address VARCHAR; BEGIN - SELECT provider_id INTO v_wallet_address - FROM user_identities - WHERE user_id = NEW.user_id - AND provider = 'wallet' - LIMIT 1; - - IF v_wallet_address IS NULL THEN + -- Не меняем роль при обновлении других типов идентификаторов + IF NEW.provider != 'wallet' THEN RETURN NEW; END IF; + -- По умолчанию устанавливаем роль user UPDATE users - SET role = 'admin'::user_role + SET role = 'user'::user_role WHERE id = NEW.user_id; + -- Роль админа будет назначаться через auth-service.js после проверки баланса токенов RETURN NEW; END; $$ LANGUAGE plpgsql; @@ -59,13 +64,19 @@ AFTER INSERT OR UPDATE ON user_identities FOR EACH ROW EXECUTE FUNCTION check_admin_role(); --- Обновляем существующие записи -UPDATE users u -SET role = CASE - WHEN EXISTS ( - SELECT 1 FROM user_identities ui - WHERE ui.user_id = u.id - AND ui.provider = 'wallet' - ) THEN 'admin'::user_role - ELSE 'user'::user_role -END; \ No newline at end of file +-- Сбрасываем все роли на 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; \ No newline at end of file diff --git a/backend/services/auth-service.js b/backend/services/auth-service.js index 6870679..7896dd6 100644 --- a/backend/services/auth-service.js +++ b/backend/services/auth-service.js @@ -7,7 +7,7 @@ const verificationService = require('./verification-service'); // Использ const ADMIN_CONTRACTS = [ { address: "0xd95a45fc46a7300e6022885afec3d618d7d3f27c", network: "eth" }, - { address: "0x1d47f12ffA279BFE59Ab16d56fBb10d89AECdD5D", network: "bsc" }, + { address: "0x4B294265720B09ca39BFBA18c7E368413c0f68eB", network: "bsc" }, { address: "0xdce769b847a0a697239777d0b1c7dd33b6012ba0", network: "arbitrum" }, { address: "0x351f59de4fedbdf7601f5592b93db3b9330c1c1d", network: "polygon" } ];