using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Dogs; using gehGassi.Domain.News; using Microsoft.EntityFrameworkCore; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von Hunderassen realisiert /// public class DogRaceService : ServiceBase, IDogRaceService { private readonly IRepository _namesRepository; /// /// Erstellt eine Instanz /// /// Instanz einer IUnitOfWork public DogRaceService(IUnitOfWork unitOfWork) : base(unitOfWork) { _namesRepository = unitOfWork.GetRepository(); } /// /// Gibt eine gefilterte Liste von Hunderassen zurück /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Hunderassen public IQueryable Filter(string filter) { return Repository.Query(c => c.NameLocalized.Contains(filter)); } /// /// Erstellen einer Hunderasse /// /// Hunderasse public DogRace Create() { var item = new DogRace() { Id = Guid.NewGuid().ToString("N"), Created = DateTimeOffset.UtcNow }; return item; } /// /// Gibt eine gefilterte Liste von Hunderassen zurück. /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Hunderassen public async Task> SearchAsync(string filter) { return (await Repository.FindAsync(c => c.NameLocalized.Contains(filter) && c.Deleted == false)).ToList(); } /// /// Gibt eine gefilterte Liste von Hunderassen zurück. /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// Gewünschte Sprache /// Fallback Sprache /// List betroffener Hunderassen public async Task> SearchWithNamesAsync(string filter, string language, string fallback) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogRacesWithNames({0},{1})", c => c.Name.Contains(filter) && c.Deleted == false, language, fallback); return await baseQuery.ToListAsync().ConfigureAwait(false); } /// /// Gibt eine gefilterte Liste von Hunderassen mit Namen zurück in einer gewählten Sprache /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// Gewünschte Sprache /// Fallback Sprache /// Sollen gelöschte inkludiert werden? /// Liste betroffener Hunderassen public IQueryable FilterWithNames(string filter, string language, string fallback, bool includeDeleted) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogRacesWithNames({0},{1})", c => c.Name.Contains(filter), language, fallback); if (!includeDeleted) baseQuery = baseQuery.Where(c => c.Deleted == false); return baseQuery; } /// /// Gibt eine Liste von Hunderassen zurück, welche nach dem glieferten Datum geändert wurden. /// Wird kein Datum angegeben, werden alle zurückgegeben. /// /// Letztes Update oder null wenn noch keines /// Gewünschte Sprache /// Fallback Sprache /// Liste von Hunderassen public async Task> GetForSyncAsync(DateTimeOffset? lastUpdate, string language, string fallback) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); IQueryable baseQuery; if (lastUpdate == null) baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogRacesWithNames({0},{1})", null, language, fallback); else baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogRacesWithNames({0},{1})", c => c.UpdatedAt > lastUpdate, language, fallback); return await baseQuery.ToListAsync().ConfigureAwait(false); } /// /// Gibt eine Hunderasse mit Namen aufgelöst zurück /// /// Id der Hunderasse /// Gewünschte Sprache /// Fallback Sprache /// Hunderasse oder null, wenn nicht gefunden public async Task GetWithNamesAsync(string id, string language, string fallback) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_DogRacesWithNames({0},{1})", c => c.Id == id && c.Deleted == false, language, fallback); return await baseQuery.FirstOrDefaultAsync().ConfigureAwait(false); } } }