diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeCreateDto.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeCreateDto.cs new file mode 100644 index 00000000..219e8c75 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeCreateDto.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace PromoCodeFactory.Core.Abstractions.Models.Employees +{ + public class EmployeeCreateDto + { + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string Email { get; set; } + + public List RoleIds { get; set; } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeUpdateDto.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeUpdateDto.cs new file mode 100644 index 00000000..ca256555 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Models/Employees/EmployeeUpdateDto.cs @@ -0,0 +1,19 @@ +using PromoCodeFactory.Core.Domain.Administration; +using System; +using System.Collections.Generic; + +namespace PromoCodeFactory.Core.Abstractions.Models.Employees +{ + public class EmployeeUpdateDto + { + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string Email { get; set; } + + public List RoleIds { get; set; } + + public int AppliedPromocodesCount { get; set; } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/Employees/IEmployeeRepository.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/Employees/IEmployeeRepository.cs new file mode 100644 index 00000000..ea26f785 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/Employees/IEmployeeRepository.cs @@ -0,0 +1,9 @@ +using PromoCodeFactory.Core.Abstractions.Models.Employees; +using PromoCodeFactory.Core.Domain.Administration; + +namespace PromoCodeFactory.Core.Abstractions.Repositories.Interfaces.Employees +{ + public interface IEmployeeRepository : ICRUDRepository + { + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/ICRUDRepository.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/ICRUDRepository.cs new file mode 100644 index 00000000..dd403c2e --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/Interfaces/ICRUDRepository.cs @@ -0,0 +1,16 @@ +using PromoCodeFactory.Core.Domain; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace PromoCodeFactory.Core.Abstractions.Repositories.Interfaces +{ + public interface ICRUDRepository : IRepository where T : BaseEntity + { + Task AddAsync(TCreate entity, CancellationToken cancellationToken = default); + + Task UpdateAsync(Guid entityId, TUpdate entity, CancellationToken cancellationToken = default); + + Task DeleteAsync(Guid entityId, CancellationToken cancellationToken = default); + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Exceptions/NotFoundEntityException.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Exceptions/NotFoundEntityException.cs new file mode 100644 index 00000000..488526f1 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Exceptions/NotFoundEntityException.cs @@ -0,0 +1,9 @@ +using System; + +namespace PromoCodeFactory.Core.Exceptions +{ + public class NotFoundEntityException : Exception + { + public NotFoundEntityException(string entity) : base($"Entity \"{entity}\" not found.") { } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/EmployeeRepository.cs b/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/EmployeeRepository.cs new file mode 100644 index 00000000..2db8c79c --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/EmployeeRepository.cs @@ -0,0 +1,81 @@ +using PromoCodeFactory.Core.Abstractions.Models.Employees; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Abstractions.Repositories.Interfaces.Employees; +using PromoCodeFactory.Core.Domain.Administration; +using PromoCodeFactory.Core.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace PromoCodeFactory.DataAccess.Repositories +{ + public class EmployeeRepository : InMemoryRepository, IEmployeeRepository + { + private IRepository roleRepository; + + public EmployeeRepository(IEnumerable data, IRepository roleRepository) : base(data) + { + this.roleRepository = roleRepository; + } + + public async Task AddAsync(EmployeeCreateDto entity, CancellationToken cancellationToken) + { + var roles = new List(); + + foreach (var rol in entity.RoleIds) + roles.Add(await this.roleRepository.GetByIdAsync(rol)); + + var newEmployee = new Employee() + { + Id = Guid.NewGuid(), + FirstName = entity.FirstName, + LastName = entity.LastName, + Email = entity.Email, + Roles = roles, + AppliedPromocodesCount = 0 + }; + + ((IList)this.Data).Add(newEmployee); + + return newEmployee; + } + + public Task DeleteAsync(Guid entityId, CancellationToken cancellationToken) + { + var employee = this.Data.Where(emp => emp.Id == entityId).FirstOrDefault(); + + if(employee != null) + { + ((IList)this.Data).Remove(employee); + + return Task.FromResult(employee.Id); + } + + throw new NotFoundEntityException(nameof(Employee)); + } + + public async Task UpdateAsync(Guid entityId, EmployeeUpdateDto entity, CancellationToken cancellationToken) + { + var emp = await this.GetByIdAsync(entityId); + + emp.FirstName = entity.FirstName; + emp.LastName = entity.LastName; + emp.Email = entity.Email; + emp.AppliedPromocodesCount = entity.AppliedPromocodesCount; + + if (entity.RoleIds == null) + return emp; + + var roles = new List(); + + foreach (var rol in entity.RoleIds) + roles.Add(await this.roleRepository.GetByIdAsync(rol)); + + emp.Roles = roles; + + return emp; + } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs b/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs index df1c41dd..505c0cea 100644 --- a/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs @@ -1,11 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Models.Employees; using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Abstractions.Repositories.Interfaces.Employees; using PromoCodeFactory.Core.Domain.Administration; +using PromoCodeFactory.Core.Exceptions; using PromoCodeFactory.WebHost.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace PromoCodeFactory.WebHost.Controllers { @@ -16,9 +20,9 @@ namespace PromoCodeFactory.WebHost.Controllers [Route("api/v1/[controller]")] public class EmployeesController : ControllerBase { - private readonly IRepository _employeeRepository; + private readonly IEmployeeRepository _employeeRepository; - public EmployeesController(IRepository employeeRepository) + public EmployeesController(IEmployeeRepository employeeRepository) { _employeeRepository = employeeRepository; } @@ -70,5 +74,26 @@ public async Task> GetEmployeeByIdAsync(Guid id) return employeeModel; } + + [HttpPost("Create")] + public async Task CreateAsync([FromBody] EmployeeCreateDto employeeCreate, CancellationToken cancellationToken) => + await this._employeeRepository.AddAsync(employeeCreate, cancellationToken); + + [HttpPatch("Update/{id:guid}")] + public async Task UpdateAsync(Guid id, [FromBody] EmployeeUpdateDto employeeUpdate, CancellationToken cancellationToken) => + await this._employeeRepository.UpdateAsync(id, employeeUpdate, cancellationToken); + + [HttpDelete("Delete")] + public async Task> DeleteAsync(Guid id) + { + try + { + return await this._employeeRepository.DeleteAsync(id); + } + catch (NotFoundEntityException ex) + { + return NotFound(); + } + } } } \ No newline at end of file diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/Startup.cs b/Homeworks/Base/src/PromoCodeFactory.WebHost/Startup.cs index 8151aa4a..0e90f0c0 100644 --- a/Homeworks/Base/src/PromoCodeFactory.WebHost/Startup.cs +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/Startup.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Abstractions.Repositories.Interfaces.Employees; using PromoCodeFactory.Core.Domain.Administration; using PromoCodeFactory.DataAccess.Data; using PromoCodeFactory.DataAccess.Repositories; @@ -14,8 +15,8 @@ public class Startup public void ConfigureServices(IServiceCollection services) { services.AddControllers(); - services.AddSingleton(typeof(IRepository), (x) => - new InMemoryRepository(FakeDataFactory.Employees)); + services.AddSingleton(typeof(IEmployeeRepository), (x) => + new EmployeeRepository(FakeDataFactory.Employees, new InMemoryRepository(FakeDataFactory.Roles))); services.AddSingleton(typeof(IRepository), (x) => new InMemoryRepository(FakeDataFactory.Roles));