From ee42714069964e2b01f093b112bb5bd340e6a268 Mon Sep 17 00:00:00 2001 From: CodeLiturgy Date: Mon, 22 Aug 2022 03:13:53 +0100 Subject: [PATCH] Data objects working in controllers (Country and Currency) --- BlueWest.Api/Context/CompanyDbContext.cs | 10 +- BlueWest.Api/Context/CountryDbContext.cs | 5 +- BlueWest.Api/Context/ExchangeInterface.cs | 5 +- .../Context/Extensions/CountryDbExtensions.cs | 8 +- BlueWest.Api/Context/FinanceDbContext.cs | 4 +- BlueWest.Api/Context/UserDbContext.cs | 2 +- BlueWest.Api/Controllers/CountryController.cs | 143 +++++++++--------- .../Controllers/CurrencyController.cs | 11 +- BlueWest.Api/Dockerfile | 21 +++ BlueWest.Api/Extensions/StartupExtensions.cs | 13 +- .../Currency/CurrencyUnique.cs | 1 + docker-compose.yml | 26 ++-- 12 files changed, 141 insertions(+), 108 deletions(-) diff --git a/BlueWest.Api/Context/CompanyDbContext.cs b/BlueWest.Api/Context/CompanyDbContext.cs index 3fe7e3c..af19183 100644 --- a/BlueWest.Api/Context/CompanyDbContext.cs +++ b/BlueWest.Api/Context/CompanyDbContext.cs @@ -12,24 +12,24 @@ namespace BlueWest.WebApi.EF public sealed class CompanyDbContext : DbContext { /// - /// Db set of Companies + /// Companies. /// public DbSet Companies { get; set; } /// - /// Db set of Industries. + /// Industries. /// public DbSet Industries { get; set; } /// - /// Db set of Products. + /// Products. /// public DbSet Products { get; set; } /// - /// Options to be injected in the app + /// CompanyDbContext constructor. /// /// public CompanyDbContext(DbContextOptions options) : base(options) @@ -38,7 +38,7 @@ namespace BlueWest.WebApi.EF } /// - /// On database model creating + /// On model creating. /// /// Builder model of the database protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/BlueWest.Api/Context/CountryDbContext.cs b/BlueWest.Api/Context/CountryDbContext.cs index e3960c5..923efe2 100644 --- a/BlueWest.Api/Context/CountryDbContext.cs +++ b/BlueWest.Api/Context/CountryDbContext.cs @@ -29,7 +29,7 @@ namespace BlueWest.WebApi.EF /// - /// Options to be injected in the app + /// CountryDbContext Constructor. /// /// public CountryDbContext(DbContextOptions options) : base(options) @@ -38,8 +38,7 @@ namespace BlueWest.WebApi.EF } /// - /// The country number is the primary key - /// The currency code is the primary key + /// On model creating. /// /// protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/BlueWest.Api/Context/ExchangeInterface.cs b/BlueWest.Api/Context/ExchangeInterface.cs index 45db8ee..79bbfbe 100644 --- a/BlueWest.Api/Context/ExchangeInterface.cs +++ b/BlueWest.Api/Context/ExchangeInterface.cs @@ -24,13 +24,12 @@ namespace BlueWest.WebApi.Interfaces #region Initialization /// - /// Exchange Interface Object + /// Database Ef context constructor /// /// Country context /// Finance context /// User context /// Event manager injection - public ExchangeInterface( CountryDbContext countryDbContext, @@ -46,7 +45,7 @@ namespace BlueWest.WebApi.Interfaces } /// - /// Empty constructor + /// Database Ef context constructor /// public ExchangeInterface() { } diff --git a/BlueWest.Api/Context/Extensions/CountryDbExtensions.cs b/BlueWest.Api/Context/Extensions/CountryDbExtensions.cs index 2800453..4f388a2 100644 --- a/BlueWest.Api/Context/Extensions/CountryDbExtensions.cs +++ b/BlueWest.Api/Context/Extensions/CountryDbExtensions.cs @@ -92,7 +92,13 @@ namespace BlueWest.WebApi.EF int countryId, CurrencyCreate currencyCreate, Expression>[] duplicationValidations) { - var country = dbContext.Countries.FirstOrDefault(d => d.Id == countryId); + + var country = dbContext + .Countries + .Where(data => data.Id == countryId) + .Include(o => o.Currencies) + .FirstOrDefault(); + // Check if currency exists if (country == null) return (false, $"{nameof(country)} Not found.", null); diff --git a/BlueWest.Api/Context/FinanceDbContext.cs b/BlueWest.Api/Context/FinanceDbContext.cs index 37f1a66..b6fbf8d 100644 --- a/BlueWest.Api/Context/FinanceDbContext.cs +++ b/BlueWest.Api/Context/FinanceDbContext.cs @@ -20,7 +20,7 @@ namespace BlueWest.WebApi.EF public DbSet TransactionTypes { get; set; } /// - /// Finance transactions context + /// CompanyDbContext constructor. /// /// public FinanceDbContext(DbContextOptions options) : base(options) @@ -29,7 +29,7 @@ namespace BlueWest.WebApi.EF } /// - /// On database model creating + /// On model creating. /// /// Builder model of the database protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/BlueWest.Api/Context/UserDbContext.cs b/BlueWest.Api/Context/UserDbContext.cs index 48cf906..80a0f6f 100644 --- a/BlueWest.Api/Context/UserDbContext.cs +++ b/BlueWest.Api/Context/UserDbContext.cs @@ -31,7 +31,7 @@ namespace BlueWest.WebApi.EF } /// - /// On database model creating + /// On model creating. /// /// Builder model of the database protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/BlueWest.Api/Controllers/CountryController.cs b/BlueWest.Api/Controllers/CountryController.cs index bdeec19..d125de5 100644 --- a/BlueWest.Api/Controllers/CountryController.cs +++ b/BlueWest.Api/Controllers/CountryController.cs @@ -27,7 +27,77 @@ namespace BlueWest.WebApi.Controllers _dbContext = dbContext; } + + /// + /// Get countries + /// + /// + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpGet] + public ActionResult GetCountries() + { + var array = _dbContext + .Countries + .Select(x => new CountryUnique(x)) + .ToArray(); + + return Ok(array); + + } + + + /// + /// Get Country by Id + /// + /// ISO 3166-1 countryId numeric code + /// + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpGet("{countryId}", Name = nameof(GetCountryById))] + public ActionResult GetCountryById(int countryId) + { + var country = _dbContext.Countries + .Where(x => x.Id == countryId) + .Select(x => new CountryUnique(x)) + .FirstOrDefault(); + + + if (country != null) + { + return Ok(country); + } + + return new NotFoundResult(); + } + + + /// + /// Get currencies of a countryId + /// + /// + /// + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpGet("{countryId}/currencies")] + public ActionResult GetCountryCurrencies(int countryId) + { + var countryObj = _dbContext.Countries.FirstOrDefault(d => d.Id == countryId); + + if (countryObj == null) return new NotFoundResult(); + + var array = _dbContext + .Countries + .Where(data => data.Id == countryId) + .SelectMany(o => o.Currencies) + .Select(x => new CurrencyUnique(x)) + .ToArray(); + + return Ok(array); + } + + /// /// Add Country /// @@ -54,12 +124,11 @@ namespace BlueWest.WebApi.Controllers [HttpPost] public ActionResult AddCountry(CountryCreate countryToCreate) { - Country newCountry = new Country(countryToCreate); _dbContext.Countries.Add(newCountry); bool success = _dbContext.SaveChanges() >= 0; if (!success) return new BadRequestResult(); - return CreatedAtRoute(nameof(GetCountryById), new {countryId = newCountry.Id}); + return CreatedAtRoute(nameof(GetCountryById), new {countryId = newCountry.Id}, new CountryUnique(newCountry)); } /// @@ -73,80 +142,18 @@ namespace BlueWest.WebApi.Controllers [HttpPut("{countryCode}")] public ActionResult UpdateCountry(int countryCode, CountryUpdate countryToUpdate) { - var (success, countryId) = _dbContext.UpdateCountry(countryToUpdate, countryCode); + var (success, country) = _dbContext.UpdateCountry(countryToUpdate, countryCode); if (success) { - return Ok(countryId); + var countryReply = new CountryUnique(country); + return Ok(countryReply); } return new NotFoundResult(); } - /// - /// Get countries - /// - /// - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - [HttpGet] - public ActionResult GetCountries() - { - var array = _dbContext.Countries; - - if (array != null) - { - return Ok(array.ToArray()); - } - - return new NotFoundResult(); - } - - /// - /// Get Country by Id - /// - /// ISO 3166-1 countryId numeric code - /// - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - [HttpGet("{countryId}", Name = nameof(GetCountryById))] - public ActionResult GetCountryById(int countryId) - { - var array = _dbContext.Countries.FirstOrDefault(x => x.Id == countryId); - - if (array != null) - { - return Ok(array); - } - - return new NotFoundResult(); - } - - /// - /// Get currencies of a countryId - /// - /// - /// - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - [HttpGet("{countryId}/currencies")] - public ActionResult GetCountryCurrencies(int countryId) - { - var countryObj = _dbContext.Countries.FirstOrDefault(d => d.Id == countryId); - - if (countryObj == null) return new NotFoundResult(); - - var array = _dbContext - .Countries - .Where(data => data.Id == countryId) - .SelectMany(o => o.Currencies) - .ToArray(); - - return Ok(array); - } - - /// /// Adds a currency to Country /// @@ -170,7 +177,7 @@ namespace BlueWest.WebApi.Controllers return new ConflictObjectResult(message); } - return Ok(country); + return Ok(new CountryUnique(country)); } diff --git a/BlueWest.Api/Controllers/CurrencyController.cs b/BlueWest.Api/Controllers/CurrencyController.cs index f6f6f04..4e2659a 100644 --- a/BlueWest.Api/Controllers/CurrencyController.cs +++ b/BlueWest.Api/Controllers/CurrencyController.cs @@ -35,7 +35,10 @@ namespace BlueWest.WebApi.Controllers [HttpGet] public ActionResult GetCurrencies() { - var currencies = _dbContext.Currencies.ToArray(); + var currencies = _dbContext.Currencies + .Select(currency => new CurrencyUnique(currency)) + .ToArray(); + return Ok(currencies); } @@ -56,7 +59,7 @@ namespace BlueWest.WebApi.Controllers return new NotFoundResult(); } - return CreatedAtRoute(nameof(GetCurrencyById), new {CurrencyId = newCurrency.Code}, newCurrency); + return CreatedAtRoute(nameof(GetCurrencyById), new {CurrencyId = newCurrency.Code}, new CurrencyUnique(newCurrency)); } /// @@ -74,7 +77,7 @@ namespace BlueWest.WebApi.Controllers if (success) { - return Ok(currency); + return Ok(new CurrencyUnique(currency)); } return new NotFoundResult(); @@ -95,7 +98,7 @@ namespace BlueWest.WebApi.Controllers if (currency != null) { - return Ok(currency); + return Ok(new CurrencyUnique(currency)); } return new NotFoundResult(); diff --git a/BlueWest.Api/Dockerfile b/BlueWest.Api/Dockerfile index faff182..f39653f 100644 --- a/BlueWest.Api/Dockerfile +++ b/BlueWest.Api/Dockerfile @@ -7,8 +7,29 @@ WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src +COPY ["BlueWest.Data.Capital/BlueWest.Data.Capital.csproj", "BlueWest.Data.Capital/"] +RUN dotnet restore "BlueWest.Data.Capital/BlueWest.Data.Capital.csproj" + + +COPY ["BlueWest/BlueWest.csproj", "BlueWest/"] +RUN dotnet restore "BlueWest/BlueWest.csproj" + + +COPY ["BlueWest.Data.Geography/BlueWest.Data.Geography.csproj", "BlueWest.Data.Geography/"] +RUN dotnet restore "BlueWest.Data.Geography/BlueWest.Data.Geography.csproj" + + COPY ["BlueWest.Api/BlueWest.Api.csproj", "BlueWest.Api/"] RUN dotnet restore "BlueWest.Api/BlueWest.Api.csproj" + + +COPY ["include/BlueWest.MapTo/src/BlueWest.MapTo/BlueWest.MapTo.csproj", "include/BlueWest.MapTo/src/BlueWest.MapTo/"] +RUN dotnet restore "include/BlueWest.MapTo/src/BlueWest.MapTo/BlueWest.MapTo.csproj" + +COPY ["include/Math-Expression-Evaluator/SimpleExpressionEvaluator/SimpleExpressionEvaluator.csproj", "include/Math-Expression-Evaluator/SimpleExpressionEvaluator/"] +RUN dotnet restore "include/Math-Expression-Evaluator/SimpleExpressionEvaluator/SimpleExpressionEvaluator.csproj" + + COPY [".", "."] RUN dotnet build "BlueWest.Api/BlueWest.Api.csproj" -c Release -o /app/build diff --git a/BlueWest.Api/Extensions/StartupExtensions.cs b/BlueWest.Api/Extensions/StartupExtensions.cs index 32821a7..35a00b0 100644 --- a/BlueWest.Api/Extensions/StartupExtensions.cs +++ b/BlueWest.Api/Extensions/StartupExtensions.cs @@ -25,20 +25,22 @@ namespace BlueWest.WebApi IConfiguration configuration, IWebHostEnvironment environment) { - var optionsBuilderRef = optionsBuilder.UseMySql(configuration.GetConnectionString("LocalMySQL"), - new MySqlServerVersion(new Version(8, 0, 11))); + optionsBuilder.UseMySql(configuration.GetConnectionString("LocalMySQL"), + new MySqlServerVersion(new Version(8, 0, 11))) + .UseMySql(new MySqlServerVersion(new Version(8, 0, 11)), + builder => { builder.EnableRetryOnFailure(6, TimeSpan.FromSeconds(3), null); }); // The following three options help with debugging, but should // be changed or removed for production. if (environment.IsDevelopment()) { - optionsBuilderRef + optionsBuilder .LogTo(Console.WriteLine, LogLevel.Information) .EnableSensitiveDataLogging() .EnableDetailedErrors(); } - return optionsBuilderRef; + return optionsBuilder; } /// @@ -51,14 +53,11 @@ namespace BlueWest.WebApi public static IServiceCollection PrepareDatabasePool(this IServiceCollection serviceCollection, IConfiguration configuration, IWebHostEnvironment environment) { - return serviceCollection .AddDbContextPool(options => options.GetMySqlSettings(configuration, environment)) .AddDbContextPool(options => options.GetMySqlSettings(configuration, environment)) .AddDbContextPool(options => options.GetMySqlSettings(configuration, environment)) .AddDbContextPool(options => options.GetMySqlSettings(configuration, environment)); - - } } } \ No newline at end of file diff --git a/BlueWest.Data.Capital/Currency/CurrencyUnique.cs b/BlueWest.Data.Capital/Currency/CurrencyUnique.cs index 29225fd..a8a9bfc 100644 --- a/BlueWest.Data.Capital/Currency/CurrencyUnique.cs +++ b/BlueWest.Data.Capital/Currency/CurrencyUnique.cs @@ -7,6 +7,7 @@ namespace BlueWest.Data [MapFrom(typeof(Currency))] public partial class CurrencyUnique { + public int Id { get; set; } public int Num { get; set; } // Primary key [MaxLength(3)] public string Code { get; set; } diff --git a/docker-compose.yml b/docker-compose.yml index 2520efc..ebe09e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,5 @@ version: '3' services: - bapi120: - build: - context: ./ - dockerfile: ./BlueWest.Api/Dockerfile - ports: - - 8080:80 - environment: - VIRTUAL_HOST: localhost - restart: always - links: - - db:db - container_name: BW1_API db: container_name: BW1_DB_MYSQL image: mysql/mysql-server:8.0 @@ -34,7 +22,17 @@ services: MYSQL_ROOT_PASSWORD: 'dXjw127124dJ' # ports: # - "3308:3306" - - + bapi120: + build: + context: ./ + dockerfile: ./BlueWest.Api/Dockerfile + ports: + - 8080:80 + environment: + VIRTUAL_HOST: localhost + restart: always + links: + - db:db + container_name: BW1_API \ No newline at end of file