[
  {
    "path": ".gitignore",
    "content": "/Part 3/.vs\n/Part 3/AccountOwnerServer/obj\n/Part 3/AccountOwnerServer/AccountOwnerServer.csproj.user\n/Part 3/AccountOwnerServer/bin\n/Part 3/Contracts/obj\n/Part 3/Contracts/bin\n/Part 3/LoggerService/obj\n/Part 3/LoggerService/bin\n\n\n*.suo\n*.user\n_ReSharper.*\nbin\nobj\npackages\n/Part 4/Contracts/obj\n/Part 4/Contracts/bin\n/Part 4/Entities/obj\n/Part 4/Entities/bin\n/Part 4/LoggerService/obj\n/Part 4/LoggerService/bin\n/Part 4/Repository/obj\n/Part 4/Repository/bin\n/Part7/.vscode\nProjects\n/Part 3/AccountOwnerServer/Projects\n/Part 5/AccountOwnerServer/Projects\n/Part 4/AccountOwnerServer/Projects\n/Part 6/AccountOwnerServer/Projects\n/Part 5 - Update - OwnersByName/.vs\n/Part 4/.vs\n/Part 5/.vs\n/Part 2/AccountOwnerServer/.vs\n/Part 6/.vs\n/Part 16/.NET Core part - end/.vs\n/Part 17/.NET Core part - end/.vs\n"
  },
  {
    "path": "Part 1/init.sql",
    "content": "-- MySQL Script generated by MySQL Workbench\n-- Wed Jan 22 11:12:09 2025\n-- Model: New Model    Version: 1.0\n-- MySQL Workbench Forward Engineering\n\nSET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;\nSET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;\nSET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';\n\n-- -----------------------------------------------------\n-- Schema AccountOwner\n-- -----------------------------------------------------\n\n-- -----------------------------------------------------\n-- Schema AccountOwner\n-- -----------------------------------------------------\nCREATE SCHEMA IF NOT EXISTS `AccountOwner` DEFAULT CHARACTER SET utf8 ;\nUSE `AccountOwner` ;\n\n-- -----------------------------------------------------\n-- Table `AccountOwner`.`Owner`\n-- -----------------------------------------------------\nDROP TABLE IF EXISTS `AccountOwner`.`Owner` ;\n\nCREATE TABLE IF NOT EXISTS `AccountOwner`.`Owner` (\n  `OwnerId` CHAR(36) NOT NULL,\n  `Name` NVARCHAR(60) NOT NULL,\n  `DateOfBirth` DATE NOT NULL,\n  `Address` NVARCHAR(100) NOT NULL,\n  PRIMARY KEY (`OwnerId`))\nENGINE = InnoDB;\n\n\n-- -----------------------------------------------------\n-- Table `AccountOwner`.`Account`\n-- -----------------------------------------------------\nDROP TABLE IF EXISTS `AccountOwner`.`Account` ;\n\nCREATE TABLE IF NOT EXISTS `AccountOwner`.`Account` (\n  `AccountID` CHAR(36) NOT NULL,\n  `DateCreated` DATE NOT NULL,\n  `AccountType` NVARCHAR(45) NOT NULL,\n  `OwnerId` CHAR(36) NOT NULL,\n  PRIMARY KEY (`AccountID`),\n  INDEX `fk_Account_Owner_idx` (`OwnerId` ASC) VISIBLE,\n  CONSTRAINT `fk_Account_Owner`\n    FOREIGN KEY (`OwnerId`)\n    REFERENCES `AccountOwner`.`Owner` (`OwnerId`)\n    ON DELETE RESTRICT\n    ON UPDATE CASCADE)\nENGINE = InnoDB;\n\n\nSET SQL_MODE=@OLD_SQL_MODE;\nSET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;\nSET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/AccountOwnerServer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/Controllers/WeatherForecastController.cs",
    "content": "using Microsoft.AspNetCore.Mvc;\n\nnamespace AccountOwnerServer.Controllers\n{\n    [ApiController]\n    [Route(\"[controller]\")]\n    public class WeatherForecastController : ControllerBase\n    {\n        private static readonly string[] Summaries = new[]\n        {\n        \"Freezing\", \"Bracing\", \"Chilly\", \"Cool\", \"Mild\", \"Warm\", \"Balmy\", \"Hot\", \"Sweltering\", \"Scorching\"\n    };\n\n        private readonly ILogger<WeatherForecastController> _logger;\n\n        public WeatherForecastController(ILogger<WeatherForecastController> logger)\n        {\n            _logger = logger;\n        }\n\n        [HttpGet]\n        public IEnumerable<WeatherForecast> Get()\n        {\n            return Enumerable.Range(1, 5).Select(index => new WeatherForecast\n            {\n                Date = DateTime.Now.AddDays(index),\n                TemperatureC = Random.Shared.Next(-20, 55),\n                Summary = Summaries[Random.Shared.Next(Summaries.Length)]\n            })\n            .ToArray();\n        }\n    }\n}"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/Extensions/ServiceExtensions.cs",
    "content": "﻿namespace AccountOwnerServer.Extensions\n{\n    public static class ServiceExtensions\n    {\n        public static void ConfigureCors(this IServiceCollection services)\n        {\n            services.AddCors(options =>\n            {\n                options.AddPolicy(\"CorsPolicy\",\n                    builder => builder.AllowAnyOrigin()\n                    .AllowAnyMethod()\n                    .AllowAnyHeader());\n            });\n        }\n\n        public static void ConfigureIISIntegration(this IServiceCollection services)\n        {\n            services.Configure<IISOptions>(options =>\n            {\n\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/Program.cs",
    "content": "using AccountOwnerServer.Extensions;\nusing Microsoft.AspNetCore.HttpOverrides;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\n\nbuilder.Services.ConfigureCors(); \nbuilder.Services.ConfigureIISIntegration();\n\nbuilder.Services.AddControllers();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment()) \n    app.UseDeveloperExceptionPage(); \nelse \n    app.UseHsts();\n\napp.UseHttpsRedirection();\n\napp.UseStaticFiles();\n\napp.UseForwardedHeaders(new ForwardedHeadersOptions \n{ \n    ForwardedHeaders = ForwardedHeaders.All \n}); \n\napp.UseCors(\"CorsPolicy\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:40700\",\n      \"sslPort\": 44360\n    }\n  },\n  \"profiles\": {\n    \"AccountOwnerServer\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/WeatherForecast.cs",
    "content": "namespace AccountOwnerServer\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n        public int TemperatureC { get; set; }\n\n        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);\n\n        public string? Summary { get; set; }\n    }\n}"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Part 2/AccountOwnerServer/AccountOwnerServer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32210.238\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AccountOwnerServer\", \"AccountOwnerServer\\AccountOwnerServer.csproj\", \"{0213FB50-5C53-4C34-8B2C-E515C7DC2579}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F8E1F895-37AB-455B-8D05-ED495BE48F88}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/AccountOwnerServer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\LoggerService\\LoggerService.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/Controllers/WeatherForecastController.cs",
    "content": "using Contracts;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace AccountOwnerServer.Controllers\n{\n    [ApiController]\n    [Route(\"[controller]\")]\n    public class WeatherForecastController : ControllerBase\n    {\n        private readonly ILoggerManager _logger;\n\n        public WeatherForecastController(ILoggerManager logger)\n        {\n            _logger = logger;\n        }\n\n        [HttpGet]\n        public IEnumerable<string> Get()\n        {\n            _logger.LogInfo(\"Here is info message from the controller.\"); \n            _logger.LogDebug(\"Here is debug message from the controller.\"); \n            _logger.LogWarn(\"Here is warn message from the controller.\"); \n            _logger.LogError(\"Here is error message from the controller.\");\n\n            return new string[] { \"value1\", \"value2\" };\n        }\n    }\n}"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/Extensions/ServiceExtensions.cs",
    "content": "﻿using Contracts;\nusing LoggerService;\n\nnamespace AccountOwnerServer.Extensions\n{\n    public static class ServiceExtensions\n    {\n        public static void ConfigureCors(this IServiceCollection services)\n        {\n            services.AddCors(options =>\n            {\n                options.AddPolicy(\"CorsPolicy\",\n                    builder => builder.AllowAnyOrigin()\n                    .AllowAnyMethod()\n                    .AllowAnyHeader());\n            });\n        }\n\n        public static void ConfigureIISIntegration(this IServiceCollection services)\n        {\n            services.Configure<IISOptions>(options =>\n            {\n\n            });\n        }\n\n        public static void ConfigureLoggerService(this IServiceCollection services) \n        {\n            services.AddSingleton<ILoggerManager, LoggerManager>(); \n        }\n    }\n}\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/Program.cs",
    "content": "using AccountOwnerServer.Extensions;\nusing Microsoft.AspNetCore.HttpOverrides;\nusing NLog;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nLogManager.Setup().LoadConfigurationFromFile(string.Concat(Directory.GetCurrentDirectory(), \"/nlog.config\"));\n\nbuilder.Services.ConfigureCors(); \nbuilder.Services.ConfigureIISIntegration();\nbuilder.Services.ConfigureLoggerService();\n\nbuilder.Services.AddControllers();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment()) \n    app.UseDeveloperExceptionPage(); \nelse \n    app.UseHsts();\n\napp.UseHttpsRedirection();\n\napp.UseStaticFiles();\n\napp.UseForwardedHeaders(new ForwardedHeadersOptions \n{ \n    ForwardedHeaders = ForwardedHeaders.All \n}); \n\napp.UseCors(\"CorsPolicy\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:40700\",\n      \"sslPort\": 44360\n    }\n  },\n  \"profiles\": {\n    \"AccountOwnerServer\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/WeatherForecast.cs",
    "content": "namespace AccountOwnerServer\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n        public int TemperatureC { get; set; }\n\n        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);\n\n        public string? Summary { get; set; }\n    }\n}"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer/nlog.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      autoReload=\"true\"\n      internalLogLevel=\"Trace\"\n      internalLogFile=\"d:Projects\\Blog-AccountOwner\\Project\\internal_logs\\internallog.txt\">\n\n  <targets>\n    <target name=\"logfile\" xsi:type=\"File\"\n            fileName=\"d:/Projects/Blog-AccountOwner/Project/logs/${shortdate}_logfile.txt\"\n            layout=\"${longdate} ${level:uppercase=true} ${message}\"/>\n  </targets>\n\n  <rules>\n    <logger name=\"*\" minlevel=\"Debug\" writeTo=\"logfile\" />\n  </rules>\n</nlog>"
  },
  {
    "path": "Part 3/AccountOwnerServer/AccountOwnerServer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32210.238\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AccountOwnerServer\", \"AccountOwnerServer\\AccountOwnerServer.csproj\", \"{0213FB50-5C53-4C34-8B2C-E515C7DC2579}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Contracts\", \"Contracts\\Contracts.csproj\", \"{B731D3C2-9A89-40E4-B96B-AA300B4195BB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"LoggerService\", \"LoggerService\\LoggerService.csproj\", \"{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F8E1F895-37AB-455B-8D05-ED495BE48F88}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/Contracts/Contracts.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/Contracts/ILoggerManager.cs",
    "content": "﻿namespace Contracts\n{\n    public interface ILoggerManager\n    {\n        void LogInfo(string message);\n        void LogWarn(string message);\n        void LogDebug(string message);\n        void LogError(string message);\n    }\n}\n"
  },
  {
    "path": "Part 3/AccountOwnerServer/LoggerService/LoggerManager.cs",
    "content": "﻿using Contracts;\nusing NLog;\n\nnamespace LoggerService\n{\n    public class LoggerManager : ILoggerManager\n    {\n        private static ILogger logger = LogManager.GetCurrentClassLogger();\n\n        public void LogDebug(string message) => logger.Debug(message);\n\n        public void LogError(string message) => logger.Error(message);\n\n        public void LogInfo(string message) => logger.Info(message);\n\n        public void LogWarn(string message) => logger.Warn(message);\n    }\n}"
  },
  {
    "path": "Part 3/AccountOwnerServer/LoggerService/LoggerService.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NLog.Extensions.Logging\" Version=\"5.3.15\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/AccountOwnerServer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Pomelo.EntityFrameworkCore.MySql\" Version=\"9.0.0-preview.2.efcore.9.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\LoggerService\\LoggerService.csproj\" />\n    <ProjectReference Include=\"..\\Repository\\Repository.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/Controllers/WeatherForecastController.cs",
    "content": "using Contracts;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace AccountOwnerServer.Controllers\n{\n    [ApiController]\n    [Route(\"[controller]\")]\n    public class WeatherForecastController : ControllerBase\n    {\n        private IRepositoryWrapper _repository;\n\n        public WeatherForecastController(IRepositoryWrapper repository)\n        {\n            _repository = repository;\n        }\n\n        [HttpGet]\n        public IEnumerable<string> Get()\n        {\n            var domesticAccounts = _repository.Account.FindByCondition(x => x.AccountType.Equals(\"Domestic\"));\n            var owners = _repository.Owner.FindAll();\n\n            return new string[] { \"value1\", \"value2\" };\n        }\n    }\n}"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/Extensions/ServiceExtensions.cs",
    "content": "﻿using Contracts;\nusing LoggerService;\nusing Microsoft.EntityFrameworkCore;\nusing Entities;\nusing Repository;\n\nnamespace AccountOwnerServer.Extensions\n{\n    public static class ServiceExtensions\n    {\n        public static void ConfigureCors(this IServiceCollection services)\n        {\n            services.AddCors(options =>\n            {\n                options.AddPolicy(\"CorsPolicy\",\n                    builder => builder.AllowAnyOrigin()\n                    .AllowAnyMethod()\n                    .AllowAnyHeader());\n            });\n        }\n\n        public static void ConfigureIISIntegration(this IServiceCollection services)\n        {\n            services.Configure<IISOptions>(options =>\n            {\n\n            });\n        }\n\n        public static void ConfigureLoggerService(this IServiceCollection services) \n        {\n            services.AddSingleton<ILoggerManager, LoggerManager>(); \n        }\n\n        public static void ConfigureMySqlContext(this IServiceCollection services, IConfiguration config)\n        {\n            var connectionString = config[\"mysqlconnection:connectionString\"];\n\n            services.AddDbContext<RepositoryContext>(o => o.UseMySql(connectionString, \n                MySqlServerVersion.LatestSupportedServerVersion));\n        }\n\n        public static void ConfigureRepositoryWrapper(this IServiceCollection services) \n        { \n            services.AddScoped<IRepositoryWrapper, RepositoryWrapper>(); \n        }\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/Program.cs",
    "content": "using AccountOwnerServer.Extensions;\nusing Microsoft.AspNetCore.HttpOverrides;\nusing NLog;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nLogManager.Setup().LoadConfigurationFromFile(string.Concat(Directory.GetCurrentDirectory(), \"/nlog.config\"));\n\nbuilder.Services.ConfigureCors(); \nbuilder.Services.ConfigureIISIntegration();\nbuilder.Services.ConfigureLoggerService();\nbuilder.Services.ConfigureMySqlContext(builder.Configuration);\nbuilder.Services.ConfigureRepositoryWrapper();\n\nbuilder.Services.AddControllers();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment()) \n    app.UseDeveloperExceptionPage(); \nelse \n    app.UseHsts();\n\napp.UseHttpsRedirection();\n\napp.UseStaticFiles();\n\napp.UseForwardedHeaders(new ForwardedHeadersOptions \n{ \n    ForwardedHeaders = ForwardedHeaders.All \n}); \n\napp.UseCors(\"CorsPolicy\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:40700\",\n      \"sslPort\": 44360\n    }\n  },\n  \"profiles\": {\n    \"AccountOwnerServer\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/WeatherForecast.cs",
    "content": "namespace AccountOwnerServer\n{\n    public class WeatherForecast\n    {\n        public DateTime Date { get; set; }\n\n        public int TemperatureC { get; set; }\n\n        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);\n\n        public string? Summary { get; set; }\n    }\n}"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"mysqlconnection\": {\n    \"connectionString\": \"server=localhost;userid=root;password=yourpass;database=accountowner;\"\n  },\n    \"AllowedHosts\": \"*\"\n  }\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer/nlog.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      autoReload=\"true\"\n      internalLogLevel=\"Trace\"\n      internalLogFile=\"d:Projects\\Blog-AccountOwner\\Project\\internal_logs\\internallog.txt\">\n\n  <targets>\n    <target name=\"logfile\" xsi:type=\"File\"\n            fileName=\"d:/Projects/Blog-AccountOwner/Project/logs/${shortdate}_logfile.txt\"\n            layout=\"${longdate} ${level:uppercase=true} ${message}\"/>\n  </targets>\n\n  <rules>\n    <logger name=\"*\" minlevel=\"Debug\" writeTo=\"logfile\" />\n  </rules>\n</nlog>"
  },
  {
    "path": "Part 4/AccountOwnerServer/AccountOwnerServer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32210.238\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AccountOwnerServer\", \"AccountOwnerServer\\AccountOwnerServer.csproj\", \"{0213FB50-5C53-4C34-8B2C-E515C7DC2579}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Contracts\", \"Contracts\\Contracts.csproj\", \"{B731D3C2-9A89-40E4-B96B-AA300B4195BB}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LoggerService\", \"LoggerService\\LoggerService.csproj\", \"{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Entities\", \"Entities\\Entities.csproj\", \"{16AAE663-A20E-493D-9087-F4F4016F6216}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Repository\", \"Repository\\Repository.csproj\", \"{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F8E1F895-37AB-455B-8D05-ED495BE48F88}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/Contracts.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/IAccountRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IAccountRepository : IRepositoryBase<Account>\n    {\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/ILoggerManager.cs",
    "content": "﻿namespace Contracts\n{\n    public interface ILoggerManager\n    {\n        void LogInfo(string message);\n        void LogWarn(string message);\n        void LogDebug(string message);\n        void LogError(string message);\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/IOwnerRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IOwnerRepository : IRepositoryBase<Owner>\n    {\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/IRepositoryBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryBase<T>\n    {\n        IQueryable<T> FindAll(); \n        IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression); \n        void Create(T entity); \n        void Update(T entity); \n        void Delete(T entity);\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Contracts/IRepositoryWrapper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryWrapper \n    { \n        IOwnerRepository Owner { get; } \n        IAccountRepository Account { get; } \n        void Save(); \n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Entities/Entities.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore\" Version=\"9.0.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Entities/Models/Account.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"account\")] \n    public class Account \n    {\n        public Guid AccountId { get; set; }\n\n        [Required(ErrorMessage = \"Date created is required\")] \n        public DateTime DateCreated { get; set; }\n\n        [Required(ErrorMessage = \"Account type is required\")] \n        public string? AccountType { get; set; }\n\n        [ForeignKey(nameof(Owner))]\n        public Guid OwnerId { get; set; }\n        public Owner? Owner { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Entities/Models/Owner.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"owner\")] \n    public class Owner \n    { \n        public Guid OwnerId { get; set; }\n\n        [Required(ErrorMessage = \"Name is required\")] \n        [StringLength(60, ErrorMessage = \"Name can't be longer than 60 characters\")] \n        public string? Name { get; set; }\n\n        [Required(ErrorMessage = \"Date of birth is required\")] \n        public DateTime DateOfBirth { get; set; }\n\n        [Required(ErrorMessage = \"Address is required\")] \n        [StringLength(100, ErrorMessage = \"Address cannot be loner then 100 characters\")] \n        public string? Address { get; set; }\n\n        public ICollection<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Entities/RepositoryContext.cs",
    "content": "﻿using Entities.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace Entities\n{\n    public class RepositoryContext : DbContext\n    {\n        public RepositoryContext(DbContextOptions options) \n            : base(options) \n        { \n        }\n\n        public DbSet<Owner>? Owners { get; set; }\n        public DbSet<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/LoggerService/LoggerManager.cs",
    "content": "﻿using Contracts;\nusing NLog;\n\nnamespace LoggerService\n{\n    public class LoggerManager : ILoggerManager\n    {\n        private static ILogger logger = LogManager.GetCurrentClassLogger();\n\n        public void LogDebug(string message) => logger.Debug(message);\n\n        public void LogError(string message) => logger.Error(message);\n\n        public void LogInfo(string message) => logger.Info(message);\n\n        public void LogWarn(string message) => logger.Warn(message);\n    }\n}"
  },
  {
    "path": "Part 4/AccountOwnerServer/LoggerService/LoggerService.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NLog.Extensions.Logging\" Version=\"5.3.15\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Repository/AccountRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\n\nnamespace Repository\n{\n    public class AccountRepository : RepositoryBase<Account>, IAccountRepository \n    { \n        public AccountRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        } \n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Repository/OwnerRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\n\nnamespace Repository\n{\n    public class OwnerRepository : RepositoryBase<Owner>, IOwnerRepository \n    { \n        public OwnerRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        } \n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Repository/Repository.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Repository/RepositoryBase.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Microsoft.EntityFrameworkCore;\nusing System.Linq.Expressions;\n\nnamespace Repository\n{\n    public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class\n    {\n        protected RepositoryContext RepositoryContext { get; set; } \n        public RepositoryBase(RepositoryContext repositoryContext) \n        {\n            RepositoryContext = repositoryContext; \n        }\n\n        public IQueryable<T> FindAll() => RepositoryContext.Set<T>().AsNoTracking();\n\n        public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression) => \n            RepositoryContext.Set<T>().Where(expression).AsNoTracking();\n\n        public void Create(T entity) => RepositoryContext.Set<T>().Add(entity);\n\n        public void Update(T entity) => RepositoryContext.Set<T>().Update(entity);\n\n        public void Delete(T entity) => RepositoryContext.Set<T>().Remove(entity);\n    }\n}\n"
  },
  {
    "path": "Part 4/AccountOwnerServer/Repository/RepositoryWrapper.cs",
    "content": "﻿using Contracts;\nusing Entities;\n\nnamespace Repository\n{\n    public class RepositoryWrapper : IRepositoryWrapper \n    { \n        private RepositoryContext _repoContext; \n        private IOwnerRepository _owner; \n        private IAccountRepository _account; \n        public IOwnerRepository Owner \n        { \n            get \n            { \n                if (_owner == null) \n                { \n                    _owner = new OwnerRepository(_repoContext); \n                } \n                return _owner; \n            } \n        } \n        \n        public IAccountRepository Account \n        { \n            get \n            { \n                if (_account == null) \n                { \n                    _account = new AccountRepository(_repoContext); \n                } \n                return _account; \n            } \n        } \n        \n        public RepositoryWrapper(RepositoryContext repositoryContext) \n        { \n            _repoContext = repositoryContext; \n        } \n        \n        public void Save() \n        {\n            _repoContext.SaveChanges();\n        } \n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/AccountOwnerServer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"AutoMapper\" Version=\"13.0.1\" />\n    <PackageReference Include=\"Pomelo.EntityFrameworkCore.MySql\" Version=\"9.0.0-preview.2.efcore.9.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\LoggerService\\LoggerService.csproj\" />\n    <ProjectReference Include=\"..\\Repository\\Repository.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/Controllers/OwnerController.cs",
    "content": "﻿using AutoMapper;\nusing Contracts;\nusing Entities.DataTransferObjects;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace AccountOwnerServer.Controllers\n{\n    [Route(\"api/owner\")]\n    [ApiController]\n    public class OwnerController : ControllerBase\n    {\n        private ILoggerManager _logger; \n        private IRepositoryWrapper _repository;\n        private IMapper _mapper;\n        \n        public OwnerController(ILoggerManager logger, IRepositoryWrapper repository, IMapper mapper) \n        { \n            _logger = logger; \n            _repository = repository; \n            _mapper = mapper;\n        }\n\n        [HttpGet] \n        public IActionResult GetAllOwners() \n        { \n            try \n            { \n                var owners = _repository.Owner.GetAllOwners(); \n                _logger.LogInfo($\"Returned all owners from database.\");\n\n                var ownersResult = _mapper.Map<IEnumerable<OwnerDto>>(owners);\n                return Ok(ownersResult); \n            } \n            catch (Exception ex) \n            { \n                _logger.LogError($\"Something went wrong inside GetAllOwners action: {ex.Message}\"); \n                \n                return StatusCode(500, \"Internal server error\"); \n            } \n        }\n\n        [HttpGet(\"{id}\")]\n        public IActionResult GetOwnerById(Guid id)\n        {\n            try\n            {\n                var owner = _repository.Owner.GetOwnerById(id);\n                if (owner is null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n                else\n                {\n                    _logger.LogInfo($\"Returned owner with id: {id}\");\n\n                    var ownerResult = _mapper.Map<OwnerDto>(owner);\n                    return Ok(ownerResult);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside GetOwnerById action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n\n        [HttpGet(\"{id}/account\")]\n        public IActionResult GetOwnerWithDetails(Guid id)\n        {\n            try\n            {\n                var owner = _repository.Owner.GetOwnerWithDetails(id);\n                if (owner == null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n                else\n                {\n                    _logger.LogInfo($\"Returned owner with details for id: {id}\");\n\n                    var ownerResult = _mapper.Map<OwnerDto>(owner);\n                    return Ok(ownerResult);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside GetOwnerWithDetails action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/Extensions/ServiceExtensions.cs",
    "content": "﻿using Contracts;\nusing LoggerService;\nusing Microsoft.EntityFrameworkCore;\nusing Entities;\nusing Repository;\n\nnamespace AccountOwnerServer.Extensions\n{\n    public static class ServiceExtensions\n    {\n        public static void ConfigureCors(this IServiceCollection services)\n        {\n            services.AddCors(options =>\n            {\n                options.AddPolicy(\"CorsPolicy\",\n                    builder => builder.AllowAnyOrigin()\n                    .AllowAnyMethod()\n                    .AllowAnyHeader());\n            });\n        }\n\n        public static void ConfigureIISIntegration(this IServiceCollection services)\n        {\n            services.Configure<IISOptions>(options =>\n            {\n\n            });\n        }\n\n        public static void ConfigureLoggerService(this IServiceCollection services) \n        {\n            services.AddSingleton<ILoggerManager, LoggerManager>(); \n        }\n\n        public static void ConfigureMySqlContext(this IServiceCollection services, IConfiguration config)\n        {\n            var connectionString = config[\"mysqlconnection:connectionString\"];\n\n            services.AddDbContext<RepositoryContext>(o => o.UseMySql(connectionString, \n                MySqlServerVersion.LatestSupportedServerVersion));\n        }\n\n        public static void ConfigureRepositoryWrapper(this IServiceCollection services) \n        { \n            services.AddScoped<IRepositoryWrapper, RepositoryWrapper>(); \n        }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/MappingProfile.cs",
    "content": "﻿using AutoMapper;\nusing Entities.DataTransferObjects;\nusing Entities.Models;\nusing System.Linq;\n\nnamespace AccountOwnerServer\n{\n    public class MappingProfile : Profile\n    {\n        public MappingProfile()\n        {\n            CreateMap<Owner, OwnerDto>();\n\n            CreateMap<Account, AccountDto>();\n        }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/Program.cs",
    "content": "using AccountOwnerServer.Extensions;\nusing Microsoft.AspNetCore.HttpOverrides;\nusing NLog;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nLogManager.Setup().LoadConfigurationFromFile(string.Concat(Directory.GetCurrentDirectory(), \"/nlog.config\"));\n\nbuilder.Services.ConfigureCors(); \nbuilder.Services.ConfigureIISIntegration();\nbuilder.Services.ConfigureLoggerService();\nbuilder.Services.ConfigureMySqlContext(builder.Configuration);\nbuilder.Services.ConfigureRepositoryWrapper();\nbuilder.Services.AddAutoMapper(typeof(Program));\n\nbuilder.Services.AddControllers();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment()) \n    app.UseDeveloperExceptionPage(); \nelse \n    app.UseHsts();\n\napp.UseHttpsRedirection();\n\napp.UseStaticFiles();\n\napp.UseForwardedHeaders(new ForwardedHeadersOptions \n{ \n    ForwardedHeaders = ForwardedHeaders.All \n}); \n\napp.UseCors(\"CorsPolicy\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:40700\",\n      \"sslPort\": 44360\n    }\n  },\n  \"profiles\": {\n    \"AccountOwnerServer\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"mysqlconnection\": {\n    \"connectionString\": \"server=localhost;userid=root;password=yourpass;database=accountowner;\"\n  },\n    \"AllowedHosts\": \"*\"\n  }\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer/nlog.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      autoReload=\"true\"\n      internalLogLevel=\"Trace\"\n      internalLogFile=\"d:Projects\\Blog-AccountOwner\\Project\\internal_logs\\internallog.txt\">\n\n  <targets>\n    <target name=\"logfile\" xsi:type=\"File\"\n            fileName=\"d:/Projects/Blog-AccountOwner/Project/logs/${shortdate}_logfile.txt\"\n            layout=\"${longdate} ${level:uppercase=true} ${message}\"/>\n  </targets>\n\n  <rules>\n    <logger name=\"*\" minlevel=\"Debug\" writeTo=\"logfile\" />\n  </rules>\n</nlog>"
  },
  {
    "path": "Part 5/AccountOwnerServer/AccountOwnerServer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32210.238\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AccountOwnerServer\", \"AccountOwnerServer\\AccountOwnerServer.csproj\", \"{0213FB50-5C53-4C34-8B2C-E515C7DC2579}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Contracts\", \"Contracts\\Contracts.csproj\", \"{B731D3C2-9A89-40E4-B96B-AA300B4195BB}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LoggerService\", \"LoggerService\\LoggerService.csproj\", \"{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Entities\", \"Entities\\Entities.csproj\", \"{16AAE663-A20E-493D-9087-F4F4016F6216}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Repository\", \"Repository\\Repository.csproj\", \"{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F8E1F895-37AB-455B-8D05-ED495BE48F88}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/Contracts.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/IAccountRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IAccountRepository\n    {\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/ILoggerManager.cs",
    "content": "﻿namespace Contracts\n{\n    public interface ILoggerManager\n    {\n        void LogInfo(string message);\n        void LogWarn(string message);\n        void LogDebug(string message);\n        void LogError(string message);\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/IOwnerRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IOwnerRepository\n    {\n        IEnumerable<Owner> GetAllOwners();\n        Owner GetOwnerById(Guid ownerId);\n        Owner GetOwnerWithDetails(Guid ownerId);\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/IRepositoryBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryBase<T>\n    {\n        IQueryable<T> FindAll(); \n        IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression); \n        void Create(T entity); \n        void Update(T entity); \n        void Delete(T entity);\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Contracts/IRepositoryWrapper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryWrapper \n    { \n        IOwnerRepository Owner { get; } \n        IAccountRepository Account { get; } \n        void Save(); \n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/DataTransferObjects/AccountDto.cs",
    "content": "﻿using System;\n\nnamespace Entities.DataTransferObjects\n{\n    public class AccountDto\n    {\n        public Guid Id { get; set; }\n        public DateTime DateCreated { get; set; }\n        public string? AccountType { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/DataTransferObjects/OwnerDto.cs",
    "content": "﻿namespace Entities.DataTransferObjects\n{\n    public class OwnerDto\n    {\n        public Guid Id { get; set; }\n        public string? Name { get; set; }\n        public DateTime DateOfBirth { get; set; }\n        public string? Address { get; set; }\n\n        public IEnumerable<AccountDto>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/Entities.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore\" Version=\"9.0.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/Models/Account.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"account\")] \n    public class Account \n    {\n        [Column(\"AccountId\")]\n        public Guid Id { get; set; }\n\n        [Required(ErrorMessage = \"Date created is required\")] \n        public DateTime DateCreated { get; set; }\n\n        [Required(ErrorMessage = \"Account type is required\")] \n        public string? AccountType { get; set; }\n\n        [ForeignKey(nameof(Owner))]\n        public Guid OwnerId { get; set; }\n        public Owner? Owner { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/Models/Owner.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"owner\")] \n    public class Owner \n    {\n        [Column(\"OwnerId\")]\n        public Guid Id { get; set; }\n\n        [Required(ErrorMessage = \"Name is required\")] \n        [StringLength(60, ErrorMessage = \"Name can't be longer than 60 characters\")] \n        public string? Name { get; set; }\n\n        [Required(ErrorMessage = \"Date of birth is required\")] \n        public DateTime DateOfBirth { get; set; }\n\n        [Required(ErrorMessage = \"Address is required\")] \n        [StringLength(100, ErrorMessage = \"Address cannot be loner then 100 characters\")] \n        public string? Address { get; set; }\n\n        public ICollection<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Entities/RepositoryContext.cs",
    "content": "﻿using Entities.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace Entities\n{\n    public class RepositoryContext : DbContext\n    {\n        public RepositoryContext(DbContextOptions options) \n            : base(options) \n        { \n        }\n\n        public DbSet<Owner>? Owners { get; set; }\n        public DbSet<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/LoggerService/LoggerManager.cs",
    "content": "﻿using Contracts;\nusing NLog;\n\nnamespace LoggerService\n{\n    public class LoggerManager : ILoggerManager\n    {\n        private static ILogger logger = LogManager.GetCurrentClassLogger();\n\n        public void LogDebug(string message) => logger.Debug(message);\n\n        public void LogError(string message) => logger.Error(message);\n\n        public void LogInfo(string message) => logger.Info(message);\n\n        public void LogWarn(string message) => logger.Warn(message);\n    }\n}"
  },
  {
    "path": "Part 5/AccountOwnerServer/LoggerService/LoggerService.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NLog.Extensions.Logging\" Version=\"5.3.15\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Repository/AccountRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\n\nnamespace Repository\n{\n    public class AccountRepository : RepositoryBase<Account>, IAccountRepository \n    { \n        public AccountRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        } \n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Repository/OwnerRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace Repository\n{\n    public class OwnerRepository : RepositoryBase<Owner>, IOwnerRepository \n    { \n        public OwnerRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        }\n\n        public IEnumerable<Owner> GetAllOwners()\n        {\n            return FindAll()\n                .OrderBy(ow => ow.Name)\n                .ToList();\n        }\n\n        public Owner GetOwnerById(Guid ownerId)\n        {\n            return FindByCondition(owner => owner.Id.Equals(ownerId))\n                .FirstOrDefault();\n        }\n\n        public Owner GetOwnerWithDetails(Guid ownerId)\n        {\n            return FindByCondition(owner => owner.Id.Equals(ownerId))\n                .Include(ac => ac.Accounts)\n                .FirstOrDefault();\n        }\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Repository/Repository.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Repository/RepositoryBase.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Microsoft.EntityFrameworkCore;\nusing System.Linq.Expressions;\n\nnamespace Repository\n{\n    public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class\n    {\n        protected RepositoryContext RepositoryContext { get; set; } \n        public RepositoryBase(RepositoryContext repositoryContext) \n        {\n            RepositoryContext = repositoryContext; \n        }\n\n        public IQueryable<T> FindAll() => RepositoryContext.Set<T>().AsNoTracking();\n\n        public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression) => \n            RepositoryContext.Set<T>().Where(expression).AsNoTracking();\n\n        public void Create(T entity) => RepositoryContext.Set<T>().Add(entity);\n\n        public void Update(T entity) => RepositoryContext.Set<T>().Update(entity);\n\n        public void Delete(T entity) => RepositoryContext.Set<T>().Remove(entity);\n    }\n}\n"
  },
  {
    "path": "Part 5/AccountOwnerServer/Repository/RepositoryWrapper.cs",
    "content": "﻿using Contracts;\nusing Entities;\n\nnamespace Repository\n{\n    public class RepositoryWrapper : IRepositoryWrapper \n    { \n        private RepositoryContext _repoContext; \n        private IOwnerRepository _owner; \n        private IAccountRepository _account; \n        public IOwnerRepository Owner \n        { \n            get \n            { \n                if (_owner == null) \n                { \n                    _owner = new OwnerRepository(_repoContext); \n                } \n                return _owner; \n            } \n        } \n        \n        public IAccountRepository Account \n        { \n            get \n            { \n                if (_account == null) \n                { \n                    _account = new AccountRepository(_repoContext); \n                } \n                return _account; \n            } \n        } \n        \n        public RepositoryWrapper(RepositoryContext repositoryContext) \n        { \n            _repoContext = repositoryContext; \n        } \n        \n        public void Save() \n        {\n            _repoContext.SaveChanges();\n        } \n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/AccountOwnerServer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"AutoMapper\" Version=\"13.0.1\" />\n    <PackageReference Include=\"Pomelo.EntityFrameworkCore.MySql\" Version=\"9.0.0-preview.2.efcore.9.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\LoggerService\\LoggerService.csproj\" />\n    <ProjectReference Include=\"..\\Repository\\Repository.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/Controllers/OwnerController.cs",
    "content": "﻿using AutoMapper;\nusing Contracts;\nusing Entities.DataTransferObjects;\nusing Entities.Models;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace AccountOwnerServer.Controllers\n{\n    [Route(\"api/owner\")]\n    [ApiController]\n    public class OwnerController : ControllerBase\n    {\n        private ILoggerManager _logger; \n        private IRepositoryWrapper _repository;\n        private IMapper _mapper;\n        \n        public OwnerController(ILoggerManager logger, IRepositoryWrapper repository, IMapper mapper) \n        { \n            _logger = logger; \n            _repository = repository; \n            _mapper = mapper;\n        }\n\n        [HttpGet] \n        public IActionResult GetAllOwners() \n        { \n            try \n            { \n                var owners = _repository.Owner.GetAllOwners(); \n                _logger.LogInfo($\"Returned all owners from database.\");\n\n                var ownersResult = _mapper.Map<IEnumerable<OwnerDto>>(owners);\n                return Ok(ownersResult); \n            } \n            catch (Exception ex) \n            { \n                _logger.LogError($\"Something went wrong inside GetAllOwners action: {ex.Message}\"); \n                \n                return StatusCode(500, \"Internal server error\"); \n            } \n        }\n\n        [HttpGet(\"{id}\", Name = \"OwnerById\")]\n        public IActionResult GetOwnerById(Guid id)\n        {\n            try\n            {\n                var owner = _repository.Owner.GetOwnerById(id);\n                if (owner is null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n                else\n                {\n                    _logger.LogInfo($\"Returned owner with id: {id}\");\n\n                    var ownerResult = _mapper.Map<OwnerDto>(owner);\n                    return Ok(ownerResult);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside GetOwnerById action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n\n        [HttpGet(\"{id}/account\")]\n        public IActionResult GetOwnerWithDetails(Guid id)\n        {\n            try\n            {\n                var owner = _repository.Owner.GetOwnerWithDetails(id);\n                if (owner == null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n                else\n                {\n                    _logger.LogInfo($\"Returned owner with details for id: {id}\");\n\n                    var ownerResult = _mapper.Map<OwnerDto>(owner);\n                    return Ok(ownerResult);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside GetOwnerWithDetails action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n\n        [HttpPost]\n        public IActionResult CreateOwner([FromBody] OwnerForCreationDto owner)\n        {\n            try\n            {\n                if (owner is null)\n                {\n                    _logger.LogError(\"Owner object sent from client is null.\");\n                    return BadRequest(\"Owner object is null\");\n                }\n\n                if (!ModelState.IsValid)\n                {\n                    _logger.LogError(\"Invalid owner object sent from client.\");\n                    return BadRequest(\"Invalid model object\");\n                }\n\n                var ownerEntity = _mapper.Map<Owner>(owner);\n\n                _repository.Owner.CreateOwner(ownerEntity);\n                _repository.Save();\n\n                var createdOwner = _mapper.Map<OwnerDto>(ownerEntity);\n\n                return CreatedAtRoute(\"OwnerById\", new { id = createdOwner.Id }, createdOwner);\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside CreateOwner action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n\n        [HttpPut(\"{id}\")]\n        public IActionResult UpdateOwner(Guid id, [FromBody] OwnerForUpdateDto owner)\n        {\n            try\n            {\n                if (owner is null)\n                {\n                    _logger.LogError(\"Owner object sent from client is null.\");\n                    return BadRequest(\"Owner object is null\");\n                }\n\n                if (!ModelState.IsValid)\n                {\n                    _logger.LogError(\"Invalid owner object sent from client.\");\n                    return BadRequest(\"Invalid model object\");\n                }\n\n                var ownerEntity = _repository.Owner.GetOwnerById(id);\n                if (ownerEntity is null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n\n                _mapper.Map(owner, ownerEntity);\n\n                _repository.Owner.UpdateOwner(ownerEntity);\n                _repository.Save();\n\n                return NoContent();\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside UpdateOwner action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n\n        [HttpDelete(\"{id}\")]\n        public IActionResult DeleteOwner(Guid id)\n        {\n            try\n            {\n                var owner = _repository.Owner.GetOwnerById(id);\n                if (owner == null)\n                {\n                    _logger.LogError($\"Owner with id: {id}, hasn't been found in db.\");\n                    return NotFound();\n                }\n\n                if (_repository.Account.AccountsByOwner(id).Any())\n                {\n                    _logger.LogError($\"Cannot delete owner with id: {id}. It has related accounts. Delete those accounts first\");\n                    return BadRequest(\"Cannot delete owner. It has related accounts. Delete those accounts first\");\n                }\n\n                _repository.Owner.DeleteOwner(owner);\n                _repository.Save();\n\n                return NoContent();\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError($\"Something went wrong inside DeleteOwner action: {ex.Message}\");\n                return StatusCode(500, \"Internal server error\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/Extensions/ServiceExtensions.cs",
    "content": "﻿using Contracts;\nusing LoggerService;\nusing Microsoft.EntityFrameworkCore;\nusing Entities;\nusing Repository;\n\nnamespace AccountOwnerServer.Extensions\n{\n    public static class ServiceExtensions\n    {\n        public static void ConfigureCors(this IServiceCollection services)\n        {\n            services.AddCors(options =>\n            {\n                options.AddPolicy(\"CorsPolicy\",\n                    builder => builder.AllowAnyOrigin()\n                    .AllowAnyMethod()\n                    .AllowAnyHeader());\n            });\n        }\n\n        public static void ConfigureIISIntegration(this IServiceCollection services)\n        {\n            services.Configure<IISOptions>(options =>\n            {\n\n            });\n        }\n\n        public static void ConfigureLoggerService(this IServiceCollection services) \n        {\n            services.AddSingleton<ILoggerManager, LoggerManager>(); \n        }\n\n        public static void ConfigureMySqlContext(this IServiceCollection services, IConfiguration config)\n        {\n            var connectionString = config[\"mysqlconnection:connectionString\"];\n\n            services.AddDbContext<RepositoryContext>(o => o.UseMySql(connectionString, \n                MySqlServerVersion.LatestSupportedServerVersion));\n        }\n\n        public static void ConfigureRepositoryWrapper(this IServiceCollection services) \n        { \n            services.AddScoped<IRepositoryWrapper, RepositoryWrapper>(); \n        }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/MappingProfile.cs",
    "content": "﻿using AutoMapper;\nusing Entities.DataTransferObjects;\nusing Entities.Models;\nusing System.Linq;\n\nnamespace AccountOwnerServer\n{\n    public class MappingProfile : Profile\n    {\n        public MappingProfile()\n        {\n            CreateMap<Owner, OwnerDto>();\n\n            CreateMap<Account, AccountDto>();\n\n            CreateMap<OwnerForCreationDto, Owner>();\n\n            CreateMap<OwnerForUpdateDto, Owner>();\n        }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/Program.cs",
    "content": "using AccountOwnerServer.Extensions;\nusing Microsoft.AspNetCore.HttpOverrides;\nusing NLog;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nLogManager.Setup().LoadConfigurationFromFile(string.Concat(Directory.GetCurrentDirectory(), \"/nlog.config\"));\n\nbuilder.Services.ConfigureCors(); \nbuilder.Services.ConfigureIISIntegration();\nbuilder.Services.ConfigureLoggerService();\nbuilder.Services.ConfigureMySqlContext(builder.Configuration);\nbuilder.Services.ConfigureRepositoryWrapper();\nbuilder.Services.AddAutoMapper(typeof(Program));\n\nbuilder.Services.AddControllers();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment()) \n    app.UseDeveloperExceptionPage(); \nelse \n    app.UseHsts();\n\napp.UseHttpsRedirection();\n\napp.UseStaticFiles();\n\napp.UseForwardedHeaders(new ForwardedHeadersOptions \n{ \n    ForwardedHeaders = ForwardedHeaders.All \n}); \n\napp.UseCors(\"CorsPolicy\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/Properties/launchSettings.json",
    "content": "﻿{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:40700\",\n      \"sslPort\": 44360\n    }\n  },\n  \"profiles\": {\n    \"AccountOwnerServer\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"applicationUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": false,\n      \"launchUrl\": \"weatherforecast\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"mysqlconnection\": {\n    \"connectionString\": \"server=localhost;userid=root;password=yourpass;database=accountowner;\"\n  },\n    \"AllowedHosts\": \"*\"\n  }\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer/nlog.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      autoReload=\"true\"\n      internalLogLevel=\"Trace\"\n      internalLogFile=\"d:Projects\\Blog-AccountOwner\\Project\\internal_logs\\internallog.txt\">\n\n  <targets>\n    <target name=\"logfile\" xsi:type=\"File\"\n            fileName=\"d:/Projects/Blog-AccountOwner/Project/logs/${shortdate}_logfile.txt\"\n            layout=\"${longdate} ${level:uppercase=true} ${message}\"/>\n  </targets>\n\n  <rules>\n    <logger name=\"*\" minlevel=\"Debug\" writeTo=\"logfile\" />\n  </rules>\n</nlog>"
  },
  {
    "path": "Part 6/AccountOwnerServer/AccountOwnerServer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32210.238\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AccountOwnerServer\", \"AccountOwnerServer\\AccountOwnerServer.csproj\", \"{0213FB50-5C53-4C34-8B2C-E515C7DC2579}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Contracts\", \"Contracts\\Contracts.csproj\", \"{B731D3C2-9A89-40E4-B96B-AA300B4195BB}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LoggerService\", \"LoggerService\\LoggerService.csproj\", \"{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Entities\", \"Entities\\Entities.csproj\", \"{16AAE663-A20E-493D-9087-F4F4016F6216}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Repository\", \"Repository\\Repository.csproj\", \"{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0213FB50-5C53-4C34-8B2C-E515C7DC2579}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B731D3C2-9A89-40E4-B96B-AA300B4195BB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CEC76F5-80AF-4B37-B6F1-94A743E5C748}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{16AAE663-A20E-493D-9087-F4F4016F6216}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A0C0D726-5224-4B8F-8C05-BB2C12A78D9B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F8E1F895-37AB-455B-8D05-ED495BE48F88}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/Contracts.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/IAccountRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IAccountRepository\n    {\n        IEnumerable<Account> AccountsByOwner(Guid ownerId);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/ILoggerManager.cs",
    "content": "﻿namespace Contracts\n{\n    public interface ILoggerManager\n    {\n        void LogInfo(string message);\n        void LogWarn(string message);\n        void LogDebug(string message);\n        void LogError(string message);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/IOwnerRepository.cs",
    "content": "﻿using Entities.Models;\n\nnamespace Contracts\n{\n    public interface IOwnerRepository\n    {\n        IEnumerable<Owner> GetAllOwners();\n        Owner GetOwnerById(Guid ownerId);\n        Owner GetOwnerWithDetails(Guid ownerId);\n        void CreateOwner(Owner owner);\n        void UpdateOwner(Owner owner);\n        void DeleteOwner(Owner owner);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/IRepositoryBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryBase<T>\n    {\n        IQueryable<T> FindAll(); \n        IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression); \n        void Create(T entity); \n        void Update(T entity); \n        void Delete(T entity);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Contracts/IRepositoryWrapper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Contracts\n{\n    public interface IRepositoryWrapper \n    { \n        IOwnerRepository Owner { get; } \n        IAccountRepository Account { get; } \n        void Save(); \n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/DataTransferObjects/AccountDto.cs",
    "content": "﻿using System;\n\nnamespace Entities.DataTransferObjects\n{\n    public class AccountDto\n    {\n        public Guid Id { get; set; }\n        public DateTime DateCreated { get; set; }\n        public string? AccountType { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/DataTransferObjects/OwnerDto.cs",
    "content": "﻿namespace Entities.DataTransferObjects\n{\n    public class OwnerDto\n    {\n        public Guid Id { get; set; }\n        public string? Name { get; set; }\n        public DateTime DateOfBirth { get; set; }\n        public string? Address { get; set; }\n\n        public IEnumerable<AccountDto>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/DataTransferObjects/OwnerForCreationDto.cs",
    "content": "﻿using System;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace Entities.DataTransferObjects\n{\n    public class OwnerForCreationDto\n    {\n        [Required(ErrorMessage = \"Name is required\")]\n        [StringLength(60, ErrorMessage = \"Name can't be longer than 60 characters\")]\n        public string? Name { get; set; }\n\n        [Required(ErrorMessage = \"Date of birth is required\")]\n        public DateTime DateOfBirth { get; set; }\n\n        [Required(ErrorMessage = \"Address is required\")]\n        [StringLength(100, ErrorMessage = \"Address cannot be loner then 100 characters\")]\n        public string? Address { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/DataTransferObjects/OwnerForUpdateDto.cs",
    "content": "﻿using System;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace Entities.DataTransferObjects\n{\n    public class OwnerForUpdateDto\n    {\n        [Required(ErrorMessage = \"Name is required\")]\n        [StringLength(60, ErrorMessage = \"Name can't be longer than 60 characters\")]\n        public string Name { get; set; }\n\n        [Required(ErrorMessage = \"Date of birth is required\")]\n        public DateTime DateOfBirth { get; set; }\n\n        [Required(ErrorMessage = \"Address is required\")]\n        [StringLength(100, ErrorMessage = \"Address cannot be loner then 100 characters\")]\n        public string Address { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/Entities.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore\" Version=\"9.0.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/Models/Account.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"account\")] \n    public class Account \n    {\n        [Column(\"AccountId\")]\n        public Guid Id { get; set; }\n\n        [Required(ErrorMessage = \"Date created is required\")] \n        public DateTime DateCreated { get; set; }\n\n        [Required(ErrorMessage = \"Account type is required\")] \n        public string? AccountType { get; set; }\n\n        [ForeignKey(nameof(Owner))]\n        public Guid OwnerId { get; set; }\n        public Owner? Owner { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/Models/Owner.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Entities.Models\n{\n    [Table(\"owner\")] \n    public class Owner \n    {\n        [Column(\"OwnerId\")]\n        public Guid Id { get; set; }\n\n        [Required(ErrorMessage = \"Name is required\")] \n        [StringLength(60, ErrorMessage = \"Name can't be longer than 60 characters\")] \n        public string? Name { get; set; }\n\n        [Required(ErrorMessage = \"Date of birth is required\")] \n        public DateTime DateOfBirth { get; set; }\n\n        [Required(ErrorMessage = \"Address is required\")] \n        [StringLength(100, ErrorMessage = \"Address cannot be loner then 100 characters\")] \n        public string? Address { get; set; }\n\n        public ICollection<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Entities/RepositoryContext.cs",
    "content": "﻿using Entities.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace Entities\n{\n    public class RepositoryContext : DbContext\n    {\n        public RepositoryContext(DbContextOptions options) \n            : base(options) \n        { \n        }\n\n        public DbSet<Owner>? Owners { get; set; }\n        public DbSet<Account>? Accounts { get; set; }\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/LoggerService/LoggerManager.cs",
    "content": "﻿using Contracts;\nusing NLog;\n\nnamespace LoggerService\n{\n    public class LoggerManager : ILoggerManager\n    {\n        private static ILogger logger = LogManager.GetCurrentClassLogger();\n\n        public void LogDebug(string message) => logger.Debug(message);\n\n        public void LogError(string message) => logger.Error(message);\n\n        public void LogInfo(string message) => logger.Info(message);\n\n        public void LogWarn(string message) => logger.Warn(message);\n    }\n}"
  },
  {
    "path": "Part 6/AccountOwnerServer/LoggerService/LoggerService.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NLog.Extensions.Logging\" Version=\"5.3.15\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Repository/AccountRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\n\nnamespace Repository\n{\n    public class AccountRepository : RepositoryBase<Account>, IAccountRepository \n    { \n        public AccountRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        }\n\n        public IEnumerable<Account> AccountsByOwner(Guid ownerId) =>\n            FindByCondition(a => a.OwnerId.Equals(ownerId)).ToList();\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Repository/OwnerRepository.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Entities.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace Repository\n{\n    public class OwnerRepository : RepositoryBase<Owner>, IOwnerRepository \n    { \n        public OwnerRepository(RepositoryContext repositoryContext) \n            : base(repositoryContext) \n        { \n        }\n\n        public IEnumerable<Owner> GetAllOwners()\n        {\n            return FindAll()\n                .OrderBy(ow => ow.Name)\n                .ToList();\n        }\n\n        public Owner GetOwnerById(Guid ownerId)\n        {\n            return FindByCondition(owner => owner.Id.Equals(ownerId))\n                .FirstOrDefault();\n        }\n\n        public Owner GetOwnerWithDetails(Guid ownerId)\n        {\n            return FindByCondition(owner => owner.Id.Equals(ownerId))\n                .Include(ac => ac.Accounts)\n                .FirstOrDefault();\n        }\n\n        public void CreateOwner(Owner owner) => Create(owner);\n\n        public void UpdateOwner(Owner owner) => Update(owner);\n\n        public void DeleteOwner(Owner owner) => Delete(owner);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Repository/Repository.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Contracts\\Contracts.csproj\" />\n    <ProjectReference Include=\"..\\Entities\\Entities.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Repository/RepositoryBase.cs",
    "content": "﻿using Contracts;\nusing Entities;\nusing Microsoft.EntityFrameworkCore;\nusing System.Linq.Expressions;\n\nnamespace Repository\n{\n    public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class\n    {\n        protected RepositoryContext RepositoryContext { get; set; } \n        public RepositoryBase(RepositoryContext repositoryContext) \n        {\n            RepositoryContext = repositoryContext; \n        }\n\n        public IQueryable<T> FindAll() => RepositoryContext.Set<T>().AsNoTracking();\n\n        public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression) => \n            RepositoryContext.Set<T>().Where(expression).AsNoTracking();\n\n        public void Create(T entity) => RepositoryContext.Set<T>().Add(entity);\n\n        public void Update(T entity) => RepositoryContext.Set<T>().Update(entity);\n\n        public void Delete(T entity) => RepositoryContext.Set<T>().Remove(entity);\n    }\n}\n"
  },
  {
    "path": "Part 6/AccountOwnerServer/Repository/RepositoryWrapper.cs",
    "content": "﻿using Contracts;\nusing Entities;\n\nnamespace Repository\n{\n    public class RepositoryWrapper : IRepositoryWrapper \n    { \n        private RepositoryContext _repoContext; \n        private IOwnerRepository _owner; \n        private IAccountRepository _account; \n        public IOwnerRepository Owner \n        { \n            get \n            { \n                if (_owner == null) \n                { \n                    _owner = new OwnerRepository(_repoContext); \n                } \n                return _owner; \n            } \n        } \n        \n        public IAccountRepository Account \n        { \n            get \n            { \n                if (_account == null) \n                { \n                    _account = new AccountRepository(_repoContext); \n                } \n                return _account; \n            } \n        } \n        \n        public RepositoryWrapper(RepositoryContext repositoryContext) \n        { \n            _repoContext = repositoryContext; \n        } \n        \n        public void Save() \n        {\n            _repoContext.SaveChanges();\n        } \n    }\n}\n"
  },
  {
    "path": "README.md",
    "content": "# .NET-Core-Series\nCode Maze .NET Core Series\nhttps://code-maze.com/net-core-series/\n"
  }
]