src/Services/Infection/Infection.WebApi/Controllers/InfectionController.cs (99 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.Infection.WebApi.Entities; using Epam.CovidResistance.Services.Infection.WebApi.Interfaces; using Epam.CovidResistance.Services.Infection.WebApi.Models; using Epam.CovidResistance.Shared.Domain.Model.Errors; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; namespace Epam.CovidResistance.Services.Infection.WebApi.Controllers { /// <summary> /// Provides functionality to Infection Service /// </summary> [Produces("application/json")] [Route("api/v1/[controller]")] [ApiController] public class InfectionController : ControllerBase { private readonly IInfectionService infectionService; private readonly ILogger<InfectionController> logger; /// <summary>Initializes a new instance of the <see cref="InfectionController" /> class.</summary> /// <param name="logger">The logger.</param> /// <param name="infectionService">The infection service.</param> public InfectionController( ILogger<InfectionController> logger, IInfectionService infectionService) { this.logger = logger; this.infectionService = infectionService; } /// <summary>Initiates a status change request.</summary> /// <param name="changeRequest">The change request.</param> /// <returns></returns> /// <remarks>Called when a doctor initiates a status change request.</remarks> [Authorize(Roles = "Medical")] [HttpPost("status/init")] [ProducesResponseType(typeof(ChangeResponse), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Error), StatusCodes.Status403Forbidden)] [ProducesResponseType(typeof(Error), StatusCodes.Status500InternalServerError)] public IActionResult InitStatusChange([FromBody] ChangeRequest changeRequest) { var userToken = User.FindFirst("sub")?.Value; try { OperationResult operationResult = infectionService.InitStatusChange(userToken, changeRequest, out ChangeResponse initResponse); if (operationResult.Succeeded) { logger.LogInformation("Change request is saved"); return new OkObjectResult(initResponse); } logger.LogWarning("Status change request is rejected."); return InternalServerError(new InnerError( operationResult.ErrorTarget ?? ErrorTarget.MedicalCodeNotGenerated, operationResult.ErrorMessage)); } catch (Exception e) { logger.LogError(e, $"Unhandled exception: {e.Message}"); return InternalServerError(new InnerError(ErrorTarget.StatusChangeRequestRejected, "Unhandled exception.")); } } /// <summary>Accepts the status change request.</summary> /// <param name="acceptRequest">The accept request.</param> /// <returns></returns> /// <remarks>Called when the user accepts the status change request.</remarks> [Authorize(Roles = "User")] [HttpPost("status/accept")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Error), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(Error), StatusCodes.Status406NotAcceptable)] [ProducesResponseType(typeof(Error), StatusCodes.Status500InternalServerError)] public async Task<IActionResult> AcceptStatusChange([FromBody] AcceptRequest acceptRequest) { try { var userToken = User.FindFirst("sub")?.Value; OperationResult operationResult = await infectionService.AcceptStatusAsync(userToken, acceptRequest); switch (operationResult.Status) { case StatusCodes.Status200OK: logger.LogInformation("Change request is accepted"); return Ok(); case StatusCodes.Status404NotFound: logger.LogWarning(operationResult.ErrorMessage); return ActionError(operationResult.Status, new InnerError(ErrorTarget.AcceptStatusCodeNotFound, operationResult.ErrorMessage)); case StatusCodes.Status406NotAcceptable: logger.LogWarning(operationResult.ErrorMessage); return ActionError(operationResult.Status, new InnerError(ErrorTarget.AcceptStatusCodeExpired, operationResult.ErrorMessage)); } logger.LogError(operationResult.ErrorMessage); return InternalServerError(new InnerError(ErrorTarget.AcceptStatusFailed, "Unhandled exception.")); } catch (Exception e) { logger.LogError(e, $"Unhandled exception: {e.Message}"); return InternalServerError(new InnerError(ErrorTarget.AcceptStatusRejected, "Unhandled exception.")); } } /// <summary>Actions the error.</summary> /// <param name="statusCode">The status code.</param> /// <param name="error">The error.</param> /// <returns></returns> private IActionResult ActionError(int statusCode, InnerError error) { var errorResponse = new Error(statusCode.ToString()); errorResponse.Errors.Add(error); return StatusCode(statusCode, errorResponse); } /// <summary>The internal server error.</summary> /// <param name="error">The error.</param> /// <returns></returns> private IActionResult InternalServerError(InnerError error) => ActionError(StatusCodes.Status500InternalServerError, error); } }