Newer
Older
hypermedia-blazorcrud / Blazorcrud.Server / Models / PersonRepository.cs
@Derek Comartin Derek Comartin on 12 Jul 4 KB Init
using Blazorcrud.Shared.Data;
using Blazorcrud.Shared.Models;
using Microsoft.EntityFrameworkCore;

namespace Blazorcrud.Server.Models
{
    public class PersonRepository:IPersonRepository
    {
        private readonly AppDbContext _appDbContext;

        public PersonRepository(AppDbContext appDbContext)
        {
            _appDbContext = appDbContext;
        }

        public async Task<Person> AddPerson(Person person)
        {
            var result = await _appDbContext.People.AddAsync(person);
            await _appDbContext.SaveChangesAsync();
            return result.Entity;
        }

        public async Task<Person?> DeletePerson(int personId)
        {
            var result = await _appDbContext.People.FirstOrDefaultAsync(p => p.PersonId==personId);
            if (result!=null)
            {
                _appDbContext.People.Remove(result);
                await _appDbContext.SaveChangesAsync();
            }
            else
            {
                throw new KeyNotFoundException("Person not found");
            }
            return result;
        }

        public async Task<Person?> GetPerson(int personId)
        {
            var result = await _appDbContext.People
                .Include(p => p.Addresses)
                .FirstOrDefaultAsync(p => p.PersonId==personId);
            if (result != null)
            {
                return result;
            }
            else
            {
                throw new KeyNotFoundException("Person not found");
            }
        }

        public PagedResult<Person> GetPeople(string? name, int page)
        {
            int pageSize = 5;
            
            if (name != null)
            {
                return _appDbContext.People
                    .Where(p => p.FirstName.Contains(name, StringComparison.CurrentCultureIgnoreCase) ||
                        p.LastName.Contains(name, StringComparison.CurrentCultureIgnoreCase))
                    .OrderBy(p => p.PersonId)
                    .Include(p => p.Addresses)
                    .GetPaged(page, pageSize);
            }
            else
            {
                return _appDbContext.People
                    .OrderBy(p => p.PersonId)
                    .Include(p => p.Addresses)
                    .GetPaged(page, pageSize);
            }
        }

        public async Task<Person?> UpdatePerson(Person person)
        {
            var result = await _appDbContext.People.Include("Addresses").FirstOrDefaultAsync(p => p.PersonId==person.PersonId);
            if (result!=null)
            {
                // Update existing person
                _appDbContext.Entry(result).CurrentValues.SetValues(person);
                
                // Remove deleted addresses
                foreach (var existingAddress in result.Addresses.ToList())
                {
                   if(!person.Addresses.Any(o => o.AddressId == existingAddress.AddressId))
                     _appDbContext.Addresses.Remove(existingAddress);
                }

                // Update and Insert Addresses
                 foreach (var addressModel in person.Addresses)
                 {
                    var existingAddress = result.Addresses
                        .Where(a => a.AddressId == addressModel.AddressId)
                        .SingleOrDefault();
                    if (existingAddress != null)
                        _appDbContext.Entry(existingAddress).CurrentValues.SetValues(addressModel);
                    else
                    {
                        var newAddress = new Address
                        {
                            AddressId = addressModel.AddressId,
                            Street = addressModel.Street,
                            City = addressModel.City,
                            State = addressModel.State,
                            ZipCode = addressModel.ZipCode
                        };
                        result.Addresses.Add(newAddress);
                    }
                }
                await _appDbContext.SaveChangesAsync();
            }
            else
            {
                throw new KeyNotFoundException("Person not found");
            }
            return result;
        }
    }
}