public void Delete(AlumniFeaturePermission alumniFeaturePermission)
 {
     using (var uow = this.GetUnitOfWork())
     {
         var alumniFeaturePermissionRepository = uow.GetRepository <AlumniFeaturePermission>();
         alumniFeaturePermissionRepository.Delete(alumniFeaturePermission);
         uow.Commit();
     }
 }
        //public int GetPermissionType(long subjectId, long featureId)
        //{
        //    using (var uow = this.GetUnitOfWork())
        //    {
        //        var featurePermission = Find(subjectId, featureId);

        //        if (featurePermission != null)
        //        {
        //            return (int)featurePermission.PermissionType;
        //        }

        //        return 2;
        //    }
        //}

        //public bool HasAccess(long? subjectId, long featureId)
        //{
        //    using (var uow = this.GetUnitOfWork())
        //    {
        //        var featureRepository = uow.GetReadOnlyRepository<Feature>();
        //        var subjectRepository = uow.GetReadOnlyRepository<Subject>();

        //        var feature = featureRepository.Get(featureId);
        //        var subject = subjectId == null ? null : subjectRepository.Query(s => s.Id == subjectId).FirstOrDefault();

        //        // Anonymous
        //        if (subject == null)
        //        {
        //            while (feature != null)
        //            {
        //                if (Exists(null, feature.Id, PermissionType.Grant))
        //                    return true;

        //                feature = feature.Parent;
        //            }

        //            return false;
        //        }

        //        // Non-Anonymous
        //        while (feature != null)
        //        {
        //            if (Exists(null, feature.Id, PermissionType.Grant))
        //                return true;

        //            if (Exists(subject.Id, feature.Id, PermissionType.Deny))
        //                return false;

        //            if (Exists(subject.Id, feature.Id, PermissionType.Grant))
        //                return true;

        //            if (subject is User)
        //            {
        //                var user = subject as User;
        //                var groupIds = user.Groups.Select(g => g.Id).ToList();

        //                if (Exists(groupIds, new[] { feature.Id }, PermissionType.Deny))
        //                {
        //                    return false;
        //                }

        //                if (Exists(groupIds, new[] { feature.Id }, PermissionType.Grant))
        //                {
        //                    return true;
        //                }
        //            }

        //            feature = feature.Parent;
        //        }

        //        return false;
        //    }
        //}

        ////public bool HasAccess(Subject subject, Feature feature)
        ////{
        ////    using (var uow = this.GetUnitOfWork())
        ////    {
        ////        var featureRepository = uow.GetReadOnlyRepository<Feature>();
        ////        var subjectRepository = uow.GetReadOnlyRepository<Subject>();

        ////        // Anonymous
        ////        if (subject == null)
        ////        {
        ////            while (feature != null)
        ////            {
        ////                if (Exists(null, feature.Id, PermissionType.Grant))
        ////                    return true;

        ////                feature = feature.Parent;
        ////            }

        ////            return false;
        ////        }

        ////        // Non-Anonymous
        ////        while (feature != null)
        ////        {
        ////            if (Exists(null, feature.Id, PermissionType.Grant))
        ////                return true;

        ////            if (Exists(subject.Id, feature.Id, PermissionType.Deny))
        ////                return false;

        ////            if (Exists(subject.Id, feature.Id, PermissionType.Grant))
        ////                return true;

        ////            if (subject is User)
        ////            {
        ////                var user = subject as User;
        ////                var groupIds = user.Groups.Select(g => g.Id).ToList();

        ////                if (Exists(groupIds, new[] { feature.Id }, PermissionType.Deny))
        ////                {
        ////                    return false;
        ////                }

        ////                if (Exists(groupIds, new[] { feature.Id }, PermissionType.Grant))
        ////                {
        ////                    return true;
        ////                }
        ////            }

        ////            feature = feature.Parent;
        ////        }

        ////        return false;
        ////    }
        ////}

        //public bool HasAccess<T>(string subjectName, string module, string controller, string action) where T : Subject
        //{
        //    using (var uow = this.GetUnitOfWork())
        //    {
        //        var operationRepository = uow.GetReadOnlyRepository<Operation>();
        //        var SubjectRepository = uow.GetReadOnlyRepository<Subject>();

        //        var operation = operationRepository.Query(x => x.Module.ToUpperInvariant() == module.ToUpperInvariant() && x.Controller.ToUpperInvariant() == controller.ToUpperInvariant() && x.Action.ToUpperInvariant() == action.ToUpperInvariant()).FirstOrDefault();
        //        var feature = operation?.Feature;
        //        var subject = SubjectRepository.Query(s => s.Name.ToUpperInvariant() == subjectName.ToUpperInvariant() && s is T).FirstOrDefault();
        //        if (feature != null && subject != null)
        //            return HasAccess(subject.Id, feature.Id);

        //        return false;
        //    }
        //}

        public void Update(AlumniFeaturePermission entity)
        {
            using (var uow = this.GetUnitOfWork())
            {
                var repo = uow.GetRepository <AlumniFeaturePermission>();
                repo.Merge(entity);
                var merged = repo.Get(entity.Id);
                repo.Put(merged);
                uow.Commit();
            }
        }
        public static FeaturePermission ToFeaturePermission(AlumniFeaturePermission alumniFeaturePermission)
        {
            var featurePermission = new FeaturePermission
            {
                Feature        = alumniFeaturePermission.Feature,
                PermissionType = alumniFeaturePermission.PermissionType,
                Subject        = alumniFeaturePermission.Subject
            };

            return(featurePermission);
        }
        public static AlumniFeaturePermission ToAlumniFeaturePermission(FeaturePermission featurePermission)
        {
            var alumniFeaturePermission = new AlumniFeaturePermission
            {
                Feature        = featurePermission.Feature,
                PermissionType = featurePermission.PermissionType,
                Subject        = featurePermission.Subject
            };

            return(alumniFeaturePermission);
        }
        public void Create(Subject subject, Feature feature, PermissionType permissionType = PermissionType.Grant)
        {
            using (var uow = this.GetUnitOfWork())
            {
                var subjectRepository = uow.GetReadOnlyRepository <Subject>();
                var featureRepository = uow.GetReadOnlyRepository <Feature>();

                var alumniFeaturePermission = new AlumniFeaturePermission()
                {
                    Subject        = subjectRepository.Get(subject.Id),
                    Feature        = featureRepository.Get(feature.Id),
                    PermissionType = permissionType
                };

                var alumniFeaturePermissionRepository = uow.GetRepository <AlumniFeaturePermission>();
                alumniFeaturePermissionRepository.Put(alumniFeaturePermission);
                uow.Commit();
            }
        }
        public void Create(long?subjectId, long featureId, BExIS.Security.Entities.Authorization.PermissionType permissionType)
        {
            using (var uow = this.GetUnitOfWork())
            {
                var featureRepository = uow.GetReadOnlyRepository <Feature>();
                var subjectRepository = uow.GetReadOnlyRepository <Subject>();

                if (Exists(subjectId, featureId, permissionType))
                {
                    return;
                }

                var alumniFeaturePermission = new AlumniFeaturePermission
                {
                    Feature        = featureRepository.Get(featureId),
                    PermissionType = permissionType,
                    Subject        = subjectId == null ? null : subjectRepository.Query(s => s.Id == subjectId).FirstOrDefault()
                };

                var alumniFeaturePermissionRepository = uow.GetRepository <AlumniFeaturePermission>();
                alumniFeaturePermissionRepository.Put(alumniFeaturePermission);
                uow.Commit();
            }
        }