using RSecurityBackend.Models.Auth.Db; using RSecurityBackend.Models.Auth.Memory; using RSecurityBackend.Models.Auth.ViewModels; using RSecurityBackend.Models.Generic; using System; using System.Linq; using System.Threading.Tasks; namespace RSecurityBackend.Services.Implementation { /// /// Permission checker service implementation /// public class UserPermissionChecker : IUserPermissionChecker { /// /// check to see if user has permission to do operation /// /// userId /// /// form /// operation /// true if has permission public virtual async Task> Check(Guid userId, Guid sessionId, string securableItemShortName, string operationShortName) { try { RServiceResult userInfo = await _appUserService.GetUserInformation(userId); if (userInfo.Result == null) { return new RServiceResult(false); } if (userInfo.Result.Status != RAppUserStatus.Active) { return new RServiceResult(false); } RServiceResult sessionCheckResult = await _appUserService.SessionExists(userId, sessionId); if(!string.IsNullOrEmpty(sessionCheckResult.ExceptionString)) { return new RServiceResult(false, sessionCheckResult.ExceptionString); } if(!sessionCheckResult.Result) { return new RServiceResult(false); } RServiceResult isAdminResult = await _appUserService.IsAdmin(userId); if(!string.IsNullOrEmpty(isAdminResult.ExceptionString)) { return new RServiceResult(false, isAdminResult.ExceptionString); } if (isAdminResult.Result) { return new RServiceResult(true); } RServiceResult hasPermission = await _appUserService.HasPermission(userId, securableItemShortName, operationShortName); if (hasPermission.Result) { return new RServiceResult(true); } return new RServiceResult(false); } catch(Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// IAppUserService instance /// protected IAppUserService _appUserService; /// /// constructor /// /// public UserPermissionChecker(IAppUserService appUserService) { _appUserService = appUserService; } } }