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