forked from ddrilling/AsbCloudServer
120 lines
4.2 KiB
C#
120 lines
4.2 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Имитирует разные типы ответа сервера
|
|
/// </summary>
|
|
[Route("api/[controller]")]
|
|
[ApiController]
|
|
public class MockController : ControllerBase
|
|
{
|
|
private readonly IServiceProvider provider;
|
|
|
|
public MockController(IServiceProvider provider)
|
|
{
|
|
this.provider = provider;
|
|
}
|
|
|
|
/// <summary>
|
|
/// имитирует http-400
|
|
/// </summary>
|
|
[HttpGet("400")]
|
|
[ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)]
|
|
public IActionResult Get400([FromQuery, Required]IDictionary<string, string> args)
|
|
{
|
|
var errors = new Dictionary<string, string[]>();
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// имитирует http-403
|
|
/// </summary>
|
|
[HttpGet("403")]
|
|
public IActionResult Get403()
|
|
{
|
|
return Forbid();
|
|
}
|
|
|
|
/// <summary>
|
|
/// имитирует http-401
|
|
/// </summary>
|
|
[HttpGet("401")]
|
|
public IActionResult Get401()
|
|
{
|
|
return Unauthorized();
|
|
}
|
|
|
|
/// <summary>
|
|
/// имитирует http-500
|
|
/// </summary>
|
|
[HttpGet("500")]
|
|
public IActionResult Get500()
|
|
{
|
|
throw new System.Exception("Это тестовое исключение");
|
|
}
|
|
|
|
/// <summary>
|
|
/// имитация отправки SignalR данных
|
|
/// </summary>
|
|
/// <example>
|
|
/// </example>
|
|
/// <param name="hubName">
|
|
/// Поддерживаемые hubЫ: wellInfo, notifications, telemetry, reports
|
|
/// </param>
|
|
/// <param name="methodName">Название вызываемого на клиенте метода. Прим.:"ReceiveDataSaub". Список методов см. в swagger definition signalr</param>
|
|
/// <param name="groupName">Группа пользователей. Прим.: "well_1". Если не задана - все пользователи. Шаблон формирования групп см. описание методов в swagger definition signalr</param>
|
|
/// <param name="body">передаваемая нагрузка. (json)</param>
|
|
/// <param name="token"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("signalr/hubs/{hubName}/{methodName}/{groupName}")]
|
|
[Authorize]
|
|
public async Task<IActionResult> PostAsync(string hubName, string methodName, string? groupName, object body, CancellationToken token)
|
|
{
|
|
IHubClients clients = hubName.ToLower() switch {
|
|
"wellinfo" => provider.GetRequiredService<IHubContext<NotificationHub>>().Clients,
|
|
"notifications" => provider.GetRequiredService<IHubContext<NotificationHub>>().Clients,
|
|
"telemetry" => provider.GetRequiredService<IHubContext<TelemetryHub>>().Clients,
|
|
"reports" => provider.GetRequiredService<IHubContext<ReportsHub>>().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();
|
|
}
|
|
}
|