Implement GenerateTokens (POST) in TokensController.cs

This commit is contained in:
Denis-Cosmin Nutiu 2021-06-11 22:30:11 +03:00
parent 0d9a60c869
commit 348e69cd88
3 changed files with 84 additions and 7 deletions

View file

@ -0,0 +1,58 @@
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: Add tokens, list tokens (unused, used), delete tokens.
private readonly IFeedbackReceiverService _feedbackReceiverService;
private readonly ITokensService _tokensService;
public TokensController(IFeedbackReceiverService feedbackReceiverService, ITokensService tokensService)
{
_feedbackReceiverService = feedbackReceiverService;
_tokensService = tokensService;
}
// TODO: Test unit & integrations.
/// <summary>
/// Creates a new batch of tokens, the tokens are tied to a FeedbackReceiver and are used by the client
/// when leaving Feedback.
/// </summary>
/// <param name="generateTokensDto">The list of FeedbackReceivers</param>
/// <returns>A BasicResponse indicating success.</returns>
/// <response code="200">Returns ok.</response>
/// <response code="400">If the items is invalid</response>
[HttpPost]
[ProducesResponseType(typeof(BasicResponse), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> 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."
});
}
}
}

View file

@ -1,11 +1,11 @@
using System.Collections.Generic; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Retroactiune.Models;
namespace Retroactiune.Services namespace Retroactiune.Services
{ {
public interface ITokensService public interface ITokensService
{ {
public Task CreateManyAsync(IEnumerable<Token> items); public Task GenerateTokensAsync(int numberOfTokens, string feedbackReceiverGuid,
DateTime? expiryTime = null);
} }
} }

View file

@ -1,10 +1,10 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using MongoDB.Driver; using MongoDB.Driver;
using Retroactiune.Models; using Retroactiune.Models;
using Retroactiune.Settings; using Retroactiune.Settings;
// TODO: Test
namespace Retroactiune.Services namespace Retroactiune.Services
{ {
public class TokensService : ITokensService public class TokensService : ITokensService
@ -17,9 +17,28 @@ namespace Retroactiune.Services
_collection = database.GetCollection<Token>(settings.TokensCollectionName); _collection = database.GetCollection<Token>(settings.TokensCollectionName);
} }
public async Task CreateManyAsync(IEnumerable<Token> items) public async Task GenerateTokensAsync(int numberOfTokens, string feedbackReceiverGuid,
DateTime? expiryTime = null)
{ {
throw new System.NotImplementedException(); // TODO: Test unit
if (numberOfTokens <= 0)
{
throw new ArgumentException("numberOfTokens must be positive");
}
var token = new List<Token>();
for (var i = 0; i < numberOfTokens; i++)
{
token.Add(new Token
{
CreatedAt = DateTime.UtcNow,
FeedbackReceiverId = feedbackReceiverGuid,
ExpiryTime = null,
TimeUsed = null
});
}
await _collection.InsertManyAsync(token);
} }
} }
} }