using System;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using BlueWest.Data;
using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.EF
{
///
/// Country table database extensions
///
public static class CountryDbExtensions
{
static CountryDbExtensions()
{
}
///
/// Returns Not found projection
///
///
public static (bool, Country) NotFound() => (false, null);
///
/// Returns Error Message projection
///
///
/// (false, message, null)
public static (bool, string, Country) ErrorMessage(string message) => (false, message, null);
///
/// Returns Success intent projection
///
/// Success message
/// Entity object
/// (bool success, Country country)
public static (bool, string, Country) Success(bool success, Country country) => (success, "1", null);
///
/// Updates a country data.
///
/// DbContext.
/// Country data to update.
/// Country Id.
///
public static (bool, Country) UpdateCountry(
this CountryDbContext dbContext,
CountryUpdate countryUpdate,
int countryId)
{
var country = dbContext.Countries.FirstOrDefault(x => x.Id == countryId);
if (country == null) return NotFound();
country.Update(countryUpdate);
dbContext.Countries.Update(country);
var result = dbContext.SaveChanges() >= 0;
return (result, country);
}
///
/// Adds a new Currency to the specified country
///
///
///
///
///
public static (bool, string, Country) AddCurrency( this CountryDbContext dbContext, int countryId, CurrencyCreate currencyCreate)
{
var country = dbContext.Countries.FirstOrDefault(d => d.Id == countryId);
// Check if currency exists
if (country == null) return (false, "Country Not found.", null);
// Creates new currency
var newCurrency = new Currency(currencyCreate);
country.Currencies.Add(newCurrency);
var success = dbContext.SaveChanges() >= 0;
return Success(success, country);
}
///
/// Add Currency with optional duplication checks
///
///
/// Country Id
/// Data to create currency
/// List of expressions
///
public static (bool, string, Country) AddCurrency(
this CountryDbContext dbContext,
int countryId, CurrencyCreate currencyCreate,
Expression>[] duplicationValidations)
{
var country = dbContext.Countries.FirstOrDefault(d => d.Id == countryId);
// Check if currency exists
if (country == null) return (false, $"{nameof(country)} Not found.", null);
// Check if there's currency with the same code
foreach (var duplicationValidation in duplicationValidations)
{
var currencyToGet = dbContext.Currencies.FirstOrDefault(duplicationValidation);
if (currencyToGet != null) return ErrorMessage($"Duplication Validation failed: {nameof(duplicationValidation.Body.ToString)}");
}
// Creates new currency
var newCurrency = new Currency(currencyCreate);
country.Currencies.Add(newCurrency);
var success = dbContext.SaveChanges() >= 0;
return Success(success, country);
}
}
}