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