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
}
}