using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Entities; using zero.Core.Extensions; namespace zero.Core.Api { public class UserApi : AppAwareBackofficeApi, IUserApi { protected UserManager UserManager { get; private set; } protected IHttpContextAccessor HttpContextAccessor { get; set; } public UserApi(IBackofficeStore store, UserManager userManager, IHttpContextAccessor httpContextAccessor) : base(store) { UserManager = userManager; HttpContextAccessor = httpContextAccessor; } /// public async Task GetUserById(string id) { IUser user = await UserManager.FindByIdAsync(id); return user; } /// public async Task GetUserByEmail(string email) { IUser user = await UserManager.FindByEmailAsync(email); return user; } /// public async Task> GetByIds(params string[] ids) { return await GetByIds(ids); } /// public async Task> GetAll() { using IAsyncDocumentSession session = Raven.OpenAsyncSession(); return await session.Query() .Scope(Scope) .OrderByDescending(x => x.CreatedDate) .ToListAsync(); } /// public async Task> GetByQuery(ListQuery query) { string currentUserId = (await UserManager.GetUserAsync(HttpContextAccessor.HttpContext.User))?.Id; HashSet appIds = new HashSet() { Constants.Database.SharedAppId, Scope.AppId }; query.SearchSelector = user => user.Name; using IAsyncDocumentSession session = Raven.OpenAsyncSession(); return await session.Query() .Where(x => x.AppId.In(appIds) || x.Id == currentUserId) .ToQueriedListAsync(query); } /// public async Task> Save(IUser model) { return await SaveModel(model); //, new UserValidator()); } /// public async Task> Delete(string id) { return await DeleteById(id); } /// public async Task> UpdatePassword(IUser user, string currentPassword, string newPassword) { if (currentPassword.IsNullOrWhiteSpace() || newPassword.IsNullOrWhiteSpace()) { return EntityResult.Fail(nameof(currentPassword), "@errors.changepassword.emptyfields"); } if (user == null) { return EntityResult.Fail("@errors.changepassword.nouser"); } IdentityResult identityResult = await UserManager.ChangePasswordAsync(user as User, currentPassword, newPassword); if (!identityResult.Succeeded) { EntityResult result = EntityResult.Fail(); foreach (IdentityError error in identityResult.Errors) { result.AddError(error.Description); } return result; } return EntityResult.Success(user); } /// public async Task> Enable(IUser user) { return await UpdateActiveState(user, true); } /// public async Task> Disable(IUser user) { return await UpdateActiveState(user, false); } /// /// Updates the active state of user. /// If IsActive=false, the user cannot login anymore /// async Task> UpdateActiveState(IUser user, bool isActive) { user.IsActive = isActive; IdentityResult identityResult = await UserManager.UpdateAsync(user as User); if (!identityResult.Succeeded) { EntityResult result = EntityResult.Fail(); foreach (IdentityError error in identityResult.Errors) { result.AddError(error.Description); } return result; } await UserManager.UpdateSecurityStampAsync(user as User); return EntityResult.Success(user); } } public interface IUserApi : IAppAwareBackofficeApi { /// /// Find user by id /// Task GetUserById(string id); /// /// Find user by email /// Task GetUserByEmail(string email); /// /// Get users by ids /// Task> GetByIds(params string[] ids); /// /// Get all users for the selected application /// Task> GetAll(); /// /// Get all available users (with query) /// Task> GetByQuery(ListQuery query); /// /// Creates or updates a user /// Task> Save(IUser model); /// /// Deletes a user /// Task> Delete(string id); /// /// Changes the password of the current user. /// User is logged out if this operation succeeds. /// Task> UpdatePassword(IUser user, string currentPassword, string newPassword); /// /// Enables a user /// Task> Enable(IUser user); /// /// Disables a user /// Task> Disable(IUser user); } }