Files
mixtape/zero.Core/Api/UserApi.cs
T

202 lines
5.0 KiB
C#

using Microsoft.AspNetCore.Identity;
using Raven.Client.Documents;
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<User> UserManager { get; private set; }
public UserApi(IBackofficeStore store, UserManager<User> userManager) : base(store)
{
UserManager = userManager;
}
/// <inheritdoc />
public async Task<IUser> GetUserById(string id)
{
IUser user = await UserManager.FindByIdAsync(id);
return user;
}
/// <inheritdoc />
public async Task<IUser> GetUserByEmail(string email)
{
IUser user = await UserManager.FindByEmailAsync(email);
return user;
}
/// <inheritdoc />
public async Task<IList<IUser>> GetAll(string appId = null)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
{
return await session.Query<IUser>()
.Scope(appId)
.OrderByDescending(x => x.CreatedDate)
.ToListAsync();
}
}
/// <inheritdoc />
public async Task<ListResult<IUser>> GetByQuery(ListQuery<IUser> query, string appId = null)
{
query.SearchSelector = user => user.Name;
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
{
return await session.Query<IUser>()
.Scope(appId)
.ToQueriedListAsync(query);
}
}
/// <inheritdoc />
public async Task<EntityResult<IUser>> Save(IUser model)
{
return await SaveModel(model); //, new UserValidator<User>());
}
/// <inheritdoc />
public async Task<EntityResult<IUser>> Delete(string id)
{
return await DeleteById<IUser>(id);
}
/// <inheritdoc />
public async Task<EntityResult<IUser>> UpdatePassword(IUser user, string currentPassword, string newPassword)
{
if (currentPassword.IsNullOrWhiteSpace() || newPassword.IsNullOrWhiteSpace())
{
return EntityResult<IUser>.Fail(nameof(currentPassword), "@errors.changepassword.emptyfields");
}
if (user == null)
{
return EntityResult<IUser>.Fail("@errors.changepassword.nouser");
}
IdentityResult identityResult = await UserManager.ChangePasswordAsync(user as User, currentPassword, newPassword);
if (!identityResult.Succeeded)
{
EntityResult<IUser> result = EntityResult<IUser>.Fail();
foreach (IdentityError error in identityResult.Errors)
{
result.AddError(error.Description);
}
return result;
}
return EntityResult<IUser>.Success(user);
}
/// <inheritdoc />
public async Task<EntityResult<IUser>> Enable(IUser user)
{
return await UpdateActiveState(user, true);
}
/// <inheritdoc />
public async Task<EntityResult<IUser>> Disable(IUser user)
{
return await UpdateActiveState(user, false);
}
/// <summary>
/// Updates the active state of user.
/// If IsActive=false, the user cannot login anymore
/// </summary>
async Task<EntityResult<IUser>> UpdateActiveState(IUser user, bool isActive)
{
user.IsActive = isActive;
IdentityResult identityResult = await UserManager.UpdateAsync(user as User);
if (!identityResult.Succeeded)
{
EntityResult<IUser> result = EntityResult<IUser>.Fail();
foreach (IdentityError error in identityResult.Errors)
{
result.AddError(error.Description);
}
return result;
}
await UserManager.UpdateSecurityStampAsync(user as User);
return EntityResult<IUser>.Success(user);
}
}
public interface IUserApi : IAppAwareBackofficeApi
{
/// <summary>
/// Find user by id
/// </summary>
Task<IUser> GetUserById(string id);
/// <summary>
/// Find user by email
/// </summary>
Task<IUser> GetUserByEmail(string email);
/// <summary>
/// Get all users for the selected application
/// </summary>
Task<IList<IUser>> GetAll(string appId = null);
/// <summary>
/// Get all available users (with query)
/// </summary>
Task<ListResult<IUser>> GetByQuery(ListQuery<IUser> query, string appId = null);
/// <summary>
/// Creates or updates a user
/// </summary>
Task<EntityResult<IUser>> Save(IUser model);
/// <summary>
/// Deletes a user
/// </summary>
Task<EntityResult<IUser>> Delete(string id);
/// <summary>
/// Changes the password of the current user.
/// User is logged out if this operation succeeds.
/// </summary>
Task<EntityResult<IUser>> UpdatePassword(IUser user, string currentPassword, string newPassword);
/// <summary>
/// Enables a user
/// </summary>
Task<EntityResult<IUser>> Enable(IUser user);
/// <summary>
/// Disables a user
/// </summary>
Task<EntityResult<IUser>> Disable(IUser user);
}
}