/// <exception cref="ConnectionStringNotFoundException">Some connection string is not found</exception>
        /// <exception cref="DatabaseException">Error is occurred while saving data to database</exception>
        public async Task UpdateExternalId(AccountCreatedTransferObject user)
        {
            var loginDbConnectionString = await _csProvider.GetLoginDb();

            if (string.IsNullOrEmpty(loginDbConnectionString))
            {
                throw new ConnectionStringNotFoundException("Login DB connection string is not found");
            }

            await Exec(loginDbConnectionString, "sc_orchestration_update_login_external_id", p =>
            {
                p.AddWithValue("@login_id", user.InternalLoginId);
                p.AddWithValue("@external_login_id", user.ExternalLoginId);
            });
        }
Example #2
0
        private async Task SendMessage(AccountCreatedEventHandler sender, AccountCreatedTransferObject user, IConfiguration config)
        {
            if (sender == null)
            {
                return;
            }

            try
            {
                var userDetail = await sender.DbCommands.GetLoginUserIdAndCustomerDb(user.InternalLoginId);

                ThreadContext.Properties["OrganisationId"] = userDetail.Item2;
                var db = new DatabaseManager();

                var publishEnabled = db.IsPublishEnabled(userDetail.Item3, (int)Constants.EntityType.User);
                if (publishEnabled)
                {
                    SqlParameter[] parameters = new SqlParameter[] {
                        new SqlParameter("@EntityId", userDetail.Item1),
                        new SqlParameter("@EntityTypeId", (int)Constants.EntityType.User),
                        new SqlParameter("@RetryCount", 0)
                        {
                            Value = 0, DbType = System.Data.DbType.Int32
                        },
                        new SqlParameter("@StatusId", 1),
                        new SqlParameter("@DateCreated", DateTime.UtcNow),
                        new SqlParameter("@ExternalId", string.Empty),
                        new SqlParameter("@MessageActionTypeId", (int)Constants.MessageActionType.SalesForceUserCreated)
                    };

                    db.Execute(userDetail.Item3, "sc_calculation_enqueue", Constants.TIMEOUT_MSMQ_EXEC_STOREDPROC, true, parameters);
                }
                _logger.InfoFormat("Enque userId: {0}, databaseId: {1}", userDetail.Item1, userDetail.Item2);
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
                throw;
            }
            finally
            {
                ThreadContext.Properties.Remove("OrganisationId");
            }
        }
        public void Should_correctly_convert_AccountCreatedTransferObject_to_json()
        {
            var obj = new AccountCreatedTransferObject
            {
                InternalLoginId    = 1,
                InternalId         = "1",
                FirstName          = "1",
                LastName           = "1",
                EmailAddress       = "1",
                ExternalLoginId    = "1",
                Username           = "******",
                ExternalCustomerId = "1",
                PermissionSets     = new List <string>()
            };

            var          actual   = obj.ToJson();
            const string expected = @"{""InternalLoginId"":1,""ExternalLoginId"":""1"",""Username"":""1"",""FirstName"":""1"",""LastName"":""1"",""EmailAddress"":""1"",""ExternalCustomerId"":""1"",""PermissionSets"":[],""CustomerCanonicallId"":null,""InternalId"":""1""}";

            Assert.Equal(expected, actual);
        }
        public async Task <int> AddUser(AccountCreatedTransferObject user)
        {
            if (string.IsNullOrEmpty(user.ExternalCustomerId))
            {
                throw new ConnectionStringNotFoundException("Cannot identify customer to which user should be created");
            }

            var loginDbConnectionString = await _csProvider.GetLoginDb();

            if (string.IsNullOrEmpty(loginDbConnectionString))
            {
                throw new ConnectionStringNotFoundException("Login DB connection string is not found");
            }

            var values = _configuration.UserDefaults;
            // if we're here then no account is associated with loginId or externalLoginId
            // only externalCustomerId can be used to lookup DB details
            var dbDetails = await _csProvider.GetCustomerDbDetails(user.ExternalCustomerId, loginDbConnectionString);

            var orgId            = dbDetails.Item1;
            var connectionString = dbDetails.Item2;

            var applicationsToAdd = string.Empty;

            int defaultUserGroupId = GetDefaultUserGroup(connectionString).Result;

            if (defaultUserGroupId == 0)
            {
                defaultUserGroupId = 1;                          //set default user group to SC Administrators
            }
            if (user.PermissionSets.Any())
            {
                applicationsToAdd = String.Join(",", user.PermissionSets.ToArray());
            }

            var dbUserId = new SqlParameter("@user_id", SqlDbType.Int)
            {
                Direction = ParameterDirection.Output
            };

            await Exec(connectionString, "sc_admin_save_preferences", p =>
            {
                p.Add(dbUserId);
                p.AddWithValue("@email", user.EmailAddress);
                p.AddWithValue("@login_name", user.Username);
                p.AddWithValue("@forename", user.FirstName);
                p.AddWithValue("@lastname", user.LastName);
                p.AddWithValue("@ugroup_id", defaultUserGroupId);
                p.AddWithValue("@language_id", values["language_id"]);
                p.AddWithValue("@set_default", true); // required to add default group
                p.AddWithValue("@applications_to_add", applicationsToAdd);
            });

            var userId = Convert.ToInt32(dbUserId.Value);
            var ids    = await GetUserId(connectionString, userId);

            if (ids == null)
            {
                throw new ListenerException("Cannot map external account to the StarChef account");
            }
            var userConfig = ids.Item2;
            var isEnabled  = ids.Item3;
            var isDeleted  = ids.Item4;

            var dbLoginId = new SqlParameter("@login_id", SqlDbType.Int)
            {
                Direction = ParameterDirection.Output
            };

            await Exec(loginDbConnectionString, "sc_admin_update_login", p =>
            {
                p.Add(dbLoginId);
                p.AddWithValue("@login_name", user.Username);
                p.AddWithValue("@db_application_id", values["db_application_id"]);
                p.AddWithValue("@db_database_id", orgId);
                p.AddWithValue("@user_id", userId);
                p.AddWithValue("@db_role_id", values["db_role_id"]);
                var pwd = Fourth.StarChef.Invariables.Security.PasswordGenerator.RandomSsoGuidPassword();
                pwd     = new Fourth.StarChef.Invariables.Security.CustomEncryption().Encrypt(pwd);
                p.AddWithValue("@login_password", pwd);
                p.AddWithValue("@login_config", userConfig);
                p.AddWithValue("@is_enabled", isEnabled);
                p.AddWithValue("@is_deleted", isDeleted);
                p.AddWithValue("@external_login_id", user.ExternalLoginId);
            });

            return(Convert.ToInt32(dbLoginId.Value));
        }
Example #5
0
 public static void AddingUser(this ILog logger, AccountCreatedTransferObject user)
 {
     logger.InfoFormat("Adding new user ({0})", user.ToJson());
 }
Example #6
0
 public static void UpdatingUserExternalId(this ILog logger, AccountCreatedTransferObject user)
 {
     logger.InfoFormat("Set externalId ({0}) to user with loginId={1}", user.ExternalLoginId, user.InternalLoginId);
 }
Example #7
0
        public async Task <MessageHandlerResult> HandleAsync(AccountCreated payload, string trackingId)
        {
            ThreadContext.Properties[INTERNAL_ID] = payload.InternalId;

            try
            {
                if (Validator.IsAllowedEvent(payload))
                {
                    _logger.EventReceived(trackingId, payload);

                    if (Validator.IsValidPayload(payload))
                    {
                        AccountCreatedTransferObject user = null;
                        try
                        {
                            user = Mapper.Map <AccountCreatedTransferObject>(payload);

                            if (payload.HasSource && payload.Source == SourceSystem.STARCHEF)
                            {
                                int userId = 0;
                                if (int.TryParse(user.InternalId, out userId))
                                {
                                    user.InternalLoginId = userId;
                                }
                            }

                            var isUserExists = await DbCommands.IsUserExists(user.InternalLoginId, username : user.Username);

                            if (isUserExists)
                            {
                                /* NOTE
                                 * LoginId is missing in the system when the event is issued
                                 * #1 by another system OR
                                 * #2 be user management API (as of 18/Apr/17).
                                 * The operation to originate loginId will lookup database for the actual value.
                                 * NB: it should be originated always because User Management send event with StarChef source system.
                                 */
                                user.InternalLoginId = await DbCommands.OriginateLoginId(user.InternalLoginId, user.Username);

                                _logger.UpdatingUserExternalId(user);
                                await DbCommands.UpdateExternalId(user);
                            }
                            else
                            {
                                _logger.AddingUser(user);
                                user.InternalLoginId = await DbCommands.AddUser(user);
                            }

                            await MessagingLogger.MessageProcessedSuccessfully(payload, trackingId);

                            _logger.Processed(trackingId, payload);

                            // run subscribed post-events
                            var evt = OnProcessed;
                            if (evt != null)
                            {
                                _logger.Info("Post-processing the event");
                                await evt(this, user, _config);
                            }
                        }
                        catch (ListenerException ex)
                        {
                            _logger.ListenerException(ex, trackingId, user);
                            return(MessageHandlerResult.Fatal);
                        }
                    }
                    else
                    {
                        var errors = Validator.GetErrors();
                        _logger.InvalidModel(trackingId, payload, errors);
                        await MessagingLogger.ReceivedInvalidModel(trackingId, payload, errors);

                        return(MessageHandlerResult.Fatal);
                    }
                }
            }
            catch (System.Exception e)
            {
                _logger.Error(e);
                return(MessageHandlerResult.Fatal);
            }
            finally
            {
                ThreadContext.Properties.Remove(INTERNAL_ID);
            }
            return(MessageHandlerResult.Success);
        }