using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Domain.Dogs;
using Microsoft.EntityFrameworkCore;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Hunden realisiert
///
public class DogService : ServiceBase, IDogService
{
private readonly IRepository _namesRepository;
///
/// Erstellt eine Instanz
///
/// Instanz eines IUnitOfWork
public DogService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_namesRepository = unitOfWork.GetRepository();
}
///
/// Gibt eine gefilterte Liste von Hunden zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Hunde
public IQueryable Filter(string filter)
{
return Repository.Query(c => c.Name.Contains(filter) || c.Number.Contains(filter) || c.Comment.Contains(filter));
}
///
/// Erstellen eines Hunden
///
/// Kunde
public Dog Create()
{
var item = new Dog()
{
Id = Guid.NewGuid().ToString("N"),
Created = DateTimeOffset.UtcNow
};
return item;
}
///
/// Gibt eine gefilterte Liste von Hunden zurück. Sucht nur im Namen
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Hunde
public async Task> SearchAsync(string filter)
{
return (await Repository.FindAsync(c => c.Name.Contains(filter))).ToList();
}
///
/// Gibt eine gefilterte Liste von Hunden mit Namen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Gewünschte Sprache
/// Fallback Sprache
/// List betroffener Hunde
public IQueryable FilterWithNames(string filter, string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogsWithNames({0},{1})", c => c.Deleted == false && (c.Name.Contains(filter) || c.Number.Contains(filter)), language, fallback);
return baseQuery;
}
///
/// Gibt die nächste freie Nummer für einen Hund zurück
///
/// Hunde-Nummer
public async Task GetNextNumberAsync()
{
long number = 1;
var total = await Repository.CountAsync().ConfigureAwait(false);
number = total + 1;
return $"D-{DateTime.UtcNow.Year:00}{DateTime.UtcNow.Month:00}-{number:000000000}";
}
///
/// Zurücksetzen der Rasse auf null
///
/// Id der Hunderasse
/// Anzahl zurückgesetzte Hunde
public async Task ResetDogRaceAsync(string dogRaceId)
{
var items = (await Repository.FindAsync(c => c.DogRaceId == dogRaceId).ConfigureAwait(false)).ToList();
foreach (var item in items)
{
item.DogRaceId = null;
}
return items.Count;
}
///
/// Gibt eine Liste der Hunde eines Benutzers zurück
///
/// Id des AppUsers
/// Letztes Update
/// Liste der Hunde
public async Task> GetDogsAsync(string appUserId, DateTimeOffset? lastUpdate)
{
var query = Repository.Query(c => c.AppUserId == appUserId);
if (lastUpdate.HasValue)
query = query.Where(c => c.UpdatedAt > lastUpdate);
return await query.ToListAsync().ConfigureAwait(false);
}
///
/// Gibt einen hunde mit Namen aufgelöst zurück
///
/// Id des Hundes
/// Gewünschte Sprache
/// Fallback Sprache
/// Sollen gelöschte auch abgefragt werden - für historische Korrektheit
/// Hund oder null, wenn nicht gefunden
public async Task GetWithNamesAsync(string dogId, string language, string fallback,bool includeDeleted)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
if (includeDeleted == false)
{
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogsWithNames({0},{1})", c => c.Deleted == false && c.Id == dogId, language, fallback);
return await baseQuery.FirstOrDefaultAsync().ConfigureAwait(false);
}
else
{
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogsWithNames({0},{1})", c => c.Id == dogId, language, fallback);
return await baseQuery.FirstOrDefaultAsync().ConfigureAwait(false);
}
}
///
/// Gibt alle Hunde mit Namen aufgelöst für einen hundebesitzer zurück
///
/// Id des Hundebesitzers
/// Gewünschte Sprache
/// Fallback Sprache
/// Hund oder null, wenn nicht gefunden
public async Task> GetWithNamesOwnerAsync(string ownerId, string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogsWithNames({0},{1})", c => c.Deleted == false && c.AppUserId == ownerId, language, fallback);
return await baseQuery.ToListAsync().ConfigureAwait(false);
}
}
}