package edu.asu.spring.quadriga.web.settings;
import java.security.Principal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import edu.asu.spring.quadriga.aspects.annotations.AccessPolicies;
import edu.asu.spring.quadriga.aspects.annotations.CheckedElementType;
import edu.asu.spring.quadriga.aspects.annotations.ElementAccessPolicy;
import edu.asu.spring.quadriga.aspects.annotations.InjectProject;
import edu.asu.spring.quadriga.aspects.annotations.InjectProjectById;
import edu.asu.spring.quadriga.aspects.annotations.ProjectIdentifier;
import edu.asu.spring.quadriga.domain.settings.IAboutText;
import edu.asu.spring.quadriga.domain.settings.impl.AboutText;
import edu.asu.spring.quadriga.domain.workbench.IProject;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.publicwebsite.IAboutTextManager;
import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager;
import edu.asu.spring.quadriga.validator.AboutTextValidator;
import edu.asu.spring.quadriga.web.login.RoleNames;
/**
* This controller manages public website's about page of a project. Information
* of title and description is editable.
*
* @author Rajat Aggarwal
*
*/
@Controller
public class WebsiteAboutEditController {
@Autowired
private IAboutTextManager aboutTextManager;
@Autowired
private IRetrieveProjectManager projectManager;
@Autowired
private AboutTextValidator validator;
/**
* Attach the custom validator to the Spring context
*/
@InitBinder("aboutTextBean")
protected void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
}
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = {
RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/workbench/projects/{ProjectId}/settings/editabout", method = RequestMethod.GET)
@InjectProjectById
public String editAbout(@ProjectIdentifier @PathVariable("ProjectId") String projectId,
@InjectProject IProject project, Model model, Principal principal) throws QuadrigaStorageException {
model.addAttribute("project", project);
if (aboutTextManager.getAboutTextByProjectId(projectId) == null) {
model.addAttribute("aboutTextBean", new AboutText());
} else {
IAboutText abtText = aboutTextManager.getAboutTextByProjectId(projectId);
model.addAttribute("aboutTextBean", abtText);
}
return "auth/editabout";
}
/**
* . Any change made in the about project page is updated into the database
* here and a "You successfully edited the about text" message is displayed.
*
* @author Rajat Aggarwal
*
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = {
RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/workbench/projects/{ProjectId}/settings/saveabout", method = RequestMethod.POST)
@InjectProjectById
public ModelAndView saveAbout(@ProjectIdentifier @PathVariable("ProjectId") String projectId,
@InjectProject IProject project, @Validated @ModelAttribute("aboutTextBean") AboutText formBean,
BindingResult result, ModelAndView model, Principal principal) throws QuadrigaStorageException {
model = new ModelAndView("auth/editabout");
model.addObject("project", project);
if (result.hasErrors()) {
model.addObject("aboutTextBean", formBean);
} else {
aboutTextManager.saveAbout(projectId, formBean);
model.addObject("show_success_alert", true);
model.addObject("success_alert_msg", "You successfully edited the about text");
}
return model;
}
}