using System; using System.Net; using System.Collections.Generic; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Serilog; using Landmark.OLA.Application.Common.Domain; using Landmark.OLA.Application.DataAccess; namespace Landmark.OLA.Application.Controllers { [Route("api/[controller]")] [ApiController] public class UiSettingsController : ControllerBase { private readonly UiSettings _uiSettings; private readonly IBranchDataAccess _branchStorage; private readonly IConfigurationAccess _configurationAccess; public UiSettingsController(UiSettings uiSettings, IBranchDataAccess branchDataAccess, IConfigurationAccess configurationAccess) { _uiSettings = uiSettings; _branchStorage = branchDataAccess; _configurationAccess = configurationAccess; } /// /// Use to retrieve UI Settings /// /// /// Returns the UI Settings; with the dynamic branch mappings injected. /// Cookies: None required or set. /// Security: None required or provided. /// // GET: api/Content/ [HttpGet] [ProducesResponseType(typeof(UiSettings), 200)] [ProducesResponseType(500)] public IActionResult Get() { try { var settings = _uiSettings; settings.BranchMapping = _branchStorage.GetBranchConfig(); settings.BranchNameMapping = _branchStorage.GetBranchNameConfig(); settings.Configuration = _configurationAccess.GetStoredSettings(); return Ok(settings); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)HttpStatusCode.InternalServerError); } } /// /// Use to get stored config (run-time changeable) /// /// /// Returns the current StoredConfig /// Cookies: None required or set. /// Security: Requires Azure AD token and Admin role. /// // GET: api/UiSettings/StoredSettings [HttpGet("StoredSettings", Name = "GetStoredSettings")] [ProducesResponseType(typeof(StoredSettings), 200)] [ProducesResponseType(500)] //[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Admin")] public IActionResult GetStoredSettings() { try { var config = _configurationAccess.GetStoredSettings(); return Ok(config); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)HttpStatusCode.InternalServerError); } } /// /// Use to save the initial storedConfig. /// /// /// Returns a saved configuration 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/UiSettings/StoredSettings [HttpPost("StoredSettings", Name = "CreateStoredSettings")] [ProducesResponseType(typeof(string), 201)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary), 400)] [ProducesResponseType(500)] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Admin")] public object CreateStoredSettings([FromBody] StoredSettings config) { try { if (config != null) { config.Id = (Guid.NewGuid()).ToString(); config.LastUpdated = DateTime.Now; _configurationAccess.CreateStoredSettings(config); HttpContext.Response.StatusCode = 201; return new { id = config.Id, message = "Successfully saved configuration" }; } return BadRequest("StoredConfig is required."); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)HttpStatusCode.InternalServerError); } } /// /// Use update the StoredConfig /// /// /// Returns a status after attempting to update the StoredConfig. /// Cookies: None required or set. /// Security: Must have a valid JWT token retrieved from Azure AD, with ADMIN role. /// // PUT: api/UiSettings/StoredSettings [HttpPut("StoredSettings", Name = "UpdateStoredSettings")] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(typeof(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary), 400)] [ProducesResponseType(403)] [ProducesResponseType(500)] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Admin")] public IActionResult UpdateStoredSettings([FromBody] StoredSettings config) { try { var cosmosId = config?.Id; if (!String.IsNullOrEmpty(cosmosId)) { config.LastUpdated = DateTime.Now; _configurationAccess.UpdateStoredSettings(config); return CreatedAtAction(nameof(UpdateStoredSettings), new { id = config.Id }, config); } return BadRequest("StoredSettings invalid."); } catch (KeyNotFoundException ex) { Log.Error(ex.Message); return NotFound(); } catch (Exception e) { Log.Error(e.Message); return StatusCode((int)HttpStatusCode.InternalServerError); } } } }