using AutoMapper; using GerstITS.Common; using GerstITS.Data; using GerstITS.Examples.Data.Entities; using GerstITS.Search; using GerstITS.System.Customizations; namespace GerstITS.Examples.Logic.Customers; internal sealed class CustomerProvider : ICustomerProvider { #region Fields private readonly IRepository _repository; private readonly IMapper _mapper; private readonly ISearchEngine _searchEngine; #endregion #region Constructors public CustomerProvider(IRepository repository, IMapper mapper, ISearchEngine searchEngine) { _repository = repository; _mapper = mapper; _searchEngine = searchEngine; } #endregion #region ICustomerProvider public Customer GetById(int id) { return GetById(id, false); } public Customer GetById(int id, bool includeInactive) { var entity = _repository.Query(includeInactive) .FirstOrDefault(i => i.Id == id) .ThrowsAnExceptionIfNotExisting(); return ToCustomizedModel(entity); } public SearchResult Search(CustomerSearchFilter filter) { var searchResult = _searchEngine.Search(filter); searchResult.Result = searchResult.Result .Select(i => i.ApplyCustomizations()) .ToList(); return searchResult; } public Customer Create(Customer customer) { var entity = _mapper.Map(customer); _repository.Save(entity); return ToCustomizedModel(entity); } public Customer Update(Customer customer) { var entity = _repository.Query() .FirstOrDefault(i => i.Id == customer.Id) .ThrowsAnExceptionIfNotExisting(); _mapper.Map(customer, entity); _repository.Save(entity); return ToCustomizedModel(entity); } public bool Delete(int id) { return Delete(id, false); } public bool Delete(int id, bool forceDelete) { var entity = _repository.Query(forceDelete) .FirstOrDefault(i => i.Id == id) .ThrowsAnExceptionIfNotExisting(); _repository.Delete(entity, forceDelete); return true; } public BulkResult Import(IEnumerable customers) { var importableCustomers = customers.Is(x => x.IsNullOrEmpty()) .ThenThrows() .WithMessage("At least one customer is required for an import."); var entities = importableCustomers.Select(_mapper.Map) .ToList(); return _repository.BulkSave(entities); } public IEnumerable GetNotes(int customerId) { return _repository.Query() .Where(i => i.CustomerId == customerId) .OrderBy(i => i.ValidFrom) .ToList() .Select(_mapper.Map) .ToList(); } public CustomerNote AddNote(int customerId, string text) { _repository.Query() .FirstOrDefault(i => i.Id == customerId) .ThrowsAnExceptionIfNotExisting(); var entity = new CustomerNoteEntity { CustomerId = customerId, Text = text }; _repository.Save(entity); return _mapper.Map(entity); } #endregion #region Methods private Customer ToCustomizedModel(CustomerEntity entity) { return _mapper.Map(entity) .ApplyCustomizations(); } #endregion }