using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Domain.Users;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Benutzern realisiert
///
public class UserService : ServiceBase, IUserService
{
private readonly IRepository _applicationUserWithNamesRepository;
///
/// Erstellt eine Instanz
///
/// Instanz eines IUnitOfWork
public UserService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_applicationUserWithNamesRepository = unitOfWork.GetRepository();
}
///
/// Prüft ob ein Benutzername noch verfügbar ist.
///
/// Zu prüfender Benutzername
/// Id die ignoriert werden soll
/// true wenn verfügbar, false sonst
public async Task IsUsernameAvailableAsync(string userName, string id = "")
{
if (string.IsNullOrWhiteSpace(userName))
throw new ArgumentException("Username may not be null or empty");
var existingUser = await Repository.FirstOrDefaultAsync(c => c.UserName == userName).ConfigureAwait(false);
if (existingUser != null && !string.IsNullOrWhiteSpace(id))
existingUser = await Repository.FirstOrDefaultAsync(c => c.UserName == userName && c.Id != id).ConfigureAwait(false);
return existingUser == null;
}
///
/// Gibt einen Benutzer anhand des Benutzernamens zurück
///
/// Benutzername
/// ApplicationUser oder null, wenn nicht gefunden
public async Task GetByUsernameAsync(string userName)
{
var existingUser = await Repository.FirstOrDefaultAsync(c => c.UserName == userName).ConfigureAwait(false);
return existingUser;
}
///
/// Gibt eine gefilterte Liste von Benutzer zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Benutzer
public IQueryable Filter(string filter)
{
return Repository.Query(c => c.FirstName.Contains(filter) || c.LastName.Contains(filter) || c.UserName.Contains(filter));
}
///
/// Erstellen eines Benutzers
///
/// Benutzer
public ApplicationUser Create()
{
var user = new ApplicationUser { RegistrationDate = DateTimeOffset.UtcNow };
return user;
}
///
/// Gibt eine gefilterte Liste von Benutzern mit Namen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Benutzer
public IQueryable FilterWithNames(string filter)
{
return _applicationUserWithNamesRepository.QueryView(c => c.FirstName.Contains(filter) || c.LastName.Contains(filter) || c.UserName.Contains(filter));
}
///
/// Gibt eine gefilterte Liste von Benutzern mit Namen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Id des Kunden
/// List betroffener Benutzer
public IQueryable FilterWithNamesCustomer(string filter, long customerId)
{
return _applicationUserWithNamesRepository.QueryView(c => c.CustomerId == customerId && (c.FirstName.Contains(filter) || c.LastName.Contains(filter) || c.UserName.Contains(filter)));
}
///
/// Zurücksetzen des Kunden auf null
///
/// Id des Kunden
/// Task
public async Task ResetCustomerAsync(long customerId)
{
var items = (await Repository.FindAsync(c => c.CustomerId == customerId).ConfigureAwait(false)).ToList();
foreach (var item in items)
{
item.CustomerId = null;
}
}
///
/// Zurücksetzen des App-Users auf null
///
/// Id des App-Users
/// Task
public async Task ResetAppUserAsync(string appUserId)
{
var items = (await Repository.FindAsync(c => c.AppUserId == appUserId).ConfigureAwait(false)).ToList();
foreach (var item in items)
{
item.AppUserId = null;
}
}
///
/// Gibt einen Benutzer anhand der App-UserId zurück
///
/// App-UserId
/// ApplicationUser oder null, wenn nicht gefunden
public async Task GetByAppUserAsync(string appUserId)
{
return await Repository.FirstOrDefaultAsync(c => c.AppUserId == appUserId).ConfigureAwait(false);
}
}
}