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