Database.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Npgsql;
  2. namespace practiceApplicaiton;
  3. /// <summary>
  4. /// Роли приложения (совпадают с ролями PostgreSQL)
  5. /// </summary>
  6. public enum AppRole { Admin, Manager }
  7. /// <summary>
  8. /// Менеджер подключения к БД.
  9. /// Строка подключения формируется по роли — каждая роль имеет
  10. /// отдельного пользователя PostgreSQL с ограниченными правами.
  11. /// </summary>
  12. public static class Database
  13. {
  14. // Текущая роль сессии
  15. public static AppRole CurrentRole { get; private set; }
  16. public static string CurrentUserName { get; private set; } = "";
  17. private static string _connectionString = "";
  18. private static readonly Dictionary<AppRole, string> AppPasswords = new()
  19. {
  20. { AppRole.Admin, "admin" },
  21. { AppRole.Manager, "manager" },
  22. };
  23. /// <summary>
  24. /// Инициализирует подключение с проверкой логина/пароля через PostgreSQL.
  25. /// Возвращает true если успешно.
  26. /// </summary>
  27. public static async Task<bool> ConnectAsync(AppRole role, string password)
  28. {
  29. // Простая проверка пароля на уровне приложения (дополнительный слой)
  30. if (password != AppPasswords[role])
  31. return false;
  32. var cs = new NpgsqlConnectionStringBuilder
  33. {
  34. Host = "edu-pg.itiscaf.ru",
  35. Port = 5432,
  36. Database = "dbwork",
  37. Username = "zakharov_pi",
  38. Password = "z4HpEB87TGS",
  39. SslMode = SslMode.Prefer,
  40. };
  41. _connectionString = cs.ConnectionString;
  42. CurrentRole = role;
  43. // Проверяем реальное подключение
  44. try
  45. {
  46. await using var conn = new NpgsqlConnection(_connectionString);
  47. await conn.OpenAsync();
  48. return true;
  49. }
  50. catch
  51. {
  52. _connectionString = "";
  53. return false;
  54. }
  55. }
  56. public static NpgsqlConnection GetConnection()
  57. {
  58. if (string.IsNullOrEmpty(_connectionString))
  59. throw new InvalidOperationException("Нет подключения к БД");
  60. return new NpgsqlConnection(_connectionString);
  61. }
  62. public static bool IsConnected => !string.IsNullOrEmpty(_connectionString);
  63. public static bool IsAdmin => CurrentRole == AppRole.Admin;
  64. }