src/Services/User/User.API/Controllers/AccountController.cs (79 lines of code) (raw):
// =========================================================================
// Copyright 2020 EPAM Systems, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =========================================================================
using Epam.CovidResistance.Services.User.API.Extensions;
using Epam.CovidResistance.Services.User.API.Interfaces;
using Epam.CovidResistance.Services.User.API.Models;
using Epam.CovidResistance.Services.User.Application.Common.Interfaces;
using Epam.CovidResistance.Services.User.Application.Common.Models;
using Epam.CovidResistance.Shared.Configuration.AspNetCore.Extensions;
using Epam.CovidResistance.Shared.Domain.Model.Errors;
using IdentityServer4.AccessTokenValidation;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Epam.CovidResistance.Services.User.API.Controllers
{
/// <summary>
/// Represents the controller for account endpoints.
/// </summary>
[Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Roles = "User"),
Route("api/v1/[controller]"), ApiController]
public class AccountController : BaseApiController
{
private readonly IIdentityService identityService;
private readonly IUserStateService userStateService;
/// <summary>
/// Initializes a new instance of the <see cref="AccountController"></see> class.
/// </summary>
public AccountController(IIdentityService identityService, IUserStateService userStateService)
{
this.identityService = identityService;
this.userStateService = userStateService;
}
/// <summary>
/// Registers the user.
/// </summary>
/// <param name="registerForm">Parameters for user registration.</param>
/// <param name="cancellationToken">The cancellation token for request.</param>
/// <returns>User access and refresh tokens.</returns>
[AllowAnonymous, HttpPost]
public async Task<IActionResult> Register([FromBody] RegisterRequest registerForm, CancellationToken cancellationToken)
{
if (!ModelState.IsValid)
{
return BadRequest(Result.Failure(ModelState.ToInnerErrors()));
}
(Result createResult, var userToken) = await identityService.CreateUserAsync(registerForm.UserToken,
registerForm.Username,
registerForm.Password);
if (!createResult.Succeeded)
{
return createResult.Status == ResultStatus.Validation
? BadRequest(createResult)
: InternalServerError(createResult);
}
try
{
userStateService.RegisterUser(registerForm.UserToken, registerForm.Username);
}
catch (Exception ex)
{
Result deleteResult = await identityService.DeleteUserAsync(userToken);
return InternalServerError(
Result.Failure(deleteResult.Errors.Append(new InnerError(ErrorTarget.UserStateFailure, ex.Message))));
}
(Result tokenResult, Token tokens) = await identityService.PostRegisterLoginAsync(registerForm.Username,
registerForm.Password,
cancellationToken);
return tokenResult.Succeeded
? Ok(tokens)
: InternalServerError(tokenResult);
}
/// <summary>
/// Nominates the user as medical.
/// </summary>
/// <param name="nominationRequest">Parameters for nominating the user as medical.</param>
[HttpPost("nominateAsMedical")]
public async Task<IActionResult> AddToRole([FromBody] MedicalNominationRequest nominationRequest)
{
if (!ModelState.IsValid)
{
return BadRequest(Result.Failure(ModelState.ToInnerErrors()));
}
Result changeResult =
await identityService.AddToMedicalRoleAsync(User.GetToken(), nominationRequest.HealthSecurityId);
if (changeResult.Status == ResultStatus.Validation)
{
return BadRequest(changeResult);
}
return changeResult.Succeeded
? Ok()
: InternalServerError(changeResult);
}
}
}