package org.iatoki.judgels.uriel.controllers;
import org.iatoki.judgels.play.IdentityUtils;
import org.iatoki.judgels.play.JudgelsPlayUtils;
import org.iatoki.judgels.play.controllers.AbstractJudgelsController;
import org.iatoki.judgels.jophiel.Jophiel;
import org.iatoki.judgels.jophiel.forms.ViewpointForm;
import org.iatoki.judgels.uriel.UrielUtils;
import org.iatoki.judgels.uriel.User;
import org.iatoki.judgels.uriel.controllers.securities.Authenticated;
import org.iatoki.judgels.uriel.controllers.securities.HasRole;
import org.iatoki.judgels.uriel.controllers.securities.LoggedIn;
import org.iatoki.judgels.uriel.services.impls.AvatarCacheServiceImpl;
import org.iatoki.judgels.uriel.services.UserService;
import org.iatoki.judgels.uriel.services.impls.JidCacheServiceImpl;
import play.data.Form;
import play.db.jpa.Transactional;
import play.mvc.Result;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.io.IOException;
@Singleton
@Named
public final class ApplicationController extends AbstractJudgelsController {
private final Jophiel jophiel;
private final UserService userService;
@Inject
public ApplicationController(Jophiel jophiel, UserService userService) {
this.jophiel = jophiel;
this.userService = userService;
}
public Result index() {
if ((session().containsKey("username")) && (session().containsKey("role"))) {
return redirect(routes.ContestController.index());
} else if (session().containsKey("username")) {
String returnUri = routes.ContestController.index().absoluteURL(request(), request().secure());
return redirect(routes.ApplicationController.authRole(returnUri));
} else {
String returnUri = routes.ContestController.index().absoluteURL(request(), request().secure());
return redirect(routes.ApplicationController.auth(returnUri));
}
}
public Result auth(String returnUri) {
if ((session().containsKey("username")) && (session().containsKey("role"))) {
return redirect(returnUri);
} else if (session().containsKey("username")) {
return redirect(routes.ApplicationController.authRole(returnUri));
} else {
returnUri = org.iatoki.judgels.uriel.controllers.routes.ApplicationController.afterLogin(returnUri).absoluteURL(request(), request().secure());
return redirect(org.iatoki.judgels.jophiel.controllers.routes.JophielClientController.login(returnUri));
}
}
@Transactional
public Result authRole(String returnUri) {
if ((session().containsKey("username")) && (session().containsKey("role"))) {
return redirect(returnUri);
} else {
String userRoleJid = IdentityUtils.getUserJid();
if (userService.existsByUserJid(userRoleJid)) {
User userRole = userService.findUserByUserJid(userRoleJid);
UrielUtils.saveRolesInSession(userRole.getRoles());
return redirect(returnUri);
} else {
userService.createUser(userRoleJid, UrielUtils.getDefaultRoles());
UrielUtils.saveRolesInSession(UrielUtils.getDefaultRoles());
return redirect(returnUri);
}
}
}
@Transactional
public Result afterLogin(String returnUri) {
if (session().containsKey("role")) {
JudgelsPlayUtils.updateUserJidCache(JidCacheServiceImpl.getInstance());
Jophiel.updateUserAvatarCache(AvatarCacheServiceImpl.getInstance());
if (JudgelsPlayUtils.hasViewPoint()) {
try {
UrielUtils.backupSession();
UrielUtils.setUserSession(jophiel.getUserByUserJid(JudgelsPlayUtils.getViewPoint()), userService.findUserByUserJid(JudgelsPlayUtils.getViewPoint()));
} catch (IOException e) {
JudgelsPlayUtils.removeViewPoint();
UrielUtils.restoreSession();
}
}
return redirect(returnUri);
} else {
returnUri = org.iatoki.judgels.uriel.controllers.routes.ApplicationController.afterLogin(returnUri).absoluteURL(request(), request().secure());
return redirect(routes.ApplicationController.authRole(returnUri));
}
}
@Transactional
public Result afterProfile(String returnUri) {
JudgelsPlayUtils.updateUserJidCache(JidCacheServiceImpl.getInstance());
Jophiel.updateUserAvatarCache(AvatarCacheServiceImpl.getInstance());
return redirect(returnUri);
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Transactional
public Result postViewAs() {
Form<ViewpointForm> form = Form.form(ViewpointForm.class).bindFromRequest();
if ((!(form.hasErrors() || form.hasGlobalErrors())) && (UrielUtils.trullyHasRole("admin"))) {
ViewpointForm viewpointForm = form.get();
try {
String userJid = jophiel.verifyUsername(viewpointForm.username);
if (userJid != null) {
try {
userService.upsertUserFromJophielUserJid(userJid);
if (!JudgelsPlayUtils.hasViewPoint()) {
UrielUtils.backupSession();
}
JudgelsPlayUtils.setViewPointInSession(userJid);
UrielUtils.setUserSession(jophiel.getUserByUserJid(userJid), userService.findUserByUserJid(userJid));
ControllerUtils.getInstance().addActivityLog("View as user " + viewpointForm.username + ".");
} catch (IOException e) {
JudgelsPlayUtils.removeViewPoint();
UrielUtils.restoreSession();
}
}
} catch (IOException e) {
// do nothing
e.printStackTrace();
}
}
return redirect(request().getHeader("Referer"));
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
public Result resetViewAs() {
JudgelsPlayUtils.removeViewPoint();
UrielUtils.restoreSession();
return redirect(request().getHeader("Referer"));
}
}