using AsbCloudApp.Exceptions; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers; /// /// Имитирует разные типы ответа сервера /// [Route("api/[controller]")] [ApiController] public class MockController : ControllerBase { private readonly IServiceProvider provider; public MockController(IServiceProvider provider) { this.provider = provider; } /// /// имитирует http-400 /// [HttpGet("400")] [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] public IActionResult Get400([FromQuery, Required]IDictionary args) { var errors = new Dictionary(); foreach (var arg in args) { var countOfErrors = ((arg.Key + arg.Value).Length % 3) + 1; var errorsText = Enumerable.Range(0, countOfErrors) .Select(i => $"{arg.Value} не соответствует критериям проверки № {i}"); errors.Add(arg.Key, errorsText.ToArray()); } if (errors.Any()) { var problem = new ValidationProblemDetails(errors); return BadRequest(problem); } else { var problem = new ValidationProblemDetails { Detail = "at least one argument must be provided" }; return BadRequest(problem); } } /// /// имитирует http-403 /// [HttpGet("403")] public IActionResult Get403() { return Forbid(); } /// /// имитирует http-401 /// [HttpGet("401")] public IActionResult Get401() { return Unauthorized(); } /// /// имитирует http-500 /// [HttpGet("500")] public IActionResult Get500() { throw new System.Exception("Это тестовое исключение"); } /// /// имитация отправки SignalR данных /// /// /// /// /// Поддерживаемые hubЫ: wellInfo, notifications, telemetry, reports /// /// Название вызываемого на клиенте метода. Прим.:"ReceiveDataSaub". Список методов см. в swagger definition signalr /// Группа пользователей. Прим.: "well_1". Если не задана - все пользователи. Шаблон формирования групп см. описание методов в swagger definition signalr /// передаваемая нагрузка. (json) /// /// [HttpPost("signalr/hubs/{hubName}/{methodName}/{groupName}")] [Authorize] public async Task PostAsync(string hubName, string methodName, string? groupName, object body, CancellationToken token) { IHubClients clients = hubName.ToLower() switch { "wellinfo" => provider.GetRequiredService>().Clients, "notifications" => provider.GetRequiredService>().Clients, "telemetry" => provider.GetRequiredService>().Clients, "reports" => provider.GetRequiredService>().Clients, _ => throw new ArgumentInvalidException(nameof(hubName), "hubName does not listed"), }; IClientProxy selectedClients = string.IsNullOrEmpty(groupName) ? clients.All : clients.Group(groupName); await selectedClients.SendAsync(methodName, body, token); return Ok(); } }