/*
This file is part of Cyclos.
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package nl.strohalm.cyclos.webservices.rest;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import nl.strohalm.cyclos.entities.access.PrincipalType;
import nl.strohalm.cyclos.entities.access.User;
import nl.strohalm.cyclos.entities.customization.fields.MemberCustomField;
import nl.strohalm.cyclos.entities.customization.fields.MemberCustomFieldValue;
import nl.strohalm.cyclos.entities.exceptions.EntityNotFoundException;
import nl.strohalm.cyclos.entities.members.Contact;
import nl.strohalm.cyclos.entities.members.Member;
import nl.strohalm.cyclos.services.customization.MemberCustomFieldService;
import nl.strohalm.cyclos.services.elements.ContactService;
import nl.strohalm.cyclos.services.elements.ElementService;
import nl.strohalm.cyclos.services.elements.MemberService;
import nl.strohalm.cyclos.utils.CustomFieldHelper;
import nl.strohalm.cyclos.utils.access.LoggedUser;
import nl.strohalm.cyclos.utils.validation.ValidationException;
import nl.strohalm.cyclos.webservices.WebServiceContext;
import nl.strohalm.cyclos.webservices.members.FullTextMemberSearchParameters;
import nl.strohalm.cyclos.webservices.members.MemberResultPage;
import nl.strohalm.cyclos.webservices.model.MemberDataVO;
import nl.strohalm.cyclos.webservices.model.MemberVO;
import nl.strohalm.cyclos.webservices.model.MyProfileVO;
import nl.strohalm.cyclos.webservices.model.RegistrationFieldValueVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.bind.annotation.ResponseStatus;
/**
* Controller which handles /members paths
*
* @author luis
*/
@Controller
public class MembersRestController extends BaseRestController {
/**
* Parameters used to update the profile
* @author luis
*/
public static class UpdateProfileParameters {
private String name;
private String username;
private String email;
private List<RegistrationFieldValueVO> customValues;
public List<RegistrationFieldValueVO> getCustomValues() {
return customValues;
}
public String getEmail() {
return email;
}
public String getName() {
return name;
}
public String getUsername() {
return username;
}
public void setCustomValues(final List<RegistrationFieldValueVO> customValues) {
this.customValues = customValues;
}
public void setEmail(final String email) {
this.email = email;
}
public void setName(final String name) {
this.name = name;
}
public void setUsername(final String username) {
this.username = username;
}
}
private static final String CUSTOM_VALUE_PREFIX = "customValue.";
private ElementService elementService;
private MemberCustomFieldService memberCustomFieldService;
private ContactService contactService;
private MemberService memberService;
private MemberFieldsRestController memberFieldsRestController;
private CustomFieldHelper customFieldHelper;
/**
* Gets member and custom fields by member id
*/
@RequestMapping(value = "members/memberData/{id}")
@ResponseBody
public MemberDataVO getMemberData(@PathVariable final Long id) {
Member member = memberService.loadByIdOrPrincipal(id, null, null);
MemberVO memberVO = memberService.getMemberVO(member, true, false);
boolean canAddMemberAsContact = false;
// The member can be added to the logged user's contact list if it's not already added.
Contact contact = contactService.loadIfExists(LoggedUser.member(), member);
if (contact == null) {
canAddMemberAsContact = true;
}
return new MemberDataVO(memberVO, canAddMemberAsContact);
}
/**
* Returns authenticated user's profile
*/
@RequestMapping(value = "members/me", method = RequestMethod.GET)
@ResponseBody
public MyProfileVO getMyProfile() {
Member member = LoggedUser.element();
return memberService.getMyProfileVO(member);
}
/**
* Loads a member by id
*/
@RequestMapping(value = "members/{id}", method = RequestMethod.GET)
@ResponseBody
public MemberVO loadById(@PathVariable final Long id) {
Member member;
try {
member = elementService.load(id);
} catch (Exception e) {
throw new EntityNotFoundException(Member.class);
}
return memberService.getMemberVO(member, true, true);
}
/**
* Loads a member by principal
*/
@RequestMapping(value = "members/principal/{principal}", method = RequestMethod.GET)
@ResponseBody
public MemberVO loadByPrincipal(@PathVariable final String principal) {
Member member;
try {
PrincipalType principalType = WebServiceContext.getChannel().getDefaultPrincipalType();
member = elementService.loadByPrincipal(principalType, principal);
} catch (Exception e) {
throw new EntityNotFoundException(Member.class);
}
return memberService.getMemberVO(member, true, true);
}
/**
* Searches for members
*/
@RequestMapping(value = "members", method = RequestMethod.GET)
@ResponseBody
public MemberResultPage search(final FullTextMemberSearchParameters params, final HttpServletRequest request) {
params.setFields(memberFieldsRestController.requestParametersToFieldValues(request, CUSTOM_VALUE_PREFIX));
return memberService.getMemberResultPage(params);
}
public void setContactService(final ContactService contactService) {
this.contactService = contactService;
}
public void setCustomFieldHelper(final CustomFieldHelper customFieldHelper) {
this.customFieldHelper = customFieldHelper;
}
public void setElementService(final ElementService elementService) {
this.elementService = elementService;
}
public void setMemberCustomFieldService(final MemberCustomFieldService memberCustomFieldService) {
this.memberCustomFieldService = memberCustomFieldService;
}
public void setMemberFieldsRestController(final MemberFieldsRestController memberFieldsRestController) {
this.memberFieldsRestController = memberFieldsRestController;
}
public void setMemberService(final MemberService memberService) {
this.memberService = memberService;
}
/**
* Updates the authenticated user's profile
*/
@RequestMapping(value = "members/me", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public void updateMyProfile(@RequestBody final UpdateProfileParameters params) {
if (params == null) {
throw new ValidationException();
}
Member member = (Member) LoggedUser.element().clone();
member.setUser((User) LoggedUser.element().getUser().clone());
if (StringUtils.isNotEmpty(params.getName())) {
member.setName(params.getName());
}
if (StringUtils.isNotEmpty(params.getUsername())) {
member.getUser().setUsername(params.getUsername());
}
if (StringUtils.isNotEmpty(params.getEmail())) {
member.setEmail(params.getEmail());
}
// Merge the custom fields
List<RegistrationFieldValueVO> fieldValueVOs = params.getCustomValues();
List<MemberCustomField> allowedFields = customFieldHelper.onlyForGroup(memberCustomFieldService.list(), member.getMemberGroup());
Collection<MemberCustomFieldValue> newFieldValues = customFieldHelper.mergeFieldValues(member, fieldValueVOs, allowedFields);
member.setCustomValues(newFieldValues);
elementService.changeProfile(member);
}
}