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;
}