using System; using System.Linq; using System.Linq.Expressions; using BlueWest.Data; using BlueWest.WebApi.EF; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace BlueWest.WebApi.Controllers { /// /// The controller responsible to fetch currency data /// [ApiController] [Route("[controller]")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)] [Authorize(Roles = "Administrator")] public partial class CurrencyController : ControllerBase { #region Initialization private readonly CountryDbContext _dbContext; /// /// Api Controller for Currency data /// /// public CurrencyController(CountryDbContext dbContext) { _dbContext = dbContext; } #endregion #region GetCurrencies /// /// Gets the currency data from currency table /// /// [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpGet] public ActionResult GetCurrencies(int skip = 0, int take = 50, int orderDir = 1) { var (success, result) = _dbContext.GetCurrencies(skip, take, orderDir); if (success) { return Ok(result); } return new NotFoundResult(); } #endregion #region GetCurrencyById /// /// Gets a currency by the currency number (id) /// /// The id of the currency to get /// [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpGet("{currencyId}", Name = nameof(GetCurrencyById))] public ActionResult GetCurrencyById(int currencyId) { var (success, result) = _dbContext.GetOneCurrencyById(currencyId); if (success) { return Ok(result); } return new NotFoundResult(); } #endregion #region GetCurrencyWithCode /// /// Gets a currency by code. /// /// The currency Code /// [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpGet("{currencyCode}", Name = nameof(GetCurrencyWithCode))] public ActionResult GetCurrencyWithCode(string currencyCode) { var (success, currency) = _dbContext.GetCurrencyWith(x => x.Code == currencyCode); if (success) { return Ok(currency); } return new NotFoundResult(); } #endregion #region AddCurrency /// /// Add Currency to the table of currencies /// /// Currency data to create /// [ProducesResponseType(StatusCodes.Status201Created)] [HttpPost] public ActionResult AddCurrency(CurrencyCreate currencyToCreate) { var (success, newCurrency) = _dbContext.AddCurrency(currencyToCreate); if (!success) { return new NotFoundResult(); } return CreatedAtRoute(nameof(GetCurrencyById), new { CurrencyId = newCurrency.Code }, newCurrency); } #endregion #region UpdateCurrency /// /// Update a currency data from the Currency table in the database /// /// The currency number we want to update /// Currency Data to update /// [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [HttpPut("{currencyNumber}")] public ActionResult UpdateCurrency(int currencyNumber, CurrencyUpdate currencyToUpdate) { var (success, currency) = _dbContext.UpdateCurrency(currencyToUpdate, currencyNumber); if (success) { return Ok(currency); } return new NotFoundResult(); } #endregion #region GetCountryFromCurrency /// /// Gets a specific country id in a country /// /// The id of the currency /// The id of the country /// /* * [GetOneFrom(nameof(Currency.Id), nameof(Country.Id), typeof(CountryUnique))] */ [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpGet("{currencyId}/countries/{countryId}", Name = nameof(GetCountryFromCurrency))] public ActionResult GetCountryFromCurrency(int currencyId, int countryId) { var (success, country) = _dbContext.GetCountryFromCurrency(currencyId, countryId); if (success) { return Ok(country); } return new NotFoundResult(); } #endregion #region AddCountry /// /// Add Currency to the table of currencies /// /// /// [ProducesResponseType(StatusCodes.Status201Created)] [HttpPost("{currencyId}/countries")] public ActionResult AddCountry(CountryCreate countryToCreate) { var (success, result) = _dbContext.AddCountry(countryToCreate); if (success) { return Ok(result); } return new BadRequestResult(); } #endregion } }