using System; using System.Collections.Generic; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Serilog; using Landmark.OLA.Application.DataAccess; using Landmark.OLA.Models.Loan; using Landmark.OLA.Models.Loan.Validators; namespace Landmark.OLA.Application.Controllers { [Route("api/[controller]")] [ApiController] public class BranchConfigController : ControllerBase { private readonly IBranchDataAccess branchStorage; public BranchConfigController( IBranchDataAccess branchDataAccess) { branchStorage = branchDataAccess; } /// /// Use to get the branch configuration /// /// /// Returns a full branch configuration. /// Cookies: None required or set. /// Security: None. /// // GET: api/BranchConfig [HttpGet(Name = "GetBranchConfig")] [ProducesResponseType(typeof(BranchConfig), 200)] [ProducesResponseType(404)] [ProducesResponseType(400)] [ProducesResponseType(500)] public IActionResult Get() { try { BranchConfig config = branchStorage.GetBranchConfig(); return Ok(config); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int) System.Net.HttpStatusCode.InternalServerError); } } /// /// Use to get the branch names configuration /// /// /// Returns a full branch configuration. /// Cookies: None required or set. /// Security: None. /// // GET: api/BranchNameConfig [HttpGet("BranchNameConfig", Name = "GetBranchNameConfig")] [ProducesResponseType(typeof(BranchNameConfig), 200)] [ProducesResponseType(404)] [ProducesResponseType(400)] [ProducesResponseType(500)] public IActionResult GetBranchNameConfig() { try { BranchNameConfig config = branchStorage.GetBranchNameConfig(); return Ok(config); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)System.Net.HttpStatusCode.InternalServerError); } } /// /// Use to save the initial branch config. /// /// /// Returns a saved branch config with id. This call will fail if ANY configs currently exist. /// Cookies: None required or set. /// Security: Requires Azure AD Jwt token and admin role. /// // POST: api/BranchConfig [HttpPost] [ProducesResponseType(typeof(string), 201)] [ProducesResponseType(403)] [ProducesResponseType(typeof(ModelStateDictionary), 400)] [ProducesResponseType(500)] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Admin")] public object Post([FromBody] BranchConfig branchConfig) { try { if (branchConfig != null) { var validator = new BranchConfigValidator(); var validatorResult = validator.Validate(branchConfig); var catchError = ""; if (!validatorResult.IsValid) { foreach (var error in validatorResult.Errors) { catchError += error; ModelState.AddModelError(error.PropertyName, error.ErrorMessage); } return BadRequest(ModelState); } branchConfig.Id = (Guid.NewGuid()).ToString(); branchConfig.Date = DateTime.Now; branchStorage.CreateBranchConfig(branchConfig); HttpContext.Response.StatusCode = 201; return new {id = branchConfig.Id, message = "Successfully saved document"}; } return BadRequest("Branch Config is required."); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int) System.Net.HttpStatusCode.InternalServerError); } } /// /// Use update the branch config /// /// /// Returns a status after attempting to update the branch configuration. /// Cookies: None required or set. /// Security: Must have a valid JWT token retrieved from Azure AD, with ADMIN role. /// // PUT: api/Storage [HttpPut] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(typeof(ModelStateDictionary), 400)] [ProducesResponseType(403)] [ProducesResponseType(500)] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Admin")] public IActionResult Put([FromBody] BranchConfig branchConfig) { try { var validator = new BranchConfigValidator(); var validatorResult = validator.Validate(branchConfig); if (!validatorResult.IsValid) { foreach (var error in validatorResult.Errors) { ModelState.AddModelError(error.PropertyName, error.ErrorMessage); } return BadRequest(ModelState); } var cosmosId = branchConfig?.Id; if (!string.IsNullOrEmpty(cosmosId)) { branchConfig.Date = DateTime.Now; branchStorage.UpdateBranchConfig(branchConfig); return CreatedAtAction(nameof(Put), new {id = branchConfig.Id}, branchConfig); } return BadRequest("Branch config invalid."); } catch (KeyNotFoundException ex) { Log.Error(ex.Message); return NotFound(); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int) System.Net.HttpStatusCode.InternalServerError); } } /// /// Use to get an updated branch names configuration /// /// /// Returns a full branch names configuration after updating it internally. /// Cookies: None required or set. /// Security: None. /// // GET: api/UpdateBranchNameConfig [HttpGet("UpdateBranchNameConfig", Name = "GetUpdateBranchNameConfig")] [ProducesResponseType(typeof(BranchNameConfig), 200)] [ProducesResponseType(404)] [ProducesResponseType(400)] [ProducesResponseType(500)] public IActionResult UpdateBranchNameConfig() { try { branchStorage.UpdateBranchNameConfig(); BranchNameConfig config = branchStorage.GetBranchNameConfig(); return Ok(config); } catch (KeyNotFoundException ex) { Log.Error(ex.Message); return NotFound(); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)System.Net.HttpStatusCode.InternalServerError); } } } }