[issue #139] client lookup and stats api
This commit is contained in:
66
WebfrontCore/Controllers/API/ClientController.cs
Normal file
66
WebfrontCore/Controllers/API/ClientController.cs
Normal 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 }
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
18
WebfrontCore/Controllers/API/Dtos/FindClientResponse.cs
Normal file
18
WebfrontCore/Controllers/API/Dtos/FindClientResponse.cs
Normal 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; }
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user