#if POSTGRES using MVC_SimpleCRUD_Layered.Data.Data.Postgres; #else using MVC_SimpleCRUD_Layered.Data.Data.MSSQL; #endif using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using MVC_SimpleCRUD_Layered.Application.Models; using MVC_SimpleCRUD_Layered.Application.Util.Extensions; using MVC_SimpleCRUD_Layered.Data.Models; using Sieve.Models; using Sieve.Services; namespace MVC_SimpleCRUD_Layered.Application.People; public class PeopleService : IPeopleService { private readonly EventsContext ctx; private readonly ISieveProcessor sieveProcessor; private readonly PagingSettings pagingSettings; public PeopleService(EventsContext ctx, IOptionsSnapshot pagingSettings, ISieveProcessor sieveProcessor) { this.ctx = ctx; this.sieveProcessor = sieveProcessor; this.pagingSettings = pagingSettings.Value; } public async Task> GetAllForSimpleListAsync() { return await ProjectPeople .OrderBy(p => p.LastNameTranscription) .ToListAsync(); } public async Task> GetPagedListAsync(PeopleIndexRequest request) { var page = request.Page < 1 ? 1 : request.Page; var pageSize = request.PageSize <= 0 ? pagingSettings.PageSize : request.PageSize; var sorts = request.Sorts.NullIfWhiteSpace() ?? nameof(PersonInfo.LastNameTranscription); var sieveModel = new SieveModel { Page = page, PageSize = pageSize, Sorts = sorts }; var totalCount = await ctx.People.CountAsync(); var query = ProjectPeople; int filteredCount; var searchText = request.SearchText.NullIfWhiteSpace(); if (searchText is not null) { sieveModel.Filters = $"({nameof(PersonInfo.FirstNameTranscription)}|{nameof(PersonInfo.LastNameTranscription)}|{nameof(PersonInfo.CountryName)})@=*{searchText}"; filteredCount = await sieveProcessor .Apply(sieveModel, query, applyPagination: false, applySorting: false) .CountAsync(); } else { filteredCount = totalCount; } var pagingInfo = new PagingInfo { FilteredItemsCount = filteredCount, TotalItemsCount = totalCount, ItemsPerPage = pageSize, CurrentPage = page, Sorts = sorts, SearchText = searchText }; if (pagingInfo.CurrentPage > pagingInfo.TotalPages) { pagingInfo.CurrentPage = pagingInfo.TotalPages; sieveModel.Page = pagingInfo.CurrentPage; } var people = filteredCount > 0 ? await sieveProcessor.Apply(sieveModel, query).ToListAsync() : []; return new PagedList(people, pagingInfo); } public async Task GetFormForEditAsync(int id, PeopleIndexRequest returnRequest) { var person = await ctx.People.AsNoTracking().FirstOrDefaultAsync(p => p.Id == id); return person is null ? null : CreateForm(person, returnRequest); } public async Task> GetCountryOptionsAsync() { return await ctx.Countries .OrderBy(d => d.Name) .Select(d => new CountryOption(d.Code, d.Name)) .ToListAsync(); } public async Task CreateAsync(PersonForm form) { var person = new Person(); CopyToPerson(form, person); ctx.People.Add(person); try { await ctx.SaveChangesAsync(); return SavePersonResult.Ok(GetDisplayName(person)); } catch (DbUpdateException exc) { return SavePersonResult.Failed(GetErrorMessage(exc)); } } public async Task UpdateAsync(int id, PersonForm form) { var person = await ctx.People.FindAsync(id); if (person is null) { return SavePersonResult.Failed($"Person with id {id} was not found."); } CopyToPerson(form, person); try { await ctx.SaveChangesAsync(); return SavePersonResult.Ok(GetDisplayName(person)); } catch (DbUpdateException exc) { return SavePersonResult.Failed(GetErrorMessage(exc)); } } public async Task DeleteAsync(int id) { var person = await ctx.People.FindAsync(id); if (person is null) { return DeletePersonResult.NotFound(); } var personName = GetDisplayName(person); ctx.People.Remove(person); try { await ctx.SaveChangesAsync(); return DeletePersonResult.Deleted(personName); } catch (DbUpdateException exc) { return DeletePersonResult.Failed(personName, GetErrorMessage(exc)); } } private IQueryable ProjectPeople => ctx.People .Select(p => new PersonInfo { Id = p.Id, FirstName = p.FirstName, LastName = p.LastName, FirstNameTranscription = p.FirstNameTranscription, LastNameTranscription = p.LastNameTranscription, BirthDate = p.BirthDate, CountryName = p.CountryCodeNavigation.Name, }); private static PersonForm CreateForm(Person person, PeopleIndexRequest returnRequest) { return new PersonForm { Id = person.Id, FirstName = person.FirstName, LastName = person.LastName, FirstNameTranscription = person.FirstNameTranscription, LastNameTranscription = person.LastNameTranscription, AddressLine = person.AddressLine, PostalCode = person.PostalCode, City = person.City, AddressCountry = person.AddressCountry, Email = person.Email, ContactPhone = person.ContactPhone, BirthDate = person.BirthDate, DocumentNumber = person.DocumentNumber, CountryCode = person.CountryCode, Page = returnRequest.Page, PageSize = returnRequest.PageSize, Sorts = returnRequest.Sorts, SearchText = returnRequest.SearchText }; } private static void CopyToPerson(PersonForm form, Person person) { person.FirstName = form.FirstName.NullIfWhiteSpace(); person.LastName = form.LastName.NullIfWhiteSpace(); person.FirstNameTranscription = form.FirstNameTranscription; person.LastNameTranscription = form.LastNameTranscription; person.AddressLine = form.AddressLine.NullIfWhiteSpace(); person.PostalCode = form.PostalCode.NullIfWhiteSpace(); person.City = form.City.NullIfWhiteSpace(); person.AddressCountry = form.AddressCountry.NullIfWhiteSpace(); person.Email = form.Email.NullIfWhiteSpace(); person.ContactPhone = form.ContactPhone.NullIfWhiteSpace(); person.BirthDate = form.BirthDate!.Value; person.DocumentNumber = form.DocumentNumber; person.CountryCode = form.CountryCode; } private static string GetDisplayName(Person person) => $"{person.FirstNameTranscription} {person.LastNameTranscription}"; private static string GetErrorMessage(DbUpdateException exc) => exc.InnerException?.Message ?? exc.Message; }