package org.geogebra.common.move.ggtapi.models;
import org.geogebra.common.move.events.BaseEvent;
import org.geogebra.common.move.ggtapi.events.LogOutEvent;
import org.geogebra.common.move.ggtapi.events.LoginEvent;
import org.geogebra.common.move.models.BaseModel;
/**
* @author gabor Base class for login logout operations
*
*/
public abstract class AuthenticationModel extends BaseModel {
private GeoGebraTubeUser loggedInUser = null;
private boolean stayLoggedOut;
/**
* token name for user logged in got back from GGT
*/
public static String GGB_TOKEN_KEY_NAME = "token";
@Override
public void onEvent(BaseEvent event) {
if (event instanceof LoginEvent) {
LoginEvent loginEvent = (LoginEvent) event;
if (loginEvent.isSuccessful()) {
onLoginSuccess(loginEvent.getUser(), loginEvent.getJSON());
} else {
onLoginError(loginEvent.getUser());
}
} else if (event instanceof LogOutEvent) {
clearLoginToken();
loggedInUser = null;
}
}
/**
* @param token
* The token to store Stores the token in localStorage or with
* any other client side method.
*/
public abstract void storeLoginToken(String token);
/**
* @return The stored Token or null if not token stored
*/
public abstract String getLoginToken();
/**
* Clears the login token from localStorage, or from other storage place
* used
*/
public abstract void clearLoginToken();
/**
* @param response
* from GGT Parses the response, and sets model dependent things
* (localStorage, etc).
*/
public void onLoginSuccess(GeoGebraTubeUser user, String json) {
this.stayLoggedOut = false;
// Remember the logged in user
this.loggedInUser = user;
storeLastUser(json);
// Store the token in the storage
if (!user.getLoginToken().equals(this.getLoginToken())) {
storeLoginToken(user.getLoginToken());
}
}
protected abstract void storeLastUser(String s);
/**
* @param response
* from GGT error happened, cleanup, etc
*/
public void onLoginError(GeoGebraTubeUser user) {
this.stayLoggedOut = false;
if (getLoginToken() != null) {
clearLoginToken();
}
}
/**
* @return the Username of the currently logged in user or null if no user
* is logged in
*/
public String getUserName() {
if (loggedInUser != null) {
return loggedInUser.getUserName();
}
return null;
}
/**
* @return the Username of the currently logged in user or null if no user
* is logged in
*/
public int getUserId() {
if (loggedInUser != null) {
return loggedInUser.getUserId();
}
return -1;
}
/**
* @return The currently logged in user or null if no user is logged in
*/
public GeoGebraTubeUser getLoggedInUser() {
return loggedInUser;
}
/**
* @return true, if a user is currently logged in or false otherwise.
*/
public boolean isLoggedIn() {
if (loggedInUser == null) {
return false;
}
return true;
}
public void startOffline(GeoGebraTubeAPI api) {
if (this.loadLastUser() != null) {
GeoGebraTubeUser offline = new GeoGebraTubeUser(null);
if (api.parseUserDataFromResponse(offline, this.loadLastUser())) {
this.loggedInUser = offline;
}
}
}
public abstract String loadLastUser();
public void stayLoggedOut() {
this.stayLoggedOut = true;
}
public boolean mayLogIn() {
return !stayLoggedOut;
}
}