Checking if a user has a valid session before making a query or call else an INVALID_SESSION error will be returned. The value of time remaining for the session can be cached and referenced so this query only runs a few times. Every time a user makes a request we can check the cache and see if the user has time remaining.
Query session information and returning UserSession model
public static UserSession getUserSessionInfo(User userObj){ UserSession bpUserSession = new UserSession(); List<AuthSession> session = [Select LastModifiedDate, NumSecondsValid from AuthSession where UsersId = : userObj.Id] ; bpUserSession.setSessionValid(false); for(AuthSession sessionObj : session){ bpUserSession.setSecondsValid(sessionObj.NumSecondsValid); bpUserSession.setLastModifiedDate(sessionObj.LastModifiedDate); } if (bpUserSession.getSecondsValid()!=null) bpUserSession.setSessionExpireTime(bpUserSession.getLastModifiedDate().addSeconds(bpUserSession.getSecondsValid())); if( bpUserSession.getSessionExpireTime() > System.now()) bpUserSession.setSessionValid(true); List<AggregateResult> loginHistoryObj = [SELECT MAX(LoginTime) FROM LoginHistory WHERE UserId = : userObj.Id GROUP BY UserId]; DateTime loginDateTime = (DateTime)loginHistoryObj[0].get('expr0'); bpUserSession.setLoginTime(loginDateTime); Date loginDate = loginDatetime.date(); if( logindate != (DateTime.now()).date()) bpUserSession.setSessionValid(false); return bpUserSession; }
User Session model to set session information
public class UserSession { DateTime lastModifiedDate; Integer secondsValid; DateTime sessionExpireTime; Boolean sessionValid; DateTime loginTime; public void setLastModifiedDate(DateTime lastModifiedDate){ this.lastModifiedDate = lastModifiedDate; } public DateTime getLastModifiedDate(){ return lastModifiedDate; } public void setSecondsValid(Integer secondsValid){ this.secondsValid = secondsValid; } public Integer getSecondsValid(){ return secondsValid; } public void setSessionExpireTime(DateTime sessionExpireTime){ this.sessionExpireTime = sessionExpireTime; } public DateTime getSessionExpireTime(){ return sessionExpireTime; } public void setSessionValid(Boolean sessionValid){ this.sessionValid = sessionValid; } public Boolean getSessionValid(){ return sessionValid; } public void setLoginTime(DateTime loginTime){ this.loginTime = loginTime; } public DateTime getLoginTime(){ return loginTime; } }