package net.pechorina.kontempl.rest; import net.pechorina.kontempl.data.Credential; import net.pechorina.kontempl.data.User; import net.pechorina.kontempl.service.UserService; import net.pechorina.kontempl.view.forms.CredentialPasswordForm; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Set; @RestController @RequestMapping(value = "/api/users/{userId}/credentials") public class UserCredentialsResource { static final Logger logger = LoggerFactory.getLogger(UserCredentialsResource.class); @Autowired private UserService userService; @Autowired private Environment env; @RequestMapping(method = RequestMethod.GET) public Set<Credential> getCredentials(@PathVariable("userId") Integer userId) { User u = userService.getUserByIdDetailed(userId); return u.getCredentials(); } @RequestMapping(method = RequestMethod.GET, value="{id}") public Credential getCredential(@PathVariable("userId") Integer userId, @PathVariable("id") Integer id) { return userService.getCredential(id); } @RequestMapping(method = RequestMethod.POST) public void addCredential(@PathVariable("userId") Integer userId, @RequestBody Credential cr, HttpServletRequest request, HttpServletResponse response) { User u = userService.getUserByIdDetailed(userId); Credential c = new Credential(); c.setAuthServiceType(cr.getAuthServiceType()); c.setActive(true); c.setCreated(new DateTime()); c.setUpdated(new DateTime()); c.setUsername(cr.getUsername()); c.setLink(cr.getLink()); c.setOptData(cr.getOptData()); userService.updatePasswordEmailCredential(c, cr.getEmail(), cr.getPassword()); u.addCredential(c); userService.save(u); logger.info("CREDENTIAL ADDED: " + c + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_CREATED); } @RequestMapping(method = RequestMethod.PUT, value = "/{id}") public void save(@PathVariable("userId") Integer userId, @PathVariable("id") Integer id, @RequestBody Credential cr, HttpServletRequest request, HttpServletResponse response) { Credential c = userService.getCredential(id); c.setAuthServiceType(cr.getAuthServiceType()); c.setActive(cr.isActive()); c.setUpdated(new DateTime()); c.setUsername(cr.getUsername()); c.setLink(cr.getLink()); c.setOptData(cr.getOptData()); userService.updatePasswordEmailCredential(c, cr.getEmail(), cr.getPassword()); userService.saveCredential(c); logger.info("CREDENTIAL SAVED: " + c + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } @RequestMapping(method = RequestMethod.GET, value = "/{id}/chpassword") public CredentialPasswordForm getPasswordForm(@PathVariable("userId") Integer userId, @PathVariable("id") Integer id ) { Credential cr = userService.getCredential(id); CredentialPasswordForm f = new CredentialPasswordForm(); f.setId(cr.getId()); f.setEmail(cr.getEmail()); f.setPassword(""); f.setPasswordConfirm(""); return f; } @RequestMapping(method = RequestMethod.PUT, value = "/{id}/chpassword") public void changePassword(@PathVariable("userId") Integer userId, @PathVariable("id") Integer id, @RequestBody CredentialPasswordForm form, HttpServletRequest request, HttpServletResponse response) { logger.debug("data: " + form); Credential cr = userService.getCredential(id); if (form.getPassword().equals(form.getPasswordConfirm())) { userService.updatePasswordEmailCredential(cr, form.getEmail(), form.getPassword()); userService.saveCredential(cr); logger.info("CREDENTIAL SAVED: " + cr + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } else { logger.info("CREDENTIAL SAVE error - password confirmation is not the same as the new password: " + form + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE); } } @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") public void remove(@PathVariable("userId") Integer userId, @PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response) { Credential c = userService.getCredential(id); userService.deleteCredential(c); logger.info("CREDENTIAL DELETED: " + id + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } }