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); } } }