using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Retroactiune.DataTransferObjects;
using Retroactiune.Services;
namespace Retroactiune.Controllers
{
[ApiController]
[Route("api/v1/[controller]")]
public class TokensController : ControllerBase
{
// TODO: list tokens (unused, used)
private readonly IFeedbackReceiverService _feedbackReceiverService;
private readonly ITokensService _tokensService;
public TokensController(IFeedbackReceiverService feedbackReceiverService, ITokensService tokensService)
{
_feedbackReceiverService = feedbackReceiverService;
_tokensService = tokensService;
}
///
/// Creates a new batch of tokens, the tokens are tied to a FeedbackReceiver and are used by the client
/// when leaving Feedback.
///
/// The list of FeedbackReceivers
/// A BasicResponse indicating success.
/// Returns ok.
/// If the items is invalid
[HttpPost]
[ProducesResponseType(typeof(BasicResponse), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task GenerateTokens([Required] GenerateTokensDto generateTokensDto)
{
var feedbackReceiverId = generateTokensDto.FeedbackReceiverId;
var result = await _feedbackReceiverService.FindAsync(
new[] {feedbackReceiverId});
if (!result.Any())
{
return BadRequest(new BasicResponse
{
Message = $"Invalid FeedbackReceiverId {generateTokensDto.FeedbackReceiverId}."
});
}
await _tokensService.GenerateTokensAsync(generateTokensDto.NumberOfTokens, feedbackReceiverId,
generateTokensDto.ExpiryTime);
return Ok(new BasicResponse
{
Message = "Tokens generated."
});
}
///
/// Deletes tokens identified by ids.
///
/// A list of token ids.
/// The request to delete the items has been submitted.
/// The request is invalid.
///
[HttpDelete]
[ProducesResponseType(typeof(NoContentResult), StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(BasicResponse),StatusCodes.Status400BadRequest)]
public async Task DeleteTokens([Required] IEnumerable tokenIds)
{
// TODO: Unit test, integration test.
try
{
await _tokensService.DeleteTokens(tokenIds);
return NoContent();
}
catch (GenericServiceException e)
{
return BadRequest(new BasicResponse
{
Message = e.Message
});
}
}
///
/// Deletes a Token given it's guid.
///
/// The guid of the item to be deleted.
/// A NoContent result.
/// The delete is submitted.
/// The request is invalid.
[HttpDelete("{guid}")]
[ProducesResponseType(typeof(NoContentResult), StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task DeleteToken(
[StringLength(24, ErrorMessage = "invalid guid, must be 24 characters", MinimumLength = 24)] string guid)
{
// TODO: Unit test, integration test.
await _tokensService.DeleteTokens(new []{ guid });
return NoContent();
}
}
}