using PhonebookService.Domain.Models;
using PhonebookService.Domain.Queries;
using PhonebookService.Domain.Repositories;
namespace PhonebookService.Infrastructure.Repositories;
///
/// Phonebook repository implementation
///
public class PhonebookRepository : IPhonebookRepository
{
private readonly PhonebookContext _context;
public PhonebookRepository(PhonebookContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
}
///
public async Task CreateItemAsync(PhonebookRecord item)
{
var entry = await _context.Records.AddAsync(item);
await _context.SaveChangesAsync();
return entry.Entity;
}
///
public async Task DeleteItemAsync(PhonebookRecord item)
{
_context.Records.Remove(item);
await _context.SaveChangesAsync();
}
///
public async Task GetItemByIdAsync(int id)
{
var entry = await _context.Records.FindAsync(id);
return entry;
}
///
public Task> GetItemsAsync(PhonebookFilterQuery query)
{
IQueryable dbQuery = _context.Records;
if (query.FirstName is not null)
dbQuery = dbQuery.Where(i => i.FirstName.Contains(query.FirstName));
if (query.Phone is not null)
dbQuery = dbQuery.Where(i => i.PhoneNumber == query.Phone);
if (query.City is not null)
dbQuery = dbQuery.Where(i => i.City == query.City);
if (query.ZipCode is not null)
dbQuery = dbQuery.Where(i => i.ZipCode == query.ZipCode);
if (query.Sort == SortMode.Ascending)
dbQuery = dbQuery.OrderBy(i => i.FirstName);
else if (query.Sort == SortMode.Descending)
dbQuery = dbQuery.OrderByDescending(i => i.FirstName);
ICollection list = dbQuery.Skip((query.Page - 1) * 5).Take(5).ToList();
return Task.FromResult(list);
}
///
public async Task UpdateItemAsync(PhonebookRecord item)
{
var entry = _context.Records.Update(item);
await _context.SaveChangesAsync();
return entry.Entity;
}
}