Supporting 'friendly constructors'

This commit is contained in:
CodeLiturgy 2022-08-21 22:14:50 +01:00
parent b13a5ac392
commit 0d410211c8
56 changed files with 554 additions and 142 deletions

View File

@ -20,9 +20,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BlueWest.Data\BlueWest.Data.csproj" /> <ProjectReference Include="..\BlueWest.Data.Capital\BlueWest.Data.Capital.csproj" />
<ProjectReference Include="..\BlueWest\BlueWest.csproj" /> <ProjectReference Include="..\BlueWest\BlueWest.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Repositories" />
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,36 @@
using BlueWest.Data;
using BlueWest.WebApi.EF.Model;
using MapTo;
using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.EF
{
internal sealed class CompanyDbContext : DbContext
{
public DbSet<Company> Companies { get; set; }
public DbSet<Industry> Industries { get; set; }
public DbSet<Product> Products { get; set; }
/// <summary>
/// Options to be injected in the app
/// </summary>
/// <param name="options"></param>
public CompanyDbContext(DbContextOptions<CompanyDbContext> options) : base(options)
{
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureCurrentDbModel();
}
}
}

View File

@ -1,15 +1,15 @@
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL.Model; using BlueWest.WebApi.EF.Model;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace BlueWest.WebApi.MySQL namespace BlueWest.WebApi.EF
{ {
/// <summary> /// <summary>
/// Countries and Currencies /// Countries and Currencies
/// </summary> /// </summary>
public sealed class CountryDbContext : DbContext internal sealed class CountryDbContext : DbContext
{ {
public DbSet<Country> Countries { get; set; } public DbSet<Country> Countries { get; set; }
@ -26,7 +26,6 @@ namespace BlueWest.WebApi.MySQL
public CountryDbContext(DbContextOptions<CountryDbContext> options) : base(options) public CountryDbContext(DbContextOptions<CountryDbContext> options) : base(options)
{ {
Database.EnsureCreated(); Database.EnsureCreated();
} }
/// <summary> /// <summary>
@ -39,5 +38,6 @@ namespace BlueWest.WebApi.MySQL
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureCurrentDbModel(); modelBuilder.ConfigureCurrentDbModel();
} }
} }
} }

View File

@ -1,7 +1,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using BlueWest.Tools; using BlueWest.Tools;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
namespace BlueWest.WebApi.Interfaces namespace BlueWest.WebApi.Interfaces
{ {
@ -10,7 +10,7 @@ namespace BlueWest.WebApi.Interfaces
/// Interface for getting and storing exchange rates data /// Interface for getting and storing exchange rates data
/// </summary> /// </summary>
/// ///
public sealed class ExchangeInterface : EventListener<ExchangeEvent>, IDisposable, IAsyncDisposable internal sealed class ExchangeInterface : EventListener<ExchangeEvent>, IDisposable, IAsyncDisposable
{ {
private readonly EventManager _eventManager; private readonly EventManager _eventManager;
private readonly CountryDbContext _countryDbContext; private readonly CountryDbContext _countryDbContext;

View File

@ -0,0 +1,61 @@
using System.Linq;
using System.Threading.Tasks;
using BlueWest.Data;
using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.EF
{
internal static class CountryDbExtensions
{
internal static Country GetCountryById(this DbSet<Country> countries, int countryId) => countries.GetOne(x => x.Id == countryId);
internal static (bool, T) NotFound<T>() where T : class => (false, null);
internal static (bool, Country) AddCountry (this CountryDbContext dbContext, CountryCreate countryCreate)
{
Country newCountry = new Country(countryCreate);
return dbContext.Countries.Add(dbContext, newCountry);
}
internal static async Task<(bool, Country)> AddCountryAsync (this CountryDbContext dbContext, CountryCreate countryCreate)
{
var newCountry = new Country(countryCreate);
return await dbContext.Countries.AddAsync(dbContext, newCountry);
}
internal static (bool, Country) UpdateCountry(this CountryDbContext dbContext, CountryUpdate countryUpdate,
int countryId)
{
var country = dbContext.Countries.FirstOrDefault(x => x.Id == countryId);
if (country != null)
{
var updatedCountry = new Country(countryUpdate);
return dbContext.Countries.Update(dbContext, updatedCountry);
}
return NotFound<Country>();
}
internal static async Task<Country> GetCountryByIdAsync(this DbSet<Country> countries, int countryId) =>
await countries.FirstOrDefaultAsync(x => x.Id == countryId);
internal static async Task<(bool, Country)> UpdateCountryAsync(this CountryDbContext dbContext, CountryUpdate countryUpdate,
int countryCode)
{
var country = await dbContext.Countries.FirstOrDefaultAsync(x => x.Code == countryCode);
if (country != null)
{
var updatedCountry = new Country(countryUpdate);
return await dbContext.Countries.UpdateAsync(dbContext, updatedCountry);
}
return NotFound<Country>();
}
}
}

View File

@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Linq;
using BlueWest.Data;
using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.EF
{
internal static class CurrencyExtensions
{
internal static Currency GetCurrencyById(this DbSet<Currency> currencies, int currencyId) => currencies.GetOne(x => x.Id == currencyId);
internal static (bool, T) NotFound<T>() where T : class => (false, null);
internal static (bool, Currency) AddCurrency(this CountryDbContext dbContext, CurrencyCreate currencyToCreate)
{
var newCurrency = new Currency(currencyToCreate);
return dbContext.Currencies.Add(dbContext, newCurrency);
}
internal static (bool, Currency) UpdateCurrency(this CountryDbContext dbContext, int currencyId, CurrencyUpdate currencyToUpdate)
{
var currency = dbContext.Currencies.FirstOrDefault(x => x.Id == currencyId);
if (currency == null) return NotFound<Currency>();
var newCurrency = new Currency(currencyToUpdate);
var operationResult = dbContext.Currencies.Update(dbContext, newCurrency);
return operationResult;
}
}
}

View File

@ -0,0 +1,14 @@
using System;
namespace BlueWest.WebApi.EF
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class DatabaseFundamentalsAttribute : Attribute
{
public Type DatabaseContextType;
public Type EntityType;
public DatabaseFundamentalsAttribute(Type databaseContextType, Type entityType) { }
}
}

View File

@ -0,0 +1,51 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using BlueWest.Data;
using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.EF;
public static class GenericExtensions
{
internal static T GetOne<T>(this DbSet<T> dbSet, Expression<Func<T,bool>> predicate) where T: class => dbSet.FirstOrDefault(predicate);
internal static async Task<T> GetOneAsync<T>(this DbSet<T> dbSet, Expression<Func<T,bool>> predicate) where T: class => await dbSet.FirstOrDefaultAsync(predicate);
internal static (bool, T) NotFound<T>() where T : class => (false, null);
internal static (bool, T) Add<T>(this DbSet<T> dbSet, DbContext dbContext, T objectToAdd) where T: class
{
var newEntity = dbSet.Add(objectToAdd).Entity;
return (dbContext.SaveChanges() >= 0, newEntity);
}
internal static async Task<(bool, T)> AddAsync<T>(this DbSet<T> dbSet, DbContext dbContext, T objectToAdd) where T: class
{
var newEntity = dbSet.Add(objectToAdd);
bool resultOperation = await dbContext.SaveChangesAsync() >= 0;
return (resultOperation, objectToAdd);
}
internal static (bool, T) Update<T>(this DbSet<T> dbSet, DbContext dbContext, T objectToUpdate) where T: class
{
dbContext.Update(objectToUpdate);
var resultOperation = dbContext.SaveChanges() >= 0;
return resultOperation ? (true, objectToUpdate) : (false, null);
}
internal static async Task<(bool, T)> UpdateAsync<T>(this DbSet<T> dbSet, DbContext dbContext, T objectToUpdate) where T: class
{
dbSet.Update(objectToUpdate);
var result = await dbContext.SaveChangesAsync() >= 0;
return (result, objectToUpdate);
}
}

View File

@ -1,23 +1,25 @@
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL.Model; using BlueWest.WebApi.EF.Model;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.MySQL namespace BlueWest.WebApi.EF
{ {
/// <summary> /// <summary>
/// Finance operations table /// Finance operations table
/// </summary> /// </summary>
public sealed class FinanceDbContext : DbContext internal sealed class FinanceDbContext : DbContext
{ {
public DbSet<FinanceOp> Transactions { get; set; } [DatabaseFundamentals(typeof(FinanceDbContext), typeof(FinanceOp))]
internal DbSet<FinanceOp> Transactions { get; set; }
public DbSet<FinanceOpType> TransactionTypes { get; set; } [DatabaseFundamentals(typeof(FinanceDbContext), typeof(FinanceOpType))]
internal DbSet<FinanceOpType> TransactionTypes { get; set; }
/// <summary> /// <summary>
/// Finance transactions context /// Finance transactions context
/// </summary> /// </summary>
/// <param name="options"></param> /// <param name="options"></param>
public FinanceDbContext(DbContextOptions<FinanceDbContext> options) : base(options) internal FinanceDbContext(DbContextOptions<FinanceDbContext> options) : base(options)
{ {
Database.EnsureCreated(); Database.EnsureCreated();
} }

View File

@ -1,24 +1,21 @@
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL.Model; using BlueWest.WebApi.EF.Model;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace BlueWest.WebApi.MySQL namespace BlueWest.WebApi.EF
{ {
public sealed class UserDbContext : DbContext internal sealed class UserDbContext : DbContext
{ {
public DbSet<User> Users { get; set; } internal DbSet<User> Users { get; set; }
internal IConfiguration Configuration;
public IConfiguration Configuration;
/// <summary> /// <summary>
/// Database for the context of database users /// Database for the context of database users
/// </summary> /// </summary>
/// <param name="options"></param> /// <param name="options"></param>
public UserDbContext(DbContextOptions<UserDbContext> options) : base(options) internal UserDbContext(DbContextOptions<UserDbContext> options) : base(options)
{ {
Database.EnsureCreated(); Database.EnsureCreated();
} }

View File

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -12,7 +12,7 @@ namespace BlueWest.WebApi.Controllers
/// </summary> /// </summary>
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class CountryController : ControllerBase internal class CountryController : ControllerBase
{ {
private readonly CountryDbContext _dbContext; private readonly CountryDbContext _dbContext;
@ -50,10 +50,8 @@ namespace BlueWest.WebApi.Controllers
[HttpPost] [HttpPost]
public ActionResult AddCountry(CountryCreate countryToCreate) public ActionResult AddCountry(CountryCreate countryToCreate)
{ {
var newCountry = countryToCreate.ToCountry(); _dbContext.AddCountry(countryToCreate);
_dbContext.Countries.Add(newCountry); return CreatedAtRoute(nameof(GetCountryById), new {countryId = countryToCreate.Code});
_dbContext.SaveChanges();
return CreatedAtRoute(nameof(GetCountryById), new {countryId = newCountry.Code}, newCountry);
} }
/// <summary> /// <summary>
@ -67,13 +65,11 @@ namespace BlueWest.WebApi.Controllers
[HttpPut("{countryCode}")] [HttpPut("{countryCode}")]
public ActionResult UpdateCountry(int countryCode, CountryUpdate countryToUpdate) public ActionResult UpdateCountry(int countryCode, CountryUpdate countryToUpdate)
{ {
var country = _dbContext.Countries.FirstOrDefault(x => x.Code == countryCode); var (success, country) = _dbContext.UpdateCountry(countryToUpdate, countryCode);
if (country != null) if (success)
{ {
var updatedCountry = new Country(countryToUpdate, countryCode, country.Currencies, country.Users); return Ok(country);
_dbContext.Countries.Update(updatedCountry);
return Ok(updatedCountry);
} }
return new NotFoundResult(); return new NotFoundResult();

View File

@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -13,11 +13,10 @@ namespace BlueWest.WebApi.Controllers
/// </summary> /// </summary>
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class CurrencyController : ControllerBase internal class CurrencyController : ControllerBase
{ {
private readonly CountryDbContext _dbContext; private readonly CountryDbContext _dbContext;
public CurrencyController(CountryDbContext dbContext) public CurrencyController(CountryDbContext dbContext)
{ {
_dbContext = dbContext; _dbContext = dbContext;
@ -32,14 +31,8 @@ namespace BlueWest.WebApi.Controllers
[HttpGet] [HttpGet]
public ActionResult GetCurrencies() public ActionResult GetCurrencies()
{ {
var dbContext = _dbContext.Currencies; var currencies = _dbContext.Currencies.ToArray();
return Ok(currencies);
if (dbContext != null)
{
return Ok(dbContext.ToArray());
}
return new NotFoundResult();
} }
/// <summary> /// <summary>
@ -53,9 +46,13 @@ namespace BlueWest.WebApi.Controllers
public ActionResult AddCurrency(CurrencyCreate currencyToCreate) public ActionResult AddCurrency(CurrencyCreate currencyToCreate)
{ {
var newCurrency = currencyToCreate.ToCurrency(); var (success, newCurrency) = _dbContext.AddCurrency(currencyToCreate);
_dbContext.Currencies.Add(newCurrency);
_dbContext.SaveChanges(); if (!success)
{
return new NotFoundResult();
}
return CreatedAtRoute(nameof(GetCurrencyById), new {CurrencyId = newCurrency.Code}, newCurrency); return CreatedAtRoute(nameof(GetCurrencyById), new {CurrencyId = newCurrency.Code}, newCurrency);
} }
@ -70,14 +67,11 @@ namespace BlueWest.WebApi.Controllers
[HttpPut("{currencyNumber}")] [HttpPut("{currencyNumber}")]
public ActionResult UpdateCurrency(int currencyNumber, CurrencyUpdate currencyToUpdate) public ActionResult UpdateCurrency(int currencyNumber, CurrencyUpdate currencyToUpdate)
{ {
var currency = _dbContext.Currencies.FirstOrDefault(x => x.Num == currencyNumber); var (success, currency) = _dbContext.UpdateCurrency(currencyNumber, currencyToUpdate);
if (currency != null) if (success)
{ {
var updatedCurrency = new Currency(currencyToUpdate, currencyNumber, new List<Country>()); return Ok(currency);
_dbContext.Update(updatedCurrency);
_dbContext.SaveChanges();
return Ok(updatedCurrency);
} }
return new NotFoundResult(); return new NotFoundResult();
@ -94,11 +88,11 @@ namespace BlueWest.WebApi.Controllers
[HttpGet("{currencyId}", Name = nameof(GetCurrencyById))] [HttpGet("{currencyId}", Name = nameof(GetCurrencyById))]
public ActionResult GetCurrencyById(int currencyId) public ActionResult GetCurrencyById(int currencyId)
{ {
var array = _dbContext.Countries.FirstOrDefault(x => x.Code == currencyId); var currency = _dbContext.Currencies.GetCurrencyById(currencyId);
if (array != null) if (currency != null)
{ {
return Ok(array); return Ok(currency);
} }
return new NotFoundResult(); return new NotFoundResult();

View File

@ -1,6 +1,6 @@
using System; using System;
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -11,7 +11,7 @@ namespace BlueWest.WebApi.Controllers;
/// </summary> /// </summary>
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class FinanceController : ControllerBase internal class FinanceController : ControllerBase
{ {
private readonly FinanceDbContext _dbContext; private readonly FinanceDbContext _dbContext;

View File

@ -6,7 +6,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
namespace BlueWest.WebApi.Tools namespace BlueWest.WebApi.Tools
{ {
public class SwaggerEnumSchemaFilter : ISchemaFilter internal class SwaggerEnumSchemaFilter : ISchemaFilter
{ {
public void Apply(OpenApiSchema model, SchemaFilterContext context) public void Apply(OpenApiSchema model, SchemaFilterContext context)
{ {

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using BlueWest.Data; using BlueWest.Data;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -11,7 +11,7 @@ namespace BlueWest.WebApi.Controllers
{ {
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class UserController : ControllerBase internal class UserController : ControllerBase
{ {
private readonly UserDbContext _dbContext; private readonly UserDbContext _dbContext;
@ -70,7 +70,7 @@ namespace BlueWest.WebApi.Controllers
[HttpPost] [HttpPost]
public ActionResult AddUser(UserCreate userCreate) public ActionResult AddUser(UserCreate userCreate)
{ {
var user = new User(userCreate, 0, new List<FinanceOp>(), null, -1); var user = new User(userCreate);
_dbContext.Users.Add(user); _dbContext.Users.Add(user);
_dbContext.SaveChanges(); _dbContext.SaveChanges();
return CreatedAtRoute(nameof(GetUserById), new {userId = user.Id}, user); return CreatedAtRoute(nameof(GetUserById), new {userId = user.Id}, user);

View File

@ -1,13 +1,15 @@
using BlueWest.Data; using BlueWest.Data;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace BlueWest.WebApi.MySQL.Model namespace BlueWest.WebApi.EF.Model
{ {
/// <summary> /// <summary>
/// Database model configuration extensions /// Database model configuration extensions
/// </summary> /// </summary>
public static class ModelBuilderExtensions public static class ModelBuilderExtensions
{ {
#region Initialization
/// <summary> /// <summary>
/// Setup the database model /// Setup the database model
/// </summary> /// </summary>
@ -16,36 +18,77 @@ namespace BlueWest.WebApi.MySQL.Model
{ {
modelBuilder modelBuilder
.ConfigureDatabaseKeys() .ConfigureDatabaseKeys()
.CountryCurrencyModel() .CurrencyModel()
.ConfigureUserModel(); .ConfigureUserModel();
} }
#endregion
#region DatabasePK
private static ModelBuilder ConfigureDatabaseKeys(this ModelBuilder modelBuilder) private static ModelBuilder ConfigureDatabaseKeys(this ModelBuilder modelBuilder)
{ {
// User PK // User
modelBuilder.Entity<User>(builder => builder modelBuilder
.HasKey(user => user.Id)); .Entity<User>(builder => builder
.HasKey(user => user.Id))
.Entity<User>().Property(user => user.Id)
.ValueGeneratedOnAdd();
// Country PK // Country
modelBuilder.Entity<Country>(builder => builder modelBuilder
.HasKey(country => country.Code)); .Entity<Country>(builder => builder
.HasKey(country => country.Id))
.Entity<Country>().Property(country => country.Id)
.ValueGeneratedOnAdd();
// Currency PK // Currency
modelBuilder.Entity<Currency>(builder => builder modelBuilder
.HasKey(currency => currency.Num)); .Entity<Currency>(builder => builder
.HasKey(currency => currency.Id))
.Entity<Currency>()
.Property(currency => currency.Id)
.ValueGeneratedOnAdd();
// FinanceOp PK // Company PK
modelBuilder
.Entity<Company>(builder => builder
.HasKey(company => company.Id))
.Entity<Company>().Property(company => company.Id)
.ValueGeneratedOnAdd();
// Industry PK
modelBuilder
.Entity<Industry>(builder => builder
.HasKey(industry => industry.Id))
.Entity<Industry>().Property(industry => industry.Id)
.ValueGeneratedOnAdd();
// Product
modelBuilder
.Entity<Industry>(builder => builder
.HasKey(industry => industry.Id));
modelBuilder
.Entity<Industry>()
.Property(industry => industry.Id)
.ValueGeneratedOnAdd();
// FinanceOp
return return
modelBuilder.Entity<FinanceOp>(builder => builder modelBuilder.Entity<FinanceOp>(builder => builder
.HasKey(financeOp => financeOp.Id)); .HasKey(financeOp => financeOp.Id));
} }
#endregion
private static ModelBuilder CountryCurrencyModel(this ModelBuilder modelBuilder) #region Database Models
private static ModelBuilder CurrencyModel(this ModelBuilder modelBuilder)
{ {
// Relationships
modelBuilder modelBuilder
.Entity<Currency>() .Entity<Currency>()
.HasMany(ub => ub.Countries) .HasMany(ub => ub.Countries)
@ -87,6 +130,8 @@ namespace BlueWest.WebApi.MySQL.Model
return modelBuilder; return modelBuilder;
} }
#endregion
} }
} }

View File

@ -1,5 +1,5 @@
using System; using System;
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@ -51,11 +51,14 @@ namespace BlueWest.WebApi
public static IServiceCollection PrepareDatabasePool(this IServiceCollection serviceCollection, public static IServiceCollection PrepareDatabasePool(this IServiceCollection serviceCollection,
IConfiguration configuration, IWebHostEnvironment environment) IConfiguration configuration, IWebHostEnvironment environment)
{ {
return serviceCollection return serviceCollection
.AddDbContextPool<UserDbContext>(options => options.GetMySqlSettings(configuration, environment)) .AddDbContextPool<UserDbContext>(options => options.GetMySqlSettings(configuration, environment))
.AddDbContextPool<CountryDbContext>(options => options.GetMySqlSettings(configuration, environment)) .AddDbContextPool<CountryDbContext>(options => options.GetMySqlSettings(configuration, environment))
.AddDbContextPool<FinanceDbContext>(options => options.GetMySqlSettings(configuration, environment)); .AddDbContextPool<FinanceDbContext>(options => options.GetMySqlSettings(configuration, environment))
.AddDbContextPool<CompanyDbContext>(options => options.GetMySqlSettings(configuration, environment));
} }
} }
} }

View File

@ -1,4 +1,4 @@
using BlueWest.WebApi.MySQL; using BlueWest.WebApi.EF;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
namespace BlueWest.WebApi; namespace BlueWest.WebApi;

View File

@ -13,6 +13,9 @@ using BlueWest.WebApi.Interfaces;
namespace BlueWest.WebApi namespace BlueWest.WebApi
{ {
/// <summary>
/// Entry point of the application.
/// </summary>
public class Program public class Program
{ {
/// <summary> /// <summary>
@ -35,18 +38,21 @@ namespace BlueWest.WebApi
optimizationLevel: OptimizationLevel.Release)); optimizationLevel: OptimizationLevel.Release));
}*/ }*/
public static IHost Host1 { get; private set; } /// <summary>
/// Host Interface of the application.
/// </summary>
public static IHost MainHost { get; private set; }
public static void Main(string[] args) public static void Main(string[] args)
{ {
Host1 = CreateHostBuilder(args) MainHost = CreateHostBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory()) .UseContentRoot(Directory.GetCurrentDirectory())
.Build(); .Build();
Host1.RunAsync();
MainHost.RunAsync();
var tryGetEventManager = Host1.Services.GetService(typeof(EventManager));
_ = Host1.Services.GetService(typeof(ExchangeInterface)); var tryGetEventManager = MainHost.Services.GetService(typeof(EventManager));
_ = MainHost.Services.GetService(typeof(ExchangeInterface));
if(tryGetEventManager == null) Console.WriteLine($"Failed to get {nameof(EventManager)} Service."); if(tryGetEventManager == null) Console.WriteLine($"Failed to get {nameof(EventManager)} Service.");
@ -62,7 +68,7 @@ namespace BlueWest.WebApi
} }
public static IHostBuilder CreateHostBuilder(string[] args) => private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args) Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using MapTo;
namespace BlueWest.Data
{
[MapFrom(typeof(CompanyCreate))]
public partial class Company
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public CompanyType CompanyType { get; set; }
public Country CurrentCountry { get; set; }
public Country OriginCountry { get; set; }
public DateTime FoundingDate { get; set; }
public List<Industry> Industry { get; set; }
public Company()
{
}
}
}

View File

@ -0,0 +1,25 @@
using System;
using MapTo;
namespace BlueWest.Data
{
[MapFrom(typeof(Company))]
public partial class CompanyCreate
{
public string Name { get; set; }
public string Address { get; set; }
public Country CurrentCountry { get; set; }
public Country OriginCountry { get; set; }
public DateTime FoundingDate { get; set; }
public CompanyCreate()
{
}
}
}

View File

@ -0,0 +1,8 @@
namespace BlueWest.Data
{
public partial class CompanySeller
{
}
}

View File

@ -0,0 +1,17 @@
using MapTo;
namespace BlueWest.Data
{
[MapFrom(typeof(Company))]
public partial class CompanyType
{
public int Id { get; set; }
public string Name { get; set; }
public CompanyType()
{
}
}
}

View File

@ -0,0 +1,16 @@
using MapTo;
namespace BlueWest.Data
{
[MapFrom(typeof(Company))]
public partial class CompanyTypeCreate
{
public string Name { get; set; }
public CompanyTypeCreate()
{
}
}
}

View File

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace BlueWest.Data
{
public partial class Product
{
public string Name { get; set; }
public Industry Industry { get; set; }
public List<Company> Seller { get; set; }
public Product()
{
}
}
}

View File

@ -14,12 +14,14 @@ namespace BlueWest.Data
public partial class Country public partial class Country
{ {
public int Id { get; set; }
/// <summary> /// <summary>
/// ISO 3166-1 numeric code /// ISO 3166-1 numeric code
/// Primary key.
/// </summary> /// </summary>
public int Code { get; set; } public int Code { get; set; }
public string Name { get; set; }
/// <summary> /// <summary>
/// ISO 3166-1 State Name /// ISO 3166-1 State Name
/// </summary> /// </summary>
@ -33,15 +35,15 @@ namespace BlueWest.Data
[JsonConstructor] [JsonConstructor]
public Country(int code, string stateName, string tld, List<Currency> currencies) public Country(string stateName, string tld, List<Currency> currencies)
{ {
Code = code;
StateName = stateName; StateName = stateName;
TLD = tld; TLD = tld;
Currencies = currencies; Currencies = currencies;
} }
public Country() { } public Country() { }
} }
} }

View File

@ -8,7 +8,9 @@ namespace BlueWest.Data
public partial class CountryCreate public partial class CountryCreate
{ {
// ISO 3166-1 numeric code // ISO 3166-1 numeric code
public int Code { get; set; } // Primary key public int Code { get; set; }
public string Name { get; set; }
public string StateName { get; set; } public string StateName { get; set; }
public List<CurrencyUnique> CurrenciesToCreate { get; set; } public List<CurrencyUnique> CurrenciesToCreate { get; set; }
@ -18,19 +20,8 @@ namespace BlueWest.Data
public string TLD { get; set; } public string TLD { get; set; }
public CountryCreate() { } public CountryCreate() { }
public Country ToCountry()
{
var currencies = new List<Currency>();
foreach (var currencyCreate in CurrenciesToCreate)
{
currencies.Add(new Currency(currencyCreate, null));
}
return new Country(this, currencies, null);
}
} }
} }

View File

@ -9,7 +9,12 @@ namespace BlueWest.Data
public partial class CountryUnique public partial class CountryUnique
{ {
// ISO 3166-1 numeric code // ISO 3166-1 numeric code
public int Code { get; set; } // Primary key public int Id { get; set; }
public int Code { get; set; }
public string Name { get; set; }
public string StateName { get; set; } public string StateName { get; set; }
[MaxLength(2)] public string Alpha2Code { get; set; } [MaxLength(2)] public string Alpha2Code { get; set; }

View File

@ -8,10 +8,14 @@ namespace BlueWest.Data
public partial class CountryUpdate public partial class CountryUpdate
{ {
public string Name { get; set; }
public string StateName { get; set; } public string StateName { get; set; }
public string Alpha2Code { get; set; } public string Alpha2Code { get; set; }
public string TLD { get; set; } public string TLD { get; set; }
/// <summary>
/// ISO 3166-1 numeric code
/// </summary>
public int Code { get; set; }
public CountryUpdate() { } public CountryUpdate() { }
} }
} }

View File

@ -0,0 +1,8 @@
namespace BlueWest.Data.generated
{
public class GeneratedCountries
{
}
}

View File

@ -12,14 +12,12 @@ namespace BlueWest.Data
public partial class Currency public partial class Currency
{ {
public int Num { get; set; } // Primary key public int Id { get; set; }
public int Num { get; set; }
[MaxLength(3)] public string Code { get; set; } [MaxLength(3)] public string Code { get; set; }
public List<Country> Countries { get; set; } public List<Country> Countries { get; set; }
public Currency() public Currency() { }
{
}
} }
} }

View File

@ -11,20 +11,7 @@ namespace BlueWest.Data
[MaxLength(3)] public string Code { get; set; } [MaxLength(3)] public string Code { get; set; }
public List<CountryUnique> CountriesToCreate { get; set; } public List<CountryUnique> CountriesToCreate { get; set; }
public CurrencyCreate() { } public CurrencyCreate() { }
public Currency ToCurrency()
{
List<Country> countries = new List<Country>();
foreach (var countryCreate in CountriesToCreate)
{
var newCountry = new Country(countryCreate, null, null);
countries.Add(newCountry);
}
return new Currency(this, countries);
}
} }
} }

View File

@ -8,6 +8,8 @@ namespace BlueWest.Data
public partial class CurrencyUpdate public partial class CurrencyUpdate
{ {
public int Num { get; set; }
// ISO 4217 Code // ISO 4217 Code
[MaxLength(3)] public string Code { get; set; } [MaxLength(3)] public string Code { get; set; }

View File

@ -0,0 +1,9 @@
namespace BlueWest.Data
{
public partial class Industry
{
public int Id { get; set; }
public string IndustryType { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace BlueWest.Data.Media
{
public class MediaSource
{
public MediaSourceType SourceType { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace BlueWest.Data.Media
{
public class MediaSourceType
{
public string SourceTypeName { get; set; }
}
}

View File

@ -0,0 +1,11 @@
namespace BlueWest.Data.Media
{
public class Website
{
public int Id { get; set; }
public string WebsiteDomain { get; set; }
public string IsHttps { get; set; }
public bool HasCloudflareLikeService { get; set; }
}
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BlueWest.Data.Capital\BlueWest.Data.Capital.csproj" />
<ProjectReference Include="..\include\BlueWest.MapTo\src\BlueWest.MapTo\BlueWest.MapTo.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
namespace BlueWest.Data.Geography
{
public partial class Coordinate
{
public Guid Key { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public Country Country { get; set; }
public TimeSpan CreatedTime { get; set; }
}
}

@ -1 +1 @@
Subproject commit 8f656cbcc1c5782b1c5983600568704b6244b1ef Subproject commit 75205acb359d624f2bdd9cb32474aca993fb77f1

View File

@ -5,7 +5,7 @@ VisualStudioVersion = 16.0.31911.196
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest", "BlueWest\BlueWest.csproj", "{293E7852-8AFD-4EFB-8C2D-F1BBE68AEE78}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest", "BlueWest\BlueWest.csproj", "{293E7852-8AFD-4EFB-8C2D-F1BBE68AEE78}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest.Data", "BlueWest.Data\BlueWest.Data.csproj", "{E518C62D-768C-4885-9C9D-FD5761605B54}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest.Data.Capital", "BlueWest.Data.Capital\BlueWest.Data.Capital.csproj", "{E518C62D-768C-4885-9C9D-FD5761605B54}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest.Api", "BlueWest.Api\BlueWest.Api.csproj", "{6D3321B5-CF1A-4251-B28D-329EDA6DC278}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlueWest.Api", "BlueWest.Api\BlueWest.Api.csproj", "{6D3321B5-CF1A-4251-B28D-329EDA6DC278}"
EndProject EndProject
@ -34,6 +34,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{552B9217-4
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlueWest.Api.Gateway", "BlueWest.Api.Gateway\BlueWest.Api.Gateway.csproj", "{A78343AF-77C6-48FD-A9C4-F8B7CBA56212}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlueWest.Api.Gateway", "BlueWest.Api.Gateway\BlueWest.Api.Gateway.csproj", "{A78343AF-77C6-48FD-A9C4-F8B7CBA56212}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlueWest.Data.Geography", "BlueWest.Data.Geography\BlueWest.Data.Geography.csproj", "{D5924A3F-0AA1-4AF4-AEDB-3B9F91E6531E}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -72,6 +74,10 @@ Global
{A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Debug|Any CPU.Build.0 = Debug|Any CPU {A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Release|Any CPU.ActiveCfg = Release|Any CPU {A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Release|Any CPU.Build.0 = Release|Any CPU {A78343AF-77C6-48FD-A9C4-F8B7CBA56212}.Release|Any CPU.Build.0 = Release|Any CPU
{D5924A3F-0AA1-4AF4-AEDB-3B9F91E6531E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5924A3F-0AA1-4AF4-AEDB-3B9F91E6531E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5924A3F-0AA1-4AF4-AEDB-3B9F91E6531E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5924A3F-0AA1-4AF4-AEDB-3B9F91E6531E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using BlueWest.Tools; using BlueWest.Tools;
using BlueWest.Core.Threading;
namespace BlueWest.Core namespace BlueWest.Core
@ -18,7 +17,7 @@ namespace BlueWest.Core
public void Run() public void Run()
{ {
new ThreadServer(EventManager); _ = new ThreadServer(EventManager);
BlueWestConsoleBanner(); BlueWestConsoleBanner();
} }

View File

@ -3,7 +3,6 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using BlueWest.Core.ComponentSystem; using BlueWest.Core.ComponentSystem;
using BlueWest.Core.Threading;
using BlueWest.Tools; using BlueWest.Tools;
namespace BlueWest.Core namespace BlueWest.Core

View File

@ -1,11 +0,0 @@
using System;
using System.Threading;
namespace BlueWest.Core.Threading
{
public static class Threads
{
}
}

@ -1 +1 @@
Subproject commit f7963d2d7e32a45bc7da61e31b07c55ca4829fb4 Subproject commit aa5b01cdc42a00e873f126049a9c111b1d5220fa