/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.frontend.web.controllers;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.orcid.core.exception.OrcidUnauthorizedException;
import org.orcid.core.manager.EmailManager;
import org.orcid.core.manager.SalesForceManager;
import org.orcid.core.salesforce.model.CommunityType;
import org.orcid.core.salesforce.model.Contact;
import org.orcid.core.salesforce.model.ContactRoleType;
import org.orcid.core.salesforce.model.Member;
import org.orcid.core.salesforce.model.MemberDetails;
import org.orcid.core.salesforce.model.SubMember;
import org.orcid.jaxb.model.common_v2.Visibility;
import org.orcid.persistence.jpa.entities.EmailEntity;
import org.orcid.persistence.jpa.entities.RecordNameEntity;
import org.orcid.pojo.ajaxForm.ConsortiumForm;
import org.orcid.pojo.ajaxForm.SubMemberForm;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
/**
*
* @author Will Simpson
*
*/
@Controller
@RequestMapping(value = { "/manage-consortium" })
public class ManageConsortiumController extends BaseController {
private static final String NOT_PUBLIC = "not public";
@Resource
private SalesForceManager salesForceManager;
@Resource
private EmailManager emailManager;
@ModelAttribute("contactRoleTypes")
public Map<String, String> retrieveContactRoleTypesAsMap() {
Map<String, String> map = new LinkedHashMap<>();
for (ContactRoleType type : ContactRoleType.values()) {
map.put(type.name(), type.value());
}
return map;
}
@ModelAttribute("communityTypes")
public Map<String, String> retrieveCommunityTypesAsMap() {
Map<String, String> map = new LinkedHashMap<>();
for (CommunityType type : CommunityType.values()) {
map.put(type.name(), type.value());
}
return map;
}
@RequestMapping
public ModelAndView getManageConsortiumPage() {
ModelAndView mav = new ModelAndView("manage_consortium");
return mav;
}
@RequestMapping(value = "/get-consortium.json", method = RequestMethod.GET)
public @ResponseBody ConsortiumForm getConsortium() {
String accountId = salesForceManager.retriveAccountIdByOrcid(getCurrentUserOrcid());
MemberDetails memberDetails = salesForceManager.retrieveDetails(accountId);
ConsortiumForm consortiumForm = ConsortiumForm.fromMemberDetails(memberDetails);
List<Contact> contactsList = salesForceManager.retrieveContactsByAccountId(accountId);
salesForceManager.addOrcidsToContacts(contactsList);
consortiumForm.setContactsList(contactsList);
consortiumForm.setRoleMap(generateSalesForceRoleMap());
return consortiumForm;
}
@RequestMapping(value = "/update-consortium.json", method = RequestMethod.POST)
public @ResponseBody ConsortiumForm updateConsortium(@RequestBody ConsortiumForm consortium) {
MemberDetails memberDetails = consortium.toMemberDetails();
String usersAuthorizedAccountId = salesForceManager.retriveAccountIdByOrcid(getCurrentUserOrcid());
Member member = memberDetails.getMember();
if (!usersAuthorizedAccountId.equals(member.getId())) {
throw new OrcidUnauthorizedException("You are not authorized for account ID = " + member.getId());
}
salesForceManager.updateMember(member);
return consortium;
}
@RequestMapping(value = "/add-contact-by-email.json")
public @ResponseBody Contact addContactByEmail(@RequestBody Contact contact) {
EmailEntity emailEntity = emailManager.findCaseInsensitive(contact.getEmail());
contact.setOrcid(emailEntity.getProfile().getId());
RecordNameEntity recordNameEntity = emailEntity.getProfile().getRecordNameEntity();
if (Visibility.PUBLIC.equals(recordNameEntity.getVisibility())) {
contact.setFirstName(recordNameEntity.getGivenNames());
contact.setLastName(recordNameEntity.getFamilyName());
} else {
contact.setFirstName(NOT_PUBLIC);
contact.setLastName(NOT_PUBLIC);
}
salesForceManager.createContact(contact);
return contact;
}
@RequestMapping(value = "/add-contact.json", method = RequestMethod.POST)
public @ResponseBody Contact addContact(@RequestBody Contact contact) {
salesForceManager.createContact(contact);
return contact;
}
@RequestMapping(value = "/remove-contact.json", method = RequestMethod.POST)
public @ResponseBody Contact removeContact(@RequestBody Contact contact) {
salesForceManager.removeContactRole(contact);
return contact;
}
@RequestMapping(value = "/update-contact.json", method = RequestMethod.POST)
public @ResponseBody Contact updateContact(@RequestBody Contact contact) {
salesForceManager.updateContact(contact);
return contact;
}
@RequestMapping(value = "/add-sub-member.json", method = RequestMethod.POST)
public @ResponseBody SubMemberForm addSubMember(@RequestBody SubMemberForm subMember) {
salesForceManager.createMember(subMember.toMember());
return subMember;
}
@RequestMapping(value = "/remove-sub-member.json", method = RequestMethod.POST)
public @ResponseBody void removeSubMember(@RequestBody SubMember subMember) {
salesForceManager.flagOpportunityAsClosed(subMember.getOpportunity().getId());
}
}