diff --git a/AB-API/AB.WEB.csproj b/AB-API/AB.WEB.csproj index 13d8260..387fc6d 100644 --- a/AB-API/AB.WEB.csproj +++ b/AB-API/AB.WEB.csproj @@ -12,7 +12,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/AB-API/Program.cs b/AB-API/Program.cs index 26edc72..aea83c9 100644 --- a/AB-API/Program.cs +++ b/AB-API/Program.cs @@ -5,12 +5,15 @@ using AB.Services; using AB.Services.Abstractions; using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; +using System.Text.Json.Serialization; var builder = WebApplication.CreateBuilder(args); // Add services to the container. -builder.Services.AddControllers().AddApplicationPart(typeof(AB.API.AssemblyReference).Assembly); +builder.Services.AddControllers().AddApplicationPart(typeof(AB.API.AssemblyReference).Assembly) + .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); + // 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" })); diff --git a/AB.API/Controllers/BusinessPartner/SupplierController.cs b/AB.API/Controllers/BusinessPartner/SupplierController.cs index b0abe21..0977013 100644 --- a/AB.API/Controllers/BusinessPartner/SupplierController.cs +++ b/AB.API/Controllers/BusinessPartner/SupplierController.cs @@ -28,9 +28,9 @@ public class SupplierController : ControllerBase } [HttpPost] - public async Task CreateSupplier([FromBody] SupplierForCreationDto supplierForCreation) + public async Task CreateSupplier([FromBody] SupplierForCreationDto supplierForCreation, CancellationToken cancellationToken) { - var supplierDto = await _supplierService.CreateAsync(supplierForCreation); + var supplierDto = await _supplierService.CreateAsync(supplierForCreation, cancellationToken); return CreatedAtAction(nameof(CreateSupplier), new { id = supplierDto.Id }, supplierDto); } diff --git a/AB.Contracts/ContactPersonDto.cs b/AB.Contracts/ContactPersonDto.cs new file mode 100644 index 0000000..43ebc61 --- /dev/null +++ b/AB.Contracts/ContactPersonDto.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AB.Contracts; + +public class ContactPersonDto +{ + + + + public string Name { get; set; } + + public string Salutation { get; set; } + + public string PhoneNumer { get; set; } + + public string Email { get; set; } + +} + diff --git a/AB.Contracts/CustomerDto.cs b/AB.Contracts/CustomerDto.cs index b73c023..0846bf6 100644 --- a/AB.Contracts/CustomerDto.cs +++ b/AB.Contracts/CustomerDto.cs @@ -16,5 +16,4 @@ public class CustomerDto public string Iban { get; set; } public string PhoneNumber { get; set; } - } diff --git a/AB.Contracts/PreferredCommunicationType.cs b/AB.Contracts/PreferredCommunicationType.cs new file mode 100644 index 0000000..bfbe611 --- /dev/null +++ b/AB.Contracts/PreferredCommunicationType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace AB.Contracts +{ + public enum PreferredCommunicationType + { + [EnumMember(Value = "Email")] + Email, + + [EnumMember(Value = "Postal")] + Postal, + + [EnumMember(Value = "Phone")] + Phone, + + [EnumMember(Value = "Phone")] + Fax + } +} diff --git a/AB.Contracts/SupplierForCreationDto.cs b/AB.Contracts/SupplierForCreationDto.cs index 04c7b74..fd7a7aa 100644 --- a/AB.Contracts/SupplierForCreationDto.cs +++ b/AB.Contracts/SupplierForCreationDto.cs @@ -1,11 +1,27 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.Serialization; namespace AB.Contracts; public class SupplierForCreationDto { + + public string Salutation { get; set; } + + public string Name1 { get; set; } + + public string Name2 { get; set; } + + public string Email { get; set; } + + public string PhoneNumber { get; set; } + + public string TaxId { get; set; } + + [DataMember(Name = "PreferredCommunication", EmitDefaultValue = true)] + public PreferredCommunicationType PreferredCommunication { get; set; } + + public IEnumerable ContactPersons { get; set; } + + + } diff --git a/AB.Domain/Repositories/ICustomerRepository.cs b/AB.Domain/Repositories/ICustomerRepository.cs index 5365510..62f9d6d 100644 --- a/AB.Domain/Repositories/ICustomerRepository.cs +++ b/AB.Domain/Repositories/ICustomerRepository.cs @@ -10,7 +10,7 @@ namespace AB.Domain.Repositories; public interface ICustomerRepository { public Task> GetAllAsync(CancellationToken cancellationToken); - Task GetByIdAsync(Guid customerId, CancellationToken cancellationToken); - void Insert(Customer customer); - void Remove(Customer customer); + public Task GetByIdAsync(Guid customerId, CancellationToken cancellationToken); + public void Insert(Customer customer); + public void Remove(Customer customer); } diff --git a/AB.Domain/Repositories/ISupplierRepository.cs b/AB.Domain/Repositories/ISupplierRepository.cs index 7cd292a..7d3d5d2 100644 --- a/AB.Domain/Repositories/ISupplierRepository.cs +++ b/AB.Domain/Repositories/ISupplierRepository.cs @@ -1,11 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using AB.Domain.Entities; namespace AB.Domain.Repositories; -public class ISupplierRepository +public interface ISupplierRepository { + public Task> GetAllAsync(CancellationToken cancellationToken); + public Task GetByIdAsync(Guid supplierId, CancellationToken cancellationToken); + public void Insert(Supplier supplier); + public void Remove(Supplier supplier); } diff --git a/AB.Persistence/RepoDbContext.cs b/AB.Persistence/RepoDbContext.cs index 28a886c..ab8df82 100644 --- a/AB.Persistence/RepoDbContext.cs +++ b/AB.Persistence/RepoDbContext.cs @@ -1,10 +1,5 @@ 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; @@ -12,7 +7,7 @@ public sealed class RepoDbContext : DbContext { public RepoDbContext(DbContextOptions options) - : base (options) + : base(options) { } diff --git a/AB.Persistence/Repos/SupplierRepository.cs b/AB.Persistence/Repos/SupplierRepository.cs index 04d4a11..41c14c1 100644 --- a/AB.Persistence/Repos/SupplierRepository.cs +++ b/AB.Persistence/Repos/SupplierRepository.cs @@ -1,4 +1,7 @@ -using System; +using AB.Domain.Entities; +using AB.Domain.Repositories; +using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,9 +9,33 @@ using System.Threading.Tasks; namespace AB.Persistence.Repos; -public class SupplierRepository +public class SupplierRepository : ISupplierRepository { + private readonly RepoDbContext _dbContext; + public SupplierRepository(RepoDbContext dbContext) + { + _dbContext = dbContext; + } + public async Task> GetAllAsync(CancellationToken cancellationToken) + { + return await _dbContext.Suppliers.ToListAsync(cancellationToken); + } + public async Task GetByIdAsync(Guid supplierId, CancellationToken cancellationToken) + { + return await _dbContext.Suppliers.FirstOrDefaultAsync(x => x.SupplierId == supplierId, cancellationToken); + } + + public void Insert(Supplier supplier) + { + _dbContext.Add(supplier); + } + + public void Remove(Supplier supplier) + { + + _dbContext.Suppliers.Remove(supplier); + } } diff --git a/AB.Services.Abstractions/ISupplierService.cs b/AB.Services.Abstractions/ISupplierService.cs index e00decf..ba106d9 100644 --- a/AB.Services.Abstractions/ISupplierService.cs +++ b/AB.Services.Abstractions/ISupplierService.cs @@ -4,8 +4,8 @@ namespace AB.Services.Abstractions; public interface ISupplierService { - Task CreateAsync(SupplierForCreationDto supplierForCreation); - Task DeleteAsync(Guid supplierId, CancellationToken cancellationToken); - Task> GetAllAsync(CancellationToken cancellationToken); - Task GetSupplierByIdAsync(Guid supplierId, CancellationToken cancellationToken); + public Task CreateAsync(SupplierForCreationDto supplierForCreation, CancellationToken cancellationToken); + public Task DeleteAsync(Guid supplierId, CancellationToken cancellationToken); + public Task> GetAllAsync(CancellationToken cancellationToken); + public Task GetSupplierByIdAsync(Guid supplierId, CancellationToken cancellationToken); } diff --git a/AB.Services/CustomerService.cs b/AB.Services/CustomerService.cs index 8bb7e68..7bc45c0 100644 --- a/AB.Services/CustomerService.cs +++ b/AB.Services/CustomerService.cs @@ -21,8 +21,6 @@ public class CustomerService : ICustomerService public async Task CreateAsync(CustomerForCreationDto customerForCreation, CancellationToken cancellationToken = default) { - - var customer = new Customer { Salutation = customerForCreation.Salutaion, @@ -46,7 +44,7 @@ public class CustomerService : ICustomerService { var customer = await _customerRepository.GetByIdAsync(customerId, cancellationToken); - if (customer == null) + if (customer is null) { throw new BusinessPartnerNotFoundException(customerId); } @@ -122,7 +120,7 @@ public class CustomerService : ICustomerService public static void SetIfContains(T value, Customer customer, string propertyName) { - if (value is not null) + if (value is not null && !string.IsNullOrWhiteSpace(propertyName)) { customer.GetType().GetProperty(propertyName).SetValue(customer, value); diff --git a/AB.Services/SupplierService.cs b/AB.Services/SupplierService.cs new file mode 100644 index 0000000..faaf70b --- /dev/null +++ b/AB.Services/SupplierService.cs @@ -0,0 +1,87 @@ +using AB.Contracts; +using AB.Domain.Entities; +using AB.Domain.Exceptions; +using AB.Domain.Repositories; +using AB.Services.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AB.Services +{ + public class SupplierService : ISupplierService + { + + private readonly ISupplierRepository _supplierRepository; + + private readonly IUnitOfWork _unitOfWork; + + public SupplierService(ISupplierRepository supplierRepository, IUnitOfWork unitOfWork) + { + _supplierRepository = supplierRepository; + _unitOfWork = unitOfWork; + } + + public async Task CreateAsync(SupplierForCreationDto supplierForCreation, CancellationToken cancellationToken) + { + var supplier = new Supplier + { + + }; + + _supplierRepository.Insert(supplier); + + await _unitOfWork.SaveChangesAsync(cancellationToken); + + var supplierDto = ConvertToSupplierDto(supplier); + + return supplierDto; + } + + public async Task DeleteAsync(Guid supplierId, CancellationToken cancellationToken) + { + var supplier = await _supplierRepository.GetByIdAsync(supplierId, cancellationToken); + + if (supplier is null) + { + throw new BusinessPartnerNotFoundException(supplierId); + } + + _supplierRepository.Remove(supplier); + + await _unitOfWork.SaveChangesAsync(cancellationToken); + } + + public async Task> GetAllAsync(CancellationToken cancellationToken) + { + var supplierList = await _supplierRepository.GetAllAsync(cancellationToken); + + var supplierDtoList = supplierList.Select(supplier => + { + return ConvertToSupplierDto(supplier); + }); + + return supplierDtoList; + } + + public async Task GetSupplierByIdAsync(Guid supplierId, CancellationToken cancellationToken) + { + var supplier = await _supplierRepository.GetByIdAsync(supplierId, cancellationToken); + + var supplierDto = ConvertToSupplierDto(supplier); + + return supplierDto; + } + + private SupplierDto ConvertToSupplierDto(Supplier supplier) + { + var supplierDto = new SupplierDto + { + Id = supplier.SupplierId, + }; + return supplierDto; + } + } +}