Compare commits
5 Commits
main
...
c805ce20a8
| Author | SHA1 | Date | |
|---|---|---|---|
| c805ce20a8 | |||
| ad998e0499 | |||
| 8611427557 | |||
| d5aeb0a06e | |||
| 5aa09670bc |
67
AB-API.sln
Normal file
67
AB-API.sln
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.4.33205.214
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AB.WEB", "AB-API\AB.WEB.csproj", "{45855EEB-EA31-476F-A020-1A3B71AD725A}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AB.Domain", "AB.Domain\AB.Domain.csproj", "{9F60492C-A480-4056-983D-0F6B1A1ABD1B}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AB.Services", "AB.Services\AB.Services.csproj", "{74E74C3E-8A8E-4771-894B-A2919B3422E5}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AB.Contracts", "AB.Contracts\AB.Contracts.csproj", "{9319695E-2237-49E2-80CD-761F53364421}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AB.Services.Abstractions", "AB.Services.Abstractions\AB.Services.Abstractions.csproj", "{4E3D1E97-AD83-4F66-825E-105441AF4E15}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{AD8DD52C-57EC-455A-9A8D-E50009FCE608}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AB.Persistence", "AB.Persistence\AB.Persistence.csproj", "{BF2F36D4-6EF4-43AB-840F-0336EB1723EC}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AB.API", "AB.API\AB.API.csproj", "{7595A349-8990-467D-8122-8E79931359DC}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{45855EEB-EA31-476F-A020-1A3B71AD725A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{45855EEB-EA31-476F-A020-1A3B71AD725A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{45855EEB-EA31-476F-A020-1A3B71AD725A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{45855EEB-EA31-476F-A020-1A3B71AD725A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9F60492C-A480-4056-983D-0F6B1A1ABD1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9F60492C-A480-4056-983D-0F6B1A1ABD1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9F60492C-A480-4056-983D-0F6B1A1ABD1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9F60492C-A480-4056-983D-0F6B1A1ABD1B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{74E74C3E-8A8E-4771-894B-A2919B3422E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{74E74C3E-8A8E-4771-894B-A2919B3422E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{74E74C3E-8A8E-4771-894B-A2919B3422E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{74E74C3E-8A8E-4771-894B-A2919B3422E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9319695E-2237-49E2-80CD-761F53364421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9319695E-2237-49E2-80CD-761F53364421}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9319695E-2237-49E2-80CD-761F53364421}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9319695E-2237-49E2-80CD-761F53364421}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{4E3D1E97-AD83-4F66-825E-105441AF4E15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4E3D1E97-AD83-4F66-825E-105441AF4E15}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4E3D1E97-AD83-4F66-825E-105441AF4E15}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{4E3D1E97-AD83-4F66-825E-105441AF4E15}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{BF2F36D4-6EF4-43AB-840F-0336EB1723EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{BF2F36D4-6EF4-43AB-840F-0336EB1723EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{BF2F36D4-6EF4-43AB-840F-0336EB1723EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{BF2F36D4-6EF4-43AB-840F-0336EB1723EC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7595A349-8990-467D-8122-8E79931359DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7595A349-8990-467D-8122-8E79931359DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7595A349-8990-467D-8122-8E79931359DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7595A349-8990-467D-8122-8E79931359DC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{BF2F36D4-6EF4-43AB-840F-0336EB1723EC} = {AD8DD52C-57EC-455A-9A8D-E50009FCE608}
|
||||||
|
{7595A349-8990-467D-8122-8E79931359DC} = {AD8DD52C-57EC-455A-9A8D-E50009FCE608}
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {C7D1722E-5C50-4F16-BA7D-79977DD1D621}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
24
AB-API/AB.WEB.csproj
Normal file
24
AB-API/AB.WEB.csproj
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<RootNamespace>AB_API</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AB.API\AB.API.csproj" />
|
||||||
|
<ProjectReference Include="..\AB.Persistence\AB.Persistence.csproj" />
|
||||||
|
<ProjectReference Include="..\AB.Services\AB.Services.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
44
AB-API/Program.cs
Normal file
44
AB-API/Program.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using AB.Domain.Repositories;
|
||||||
|
using AB.Persistence;
|
||||||
|
using AB.Persistence.Repos;
|
||||||
|
using AB.Services;
|
||||||
|
using AB.Services.Abstractions;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
|
||||||
|
builder.Services.AddControllers().AddApplicationPart(typeof(AB.API.AssemblyReference).Assembly);
|
||||||
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
|
builder.Services.AddSwaggerGen(c => c.SwaggerDoc("v1", new OpenApiInfo { Title = "AB-API", Version = "v1" , Description = "An Api for the AB-Application"}));
|
||||||
|
|
||||||
|
builder.Services.AddScoped<ICustomerService, CustomerService>();
|
||||||
|
builder.Services.AddScoped<ICustomerRepository, CustomerRepository>();
|
||||||
|
|
||||||
|
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
|
||||||
|
|
||||||
|
builder.Services.AddDbContextPool<RepoDbContext>(builder =>
|
||||||
|
{
|
||||||
|
builder.UseInMemoryDatabase("test");
|
||||||
|
});
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.Run();
|
||||||
31
AB-API/Properties/launchSettings.json
Normal file
31
AB-API/Properties/launchSettings.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:25034",
|
||||||
|
"sslPort": 44354
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"AB_API": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"applicationUrl": "https://localhost:7196;http://localhost:5286",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
AB-API/appsettings.Development.json
Normal file
8
AB-API/appsettings.Development.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
AB-API/appsettings.json
Normal file
9
AB-API/appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
||||||
17
AB.API/AB.API.csproj
Normal file
17
AB.API/AB.API.csproj
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AB.Services.Abstractions\AB.Services.Abstractions.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
12
AB.API/AssemblyReference.cs
Normal file
12
AB.API/AssemblyReference.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.API
|
||||||
|
{
|
||||||
|
public class AssemblyReference
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
51
AB.API/Controllers/BusinessPartner/CustomerController.cs
Normal file
51
AB.API/Controllers/BusinessPartner/CustomerController.cs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
using AB.Contracts;
|
||||||
|
using AB.Services.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace AB.API.Controllers.BusinessPartner;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/customers")]
|
||||||
|
public class CustomerController : ControllerBase
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly ICustomerService _customerService;
|
||||||
|
|
||||||
|
public CustomerController(ICustomerService customerService)
|
||||||
|
{
|
||||||
|
_customerService = customerService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<ActionResult<IEnumerable<CustomerDto>>> GetCustomers(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var customers = await _customerService.GetAllAsync(cancellationToken);
|
||||||
|
|
||||||
|
return Ok(customers);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("{customerId:guid}")]
|
||||||
|
public async Task<ActionResult<CustomerDto>> GetCustomerById(Guid customerId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var customer = await _customerService.GetByIdAsync(customerId, cancellationToken);
|
||||||
|
|
||||||
|
return Ok(customer);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<CreatedAtActionResult> CreateCustomer([FromBody] CustomerForCreationDto customerForCreation)
|
||||||
|
{
|
||||||
|
var customerDto = await _customerService.CreateAsync(customerForCreation);
|
||||||
|
|
||||||
|
return CreatedAtAction(nameof(CreateCustomer), new { customerId = customerDto.Id }, customerDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("{customerId:guid}")]
|
||||||
|
public async Task<NoContentResult> DeleteCustomer(Guid customerId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await _customerService.DeleteAsync(customerId, cancellationToken);
|
||||||
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
48
AB.API/Controllers/BusinessPartner/SupplierController.cs
Normal file
48
AB.API/Controllers/BusinessPartner/SupplierController.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using AB.Contracts;
|
||||||
|
using AB.Services.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace AB.API.Controllers.BusinessPartner;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/suppliers")]
|
||||||
|
public class SupplierController : ControllerBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public readonly ISupplierService _supplierService;
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<ActionResult<IEnumerable<SupplierDto>>> GetSupplieres(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var suppliers = await _supplierService.GetAllAsync(cancellationToken);
|
||||||
|
|
||||||
|
return Ok(suppliers);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("{supplierId:guid}")]
|
||||||
|
public async Task<ActionResult<SupplierDto>> GetSupplierById(Guid supplierId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var supplierDto = await _supplierService.GetSupplierByIdAsync(supplierId, cancellationToken);
|
||||||
|
|
||||||
|
return Ok(supplierDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<CreatedAtActionResult> CreateSupplier([FromBody] SupplierForCreationDto supplierForCreation)
|
||||||
|
{
|
||||||
|
var supplierDto = await _supplierService.CreateAsync(supplierForCreation);
|
||||||
|
|
||||||
|
return CreatedAtAction(nameof(CreateSupplier), new { id = supplierDto.Id }, supplierDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("{supplierId:guid}")]
|
||||||
|
public async Task<NoContentResult> DeleteSupplier(Guid supplierId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await _supplierService.DeleteAsync(supplierId, cancellationToken);
|
||||||
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
9
AB.Contracts/AB.Contracts.csproj
Normal file
9
AB.Contracts/AB.Contracts.csproj
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
20
AB.Contracts/CustomerDto.cs
Normal file
20
AB.Contracts/CustomerDto.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
namespace AB.Contracts;
|
||||||
|
|
||||||
|
public class CustomerDto
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
public string Salutaion { get; set; }
|
||||||
|
|
||||||
|
public string Name1 { get; set; }
|
||||||
|
|
||||||
|
public string Name2 { get; set; }
|
||||||
|
|
||||||
|
public string Email { get; set; }
|
||||||
|
|
||||||
|
public string Iban { get; set; }
|
||||||
|
|
||||||
|
public string PhoneNumber { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
27
AB.Contracts/CustomerForCreationDto.cs
Normal file
27
AB.Contracts/CustomerForCreationDto.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Contracts;
|
||||||
|
|
||||||
|
public class CustomerForCreationDto
|
||||||
|
{
|
||||||
|
[Required]
|
||||||
|
public string Salutaion { get; set; }
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string Name1 { get; set; }
|
||||||
|
|
||||||
|
public string? Name2 { get; set; }
|
||||||
|
|
||||||
|
public string? Email { get; set; }
|
||||||
|
|
||||||
|
public string? Iban { get; set; }
|
||||||
|
|
||||||
|
public string? PhoneNumber { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
14
AB.Contracts/SupplierDto.cs
Normal file
14
AB.Contracts/SupplierDto.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Contracts;
|
||||||
|
|
||||||
|
public class SupplierDto
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
11
AB.Contracts/SupplierForCreationDto.cs
Normal file
11
AB.Contracts/SupplierForCreationDto.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Contracts;
|
||||||
|
|
||||||
|
public class SupplierForCreationDto
|
||||||
|
{
|
||||||
|
}
|
||||||
9
AB.Domain/AB.Domain.csproj
Normal file
9
AB.Domain/AB.Domain.csproj
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
26
AB.Domain/Entities/Customer.cs
Normal file
26
AB.Domain/Entities/Customer.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Entities;
|
||||||
|
|
||||||
|
public class Customer
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid CustomerId { get; set; }
|
||||||
|
|
||||||
|
public string Salutation { get; set; }
|
||||||
|
|
||||||
|
public string Name1 { get; set; }
|
||||||
|
|
||||||
|
public string Name2 { get; set; }
|
||||||
|
|
||||||
|
public string Email { get; set; }
|
||||||
|
|
||||||
|
public string Iban { get; set; }
|
||||||
|
|
||||||
|
public string PhoneNumber { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
13
AB.Domain/Entities/Product.cs
Normal file
13
AB.Domain/Entities/Product.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Entities;
|
||||||
|
|
||||||
|
public class Product
|
||||||
|
{
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
13
AB.Domain/Entities/Supplier.cs
Normal file
13
AB.Domain/Entities/Supplier.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Entities;
|
||||||
|
|
||||||
|
public class Supplier
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid SupplierId { get; set; }
|
||||||
|
}
|
||||||
16
AB.Domain/Exceptions/BusinessPartnerNotFoundException.cs
Normal file
16
AB.Domain/Exceptions/BusinessPartnerNotFoundException.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Exceptions;
|
||||||
|
|
||||||
|
public class BusinessPartnerNotFoundException : NotFoundException
|
||||||
|
{
|
||||||
|
|
||||||
|
public BusinessPartnerNotFoundException(Guid businessPartnerId)
|
||||||
|
: base ($"The BusinessPartner with the indetifier {businessPartnerId} was not found.")
|
||||||
|
{ }
|
||||||
|
|
||||||
|
}
|
||||||
19
AB.Domain/Exceptions/NotFoundException.cs
Normal file
19
AB.Domain/Exceptions/NotFoundException.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Exceptions;
|
||||||
|
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public abstract class NotFoundException : Exception
|
||||||
|
{
|
||||||
|
public NotFoundException() { }
|
||||||
|
public NotFoundException(string message) : base(message) { }
|
||||||
|
public NotFoundException(string message, Exception inner) : base(message, inner) { }
|
||||||
|
protected NotFoundException(
|
||||||
|
System.Runtime.Serialization.SerializationInfo info,
|
||||||
|
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
|
||||||
|
}
|
||||||
16
AB.Domain/Repositories/ICustomerRepository.cs
Normal file
16
AB.Domain/Repositories/ICustomerRepository.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using AB.Domain.Entities;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface ICustomerRepository
|
||||||
|
{
|
||||||
|
public Task<IEnumerable<Customer>> GetAllAsync(CancellationToken cancellationToken);
|
||||||
|
Task<Customer> GetByIdAsync(Guid customerId, CancellationToken cancellationToken);
|
||||||
|
void Insert(Customer customer);
|
||||||
|
void Remove(Customer customer);
|
||||||
|
}
|
||||||
11
AB.Domain/Repositories/ISupplierRepository.cs
Normal file
11
AB.Domain/Repositories/ISupplierRepository.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Domain.Repositories;
|
||||||
|
|
||||||
|
public class ISupplierRepository
|
||||||
|
{
|
||||||
|
}
|
||||||
6
AB.Domain/Repositories/IUnitOfWork.cs
Normal file
6
AB.Domain/Repositories/IUnitOfWork.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace AB.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IUnitOfWork
|
||||||
|
{
|
||||||
|
public Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
||||||
|
}
|
||||||
17
AB.Persistence/AB.Persistence.csproj
Normal file
17
AB.Persistence/AB.Persistence.csproj
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AB.Domain\AB.Domain.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
25
AB.Persistence/RepoDbContext.cs
Normal file
25
AB.Persistence/RepoDbContext.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using AB.Domain.Entities;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Persistence;
|
||||||
|
|
||||||
|
public sealed class RepoDbContext : DbContext
|
||||||
|
{
|
||||||
|
|
||||||
|
public RepoDbContext(DbContextOptions options)
|
||||||
|
: base (options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public DbSet<Customer> Customers { get; set; }
|
||||||
|
|
||||||
|
public DbSet<Supplier> Suppliers { get; set; }
|
||||||
|
|
||||||
|
public DbSet<Product> Products { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
36
AB.Persistence/Repos/CustomerRepository.cs
Normal file
36
AB.Persistence/Repos/CustomerRepository.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using AB.Domain.Entities;
|
||||||
|
using AB.Domain.Repositories;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace AB.Persistence.Repos;
|
||||||
|
|
||||||
|
public class CustomerRepository : ICustomerRepository
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly RepoDbContext _dbContext;
|
||||||
|
|
||||||
|
public CustomerRepository(RepoDbContext dbContext)
|
||||||
|
{
|
||||||
|
_dbContext = dbContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Customer>> GetAllAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return await _dbContext.Customers.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Customer> GetByIdAsync(Guid customerId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return await _dbContext.Customers.FirstOrDefaultAsync(x => x.CustomerId == customerId, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Insert(Customer customer)
|
||||||
|
{
|
||||||
|
_dbContext.Customers.Add(customer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Remove(Customer customer)
|
||||||
|
{
|
||||||
|
_dbContext.Customers.Remove(customer);
|
||||||
|
}
|
||||||
|
}
|
||||||
14
AB.Persistence/Repos/SupplierRepository.cs
Normal file
14
AB.Persistence/Repos/SupplierRepository.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Persistence.Repos;
|
||||||
|
|
||||||
|
public class SupplierRepository
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
19
AB.Persistence/Repos/UnitOfWork.cs
Normal file
19
AB.Persistence/Repos/UnitOfWork.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using AB.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace AB.Persistence.Repos;
|
||||||
|
|
||||||
|
public class UnitOfWork : IUnitOfWork
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly RepoDbContext _dbContext;
|
||||||
|
|
||||||
|
public UnitOfWork(RepoDbContext dbContext)
|
||||||
|
{
|
||||||
|
_dbContext = dbContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<int> SaveChangesAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return _dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
13
AB.Services.Abstractions/AB.Services.Abstractions.csproj
Normal file
13
AB.Services.Abstractions/AB.Services.Abstractions.csproj
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AB.Contracts\AB.Contracts.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
16
AB.Services.Abstractions/ICustomerService.cs
Normal file
16
AB.Services.Abstractions/ICustomerService.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using AB.Contracts;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AB.Services.Abstractions;
|
||||||
|
|
||||||
|
public interface ICustomerService
|
||||||
|
{
|
||||||
|
Task<CustomerDto> CreateAsync(CustomerForCreationDto customerForCreation, CancellationToken cancellationToken = default);
|
||||||
|
Task DeleteAsync(Guid customerId, CancellationToken cancellationToken);
|
||||||
|
Task<IEnumerable<CustomerDto>> GetAllAsync(CancellationToken cancellationToken);
|
||||||
|
Task<CustomerDto> GetByIdAsync(Guid customerId, CancellationToken cancellationToken);
|
||||||
|
}
|
||||||
11
AB.Services.Abstractions/ISupplierService.cs
Normal file
11
AB.Services.Abstractions/ISupplierService.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using AB.Contracts;
|
||||||
|
|
||||||
|
namespace AB.Services.Abstractions;
|
||||||
|
|
||||||
|
public interface ISupplierService
|
||||||
|
{
|
||||||
|
Task<SupplierDto> CreateAsync(SupplierForCreationDto supplierForCreation);
|
||||||
|
Task DeleteAsync(Guid supplierId, CancellationToken cancellationToken);
|
||||||
|
Task<IEnumerable<SupplierDto>> GetAllAsync(CancellationToken cancellationToken);
|
||||||
|
Task<SupplierDto> GetSupplierByIdAsync(Guid supplierId, CancellationToken cancellationToken);
|
||||||
|
}
|
||||||
14
AB.Services/AB.Services.csproj
Normal file
14
AB.Services/AB.Services.csproj
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AB.Domain\AB.Domain.csproj" />
|
||||||
|
<ProjectReference Include="..\AB.Services.Abstractions\AB.Services.Abstractions.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
99
AB.Services/CustomerService.cs
Normal file
99
AB.Services/CustomerService.cs
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
using AB.Contracts;
|
||||||
|
using AB.Domain.Entities;
|
||||||
|
using AB.Domain.Exceptions;
|
||||||
|
using AB.Domain.Repositories;
|
||||||
|
using AB.Services.Abstractions;
|
||||||
|
|
||||||
|
namespace AB.Services;
|
||||||
|
|
||||||
|
public class CustomerService : ICustomerService
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly ICustomerRepository _customerRepository;
|
||||||
|
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public CustomerService(ICustomerRepository customerRepository, IUnitOfWork unitOfWork)
|
||||||
|
{
|
||||||
|
_customerRepository = customerRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CustomerDto> CreateAsync(CustomerForCreationDto customerForCreation, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
var customer = new Customer
|
||||||
|
{
|
||||||
|
Salutation = customerForCreation.Salutaion,
|
||||||
|
Name1 = customerForCreation.Name1,
|
||||||
|
Name2 = (customerForCreation.Name2 is null) ? string.Empty : customerForCreation.Name2,
|
||||||
|
Email = (customerForCreation.Email is null) ? string.Empty : customerForCreation.Email,
|
||||||
|
PhoneNumber = (customerForCreation.PhoneNumber is null) ? string.Empty : customerForCreation.PhoneNumber,
|
||||||
|
Iban = (customerForCreation.Iban is null) ? string.Empty : customerForCreation.Iban,
|
||||||
|
};
|
||||||
|
|
||||||
|
_customerRepository.Insert(customer);
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
|
var customerDto = ConvertToCustomerDto(customer);
|
||||||
|
|
||||||
|
return customerDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(Guid customerId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var customer = await _customerRepository.GetByIdAsync(customerId, cancellationToken);
|
||||||
|
|
||||||
|
if (customer == null)
|
||||||
|
{
|
||||||
|
throw new BusinessPartnerNotFoundException(customerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
_customerRepository.Remove(customer);
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<CustomerDto>> GetAllAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var customers = await _customerRepository.GetAllAsync(cancellationToken);
|
||||||
|
|
||||||
|
var customerDtoList = customers.Select(customer =>
|
||||||
|
{
|
||||||
|
return ConvertToCustomerDto(customer);
|
||||||
|
});
|
||||||
|
|
||||||
|
return customerDtoList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CustomerDto> GetByIdAsync(Guid customerId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var customer = await _customerRepository.GetByIdAsync(customerId, cancellationToken);
|
||||||
|
|
||||||
|
if (customer is null)
|
||||||
|
{
|
||||||
|
throw new BusinessPartnerNotFoundException(customerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
var customerDto = ConvertToCustomerDto(customer);
|
||||||
|
|
||||||
|
return customerDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CustomerDto ConvertToCustomerDto(Customer customer)
|
||||||
|
{
|
||||||
|
var customerDto = new CustomerDto
|
||||||
|
{
|
||||||
|
Id = customer.CustomerId,
|
||||||
|
Salutaion = customer.Salutation,
|
||||||
|
Name1 = customer.Name1,
|
||||||
|
Name2 = customer.Name2,
|
||||||
|
Email = customer.Email,
|
||||||
|
PhoneNumber = customer.PhoneNumber,
|
||||||
|
Iban = customer.Iban,
|
||||||
|
};
|
||||||
|
return customerDto;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user