using gehGassi.Core.Interfaces; using gehGassi.Domain.News; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Domain.Common; using gehGassi.Domain.Pages; using Microsoft.EntityFrameworkCore; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von FAQs realisiert /// public class FaqService : ServiceBase, IFaqService { private readonly IRepository _namesRepository; /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public FaqService(IUnitOfWork unitOfWork) : base(unitOfWork) { _namesRepository = unitOfWork.GetRepository(); } /// /// Gibt eine gefilterte Liste von FAQs zurück /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener FAQs public IQueryable Filter(string filter) { return Repository.Query(c => c.Title.Contains(filter)); } /// /// Erstellen einer FAQ /// /// Faq public Faq Create() { var item = new Faq() { Id = Guid.NewGuid().ToString("N"), Created = DateTimeOffset.UtcNow }; return item; } /// /// Gibt eine gefilterte Liste von FAQs zurück. Sucht nur im Titel /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener FAQs public async Task> SearchAsync(string filter) { return (await Repository.FindAsync(c => c.Title.Contains(filter))).ToList(); } /// /// Gibt eine gefilterte Liste von FAQs 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 FAQs public IQueryable FilterWithNames(string filter, string language, string fallback, bool includeDeleted) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_FaqsWithNames({0},{1})", c => c.Title.Contains(filter) || c.Question.Contains(filter), language, fallback); if (!includeDeleted) baseQuery = baseQuery.Where(c => c.Deleted == false); return baseQuery; } /// /// Gibt eine Liste von FAQs zurück, welche nach dem glieferten Datum geändert wurden. /// Wird kein Datum angegeben, werden alle zurückgegeben. /// Es werden alle Kategorien zurückgegeben - egal ob on- oder offline. /// /// Letztes Update oder null wenn noch keines /// Gewünschte Sprache /// Fallback Sprache /// Liste von FAQs 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_FaqsWithNames({0},{1})", null, language, fallback); else baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_FaqsWithNames({0},{1})", c => c.UpdatedAt > lastUpdate, language, fallback); return await baseQuery.ToListAsync().ConfigureAwait(false); } /// /// Erstellt das FAQ-Html für die Integration in die FAQ-Seite. /// Es werden alle FAQs genommen, welche Online sind und nicht gelöscht wurden /// /// Gewünschte Sprache /// Fallback Sprache /// Typ /// string - HTML public async Task GenerateHtmlForPageAsync(string language, string fallback, FaqType type) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var faqsQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_FaqsWithNames({0},{1})", c => c.Deleted == false && c.OnlineStatus == OnlineStatus.Online, language, fallback); if(type != FaqType.Both) faqsQuery = faqsQuery.Where(c => c.Type == type || c.Type == FaqType.Both); var faqs = await faqsQuery.OrderBy(c => c.Order).ThenBy(c => c.Question).ToListAsync().ConfigureAwait(false); if (faqs.Any()) { var result = $"
"; foreach (var faq in faqs) { result += $"
" + $"

" + $"" + $"

" + $"
" + $"
" + $"{faq.Answer}" + $"
" + $"
" + $"
"; } result += "
"; return result; } return string.Empty; } /// /// Gibt eine Liste aller FAQ mit einem speziellen Typ zurück /// /// Typ /// Liste FAQ public async Task> GetAllAsync(FaqType type) { var query = Repository.Query(c => c.OnlineStatus == OnlineStatus.Online && c.Deleted == false); if(type != FaqType.Both) query = query.Where(c => c.Type == type || c.Type == FaqType.Both); var list = await query.OrderBy(c => c.Order).ToListAsync().ConfigureAwait(false); return list; } } }