Example #1
0
            /// <summary>
            /// Lock the current user, so that same user can't log into another terminal until log off from the current terminal.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <bool> LockUserAtLogOn(LockUserAtLogOnDataRequest request)
            {
                const bool AllowMultipleTerminalSessions = false;

                bool isAccessAllowed;
                EmployeeL2CacheDataStoreAccessor cacheAccessor = GetCacheAccessor(request.RequestContext);

                if (!cacheAccessor.LockUserAtLogOn(request.TerminalId, request.StaffId, out isAccessAllowed))
                {
                    CreateEmployeeSessionDataResponse response = this.CreateEmployeeSession(
                        request.RequestContext,
                        AllowMultipleTerminalSessions,
                        request.ChannelId,
                        request.TerminalId,
                        request.StaffId,
                        request.DataAreaId);

                    // access is allowed if there is no previous existing session
                    isAccessAllowed = string.IsNullOrWhiteSpace(response.ExistingSessionTerminalId);

                    if (isAccessAllowed)
                    {
                        // only cache if user is allowed
                        // if user is blocked, we want to always keep performing the check to avoid
                        // blocking the user during the cache expiration period
                        cacheAccessor.CacheLockUserAtLogOn(request.TerminalId, request.StaffId, isAccessAllowed);
                    }
                }

                return(new SingleEntityDataServiceResponse <bool>(isAccessAllowed));
            }
            /// <summary>
            /// Checks whether the current employee has an open session on the current terminal.
            /// </summary>
            /// <param name="requestContext">The request context.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <bool> CheckEmployeeHasOpenSessionOnCurrentTerminal(RequestContext requestContext)
            {
                const string EmployeeSessionsViewName = "EmployeeSessionsView";
                string       terminalId = requestContext.GetTerminal().TerminalId;
                string       staffId    = requestContext.GetPrincipal().UserId;

                bool employeeHasOpenSessionOnCurrentTerminal;

                DataStoreManager.InstantiateDataStoreManager(requestContext);
                EmployeeL2CacheDataStoreAccessor accessor = new EmployeeL2CacheDataStoreAccessor(DataStoreManager.DataStores[DataStoreType.L2Cache], requestContext);

                if (!accessor.CheckEmployeeSessionOpenOnTerminal(terminalId, staffId, out employeeHasOpenSessionOnCurrentTerminal))
                {
                    using (DatabaseContext databaseContext = new DatabaseContext(requestContext))
                    {
                        SqlPagedQuery query = new SqlPagedQuery(QueryResultSettings.SingleRecord)
                        {
                            Select = new ColumnSet("STAFFID"),
                            From   = EmployeeSessionsViewName,
                            Where  = "DATAAREAID = @DATAAREAID AND STAFFID = @STAFFID AND TERMINALID = @TERMINALID AND CHANNELID = @CHANNELID",
                        };

                        query.Parameters["@DATAAREAID"] = requestContext.GetChannelConfiguration().InventLocationDataAreaId;
                        query.Parameters["@STAFFID"]    = staffId;
                        query.Parameters["@TERMINALID"] = terminalId;
                        query.Parameters["@CHANNELID"]  = requestContext.GetPrincipal().ChannelId;

                        employeeHasOpenSessionOnCurrentTerminal = databaseContext.ExecuteScalarCollection <string>(query).Any();
                    }

                    accessor.CacheIsEmployeeSessionOpenOnTerminal(terminalId, staffId, employeeHasOpenSessionOnCurrentTerminal);
                }

                return(new SingleEntityDataServiceResponse <bool>(employeeHasOpenSessionOnCurrentTerminal));
            }
Example #3
0
            /// <summary>
            /// Unlock the current user.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <bool> UnLockUserAtLogOff(UnlockUserAtLogOffDataRequest request)
            {
                ParameterSet parameters = new ParameterSet();

                parameters[ChannelIdParamName]  = request.ChannelId;
                parameters[StaffIdParamName]    = request.StaffId;
                parameters[DataAreaIdParamName] = request.DataAreaId;
                ParameterSet outputParameters = new ParameterSet();

                outputParameters[ReturnValueParamName] = 0;

                using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(request))
                {
                    databaseContext.ExecuteStoredProcedureScalar(UnlockUserSprocName, parameters, outputParameters);
                }

                bool result = false;

                if ((int)outputParameters[ReturnValueParamName] == 1)
                {
                    result = true;
                }

                EmployeeL2CacheDataStoreAccessor cacheAccessor = GetCacheAccessor(request.RequestContext);

                cacheAccessor.ClearCacheLockUserAtLogOn(request.TerminalId, request.StaffId);

                // unlocking the user has the same meaning as deleting the user session on the terminal
                cacheAccessor.ClearCacheIsEmployeeSessionOpenOnTerminal(request.TerminalId, request.StaffId);

                return(new SingleEntityDataServiceResponse <bool>(result));
            }
            /// <summary>
            /// Logs On the user in the local store database.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <Employee> EmployeeLogOnStore(EmployeeLogOnStoreDataRequest request)
            {
                EmployeeDataManager dataManager = this.GetDataManagerInstance(request.RequestContext);
                var result = dataManager.EmployeeLogOnStore(request.ChannelId, request.StaffId, request.PasswordHash, request.ColumnSet);

                // Clear the cache for the staff at logon.
                DataStoreManager.InstantiateDataStoreManager(request.RequestContext);
                EmployeeL2CacheDataStoreAccessor accessor = new EmployeeL2CacheDataStoreAccessor(DataStoreManager.DataStores[DataStoreType.L2Cache], request.RequestContext);

                accessor.ClearCacheAuthorizedEmployeeOnStore(request.ChannelId, request.StaffId);

                return(new SingleEntityDataServiceResponse <Employee>(result));
            }