Merge pull request 'Поднять dev-стек в Docker (фронт + observability) и починить подключение Telegram' (#24) from t23_dev_stack_telegram into main
ci / build-test (push) Successful in 2m55s
ci / build-test (push) Successful in 2m55s
Reviewed-on: #24
This commit was merged in pull request #24.
This commit is contained in:
@@ -22,6 +22,7 @@ public sealed class TgStatusService(
|
||||
TelegramKeysService keys)
|
||||
{
|
||||
private const string IdlePhase = "idle";
|
||||
private const string ReadyPhase = "ready";
|
||||
|
||||
// Опции JSON KV-значений статуса: camelCase (как пишет ингресс) + терпимость регистра.
|
||||
private static readonly JsonSerializerOptions KvJsonOptions = new()
|
||||
@@ -37,13 +38,19 @@ public sealed class TgStatusService(
|
||||
public async Task<TgStatusDto> GetAsync(CancellationToken ct)
|
||||
{
|
||||
TelegramAccountStatusDto live = await ReadLiveAsync(ct).ConfigureAwait(false);
|
||||
string account = await ReadAccountAsync(ct).ConfigureAwait(false);
|
||||
// «Подключён» для UI = авторизован (phase ready). Транспортный connected сервиса
|
||||
// означает лишь живость соединения и не гарантирует вход — в UI он даёт «зависание».
|
||||
bool authorized = string.Equals(live.Phase, ReadyPhase, StringComparison.Ordinal);
|
||||
// Живой account (имя из Telegram) приоритетнее KV: при QR-входе KV ещё не заполнен.
|
||||
string account = string.IsNullOrEmpty(live.Account)
|
||||
? await ReadAccountAsync(ct).ConfigureAwait(false)
|
||||
: live.Account;
|
||||
int monitored = (await dialogs.ListMonitoredIdsAsync(ct).ConfigureAwait(false)).Count;
|
||||
TgKeysSnapshot snapshot = await keys.GetAsync(ct).ConfigureAwait(false);
|
||||
|
||||
return new TgStatusDto(
|
||||
Phase: live.Phase,
|
||||
Connected: live.Connected,
|
||||
Connected: authorized,
|
||||
Listener: live.Listener,
|
||||
Account: account,
|
||||
Monitored: monitored,
|
||||
|
||||
@@ -67,21 +67,22 @@ public sealed class TgStatusServiceTests
|
||||
/// Готовый аккаунт
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task GetAsync_ReadyGateway_ComposesLiveFieldsWithKvAccountMonitoredAndKeys()
|
||||
public async Task GetAsync_ReadyGateway_PrefersLiveAccountOverKvAndComputesConnected()
|
||||
{
|
||||
(TgStatusService service, TestTelegramStore store, TestSettingsStore settings, TestTelegramGateway gateway, _, TestGlobalSettingsStore globalSettings) = Create();
|
||||
store.Seed(Dialog("d_1", "Канал", "channel", Monitor: true));
|
||||
settings.Preload(SettingsKeys.TgAccount, "\"@realuser\"");
|
||||
PreloadKeys(globalSettings, "123456", "abcdefghijklmnop");
|
||||
// Транспортный Connected=false, но phase ready → UI должен считать аккаунт подключённым.
|
||||
gateway.Status = new TelegramAccountStatusDto(
|
||||
Phase: "ready", Connected: true, Listener: true, Account: "gateway-account", Error: null, QrUrl: null);
|
||||
Phase: "ready", Connected: false, Listener: true, Account: "@liveuser", Error: null, QrUrl: null);
|
||||
|
||||
TgStatusDto status = await service.GetAsync(CancellationToken.None);
|
||||
|
||||
Assert.Equal("ready", status.Phase);
|
||||
Assert.True(status.Connected);
|
||||
Assert.True(status.Connected); // connected = авторизация (phase ready), не транспорт
|
||||
Assert.True(status.Listener);
|
||||
Assert.Equal("@realuser", status.Account); // KV tgAccount перекрывает справочное поле гейта (Ruling 8)
|
||||
Assert.Equal("@liveuser", status.Account); // живой account приоритетнее KV
|
||||
Assert.Equal(1, status.Monitored);
|
||||
Assert.True(status.KeysSet);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user