public override ObjectAccessItem InitializeAccessItem(ObjectAccessItem accessItem, int userID, Type objectType)
        {
            var access = base.InitializeAccessItem(accessItem, userID, objectType);
            var owner = access.Users.FirstOrDefault(x => x.UserID == userID);

            access.ReadAll = access.UpdateAll = access.DeleteAll = access.ChangeAccessAll = false;

            access.UserCategories.Clear();
            access.Users.Clear();

            access.Users.Add(owner);

            return accessItem;
        }
        public override ObjectAccessItem InitializeAccessItem(ObjectAccessItem accessItem, int userID, Type objectType)
        {
            var access = base.InitializeAccessItem(accessItem, userID, objectType);

            access.DeleteAll = access.UpdateAll = access.ChangeAccessAll = false;

            access.UserCategories = access.UserCategories ?? new List<UserCategoryAccess>();

            foreach (var category in access.UserCategories)
                category.Update = category.Delete = category.ChangeAccess = false;

            access.Users = access.Users ?? new List<UserAccess>();

            foreach (var user in access.Users.Where(x => x.UserID != userID))
                user.Update = user.Delete = user.ChangeAccess = false;

            return access;
        }
        public override ObjectAccessItem InitializeAccessItem(ObjectAccessItem accessItem, int userID, Type objectType)
        {
            var user = _systemUnitOfWork.GetRepository<User>().All().FirstOrDefault(x => !x.Hidden && x.ID == userID);

            if (user != null && user.UserCategory != null)
            {
                var nearestCompanies = new List<UserCategory>();

                if (user.UserCategory.Company)
                    nearestCompanies.Add(user.UserCategory);

                if (user.UserCategory.sys_all_parents != null)
                {
                    var parentIDs = user.UserCategory.sys_all_parents.Split(HCategory.Seperator)
                    .Select(HCategory.IdToInt).Reverse();

                    nearestCompanies.AddRange(_systemUnitOfWork.GetRepository<UserCategory>().All()
                            .Where(x => !x.Hidden && parentIDs.Contains(x.ID) && x.Company));
                }

                if (nearestCompanies.Any())
                    accessItem.ReadAll = accessItem.UpdateAll = accessItem.DeleteAll = accessItem.ChangeAccessAll = false;

                accessItem.UserCategories = nearestCompanies.Select(x => new UserCategoryAccess
                {
                    UserCategoryID = x.ID,
                    ObjectAccessItem = accessItem,
                    ChangeAccess = false
                }).ToList();

                accessItem.Users.Add(new UserAccess
                {
                    UserID = user.ID
                });
            }

            return accessItem;
        }
        public virtual void OnBeforeSave(IUnitOfWork unitOfWork, ObjectAccessItem src, ObjectAccessItem dest)
        {
            if (src.UserCategories != null)
            {
                src.UserCategories = src.UserCategories.GroupBy(x => x.UserCategoryID).Select(x =>
                {
                    var category = x.FirstOrDefault(c => c.UserCategoryID == x.Key);

                    if (category == null) return null;

                    category.Read = x.Any(c => c.Read);

                    category.Update = x.Any(c => c.Update);

                    category.Delete = x.Any(c => c.Delete);

                    return category;
                }).ToList();
            }

            if (src.Users != null)
            {
                src.Users = src.Users.GroupBy(x => x.UserID).Select(x =>
                {
                    var category = x.FirstOrDefault(c => c.UserID == x.Key);

                    if (category == null) return null;

                    category.Read = x.Any(c => c.Read);

                    category.Update = x.Any(c => c.Update);

                    category.Delete = x.Any(c => c.Delete);

                    return category;
                }).ToList();
            }
        }
 public virtual ObjectAccessItem InitializeAccessItem(ObjectAccessItem accessItem, int userID, Type objectType)
 {
     return accessItem;
 }
 public virtual void ChangeSortOrder(IUnitOfWork unitOfWork, ObjectAccessItem obj, int newOrder)
 {
 }
        public virtual void Delete(IUnitOfWork unitOfWork, ObjectAccessItem obj)
        {
            var repository = unitOfWork.GetRepository<ObjectAccessItem>();

            obj.Hidden = true;

            repository.Update(obj);

            unitOfWork.SaveChanges();

            var eventHandler = Volatile.Read(ref this.OnDelete);

            if (eventHandler != null)
            {
                eventHandler(this, new BaseObjectEventArgs()
                {
                    Type = TypeEvent.OnDelete,
                    Object = obj,
                    UnitOfWork = unitOfWork
                });
            }
        }
        public virtual ObjectAccessItem Update(IUnitOfWork unitOfWork, ObjectAccessItem obj)
        {
            var repository = unitOfWork.GetRepository<ObjectAccessItem>();

            var objDest = repository.Find(obj.ID);

            this.OnBeforeSave(unitOfWork, obj, objDest);

            var saver = this.GetForSave(unitOfWork, unitOfWork.GetObjectSaver(obj, objDest));

            repository.Update(saver.Dest);

            unitOfWork.SaveChanges();

            var eventHandler = Volatile.Read(ref this.OnUpdate);

            if (eventHandler != null)
            {
                eventHandler(this, new BaseObjectEventArgs()
                {
                    Type = TypeEvent.OnUpdate,
                    Object = saver.Dest,
                    UnitOfWork = unitOfWork
                });
            }

            return saver.Dest;
        }
        public virtual ObjectAccessItem Create(IUnitOfWork unitOfWork, ObjectAccessItem obj)
        {

            this.InitSortOrder(unitOfWork, obj);

            this.OnBeforeSave(unitOfWork, obj, null);

            var saver = this.GetForSave(unitOfWork, unitOfWork.GetObjectSaver(obj, null));

            unitOfWork.GetRepository<ObjectAccessItem>().Create(saver.Dest);

            unitOfWork.SaveChanges();

            var eventHandler = Volatile.Read(ref this.OnCreate);

            if (eventHandler != null)
            {
                eventHandler(this, new BaseObjectEventArgs()
                {
                    Type = TypeEvent.OnCreate,
                    Object = saver.Dest,
                    UnitOfWork = unitOfWork
                });
            }

            return saver.Dest;
        }
 protected virtual void InitSortOrder(IUnitOfWork unitOfWork, ObjectAccessItem obj)
 {
     if (obj.SortOrder == -1)
     {
         obj.SortOrder = (this.GetAll(unitOfWork).Max(m => (int?)m.SortOrder) ?? 0) + 1;
     }
 }