Skip to content

v1.1.0

Choose a tag to compare

@geekcodev geekcodev released this 28 Aug 10:33
· 12 commits to main since this release
25d0b01

v1.1.0 — Профиль пользователя (аватар), рефакторинг реестра чатов

Новое

  • MaxUserProfileService (src/Services/MaxUserProfileService.php, singleton в контейнере): наполнение
    max_users полноценным профилем — avatar_url, full_avatar_url, name, description — через эндпоинт ядра
    getChatMembers (в апдейтах MAX аватар не приходит; источник истины — участники чата).
    • refresh(int|list<int>): bool — chat_id из активных max_chats; если активного чата нет — false без вызова
      API;
    • upsertFromMember(ChatMember): MaxUser — updateOrCreate по user_id, пишет profile_checked_at;
    • ensureAvatar(MaxUser, ?int $chatId = null): bool — дозаполняет аватар, если пуст; явный chatId работает без
      реестра; при уже заполненном аватаре ничего не вызывает.
    • Группировка userIds по чатам и батчинг по users.profile_batch_size (по умолчанию 50) на вызов getChatMembers.
  • Конфиг users.*: profile_from_active_chats (env MAX_USERS_PROFILE_FROM_ACTIVE_CHATS, default true) — резолв
    chat_id из активных max_chats; profile_batch_size (env MAX_USERS_PROFILE_BATCH_SIZE, default 50) — лимит
    userIds на вызов getChatMembers; profile_check_interval (env MAX_USERS_PROFILE_CHECK_INTERVAL, default 86400 —
    раз в сутки) — периодичность перепроверки профиля в ensureAvatar, сек (0 — обновлять только при пустом аватаре).
  • max_users: колонки phone, email, profile_checked_at (nullable timestamp синхронизации профиля).

Изменение (BC)

  • Реестр чатов переименован: класс BotChat → MaxChat (таблица max_chats), enum
    ChatStatus → MaxChatStatus, слушатель PersistChatListener → PersistMaxChatListener, связь
    MaxUser::chats() → MaxUser::maxChats(). Уже задеплоенным БД нужна отдельная миграция на rename.
  • Публичный контракт конфигурации сохранён: ключи chats.*, env MAX_CHATS_*, Support\Config::chatsModel() не
    менялись. Модели переопределяются через MAX_CHATS_MODEL/MAX_USERS_MODEL.

Затронутые сценарии

  • Профиль с аватаром подтягивается «по требованию»: RefreshDatabase-совместимый вызов refresh()/ensureAvatar()
    из приложения после того, как бот добавлен в чат. Заполнение аватара прямо при апдейтах намеренно НЕ добавлено
    (экономим вызовы API под Rate limit) — основной путь по требованию.

Качество

  • PHP 8.4, PSR-12, PHPStan level max — 0 ошибок.
  • PHPUnit зелёные (166 тестов / 397 assertions); покрытие строк 99.48%, порог ≥ 95%.
  • composer audit — без уязвимостей.