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