package kornell.api.client;
import java.util.List;
import java.util.logging.Logger;
import kornell.core.entity.CourseClass;
import kornell.core.entity.Institution;
import kornell.core.entity.RoleCategory;
import kornell.core.entity.RoleType;
import kornell.core.error.KornellErrorTO;
import kornell.core.to.CourseClassTO;
import kornell.core.to.RoleTO;
import kornell.core.to.TokenTO;
import kornell.core.to.UserHelloTO;
import kornell.core.to.UserInfoTO;
import kornell.core.util.StringUtils;
import kornell.gui.client.util.ClientProperties;
public class KornellSession extends KornellClient {
Logger logger = Logger.getLogger(KornellSession.class.getName());
private static final String PREFIX = ClientProperties.PREFIX + "UserSession";
private UserInfoTO currentUser = null;
private Institution institution = null;
private CourseClassTO currentCourseClass = null;
public KornellSession() {
logger.info("Instantiated new Kornell Session");
}
public boolean isPlatformAdmin(String institutionUUID) {
return isValidRole(RoleType.platformAdmin, institutionUUID, null);
}
public boolean isPlatformAdmin() {
return isValidRole(RoleType.platformAdmin, institution.getUUID(), null);
}
public boolean isInstitutionAdmin(String institutionUUID) {
return isValidRole(RoleType.institutionAdmin, institutionUUID, null) || isPlatformAdmin(institutionUUID);
}
public boolean isInstitutionAdmin() {
return isInstitutionAdmin(institution.getUUID());
}
public boolean hasCourseClassRole(String courseClassUUID) {
return isCourseClassAdmin(courseClassUUID) || isCourseClassObserver(courseClassUUID) || isCourseClassTutor(courseClassUUID);
}
public boolean hasCourseClassRole() {
return isCourseClassAdmin() || isCourseClassObserver() || isCourseClassTutor();
}
public boolean isCourseClassAdmin(String courseClassUUID) {
return isValidRole(RoleType.courseClassAdmin, null, courseClassUUID) || isInstitutionAdmin();
}
public boolean isCourseClassAdmin() {
if(currentCourseClass == null) return false;
CourseClass courseClass = currentCourseClass.getCourseClass();
if(courseClass == null) return false;
String courseClassUUID = courseClass.getUUID();
return isCourseClassAdmin(courseClassUUID);
}
public boolean isCourseClassObserver(String courseClassUUID) {
return isValidRole(RoleType.observer, null, courseClassUUID) || isInstitutionAdmin();
}
public boolean isCourseClassObserver() {
if(currentCourseClass == null) return false;
CourseClass courseClass = currentCourseClass.getCourseClass();
if(courseClass == null) return false;
String courseClassUUID = courseClass.getUUID();
return isCourseClassObserver(courseClassUUID);
}
public boolean isCourseClassTutor(String courseClassUUID) {
return isValidRole(RoleType.tutor, null, courseClassUUID) || isInstitutionAdmin();
}
public boolean isCourseClassTutor() {
if(currentCourseClass == null) return false;
CourseClass courseClass = currentCourseClass.getCourseClass();
if(courseClass == null) return false;
String courseClassUUID = courseClass.getUUID();
return isCourseClassTutor(courseClassUUID);
}
public boolean hasAnyAdminRole() {
if(currentUser == null) return false;
List<RoleTO> roleTOs = currentUser.getRoles();
return (RoleCategory.hasRole(roleTOs, RoleType.courseClassAdmin) ||
RoleCategory.hasRole(roleTOs, RoleType.observer) ||
RoleCategory.hasRole(roleTOs, RoleType.tutor) ||
isInstitutionAdmin());
}
private boolean isValidRole(RoleType type, String institutionUUID, String courseClassUUID) {
if (currentUser == null)
return false;
return RoleCategory.isValidRole(currentUser.getRoles(), type, institutionUUID, courseClassUUID);
}
public boolean isAuthenticated() {
return currentUser != null;
}
public boolean isAnonymous() {
return ! isAuthenticated();
}
public boolean hasSignedTerms() {
return StringUtils.isSome(institution.getTerms()) &&
currentUser != null &&
currentUser.getPerson().getTermsAcceptedOn() != null;
}
public void login(String username,
String password,
final Callback<UserHelloTO> callback) {
Callback<TokenTO> loginWrapper = new Callback<TokenTO>() {
@Override
public void ok(TokenTO to) {
ClientProperties.set(ClientProperties.X_KNL_TOKEN, to.getToken());
fetchUser(callback);
}
@Override
protected void unauthorized(KornellErrorTO kornellErrorTO) {
setCurrentUser(null);
callback.unauthorized(kornellErrorTO);
}
//user must change his password
@Override
protected void forbidden(KornellErrorTO kornellErrorTO) {
callback.forbidden(kornellErrorTO);
}
};
String institutionUUID = institution.getUUID();
POST_LOGIN(username, password, institutionUUID, "/auth/token").sendRequest(null, loginWrapper);
}
public void fetchUser(final Callback<UserHelloTO> callback) {
final Callback<UserHelloTO> wrapper = new Callback<UserHelloTO>() {
@Override
public void ok(UserHelloTO userHello) {
setCurrentUser(userHello.getUserInfoTO());
callback.ok(userHello);
}
@Override
protected void unauthorized(KornellErrorTO kornellErrorTO) {
setCurrentUser(null);
callback.unauthorized(kornellErrorTO);
}
};
GET("/user/login").sendRequest(null, wrapper);
}
public void logout(){
POST("/auth/logout").sendRequest(null, new Callback<String>() {
@Override
public void ok(String to) {
//Nothing to do
}
@Override
protected void unauthorized(KornellErrorTO kornellErrorTO) {
//nothing to do here too, if for some reason the token is not there when the user
//tries to logout, let's just ignore.
}
});
ClientProperties.remove(ClientProperties.X_KNL_TOKEN);
setCurrentUser(null);
}
public String getItem(String key) {
return ClientProperties.get(prefixed(key));
}
public void setItem(String key, String value) {
ClientProperties.set(prefixed(key), value);
}
private String prefixed(String key) {
return PREFIX + ClientProperties.SEPARATOR + currentUser.getPerson().getUUID()
+ ClientProperties.SEPARATOR + key;
}
public String getAssetsURL() {
return institution == null ? "" : "/repository/" + institution.getAssetsRepositoryUUID();
}
public Institution getInstitution() {
return institution;
}
public void setInstitution(Institution institution) {
this.institution = institution;
}
public CourseClassTO getCurrentCourseClass() {
return currentCourseClass;
}
public void setCurrentCourseClass(CourseClassTO currentCourseClass) {
this.currentCourseClass = currentCourseClass;
}
public UserInfoTO getCurrentUser() {
if (currentUser == null) {
logger.warning("WARNING: Requested current user for unauthenticated session. Watch out for NPEs. Check before or use callback to be safer.");
}
return currentUser;
}
public void setCurrentUser(UserInfoTO userInfo) {
this.currentUser = userInfo;
if(userInfo != null && userInfo.getPerson() != null){
ClientProperties.set(PREFIX + ClientProperties.SEPARATOR + ClientProperties.CURRENT_SESSION,
userInfo.getPerson().getUUID());
}
}
}