Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
37fdc8c
Сделал создание базы из лаунчера входа
J0shlerB0y Apr 28, 2026
9d5f2cf
решил конфликты с изменениями по ревью
J0shlerB0y Apr 28, 2026
c5593f6
сделал клиент создание базы для облака
J0shlerB0y Apr 28, 2026
2266c4b
универсальное наполнение базы данных из скриптов
J0shlerB0y Apr 30, 2026
a43ac62
починил маппинг страниц + скрипты наполнения баз
J0shlerB0y May 1, 2026
0e82442
поменял получения крейтора базы в типе подключения
J0shlerB0y May 2, 2026
ab2ff0d
починил проблему передачи зависимостей
J0shlerB0y May 2, 2026
80ebe2c
добавление title при создании базы
J0shlerB0y May 2, 2026
a771542
реализация IDbCreatorModel для QSCloud и правки
J0shlerB0y May 5, 2026
8229cb5
Создание базы через облако
J0shlerB0y May 6, 2026
3f9ae8e
убрал лишние элементы
J0shlerB0y May 6, 2026
024eeda
настроил клиент создания базы через облако
J0shlerB0y May 11, 2026
0dc4147
сделал адаптер для строго кода и перерабтал под новый интерфейс взаим…
J0shlerB0y May 14, 2026
2611bf3
доработки по ревью
J0shlerB0y Jun 10, 2026
d20c498
Update MySqlDbCreateModel.cs
J0shlerB0y Jun 10, 2026
41ba7a7
доработал легаси UserCreateDbController
J0shlerB0y Jun 11, 2026
c9c4b79
вынес тестовую конфигурацию создания базы
J0shlerB0y Jun 11, 2026
84669e9
вернул комментарий
J0shlerB0y Jun 11, 2026
e8f83e5
Merge branch 'master' into feature/LauncherProviderCreateDb
J0shlerB0y Jun 11, 2026
5f2ee3a
удаление и экспорт базы начало
J0shlerB0y Jun 15, 2026
fb66aef
импорт базы из sql скрипта
J0shlerB0y Jun 15, 2026
4b6d9c8
логика импорта экспорта и удаления с сервера
J0shlerB0y Jun 15, 2026
2119b28
вынесение общей логики в один сервис
J0shlerB0y Jun 17, 2026
f68a2d5
небольшие правки сервисов
J0shlerB0y Jun 18, 2026
4474913
рефакторинг карусели и разделение настроек
J0shlerB0y Jun 18, 2026
64c0ae0
доработки по тестам
J0shlerB0y Jun 19, 2026
9ea6cdb
очистил от зависимостей импорт в настройках
J0shlerB0y Jun 19, 2026
4dc5f97
валидация
J0shlerB0y Jun 19, 2026
96e4bfb
переработка создания через провайдер полностью
J0shlerB0y Jun 27, 2026
6222efb
убрал передачу DI, разделил импорт и создание
J0shlerB0y Jun 29, 2026
ef64885
рефаторинг на новый движок модели создания
J0shlerB0y Jun 29, 2026
ce01f93
почистил прошлый рефакторинг
J0shlerB0y Jun 29, 2026
de674ca
убрал все фабрики моделей наполнения
J0shlerB0y Jul 5, 2026
9aa3b9e
сделал управление пользователем в провайдере
J0shlerB0y Jul 6, 2026
c8430cc
разделение интерфейсов и батч изменений
J0shlerB0y Jul 6, 2026
4530e47
доработал UI редактирования пользователей
J0shlerB0y Jul 6, 2026
e072444
добавил product_id в запрос на изменение юзеров
J0shlerB0y Jul 8, 2026
62387a2
отделение доступа для управления юзерами
J0shlerB0y Jul 9, 2026
7c4869b
починил обработку ошибок
J0shlerB0y Jul 9, 2026
4bcf3aa
оптимизация и отключение таймаута на дамп
J0shlerB0y Jul 9, 2026
66b7d5b
доработал анимацию шестеренки
J0shlerB0y Jul 9, 2026
f8c8db0
ограничение точечной настройки доступа к базе
J0shlerB0y Jul 9, 2026
d2fae6d
обработчик ошибок через AvaloniaInteractiveMessage
J0shlerB0y Jul 11, 2026
5fb30c4
флаг глобального админа
J0shlerB0y Jul 11, 2026
f3ee47e
глобальное добавление в users информации о пользователе
J0shlerB0y Jul 11, 2026
ef7c8b9
прикладные права для свободного
J0shlerB0y Jul 12, 2026
5fbce5a
небольшие поправки
J0shlerB0y Jul 13, 2026
317b48a
обновление только изменёных полей
J0shlerB0y Jul 13, 2026
8a5683e
синхронизация глобальных изменений полей в users
J0shlerB0y Jul 13, 2026
afa0191
разделил а три страницы управлением пользователями
J0shlerB0y Jul 13, 2026
c844eff
доработки управления пользователями
J0shlerB0y Jul 14, 2026
0530ebb
переработка визуала лаунчера
J0shlerB0y Jul 14, 2026
9bcd340
переработка визуала лаунчера
J0shlerB0y Jul 14, 2026
22eef09
Merge branch 'LauncherUserManagementTest' of https://github.com/Quali…
J0shlerB0y Jul 14, 2026
919bea9
Revert "прикладные права для свободного"
J0shlerB0y Jul 14, 2026
62b0f0e
Revert "убрал все фабрики моделей наполнения"
J0shlerB0y Jul 14, 2026
aa482bb
доработал модель наполнения базы
J0shlerB0y Jul 14, 2026
26b9af4
доработки инваритной логики наполнения базы
J0shlerB0y Jul 15, 2026
262cf04
проверка базы при создании и минорные обновления
J0shlerB0y Jul 16, 2026
5abf1a3
доработки перезаписи базы при создании
J0shlerB0y Jul 17, 2026
787c0c9
отдельный класс модели перезаписи
J0shlerB0y Jul 19, 2026
3d84215
более универсальная перезапись на подобии создания
J0shlerB0y Jul 20, 2026
ef4077c
Revert "более универсальная перезапись на подобии создания"
J0shlerB0y Jul 20, 2026
d7709e1
Revert "отдельный класс модели перезаписи"
J0shlerB0y Jul 20, 2026
5552a2f
упростил перезапись и удаление прав при удалении
J0shlerB0y Jul 20, 2026
3806522
удалил синхронизацию глобальных прав с users
J0shlerB0y Jul 20, 2026
9546b38
доработки по тестам
J0shlerB0y Jul 20, 2026
ef0049e
логика работы с базами через QSLauncher
J0shlerB0y Jul 22, 2026
5a9f094
фикс поэтапного обновления
J0shlerB0y Jul 24, 2026
bcf426f
создание, удаление в QSLauncher
J0shlerB0y Jul 24, 2026
b403a0a
переработал обновление на строковый батчинг
J0shlerB0y Jul 24, 2026
13621f5
первые работы с пользователем в QSLauncher
J0shlerB0y Jul 24, 2026
ee96242
вынесение логики и доработка чистоты
J0shlerB0y Jul 26, 2026
98956ea
дописал менеджеры для базы и users QSLauncher
J0shlerB0y Jul 27, 2026
8432e5a
провайдер связывающийся с QSLauncher
J0shlerB0y Jul 28, 2026
eb6474c
вынес ProductCode в конструктор провайдеров
J0shlerB0y Jul 28, 2026
285b69e
добавил недостающие компоненты и доработки
J0shlerB0y Jul 28, 2026
a078ddf
переработал диалог вопроса
J0shlerB0y Jul 30, 2026
b12569c
доработки по лаунчеру
J0shlerB0y Aug 3, 2026
6899096
доработки по лаунчеру с облаком
J0shlerB0y Aug 3, 2026
e26c6b1
вынес логику по обработке доступа в провайдере
J0shlerB0y Aug 3, 2026
3c0a44b
клонирую билдер подключения
J0shlerB0y Aug 3, 2026
c5f4099
перевёл весь productId на byte
J0shlerB0y Aug 3, 2026
359de99
резолв метабазы, 2 хоста в юзера, расширил лок
J0shlerB0y Aug 3, 2026
e1a81bd
чтения из многих баз батчем
J0shlerB0y Aug 3, 2026
595dc90
доработал запрос к параметрам
J0shlerB0y Aug 3, 2026
9476e46
обновил работу с админом на провайдерах
J0shlerB0y Aug 10, 2026
2f14aaa
доработки вьюх и vm
J0shlerB0y Aug 10, 2026
5018513
доработка VM с доступами и локом экрана
J0shlerB0y Aug 17, 2026
f97e864
комментарии к BaseParametersReader
J0shlerB0y Aug 17, 2026
a66b357
комментарии на менеджеры
J0shlerB0y Aug 17, 2026
5c69f6a
вынес Coalesce и доработал обновление name
J0shlerB0y Aug 17, 2026
e662a36
Update QS.DbManagement.csproj
J0shlerB0y Aug 17, 2026
35bac50
обработка ошибок с QS.ErrorReporting
J0shlerB0y Aug 17, 2026
58fc25b
доработка комментариев
J0shlerB0y Aug 20, 2026
fc66055
перенёс и доработал криптографию в библиотеке
J0shlerB0y Aug 20, 2026
5827290
доработал экспортер
J0shlerB0y Aug 20, 2026
4e19e1f
добавил единый источник типов подключения
J0shlerB0y Aug 21, 2026
9ef640e
начало тестов, фикстура базы
J0shlerB0y Aug 21, 2026
00b39be
вынес карточку пользователя
J0shlerB0y Aug 21, 2026
4b0ea2b
вынес доступы для подключения
J0shlerB0y Aug 21, 2026
8e61da1
вынес лаунчер навигатор
J0shlerB0y Aug 21, 2026
d9994f7
убрал AppLaunchService и его последствия
J0shlerB0y Aug 21, 2026
3c1f3d5
убрал ненужные поля, реальная сущность на метабазу
J0shlerB0y Aug 24, 2026
1709392
обновление прав на синхронизацию
J0shlerB0y Aug 24, 2026
774a406
Update Privileges
J0shlerB0y Aug 24, 2026
c56c412
вьюшки для новых галочек
J0shlerB0y Aug 24, 2026
ea6da6f
доработки по синхронизации
J0shlerB0y Aug 25, 2026
d96e2da
доработка
J0shlerB0y Aug 25, 2026
4801540
обработка потоковых ошибок и ошибок в dispatcher
J0shlerB0y Aug 27, 2026
24a1a5c
убрал LauncherColumnMapper
J0shlerB0y Aug 29, 2026
3a5a1a9
launcherUsers единая последовательность и батчинг
J0shlerB0y Aug 29, 2026
60f276c
переработал бул занятости
J0shlerB0y Aug 30, 2026
968438b
удаление productId из пользователя
J0shlerB0y Aug 31, 2026
45d8d80
тесты лаунчера of the following:
J0shlerB0y Aug 31, 2026
632c81a
добавление версии бд в лаунчер
J0shlerB0y Aug 31, 2026
9f44f9a
обновление подключения при сбое
J0shlerB0y Aug 31, 2026
62562b0
тесты на создание базы и разрыв соединения
J0shlerB0y Aug 31, 2026
d09238c
разбор ошибок от облака
J0shlerB0y Aug 31, 2026
49ae453
почистил неиспользуемый код
J0shlerB0y Sep 1, 2026
a5fb7e3
Merge branch 'develop' into feature/LauncherUserManagement
J0shlerB0y Sep 1, 2026
7071471
почистил неиспользуемый код
J0shlerB0y Sep 1, 2026
897f6c0
опциональность конфигурации скриптов
J0shlerB0y Sep 1, 2026
05b8afb
убрал криптографию
J0shlerB0y Sep 1, 2026
464adb5
опциональные ресурсы наполнения
J0shlerB0y Sep 1, 2026
3500298
почистил случайные правки из диффа PR
J0shlerB0y Sep 4, 2026
38b85f1
обновление пароля в заголовках при его смене
J0shlerB0y Sep 4, 2026
b83aeb9
правильное раскрытие ошибок с облака
J0shlerB0y Sep 4, 2026
2f073d4
сообщение об отсутствующем пользователе на сервере
J0shlerB0y Sep 4, 2026
299e0ec
обновление подключения при сменен пароля
J0shlerB0y Sep 4, 2026
fb58adb
фильтр привилегий на весь сервер, а не только базу
J0shlerB0y Sep 4, 2026
bf3a9bd
явная ошибка на отсутствующий порт в подключении
J0shlerB0y Sep 4, 2026
46f3cac
доработки тестов
J0shlerB0y Sep 4, 2026
75b65b3
пометка по навигатору
J0shlerB0y Sep 4, 2026
5bbf0cc
ошибка на не удалённую базу
J0shlerB0y Sep 7, 2026
0c6d9f3
переименовал все DataBase в Database
J0shlerB0y Sep 11, 2026
7e54123
удалил неиспользуемые ответы
J0shlerB0y Sep 11, 2026
e44a316
убрал тест ошибок
J0shlerB0y Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion QS.Cloud.Client/BasicAuthInfoProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@ public BasicAuthInfoProvider(string userName, string password)

public string UserName { get; }

public string Password { get; }
public string Password { get; private set; }

public void UpdatePassword(string newPassword) => Password = newPassword;
}

public interface IBasicAuthInfoProvider
{
string UserName { get; }

string Password { get; }

void UpdatePassword(string newPassword);
}
}
47 changes: 36 additions & 11 deletions QS.Cloud.Client/Clients/Base/CloudClientByBasicAuth.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,44 @@

namespace QS.Cloud.Client
{
public class CloudClientByBasicAuth : CloudClientServiceBase
{
public class CloudClientByBasicAuth : CloudClientServiceBase {
private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

/// <summary>Столько ждём соединения в CanConnect - это проверка доступности, а не сама операция</summary>
private const int ConnectTimeoutSeconds = 5;

private readonly IBasicAuthInfoProvider authInfo;

public CloudClientByBasicAuth(IBasicAuthInfoProvider basicAuthInfoProvider, string serviceAddress, int servicePort)
: base(serviceAddress, servicePort)
{
headers = new Metadata
{ {
"Authorization",
$"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{basicAuthInfoProvider.UserName}:{basicAuthInfoProvider.Password}"))}"
} };

: base(serviceAddress, servicePort) {
authInfo = basicAuthInfoProvider ?? throw new ArgumentNullException(nameof(basicAuthInfoProvider));
headers = BuildHeaders();
}

public override bool CanConnect => throw new NotImplementedException();
private Metadata BuildHeaders() => new Metadata
{ {
"Authorization",
$"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{authInfo.UserName}:{authInfo.Password}"))}"
} };

public virtual void UpdatePassword(string newPassword) {
authInfo.UpdatePassword(newPassword);
headers = BuildHeaders();
}

public override bool CanConnect { get {
try {
Channel.ConnectAsync(DateTime.UtcNow.AddSeconds(ConnectTimeoutSeconds))
.GetAwaiter().GetResult();
return true;
}
catch(Exception ex) {
// Недоступное облако здесь - штатный ответ «нельзя», операцию не валим.
// Но причину молча терять нельзя: без неё непонятно, почему пропали кнопки.
logger.Debug(ex, "Нет соединения с облаком QS");
return false;
}
}
}
}
}
18 changes: 15 additions & 3 deletions QS.Cloud.Client/Clients/Base/CloudClientServiceBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ namespace QS.Cloud.Client
{
public abstract class CloudClientServiceBase : IDisposable
{
private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

private readonly string serviceAddress;
private readonly int servicePort;
private readonly ChannelCredentials credentials;
Expand Down Expand Up @@ -39,10 +41,20 @@ protected Channel Channel

public abstract bool CanConnect { get; }

public virtual async void Dispose()
public virtual void Dispose()
{
if(channel != null)
await channel.ShutdownAsync();
var opened = channel;
channel = null;
if(opened == null)
return;

try {
opened.ShutdownAsync().GetAwaiter().GetResult();
}
catch(Exception ex) {
// исключение из Dispose подменяет собой настоящую причину, по которой закрывались.
logger.Debug(ex, "Не удалось закрыть канал к облаку QS");
}
}
}
}
38 changes: 38 additions & 0 deletions QS.Cloud.Client/Clients/DatabaseManagementCloudClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Grpc.Core;
using QS.Cloud.Core;
using QS.Project.Versioning;
using System.Threading;

namespace QS.Cloud.Client.Clients {
public class DatabaseManagementCloudClient : CloudClientByBasicAuth {
private readonly uint ProductCode;
public DatabaseManagementCloudClient(IBasicAuthInfoProvider basicAuthInfoProvider, uint productCode)
: base(basicAuthInfoProvider, "core.cloud.qsolution.ru", 443)
{
ProductCode = productCode;
}
public virtual ClearDatabaseResponse ClearDatabase(int baseId) {
var client = new DatabaseManagement.DatabaseManagementClient(Channel);
var request = new ClearDatabaseRequest { BaseId = baseId, ProductId = ProductCode };
return client.ClearDatabase(request, headers);
}

public virtual CheckDatabaseExistsResponse CheckDatabaseExists(string dbName) {
var client = new DatabaseManagement.DatabaseManagementClient(Channel);
var request = new CheckDatabaseExistsRequest { Name = dbName, ProductId = ProductCode };
return client.CheckDatabaseExists(request, headers);
}

public virtual CreateDatabaseResponse CreateDatabase(string dbName, string dbTitle) {
var client = new DatabaseManagement.DatabaseManagementClient(Channel);
var request = new CreateDatabaseRequest { Name = dbName, Title = dbTitle, ProductId = ProductCode };
return client.CreateDatabase(request, headers);
}

public virtual DropDatabaseResponse DropDatabase(int baseId) {
var client = new DatabaseManagement.DatabaseManagementClient(Channel);
var request = new DropDatabaseRequest { BaseId = baseId, ProductId = ProductCode };
return client.DropDatabase(request, headers);
}
}
}
8 changes: 4 additions & 4 deletions QS.Cloud.Client/Clients/LoginManagementCloudClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ public class LoginManagementCloudClient : CloudClientByBasicAuth
public LoginManagementCloudClient(IBasicAuthInfoProvider basicAuthInfoProvider)
: base(basicAuthInfoProvider, "core.cloud.qsolution.ru", 443) { }

public StartResponse Start(string launcherVersion) {
public virtual StartResponse Start(string launcherVersion) {
var client = new LoginManagement.LoginManagementClient(Channel);
var request = new StartRequest { LauncherVersion = launcherVersion };
var response = client.Start(request, headers);
return response;
}

public StartSessionResponse StartSession(int baseId)
public virtual StartSessionResponse StartSession(int baseId)
{
var client = new LoginManagement.LoginManagementClient(Channel);

Expand All @@ -29,7 +29,7 @@ public StartSessionResponse StartSession(int baseId)
return response;
}

public List<BaseInfo> GetBasesForUser(uint productId)
public virtual List<BaseInfo> GetBasesForUser(uint productId)
{
var client = new LoginManagement.LoginManagementClient(Channel);
var request = new GetBasesForUserRequest();
Expand All @@ -38,7 +38,7 @@ public List<BaseInfo> GetBasesForUser(uint productId)
return response.Bases.ToList();
}

public ChangePasswordResponse ChangePassword(string newPassword) {
public virtual ChangePasswordResponse ChangePassword(string newPassword) {
var client = new LoginManagement.LoginManagementClient(Channel);
var request = new ChangePasswordRequest { NewPassword = newPassword };
var response = client.ChangePassword(request, headers);
Expand Down
82 changes: 50 additions & 32 deletions QS.Cloud.Client/Clients/UserManagementCloudClient.cs
Original file line number Diff line number Diff line change
@@ -1,63 +1,81 @@
using System.Collections.Generic;
using System.Linq;
using QS.Cloud.Core;

namespace QS.Cloud.Client
{
public class UserManagementCloudClient : CloudClientBySession
public class UserManagementCloudClient : CloudClientByBasicAuth
{
public UserManagementCloudClient(ISessionInfoProvider sessionInfoProvider)
: base(sessionInfoProvider, "core.cloud.qsolution.ru", 443) { }
public UserManagementCloudClient(IBasicAuthInfoProvider basicAuthInfoProvider)
: base(basicAuthInfoProvider, "core.cloud.qsolution.ru", 443) { }


public CreateUserResponse CreateUser(string login, string userName, string email, string password)
public virtual List<UserInfo> GetUsers()
{
var client = new UserManagement.UserManagementClient(Channel);
var response = client.GetUsers(new GetUsersRequest(), headers);
return response.Users.ToList();
}

var request = new CreateUserRequest
{
Login = login, Name = userName, Email = email, Password = password
public virtual CreateUserResponse CreateUser(UserInfo user, string password)
{
var client = new UserManagement.UserManagementClient(Channel);
var request = new CreateUserRequest {
Login = user.Login,
Name = user.Name ?? "",
Email = user.Email ?? "",
Password = password ?? "",
Phone = user.Phone ?? "",
Post = user.Post ?? "",
Comment = user.Comment ?? "",
IsAccountAdmin = user.IsAccountAdmin
};

var response = client.CreateUser(request, headers);

return response;
return client.CreateUser(request, headers);
}

public DeleteUserResponse DeleteUser(string login)
public virtual UpdateUserResponse UpdateUser(UserInfo user, string newPassword)
{
var client = new UserManagement.UserManagementClient(Channel);
var request = new UpdateUserRequest {
Login = user.Login,
Name = user.Name ?? "",
Email = user.Email ?? "",
Phone = user.Phone ?? "",
Post = user.Post ?? "",
Comment = user.Comment ?? "",
Disabled = user.Disabled,
IsAccountAdmin = user.IsAccountAdmin,
NewPassword = newPassword ?? ""
};
return client.UpdateUser(request, headers);
}

public virtual DeleteUserResponse DeleteUser(string login)
{
var client = new UserManagement.UserManagementClient(Channel);
var request = new DeleteUserRequest { User = login };
var response = client.DeleteUser(request, headers);

return response;
return client.DeleteUser(request, headers);
}

// strange, but protobuf has the same signature
public UpdateUserResponse UpdateUser()
public virtual List<BaseAccessInfo> GetUserBaseAccess(string login, uint productId)
{
var client = new UserManagement.UserManagementClient(Channel);

var request = new UpdateUserRequest();
var response = client.UpdateUser(request, headers);

return response;
var request = new GetUserBaseAccessRequest { User = login, ProductId = productId };
var response = client.GetUserBaseAccess(request, headers);
return response.Bases.ToList();
}

public bool ChangeBaseAccess(string user, int baseId, bool grant, bool admin)
public virtual ChangeBaseAccessResponse ChangeBaseAccess(string user, int baseId, bool grant, bool admin, bool readOnly, uint productId)
{
var client = new UserManagement.UserManagementClient(Channel);

var request = new ChangeBaseAccessRequest
{
var request = new ChangeBaseAccessRequest {
User = user,
BaseId = baseId,
Grant = grant,
Admin = admin
Admin = admin,
ReadOnly = readOnly,
ProductId = productId
};

var response = client.ChangeBaseAccess(request);

return response.Success;
return client.ChangeBaseAccess(request, headers);
}
}
}
53 changes: 53 additions & 0 deletions QS.Cloud.Client/Database/CloudDbSession.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using MySqlConnector;
using QS.Cloud.Client.Clients;
using QS.Cloud.Core;

namespace QS.Cloud.Client.Database {
/// <summary>
/// Временное подключение к облачной базе
/// </summary>
public sealed class CloudDbSession : IDisposable {
private readonly AliveCloudClient sessionLife;

public bool Success { get; }
public string Description { get; }
public bool IsAdmin { get; }
public BaseConnection Db { get; }
public MySqlConnectionStringBuilder ConnectionStringBuilder { get; }

private CloudDbSession(StartSessionResponse session, AliveCloudClient sessionLife, MySqlConnectionStringBuilder connectionStringBuilder) {
Success = session.Success;
Description = session.Description;
IsAdmin = session.IsAdmin;
Db = session.Db;
this.sessionLife = sessionLife;
ConnectionStringBuilder = connectionStringBuilder;
}

/// <summary>
/// Открывает сессию к базе. При успехе запускает keep-alive и собирает строку подключения;
/// при отказе возвращает сессию с <see cref="Success"/> = false
/// </summary>
public static CloudDbSession Open(LoginManagementCloudClient loginClient, int baseId) {
var session = loginClient.StartSession(baseId);
if(!session.Success)
return new CloudDbSession(session, null, null);

var sessionLife = new AliveCloudClient(new SessionInfoProvider(session.SessionId));
sessionLife.KeepAlive();

var builder = new MySqlConnectionStringBuilder {
Server = session.Db.Server,
Port = session.Db.Port,
UserID = session.Db.Login,
Password = session.Db.Password,
Database = session.Db.BaseName,
AllowUserVariables = true
};
return new CloudDbSession(session, sessionLife, builder);
}

public void Dispose() => sessionLife?.Dispose();
}
}
Loading