using Npgsql; namespace practiceApplicaiton; /// /// Роли приложения (совпадают с ролями PostgreSQL) /// public enum AppRole { Admin, Manager } /// /// Менеджер подключения к БД. /// Строка подключения формируется по роли — каждая роль имеет /// отдельного пользователя PostgreSQL с ограниченными правами. /// public static class Database { // Текущая роль сессии public static AppRole CurrentRole { get; private set; } public static string CurrentUserName { get; private set; } = ""; private static string _connectionString = ""; private static readonly Dictionary AppPasswords = new() { { AppRole.Admin, "admin" }, { AppRole.Manager, "manager" }, }; /// /// Инициализирует подключение с проверкой логина/пароля через PostgreSQL. /// Возвращает true если успешно. /// public static async Task ConnectAsync(AppRole role, string password) { // Простая проверка пароля на уровне приложения (дополнительный слой) if (password != AppPasswords[role]) return false; var cs = new NpgsqlConnectionStringBuilder { Host = "edu-pg.itiscaf.ru", Port = 5432, Database = "dbwork", Username = "zakharov_pi", Password = "z4HpEB87TGS", SslMode = SslMode.Prefer, }; _connectionString = cs.ConnectionString; CurrentRole = role; // Проверяем реальное подключение try { await using var conn = new NpgsqlConnection(_connectionString); await conn.OpenAsync(); return true; } catch { _connectionString = ""; return false; } } public static NpgsqlConnection GetConnection() { if (string.IsNullOrEmpty(_connectionString)) throw new InvalidOperationException("Нет подключения к БД"); return new NpgsqlConnection(_connectionString); } public static bool IsConnected => !string.IsNullOrEmpty(_connectionString); public static bool IsAdmin => CurrentRole == AppRole.Admin; }