using gehGassi.Core.Interfaces;
using gehGassi.Domain.Advertisements;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Domain.Dogs;
using gehGassi.Domain.Common;
using Microsoft.EntityFrameworkCore;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Appversionen realisiert
///
public class AppVersionService : ServiceBase, IAppVersionService
{
private readonly IRepository _namesRepository;
///
/// Erstellt eine Instanz
///
/// Instanz einer IUnitOfWork
public AppVersionService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_namesRepository = unitOfWork.GetRepository();
}
///
/// Gibt eine gefilterte Liste von Appversionen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener AppVersionen
public IQueryable Filter(string filter)
{
return Repository.Query(c => c.ReleaseTitleLocalized.Contains(filter) || c.Version.Contains(filter));
}
///
/// Erstellen einer Appversion
///
/// Listung
public AppVersion Create()
{
var item = new AppVersion()
{
Major = 1,
Minor = 0,
Version = "1.0",
IsCurrent = false,
IsMandatory = false,
Platform = Domain.Common.Platform.Android,
Build = null,
Revision = null,
ReleaseDate = DateTimeOffset.UtcNow,
LastUpdate = DateTimeOffset.UtcNow,
Created = DateTimeOffset.UtcNow
};
return item;
}
///
/// Gibt eine gefilterte Liste von Appversionen zurück.
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Appversionen
public async Task> SearchAsync(string filter)
{
return (await Repository.FindAsync(c => c.ReleaseTitleLocalized.Contains(filter) || c.Version.Contains(filter))).ToList();
}
///
/// Gibt eine gefilterte Liste von Appversionen mit Namen zurück in einer gewählten Sprache
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Gewünschte Sprache
/// Fallback Sprache
/// Liste betroffener Appversionen
public IQueryable FilterWithNames(string filter, string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_AppVersionsWithNames({0},{1})", c => c.ReleaseTitle.Contains(filter) || c.Version.Contains(filter), language, fallback);
return baseQuery;
}
///
/// Gibt zurück ob eine Versionsnummer für eine Plattform bereits existiert
///
/// Plattform
/// Versionsnummer die geprüft werden soll
/// ID die ignoriert werden soll
/// true wenn eine existiert, false sonst
public async Task VersionExistsAsync(Platform platform, string version, int ignoreId)
{
var count = await Repository.CountAsync(c => c.Platform == platform && c.Version == version && c.Id != ignoreId).ConfigureAwait(false);
return count > 0;
}
///
/// Gibt zurück ob eine Plattform eine aktuelle Version hat
///
/// Plattform
/// ID die ignoriert werden soll
/// true wenn eine existiert, false sonst
public async Task HasCurrentAsync(Platform platform, int ignoreId)
{
var count = await Repository.CountAsync(c => c.Platform == platform && c.IsCurrent && c.Id != ignoreId).ConfigureAwait(false);
return count > 0;
}
///
/// Zurücksetzen der aktuellen Version einer Plattform. Es kann nur einen geben :)
///
/// Plattform
/// Benutzer der die Änderung vornimmt
/// Task
public async Task ResetCurrentAsync(Platform platform, string userName)
{
var current = await Repository.FirstOrDefaultAsync(c => c.Platform == platform && c.IsCurrent).ConfigureAwait(false);
if (current != null)
{
current.IsCurrent = false;
await CommitAsync(userName).ConfigureAwait(false);
}
}
///
/// Gibt die aktuelle Version einer Plattform zurück
///
/// Plattform
/// Gewünschte Sprache
/// Fallback Sprache
/// Aktuelle Version oder null, wenn keine vorhanden
public async Task GetCurrentwithNamesAsync(Platform platform, string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_AppVersionsWithNames({0},{1})", c => c.Platform == platform && c.IsCurrent, language, fallback);
var current = await baseQuery.FirstOrDefaultAsync().ConfigureAwait(false);
return current;
}
}
}