From d4a27e97fe634d0e52e35ca2ef88f1977aa6cf2d Mon Sep 17 00:00:00 2001 From: Robieeee Date: Thu, 21 Mar 2024 11:36:27 +0700 Subject: [PATCH 1/2] features/update-customer --- .../Customer/CustomerDataListRequest.cs | 1 + .../Customer/DeleteCustomerDataRequest.cs | 17 +++++++ .../Customer/UpdateCustomerDataRequest.cs | 24 ++++++++++ .../Customer/DeleteCustomerDataResponse.cs | 13 ++++++ .../Customer/UpdateCustomerDataResponse.cs | 10 +++++ .../UpdateCustomerDataHandler.cs | 42 ++++++++++++++++++ .../Customer/UpdateCustomerValidator.cs | 35 +++++++++++++++ .../Controllers/CustomerController.cs | 16 ++++++- WebApiTraining2/training.db | Bin 36864 -> 36864 bytes WebApiTraining2/training.db-shm | Bin 0 -> 32768 bytes WebApiTraining2/training.db-wal | 0 11 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs create mode 100644 Contracts/RequestModels/Customer/UpdateCustomerDataRequest.cs create mode 100644 Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs create mode 100644 Contracts/ResponseModels/Customer/UpdateCustomerDataResponse.cs create mode 100644 Services/RequestHandlers/ManageCustomer/UpdateCustomerDataHandler.cs create mode 100644 Services/Validators/Customer/UpdateCustomerValidator.cs create mode 100644 WebApiTraining2/training.db-shm create mode 100644 WebApiTraining2/training.db-wal diff --git a/Contracts/RequestModels/Customer/CustomerDataListRequest.cs b/Contracts/RequestModels/Customer/CustomerDataListRequest.cs index 8dec991..af44ac7 100644 --- a/Contracts/RequestModels/Customer/CustomerDataListRequest.cs +++ b/Contracts/RequestModels/Customer/CustomerDataListRequest.cs @@ -5,5 +5,6 @@ namespace Contracts.RequestModels.Customer { public class CustomerDataListRequest : IRequest { + } } diff --git a/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs b/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs new file mode 100644 index 0000000..020de76 --- /dev/null +++ b/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Contracts.RequestModels.Customer +{ + public class DeleteCustomerDataRequest + { + public Guid CustomerId { get; set; } + } + public class DeleteCustomerModel + { + + } +} diff --git a/Contracts/RequestModels/Customer/UpdateCustomerDataRequest.cs b/Contracts/RequestModels/Customer/UpdateCustomerDataRequest.cs new file mode 100644 index 0000000..ce1d8cb --- /dev/null +++ b/Contracts/RequestModels/Customer/UpdateCustomerDataRequest.cs @@ -0,0 +1,24 @@ +using Contracts.ResponseModels.Customer; +using MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Contracts.RequestModels.Customer +{ + public class UpdateCustomerDataRequest : UpdateCustomerDataModel, IRequest + { + public Guid? CustomerId { get; set; } + + + } + + public class UpdateCustomerDataModel + { + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + + } +} diff --git a/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs b/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs new file mode 100644 index 0000000..68b8df1 --- /dev/null +++ b/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Contracts.ResponseModels.Customer +{ + public class DeleteCustomerDataResponse + { + + } +} diff --git a/Contracts/ResponseModels/Customer/UpdateCustomerDataResponse.cs b/Contracts/ResponseModels/Customer/UpdateCustomerDataResponse.cs new file mode 100644 index 0000000..8407a43 --- /dev/null +++ b/Contracts/ResponseModels/Customer/UpdateCustomerDataResponse.cs @@ -0,0 +1,10 @@ + +namespace Contracts.ResponseModels.Customer +{ + public class UpdateCustomerDataResponse + { + public bool Success { get; set; } + public string Message { get; set; } = string.Empty; + } + +} diff --git a/Services/RequestHandlers/ManageCustomer/UpdateCustomerDataHandler.cs b/Services/RequestHandlers/ManageCustomer/UpdateCustomerDataHandler.cs new file mode 100644 index 0000000..1017876 --- /dev/null +++ b/Services/RequestHandlers/ManageCustomer/UpdateCustomerDataHandler.cs @@ -0,0 +1,42 @@ + +using Contracts.RequestModels.Customer; +using Contracts.ResponseModels.Customer; +using Entity.Entity; +using MediatR; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage.Json; + +namespace Services.RequestHandlers.ManageCustomer +{ + public class UpdateCustomerDataHandler : IRequestHandler + { + private readonly DBContext _db; + public UpdateCustomerDataHandler(DBContext db) + { + _db = db; + } + public async Task Handle(UpdateCustomerDataRequest request, CancellationToken cancellationToken) + { + var existingData = await _db.Customers.FindAsync(request.CustomerId); + if (existingData == null) + { + return new UpdateCustomerDataResponse() + { + Success = false, + Message = "Data Tidak ditemukan" + }; + } + existingData.Name = request.Name; + existingData.Email = request.Email; + _db.Customers.Update(existingData); + await _db.SaveChangesAsync(cancellationToken); + return new UpdateCustomerDataResponse() + { + Success = true, + Message = "Data Updated." + }; + + } + + } +} diff --git a/Services/Validators/Customer/UpdateCustomerValidator.cs b/Services/Validators/Customer/UpdateCustomerValidator.cs new file mode 100644 index 0000000..40019d4 --- /dev/null +++ b/Services/Validators/Customer/UpdateCustomerValidator.cs @@ -0,0 +1,35 @@ +using Contracts.RequestModels.Customer; +using Entity.Entity; +using FluentValidation; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Services.Validators.Customer +{ + public class UpdateCustomerValidator : AbstractValidator + { + private readonly DBContext _db; + public UpdateCustomerValidator(DBContext db) + { + _db = db; + RuleFor(Q => Q.Name).NotEmpty().WithMessage("Name Can't be Empty!") + .MaximumLength(20).WithMessage("Maximum Name's Length 20 Characters!"); + + RuleFor(Q => Q.Email).EmailAddress().NotEmpty().WithMessage("Email Can't Be Empty!") + .MustAsync(AvailableEmails).WithMessage("The email you give is already exist!"); + + } + + public async Task AvailableEmails (string email, CancellationToken cancellationToken) + { + var existingEmail = await _db.Customers.Where(Q => Q.Email == email).AsNoTracking().AnyAsync(); + + return !existingEmail; + } + + } +} diff --git a/WebApiTraining2/Controllers/CustomerController.cs b/WebApiTraining2/Controllers/CustomerController.cs index 942bc74..c353f8c 100644 --- a/WebApiTraining2/Controllers/CustomerController.cs +++ b/WebApiTraining2/Controllers/CustomerController.cs @@ -4,6 +4,7 @@ using FluentValidation; using FluentValidation.AspNetCore; using Microsoft.AspNetCore.Mvc; +using Services.Validators.Customer; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -56,14 +57,27 @@ public async Task> Post([FromBody] CreateCu // PUT api//5 [HttpPut("{id}")] - public void Put(int id, [FromBody] string value) + public async Task > Put(Guid id, [FromBody] UpdateCustomerDataModel model, [FromServices] IValidator validator, CancellationToken cancellationToken) { + var request = new UpdateCustomerDataRequest { CustomerId = id, Name = model.Name, Email = model.Email }; + //request.CustomerId = id; + var validationResult = await validator.ValidateAsync(request); + if (!validationResult.IsValid) + { + validationResult.AddToModelState(ModelState); + return ValidationProblem(ModelState); + } + + var response = await _mediator.Send(request, cancellationToken); + return Ok(response); + } // DELETE api//5 [HttpDelete("{id}")] public void Delete(int id) { + } } } diff --git a/WebApiTraining2/training.db b/WebApiTraining2/training.db index afe972d99027a86ae2c4ae51d607e8c16fbb5eb0..13e353a8b196892c3474b1b1b9870791e03e4b08 100644 GIT binary patch delta 406 zcmZozz|^pSX#=BxIPVJv4&F%&d`kSg_)GX@_@41?;49>vv{_N0iZ>>NgC*3^(bUw) z*u=%yP1n`Y#8}tF*vweh$->E5*TBHV+}X&|%+`4v^cdaG0)J**w6$; z#Kh3ZAw4%SGe<8uKbJpy*F%(5WjxQrisH#0kN*gX^XoN7!2xyRrA;KtI zc9u{{?a2*tDxz7bxw(~{HUNqF@#}agk-P_6HBPF{^UM+6}^(w;u4^`^pu=ZC=+2m7tm}DzMTyG-2AcpCj4!D dJ2wj`Ea%hJU=C#@CfGPY3PH}_%%%S=0RZskcoP5s delta 181 zcmZozz|^pSX#=BxC<6lnJ6{z8|1tg!{vduCzGr+J_^LK5Dx~nSnXt2jN=i;Hms8;> zE-A{)ONWq?H^?nwGhqhHRmp2X9S< E0CcG}Y5)KL diff --git a/WebApiTraining2/training.db-shm b/WebApiTraining2/training.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3 Date: Thu, 21 Mar 2024 11:39:43 +0700 Subject: [PATCH 2/2] features/update-customer --- .../Customer/DeleteCustomerDataRequest.cs | 17 ----------------- .../Customer/DeleteCustomerDataResponse.cs | 13 ------------- 2 files changed, 30 deletions(-) delete mode 100644 Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs delete mode 100644 Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs diff --git a/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs b/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs deleted file mode 100644 index 020de76..0000000 --- a/Contracts/RequestModels/Customer/DeleteCustomerDataRequest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Contracts.RequestModels.Customer -{ - public class DeleteCustomerDataRequest - { - public Guid CustomerId { get; set; } - } - public class DeleteCustomerModel - { - - } -} diff --git a/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs b/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs deleted file mode 100644 index 68b8df1..0000000 --- a/Contracts/ResponseModels/Customer/DeleteCustomerDataResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Contracts.ResponseModels.Customer -{ - public class DeleteCustomerDataResponse - { - - } -}