< Summary

Information
Class: AppRepository.ApiServices.OzonApi.OzonChatManager
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/OzonApi/OzonChatManager.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 108
Coverable lines: 108
Total lines: 257
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)0%620%
GetChatListAsync()100%210%
GetUnreadOpenChatsAsync()100%210%
GetChatsByStatusAsync()100%210%
GetAllChatsAsync()0%4260%
MarkAsReadAsync()100%210%
GetChatHistoryAsync()100%210%
SendMessageAsync()0%2040%
SendFileAsync()0%2040%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/OzonApi/OzonChatManager.cs

#LineLine coverage
 1using Microsoft.Extensions.Http;
 2using AppRepository.ApiServices.OzonApi.Filters;
 3
 4namespace AppRepository.ApiServices.OzonApi
 5{
 6    /// <summary>
 7    /// Менеджер работы с чатами Ozon Seller API
 8    /// </summary>
 9    public class OzonChatManager
 10    {
 11        private readonly OzonChatHttpClient _chatHttpClient;
 12
 013        public OzonChatManager(
 014            IHttpClientFactory httpClientFactory,
 015            string clientId,
 016            string apiKey)
 17        {
 018            _chatHttpClient = new OzonChatHttpClient(
 019                httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)),
 020                clientId,
 021                apiKey);
 022        }
 23
 24        /// <summary>
 25        /// Получает список чатов по указанным фильтрам
 26        /// </summary>
 27        /// <param name="request">Параметры запроса с фильтрами</param>
 28        /// <returns>Список чатов с информацией о непрочитанных сообщениях</returns>
 29        public async Task<ChatListResponse?> GetChatListAsync(ChatListRequest request)
 30        {
 31            try
 32            {
 033                return await _chatHttpClient.GetChatListAsync(request).ConfigureAwait(false);
 34            }
 035            catch (Exception ex)
 36            {
 37                // Логирование ошибки можно добавить здесь
 038                Console.WriteLine($"Ошибка при получении списка чатов: {ex.Message}");
 039                return null;
 40            }
 041        }
 42
 43        /// <summary>
 44        /// Получает все открытые чаты с непрочитанными сообщениями
 45        /// </summary>
 46        /// <param name="limit">Максимальное количество чатов в ответе (по умолчанию 30, максимум 100)</param>
 47        /// <returns>Список открытых чатов с непрочитанными сообщениями</returns>
 48        public async Task<ChatListResponse?> GetUnreadOpenChatsAsync(int limit = 30)
 49        {
 050            var request = new ChatListRequest
 051            {
 052                Filter = new ChatFilter
 053                {
 054                    ChatStatus = AppRepository.ApiServices.OzonApi.Filters.ChatStatus.Opened,
 055                    UnreadOnly = true
 056                },
 057                Limit = Math.Min(limit, 100)
 058            };
 59
 060            return await GetChatListAsync(request).ConfigureAwait(false);
 061        }
 62
 63        /// <summary>
 64        /// Получает все чаты определенного типа
 65        /// </summary>
 66        /// <param name="chatStatus">Статус чатов для фильтрации</param>
 67        /// <param name="limit">Максимальное количество чатов в ответе</param>
 68        /// <param name="cursor">Указатель для пагинации</param>
 69        /// <returns>Список чатов указанного статуса</returns>
 70        public async Task<ChatListResponse?> GetChatsByStatusAsync(
 71            string chatStatus = AppRepository.ApiServices.OzonApi.Filters.ChatStatus.All,
 72            int limit = 30,
 73            string? cursor = null)
 74        {
 075            var request = new ChatListRequest
 076            {
 077                Filter = new ChatFilter
 078                {
 079                    ChatStatus = chatStatus,
 080                    UnreadOnly = false
 081                },
 082                Limit = Math.Min(limit, 100),
 083                Cursor = cursor
 084            };
 85
 086            return await GetChatListAsync(request).ConfigureAwait(false);
 087        }
 88
 89        /// <summary>
 90        /// Постраничное получение всех чатов
 91        /// </summary>
 92        /// <param name="chatStatus">Статус чатов для фильтрации</param>
 93        /// <param name="unreadOnly">Только чаты с непрочитанными сообщениями</param>
 94        /// <param name="pageSize">Размер страницы (максимум 100)</param>
 95        /// <returns>Список всех чатов по страницам</returns>
 96        public async Task<List<ChatItem>> GetAllChatsAsync(
 97            string chatStatus = AppRepository.ApiServices.OzonApi.Filters.ChatStatus.All,
 98            bool unreadOnly = false,
 99            int pageSize = 100)
 100        {
 0101            var allChats = new List<ChatItem>();
 0102            string? cursor = null;
 0103            bool hasNext = true;
 104
 0105            while (hasNext)
 106            {
 0107                var request = new ChatListRequest
 0108                {
 0109                    Filter = new ChatFilter
 0110                    {
 0111                        ChatStatus = chatStatus,
 0112                        UnreadOnly = unreadOnly
 0113                    },
 0114                    Limit = Math.Min(pageSize, 100),
 0115                    Cursor = cursor
 0116                };
 117
 0118                var response = await GetChatListAsync(request).ConfigureAwait(false);
 119
 0120                if (response?.Chats != null)
 121                {
 0122                    allChats.AddRange(response.Chats);
 0123                    cursor = response.Cursor;
 0124                    hasNext = response.HasNext;
 125                }
 126                else
 127                {
 0128                    hasNext = false;
 129                }
 130            }
 131
 0132            return allChats;
 0133        }
 134
 135        /// <summary>
 136        /// Отмечает сообщения в чате как прочитанные
 137        /// </summary>
 138        /// <param name="chatId">Идентификатор чата</param>
 139        /// <param name="fromMessageId">ID сообщения — будет прочитано это сообщение и все до него</param>
 140        /// <returns>Количество непрочитанных сообщений</returns>
 141        public async Task<ChatReadResponse?> MarkAsReadAsync(string chatId, long? fromMessageId = null)
 142        {
 143            try
 144            {
 0145                var request = new ChatReadRequest
 0146                {
 0147                    ChatId = chatId,
 0148                    FromMessageId = fromMessageId
 0149                };
 150
 0151                return await _chatHttpClient.MarkAsReadAsync(request).ConfigureAwait(false);
 152            }
 0153            catch (Exception ex)
 154            {
 0155                Console.WriteLine($"Ошибка при отметке сообщений как прочитанных: {ex.Message}");
 0156                return null;
 157            }
 0158        }
 159
 160        /// <summary>
 161        /// Получает историю сообщений чата
 162        /// </summary>
 163        /// <param name="chatId">Идентификатор чата</param>
 164        /// <param name="limit">Количество сообщений (по умолчанию 50, макс 1000)</param>
 165        /// <param name="fromMessageId">Идентификатор сообщения, от которого начинать</param>
 166        /// <param name="direction">Направление: Forward (старые→новые) или Backward (новые→старые)</param>
 167        /// <returns>Ответ с сообщениями</returns>
 168        public async Task<ChatHistoryResponse?> GetChatHistoryAsync(
 169            string chatId,
 170            int limit = 50,
 171            long? fromMessageId = null,
 172            string direction = "Backward")
 173        {
 174            try
 175            {
 0176                var request = new ChatHistoryRequest
 0177                {
 0178                    ChatId = chatId,
 0179                    Limit = Math.Min(limit, 1000),
 0180                    Direction = direction,
 0181                    FromMessageId = fromMessageId
 0182                };
 183
 0184                return await _chatHttpClient.GetChatHistoryAsync(request).ConfigureAwait(false);
 185            }
 0186            catch (Exception ex)
 187            {
 0188                Console.WriteLine($"Ошибка при получении истории чата: {ex.Message}");
 0189                return null;
 190            }
 0191        }
 192
 193        /// <summary>
 194        /// Отправляет сообщение в чат
 195        /// </summary>
 196        /// <param name="chatId">Идентификатор чата</param>
 197        /// <param name="text">Текст сообщения (от 1 до 1000 символов)</param>
 198        /// <returns>Результат отправки</returns>
 199        public async Task<ChatSendMessageResponse?> SendMessageAsync(string chatId, string text)
 200        {
 201            try
 202            {
 0203                if (string.IsNullOrWhiteSpace(text) || text.Length > 1000)
 204                {
 0205                    Console.WriteLine("Некорректный текст сообщения");
 0206                    return null;
 207                }
 208
 0209                var request = new ChatSendMessageRequest
 0210                {
 0211                    ChatId = chatId,
 0212                    Text = text
 0213                };
 214
 0215                return await _chatHttpClient.SendMessageAsync(request).ConfigureAwait(false);
 216            }
 0217            catch (Exception ex)
 218            {
 0219                Console.WriteLine($"Ошибка при отправке сообщения: {ex.Message}");
 0220                return null;
 221            }
 0222        }
 223
 224        /// <summary>
 225        /// Отправляет файл в чат
 226        /// </summary>
 227        /// <param name="chatId">Идентификатор чата</param>
 228        /// <param name="base64Content">Файл в виде строки base64</param>
 229        /// <param name="fileName">Название файла с расширением</param>
 230        /// <returns>Результат отправки</returns>
 231        public async Task<ChatSendFileResponse?> SendFileAsync(string chatId, string base64Content, string fileName)
 232        {
 233            try
 234            {
 0235                if (string.IsNullOrWhiteSpace(base64Content) || string.IsNullOrWhiteSpace(fileName))
 236                {
 0237                    Console.WriteLine("Некорректное содержимое файла или имя файла");
 0238                    return null;
 239                }
 240
 0241                var request = new ChatSendFileRequest
 0242                {
 0243                    ChatId = chatId,
 0244                    Base64Content = base64Content,
 0245                    Name = fileName
 0246                };
 247
 0248                return await _chatHttpClient.SendFileAsync(request).ConfigureAwait(false);
 249            }
 0250            catch (Exception ex)
 251            {
 0252                Console.WriteLine($"Ошибка при отправке файла: {ex.Message}");
 0253                return null;
 254            }
 0255        }
 256    }
 257}