using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Raven.Client.Documents; using Raven.Client.Documents.Session; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Identity; namespace zero.Core.Api { public class UserApi : IUserApi { protected IDocumentStore Raven { get; private set; } protected IHttpContextAccessor HttpContextAccessor { get; set; } protected UserManager UserManager { get; private set; } private ClaimsPrincipal Principal => HttpContextAccessor.HttpContext?.User; public UserApi(IDocumentStore raven, IHttpContextAccessor httpContextAccessor, UserManager userManager) { Raven = raven; HttpContextAccessor = httpContextAccessor; UserManager = userManager; } /// public async Task GetUser() { User user = await UserManager.GetUserAsync(HttpContextAccessor.HttpContext.User); return user; } /// public async Task GetUserById(string id) { User user = await UserManager.FindByIdAsync(id); return user; } /// public async Task GetUserByEmail(string email) { User user = await UserManager.FindByEmailAsync(email); return user; } /// public bool IsSuper() { return Principal.HasClaim(Constants.Auth.Claims.IsSuper, PermissionsValue.True); } /// public bool IsAdmin() { return Principal.HasClaim(Constants.Auth.Claims.Role, "administrator"); // TODO use constant (in setup as well) } /// public IList GetPermissions(string prefix = null) { return Principal.Claims .Where(claim => claim.Type == Constants.Auth.Claims.Permission && (prefix == null || claim.Value.StartsWith(prefix))) .Select(claim => new Permission(claim, prefix)) .ToList(); } /// public async Task> GetAll(string appId = null) { using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { return await session.Query() .ForApp(appId) .OrderByDescending(x => x.CreatedDate) .ToListAsync(); } } /// public async Task> GetByQuery(ListQuery query, string appId = null) { query.SearchSelector = user => user.Name; using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { return await session.Query() .ForApp(appId) .ToQueriedListAsync(query); } } } public interface IUserApi { /// /// Get currently logged-in user /// Task GetUser(); /// /// Find user by id /// Task GetUserById(string id); /// /// Find user by email /// Task GetUserByEmail(string email); /// /// Whether the current user is the super user who created the zero instance /// bool IsSuper(); /// /// Whether the current user belongs to the administrator role (will always return false if this role gets deleted) /// bool IsAdmin(); /// /// Get all permissions for the current user with an optional prefix /// IList GetPermissions(string prefix = null); /// /// Get all users for the selected application /// Task> GetAll(string appId = null); /// /// Get all available users (with query) /// Task> GetByQuery(ListQuery query, string appId = null); } }