Exemple #1
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
            });
        }
Exemple #2
0
        public CreateOrganisationResponse Invoke(CreateOrganisationRequest request)
        {
            Trace("Starting...");

            var existingOrganisation = Session.MasterRaven
                                       .Query <Organisation, Indexing.Organisations>()
                                       .FirstOrDefault(o => o.Name == request.OrganisationName);

            if (existingOrganisation != null)
            {
                return(new CreateOrganisationResponse
                {
                    Status = CreateOrganisationStatus.OrganisationExists
                });
            }

            var freeTrialPlan = _getAvailablePaymentPlansQuery.Invoke(new GetAvailablePaymentPlansRequest()).Plans.FirstOrDefault(p => p.IsFreeTier);
            var timezone      = request.TimezoneId ?? "UTC";
            var date          = DateTime.UtcNow.ToDateTimeOffset(timezone);

            var organisation = new Organisation
            {
                Name          = request.OrganisationName,
                Status        = OrganisationStatus.Active,
                PaymentPlanId = freeTrialPlan?.Id,
                CreatedOnUtc  = DateTime.UtcNow,
                TimezoneId    = timezone,
                PaymentPlan   = freeTrialPlan,
                ApiKeySalt    = Membership.GeneratePassword(8, 1),
                Subscription  = new Subscription
                {
                    Status               = SubscriptionStatus.Trial,
                    StartDate            = date,
                    CurrentPeriodEndDate = date.AddMonths(1),
                    LastModified         = date
                },
                CallbackUrl = request.CallbackUrl,
            };

            var ravenInstance = _getRavenInstancesQuery.Invoke(new GetRavenInstancesRequest())
                                .RavenInstances
                                .FirstOrDefault(r => r.Active) ?? RavenInstance.Master();

            organisation.RavenInstance   = ravenInstance;
            organisation.RavenInstanceId = ravenInstance.Id;

            MasterStore(organisation);

            var existingUserOrgMap = Session.MasterRaven
                                     .Query <UserOrganisationMapping, UserOrganisationMappings>()
                                     .FirstOrDefault(u => u.EmailAddress == request.Email);

            if (existingUserOrgMap != null)
            {
                existingUserOrgMap.Organisations.Add(organisation.Id);
            }
            else
            {
                MasterStore(new UserOrganisationMapping
                {
                    EmailAddress  = request.Email,
                    Organisations = new List <string> {
                        organisation.Id
                    },
                    Password      = request.Password.Hash(),
                    PasswordToken = Guid.Empty,
                    Status        = UserStatus.Active,
                    SsoUser       = request.SpecialUser.IsIn(SpecialUser.AppHarbor),
                });
            }

            organisation.ApiKey = Convert.ToBase64String(
                Encoding.UTF8.GetBytes(
                    _encryptor.Encrypt("{0}|{1}".FormatWith(organisation.FriendlyId, organisation.ApiKeySalt))));

            Session.SetOrganisation(organisation);
            Session.BootstrapOrganisation(organisation);

            var group = new Group
            {
                Name           = request.OrganisationName,
                OrganisationId = organisation.Id
            };

            Store(group);

            var user = new User
            {
                Email     = request.Email,
                FirstName = request.FirstName,
                LastName  = request.LastName,
                Role      = UserRole.Administrator,
                GroupIds  = new List <string> {
                    group.Id
                },
                ActiveOrganisation = organisation,
                OrganisationId     = organisation.Id,
                SpecialUser        = request.SpecialUser,
            };

            Store(user);

            //update the organisation with the primary user
            organisation.PrimaryUserId = user.Id;

            var addApplicationResponse = _addApplicationCommand.Invoke(new AddApplicationRequest
            {
                CurrentUser        = user,
                IsActive           = true,
                MatchRuleFactoryId = new MethodAndTypeMatchRuleFactory().Id,
                Name = request.OrganisationName,
                NotificationGroups = new List <string> {
                    group.Id
                },
                UserId   = user.Id,
                IsSignUp = true,
            });

            //TODO: sync indexes
            Session.SynchroniseIndexes <Indexing.Organisations, Indexing.Users>();

            return(new CreateOrganisationResponse(request.Email)
            {
                OrganisationId = organisation.Id,
                UserId = user.Id,
                ApplicationId = addApplicationResponse.ApplicationId,
            });
        }
        public AddUserResponse Invoke(AddUserRequest request)
        {
            Trace("Starting...");

            var existingUserOrgMap = Session.MasterRaven
                                     .Query <UserOrganisationMapping, UserOrganisationMappings>()
                                     .FirstOrDefault(u => u.EmailAddress == request.Email);

            if (existingUserOrgMap != null && existingUserOrgMap.Organisations.Contains(request.Organisation.Id))
            {
                return(new AddUserResponse(true)
                {
                    Status = AddUserStatus.EmailExists,
                });
            }

            var existingUser = Session.Raven.Query <User, Indexing.Users>().FirstOrDefault(u => u.Email == request.Email);

            if (existingUser != null)
            {
                return(new AddUserResponse(true)
                {
                    Status = AddUserStatus.EmailExists
                });
            }

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

            if (existingUserOrgMap != null)
            {
                var ravenInstances = _getRavenInstancesQuery.Invoke(new GetRavenInstancesRequest()).RavenInstances;

                foreach (var organisationId in existingUserOrgMap.Organisations)
                {
                    var organisation = MasterLoad <Organisation>(organisationId);
                    if (organisation == null)
                    {
                        existingUserOrgMap.Organisations.Remove(organisationId);
                    }
                    else
                    {
                        organisation.RavenInstance = ravenInstances.First(r => r.Id == organisation.RavenInstanceId);

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

                            if (existingUser == null)
                            {
                                existingUserOrgMap.Organisations.Remove(organisationId);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }

                if (existingUser != null)
                {
                    var newUser = new User
                    {
                        Email          = existingUser.Email,
                        FirstName      = existingUser.FirstName,
                        LastName       = existingUser.LastName,
                        Role           = request.Administrator ? UserRole.Administrator : UserRole.User,
                        GroupIds       = request.GroupIds.Select(Group.GetId).ToList(),
                        Status         = UserStatus.Active,
                        OrganisationId = request.Organisation.Id
                    };

                    Store(newUser);

                    existingUserOrgMap.Organisations.Add(request.Organisation.Id);

                    _sendNotificationCommand.Invoke(new SendNotificationRequest
                    {
                        EmailInfo = new AddedToOrganisationEmailInfo
                        {
                            To = existingUser.Email,
                            OrganisationName = request.Organisation.Name,
                            Organisation     = request.Organisation,
                            OrganisationId   = request.Organisation.Id,
                            UserName         = newUser.FirstName
                        },
                        OrganisationId = request.Organisation.Id,
                        Organisation   = request.Organisation
                    });

                    return(new AddUserResponse(false, request.Organisation.Id, request.Email)
                    {
                        Status = AddUserStatus.Ok
                    });
                }
            }

            var user = new User
            {
                Email          = request.Email,
                FirstName      = request.FirstName,
                LastName       = request.LastName,
                Role           = request.Administrator ? UserRole.Administrator : UserRole.User,
                GroupIds       = request.GroupIds.Select(Group.GetId).ToList(),
                Status         = UserStatus.Inactive,
                OrganisationId = request.Organisation.Id
            };

            Store(user);

            var userOrgMapping = new UserOrganisationMapping
            {
                EmailAddress  = request.Email,
                Organisations = new List <string> {
                    request.Organisation.Id
                },
                PasswordToken = Guid.NewGuid(),
                Status        = UserStatus.Inactive
            };

            MasterStore(userOrgMapping);

            _sendNotificationCommand.Invoke(new SendNotificationRequest
            {
                EmailInfo = new NewUserEmailInfo
                {
                    To       = user.Email,
                    Token    = _encryptor.Encrypt("{0}|{1}".FormatWith(userOrgMapping.PasswordToken.ToString(), user.Email)).Base64Encode(),
                    UserName = user.FirstName
                },
                OrganisationId = request.Organisation.Id,
                Organisation   = request.Organisation
            });

            return(new AddUserResponse(false, request.Organisation.Id)
            {
                Status = AddUserStatus.Ok
            });
        }