Ejemplo n.º 1
0
 protected override IEnumerable <CacheInvalidationItem> GetCacheInvalidationItems()
 {
     return(CacheInvalidation.GetOrganisationInvalidationItems(_organisationId, _email).Union(
                CacheInvalidation.GetUserInvalidationItems(_organisationId, _email)));
 }
Ejemplo n.º 2
0
        public EditUserResponse Invoke(EditUserRequest request)
        {
            Trace("Starting...");

            var userId                 = User.GetId(request.UserId);
            var existingUser           = Load <User>(userId);
            var cacheInvalidationItems = new List <CacheInvalidationItem>();

            if (existingUser == null)
            {
                return(new EditUserResponse
                {
                    Status = EditUserStatus.UserNotFound
                });
            }

            var userMapping = Session.MasterRaven.Query <UserOrganisationMapping>().First(u => u.EmailAddress == existingUser.Email);

            if (userMapping == null)
            {
                return(new EditUserResponse
                {
                    Status = EditUserStatus.UserNotFound
                });
            }

            _authorisationManager.Authorise(existingUser, request.CurrentUser);

            var existingEmail = Session.Raven.Query <User, Indexing.Users>().FirstOrDefault(u => u.Email == request.Email && u.Id != userId);

            if (existingEmail != null)
            {
                return(new EditUserResponse
                {
                    Status = EditUserStatus.EmailExists
                });
            }

            if (existingUser.Email != request.Email)
            {
                userMapping.EmailAddress = request.Email;
                Session.SynchroniseIndexes <UserOrganisationMappings>(true);
            }

            var ravenInstances = _getRavenInstancesQuery.Invoke(new GetRavenInstancesRequest()).RavenInstances;

            //find the users accounts in their organisations and sync the user
            foreach (var organisationId in userMapping.Organisations)
            {
                var organisation = MasterLoad <Organisation>(organisationId);
                if (organisation == null)
                {
                    userMapping.Organisations.Remove(organisationId);
                }
                else
                {
                    organisation.RavenInstance = ravenInstances.First(r => r.Id == organisation.RavenInstanceId);

                    using (Session.SwitchOrg(organisation))
                    {
                        var user = Session.Raven.Query <User, Indexing.Users>().FirstOrDefault(u => u.Email == request.Email);

                        if (user == null)
                        {
                            userMapping.Organisations.Remove(organisationId);
                        }
                        else
                        {
                            user.Email     = request.Email;
                            user.FirstName = request.FirstName;
                            user.LastName  = request.LastName;

                            if (organisation.Id == request.CurrentUser.ActiveOrganisation.Id)
                            {
                                if (request.Administrator.HasValue && existingUser.Role != UserRole.SuperUser)
                                {
                                    user.Role = request.Administrator.Value ? UserRole.Administrator : UserRole.User;
                                }

                                if (request.GroupIds != null)
                                {
                                    user.GroupIds = request.GroupIds.Select(Group.GetId).ToList();
                                }
                            }

                            cacheInvalidationItems.AddRange(CacheInvalidation.GetUserInvalidationItems(organisation.Id, existingUser.Email));
                        }
                    }
                }
            }

            Session.SynchroniseIndexes <Indexing.Users, Indexing.Groups>();

            return(new EditUserResponse(cacheInvalidationItems)
            {
                Status = EditUserStatus.Ok
            });
        }