[issue #139] client lookup and stats api

This commit is contained in:
RaidMax
2020-05-24 21:22:26 -05:00
parent 4457ee5461
commit 30f2f7bf09
32 changed files with 907 additions and 36 deletions

View File

@ -0,0 +1,66 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using SharedLibraryCore.Dtos;
using SharedLibraryCore.Interfaces;
using System;
using System.Linq;
using System.Threading.Tasks;
using WebfrontCore.Controllers.API.Dtos;
namespace WebfrontCore.Controllers.API
{
/// <summary>
/// api controller for client operations
/// </summary>
[ApiController]
[Route("api/client")]
public class ClientController : ControllerBase
{
private readonly IResourceQueryHelper<FindClientRequest, FindClientResult> _clientQueryHelper;
private readonly ILogger _logger;
public ClientController(ILogger logger, IResourceQueryHelper<FindClientRequest, FindClientResult> clientQueryHelper)
{
_logger = logger;
_clientQueryHelper = clientQueryHelper;
}
[HttpGet("find")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> FindAsync([FromQuery]FindClientRequest request)
{
if (!ModelState.IsValid)
{
return BadRequest(new ErrorResponse()
{
Messages = ModelState.Values.SelectMany(_value => _value.Errors.Select(_error => _error.ErrorMessage)).ToArray()
});
}
try
{
var results = await _clientQueryHelper.QueryResource(request);
return Ok(new FindClientResponse
{
TotalFoundClients = results.TotalResultCount,
Clients = results.Results
});
}
catch (Exception e)
{
_logger.WriteWarning($"Failed to retrieve clients with query - {request.ToDebugString()}");
_logger.WriteDebug(e.GetExceptionInfo());
return StatusCode(StatusCodes.Status500InternalServerError, new ErrorResponse()
{
Messages = new[] { e.Message }
});
}
}
}
}

View File

@ -0,0 +1,18 @@
using SharedLibraryCore.Dtos;
using System.Collections.Generic;
namespace WebfrontCore.Controllers.API.Dtos
{
public class FindClientResponse
{
/// <summary>
/// total number of client found matching the query
/// </summary>
public long TotalFoundClients { get; set; }
/// <summary>
/// collection of doun clients
/// </summary>
public IEnumerable<FindClientResult> Clients { get; set; }
}
}

View File

@ -0,0 +1,33 @@
using FluentValidation;
using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Dtos;
namespace WebfrontCore.Controllers.API.Validation
{
/// <summary>
/// validator for FindClientRequest
/// </summary>
public class FindClientRequestValidator : AbstractValidator<FindClientRequest>
{
public FindClientRequestValidator()
{
RuleFor(_request => _request.Name)
.NotEmpty()
.When(_request => string.IsNullOrEmpty(_request.Xuid));
RuleFor(_request => _request.Name)
.MinimumLength(EFAlias.MIN_NAME_LENGTH)
.MaximumLength(EFAlias.MAX_NAME_LENGTH);
RuleFor(_request => _request.Xuid)
.NotEmpty()
.When(_request => string.IsNullOrEmpty(_request.Name));
RuleFor(_request => _request.Count)
.InclusiveBetween(1, 100);
RuleFor(_request => _request.Offset)
.GreaterThanOrEqualTo(0);
}
}
}