diff --git a/.gitignore b/.gitignore index 1860d1b..3ef17e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,31 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -/.idea/ -/target/ -*.iml -/out/ -/.classpath -/.project -/.settings - +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +/.idea/ +/target/ +*.iml +/out/ +/.classpath +/.project +/.settings + +/.externalToolBuilders/ diff --git a/src/main/java/io/khasang/teamnote/controller/UserController.java b/src/main/java/io/khasang/teamnote/controller/UserController.java index 46924c7..44a26bc 100644 --- a/src/main/java/io/khasang/teamnote/controller/UserController.java +++ b/src/main/java/io/khasang/teamnote/controller/UserController.java @@ -19,35 +19,25 @@ * @author MickeyMouse */ @Controller -@RequestMapping(value = "/users") +@RequestMapping(value = "/rest/users") public class UserController { @Autowired private UserService userService; - @RequestMapping(value = "/", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @RequestMapping(value = "/{userId}/addRole/{roleId}", method = RequestMethod.POST) @ResponseBody - public User addUser(@RequestBody User user) { - return userService.addUser(user); - } - - @RequestMapping(value = "/", method = RequestMethod.GET) - @ResponseBody - public List getAllUsers() { - return userService.getAll(); - } - - @RequestMapping(value = "/{id}", method = RequestMethod.GET) - @ResponseBody - public User getById(@PathVariable(value = "id") String userIdStr) { + public User addRoletoUser(@PathVariable(value = "userId") String userIdStr, + @PathVariable(value = "roleId") String roleIdStr) { long userId = Long.parseLong(userIdStr); - return userService.getById(userId); + long roleId = Long.parseLong(roleIdStr); + return userService.addRoletoUser(userId, roleId); } - @RequestMapping(value = "/", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @RequestMapping(method = RequestMethod.PUT, produces = "application/json;charset=utf-8") @ResponseBody - public User update(@RequestBody User user) { - return userService.update(user); + public User addUser(@RequestBody User user) { + return userService.addUser(user); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @@ -57,6 +47,12 @@ public User delete(@PathVariable(value = "id") String userIdStr) { return userService.delete(userId); } + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List getAllUsers() { + return userService.getAll(); + } + @RequestMapping(value = "/accountName={accountName}", method = RequestMethod.GET) @ResponseBody public User getByAccountName(@PathVariable(value = "accountName") String accountName) { @@ -69,10 +65,24 @@ public User getByEmail(@PathVariable(value = "email") String email) { return userService.getByEmail(email); } + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public User getById(@PathVariable(value = "id") String userIdStr) { + long userId = Long.parseLong(userIdStr); + return userService.getById(userId); + } + @RequestMapping(value = "/firstName={firstName}&lastName={lastName}", method = RequestMethod.GET) @ResponseBody public List getByPersonName(@PathVariable(value = "firstName") String firstName, @PathVariable(value = "lastName") String lastName) { return userService.getByPersonName(firstName, lastName); } + + @RequestMapping(method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public User update(@RequestBody User user) { + return userService.update(user); + } + } diff --git a/src/main/java/io/khasang/teamnote/entity/User.java b/src/main/java/io/khasang/teamnote/entity/User.java index 3d41d46..f692f77 100644 --- a/src/main/java/io/khasang/teamnote/entity/User.java +++ b/src/main/java/io/khasang/teamnote/entity/User.java @@ -1,10 +1,14 @@ package io.khasang.teamnote.entity; +import java.util.List; + import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @@ -36,7 +40,7 @@ public class User { @Id @Column(name = "ID") @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; + private Long id; @Column(name = "LAST_NAME") private String lastName; @@ -44,6 +48,9 @@ public class User { @Column(name = "PASSWORD") private String password; + @ManyToMany(fetch = FetchType.EAGER) + private List roles; + public String getAccountName() { return accountName; } @@ -56,7 +63,7 @@ public String getFirstName() { return firstName; } - public long getId() { + public Long getId() { return id; } @@ -68,6 +75,10 @@ public String getPassword() { return password; } + public List getRoles() { + return roles; + } + public void setAccountName(String accountName) { this.accountName = accountName; } @@ -80,7 +91,7 @@ public void setFirstName(String firstName) { this.firstName = firstName; } - public void setId(long id) { + public void setId(Long id) { this.id = id; } @@ -92,4 +103,8 @@ public void setPassword(String password) { this.password = password; } + public void setRoles(List roles) { + this.roles = roles; + } + } diff --git a/src/main/java/io/khasang/teamnote/service/UserService.java b/src/main/java/io/khasang/teamnote/service/UserService.java index e8a7fed..55456c0 100644 --- a/src/main/java/io/khasang/teamnote/service/UserService.java +++ b/src/main/java/io/khasang/teamnote/service/UserService.java @@ -11,6 +11,14 @@ */ public interface UserService { + /** + * Adds role to user. + * + * @param userId + * @param roleId + */ + User addRoletoUser(long userId, long roleId); + /** * Adds user to database. * @@ -36,24 +44,6 @@ public interface UserService { */ List getAll(); - /** - * Finds user in database. - * - * @param id - * user ID - * @return user - */ - User getById(long id); - - /** - * Updates specific user in database. - * - * @param user - * user to update - * @return updated user - */ - User update(User user); - /** * Returns a {@link User} with a given account name or null if such user not found. * @@ -72,6 +62,15 @@ public interface UserService { */ User getByEmail(String email); + /** + * Finds user in database. + * + * @param id + * user ID + * @return user + */ + User getById(long id); + /** * Returns a list of all {@link User}s with a given first and last names. Many users can have the same first and * last name. That is why this method can return more than one {@link User}. @@ -83,4 +82,14 @@ public interface UserService { * @return users having given first and last name */ List getByPersonName(String firstName, String lastName); + + /** + * Updates specific user in database. + * + * @param user + * user to update + * @return updated user + */ + User update(User user); + } diff --git a/src/main/java/io/khasang/teamnote/service/impl/UserServiceImpl.java b/src/main/java/io/khasang/teamnote/service/impl/UserServiceImpl.java index e73a1ee..a9526d0 100644 --- a/src/main/java/io/khasang/teamnote/service/impl/UserServiceImpl.java +++ b/src/main/java/io/khasang/teamnote/service/impl/UserServiceImpl.java @@ -5,7 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import io.khasang.teamnote.dao.RoleDao; import io.khasang.teamnote.dao.UserDao; +import io.khasang.teamnote.entity.Role; import io.khasang.teamnote.entity.User; import io.khasang.teamnote.service.UserService; @@ -17,9 +19,20 @@ @Service("userService") public class UserServiceImpl implements UserService { + @Autowired + private RoleDao roleDao; + @Autowired private UserDao userDao; + public User addRoletoUser(long userId, long roleId) { + User user = userDao.getById(userId); + Role role = roleDao.getById(roleId); + user.getRoles().add(role); + userDao.update(user); + return user; + } + @Override public User addUser(User user) { return userDao.create(user); @@ -36,16 +49,6 @@ public List getAll() { return userDao.getList(); } - @Override - public User getById(long id) { - return userDao.getById(id); - } - - @Override - public User update(User user) { - return userDao.update(user); - } - @Override public User getByAccountName(String accountName) { return userDao.getByAccountName(accountName); @@ -56,9 +59,18 @@ public User getByEmail(String email) { return userDao.getByEmail(email); } + @Override + public User getById(long id) { + return userDao.getById(id); + } + @Override public List getByPersonName(String firstName, String lastName) { return userDao.getByPersonName(firstName, lastName); } + @Override + public User update(User user) { + return userDao.update(user); + } } diff --git a/src/test/java/io/khasang/teamnote/controller/UserControllerIntegrationTest.java b/src/test/java/io/khasang/teamnote/controller/UserControllerIntegrationTest.java new file mode 100644 index 0000000..9cab1d1 --- /dev/null +++ b/src/test/java/io/khasang/teamnote/controller/UserControllerIntegrationTest.java @@ -0,0 +1,153 @@ +package io.khasang.teamnote.controller; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import io.khasang.teamnote.entity.Document; +import io.khasang.teamnote.entity.Role; +import io.khasang.teamnote.entity.User; + +public class UserControllerIntegrationTest { + + private final String USERS_ROOT_URL = "http://localhost:8080/rest/users"; + private final String ROLES_ADD_URL = "http://localhost:8080/roles/add"; + private final String ROLES_DELETE_URL = "http://localhost:8080/roles/delete"; + + @Test + public void addRoleToUser() { + User user = createUser("Bill", "Clinton", "bill.clinton", "123", "bclinton@gmail.com"); + Role role = createRole("President", "USA President"); + + try { + RestTemplate restTemplate = new RestTemplate(); + + ResponseEntity responseEntity = restTemplate.exchange(USERS_ROOT_URL + "/{userId}/addRole/{roleId}", + HttpMethod.POST, null, User.class, user.getId(), role.getId()); + + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + User userResult = responseEntity.getBody(); + + assertNotNull(userResult.getRoles()); + assertEquals(1, userResult.getRoles().size()); + + Role roleResult = userResult.getRoles().get(0); + assertEquals(role.getId(), roleResult.getId()); + + } finally { + deleteUser(user.getId()); + deleteRole(role.getId()); + } + + } + + @Test + public void addUserAndGet() { + // Create new user and save it to database + User user = createUser("Bill", "Clinton", "bill.clinton", "123", "bclinton@gmail.com"); + assertNotNull(user.getId()); + + RestTemplate restTemplate = new RestTemplate(); + + // Load user by ID + ResponseEntity responseEntity = restTemplate.exchange(USERS_ROOT_URL + "/{id}", HttpMethod.GET, null, + User.class, user.getId()); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + User result = responseEntity.getBody(); + + assertNotNull(result); + + // Check if all user fields were saved correctly + assertEquals("Bill", result.getFirstName()); + assertEquals("Clinton", result.getLastName()); + assertEquals("bill.clinton", result.getAccountName()); + assertEquals("123", result.getPassword()); + assertEquals("bclinton@gmail.com", result.getEmail()); + + deleteUser(result.getId()); + } + + private User createUser(String firstName, String lastName, String accountName, String password, String email) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + User user = prepareUser(firstName, lastName, accountName, password, email); + HttpEntity httpEntity = new HttpEntity<>(user, headers); + RestTemplate template = new RestTemplate(); + User result = template.exchange(USERS_ROOT_URL, HttpMethod.PUT, httpEntity, User.class).getBody(); + return result; + + } + + private Role createRole(String name, String description) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + Role role = prepareRole(name, description); + HttpEntity httpEntity = new HttpEntity<>(role, headers); + RestTemplate template = new RestTemplate(); + Role result = template.exchange(ROLES_ADD_URL, HttpMethod.PUT, httpEntity, Role.class).getBody(); + return result; + + } + + private User prepareUser(String firstName, String lastName, String accountName, String password, String email) { + User user = new User(); + user.setFirstName(firstName); + user.setLastName(lastName); + user.setAccountName(accountName); + user.setPassword(password); + user.setEmail(email); + return user; + } + + @Test + public void getAllUsers() { + RestTemplate restTemplate = new RestTemplate(); + + User firstUser = createUser("Bill", "Clinton", "bill.clinton", "123", "bclinton@gmail.com"); + User secondUser = createUser("Donald", "Trump", "donald.trump", "567", "dtrump@yahoo.com"); + + ResponseEntity> responseEntity = restTemplate.exchange(USERS_ROOT_URL, HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + List resultList = responseEntity.getBody(); + assertNotNull(resultList); + deleteUser(firstUser.getId()); + deleteUser(secondUser.getId()); + } + + private void deleteUser(long id) { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange(USERS_ROOT_URL + "/{id}", HttpMethod.DELETE, null, + String.class, id); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + private Role prepareRole(String name, String description) { + Role role = new Role(); + role.setRoleName(name); + role.setRoleDescription(description); + return role; + } + + private void deleteRole(long id) { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange(ROLES_DELETE_URL + "/{id}", HttpMethod.DELETE, + null, String.class, id); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } +} diff --git a/web/WEB-INF/views/users.jsp b/web/WEB-INF/views/users.jsp index 730517c..291787a 100644 --- a/web/WEB-INF/views/users.jsp +++ b/web/WEB-INF/views/users.jsp @@ -10,7 +10,7 @@