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