diff --git a/src/main/java/io/khasang/eshop/config/AppConfig.java b/src/main/java/io/khasang/eshop/config/AppConfig.java index 11ff411..f147aff 100644 --- a/src/main/java/io/khasang/eshop/config/AppConfig.java +++ b/src/main/java/io/khasang/eshop/config/AppConfig.java @@ -1,8 +1,14 @@ package io.khasang.eshop.config; +import io.khasang.eshop.dao.AnonymousDao; import io.khasang.eshop.dao.CatDao; +import io.khasang.eshop.dao.UserDao; +import io.khasang.eshop.dao.impl.AnonymousDaoImpl; import io.khasang.eshop.dao.impl.CatDaoImpl; +import io.khasang.eshop.dao.impl.UserDaoImpl; +import io.khasang.eshop.entity.Anonymous; import io.khasang.eshop.entity.Cat; +import io.khasang.eshop.entity.User; import io.khasang.eshop.model.CreateTable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -52,6 +58,16 @@ public CatDao catDao(){ return new CatDaoImpl(Cat.class); } + @Bean + public UserDao userDao(){ + return new UserDaoImpl(User.class); + } + + @Bean + public AnonymousDao anonymousDao() { + return new AnonymousDaoImpl(Anonymous.class); + } + @Bean public CreateTable createTable(){ return new CreateTable(jdbcTemplate()); diff --git a/src/main/java/io/khasang/eshop/config/SecurityConfig.java b/src/main/java/io/khasang/eshop/config/SecurityConfig.java index 60401de..53afbbd 100644 --- a/src/main/java/io/khasang/eshop/config/SecurityConfig.java +++ b/src/main/java/io/khasang/eshop/config/SecurityConfig.java @@ -21,7 +21,7 @@ public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/admin/**").access("hasRole('ADMIN')") - .antMatchers("/user/**").access("hasRole('USER')") +// .antMatchers("/user/**").access("hasRole('USER')") .and().csrf().disable().formLogin().defaultSuccessUrl("/", false); } diff --git a/src/main/java/io/khasang/eshop/controller/AnonymousController.java b/src/main/java/io/khasang/eshop/controller/AnonymousController.java new file mode 100644 index 0000000..b0f40ac --- /dev/null +++ b/src/main/java/io/khasang/eshop/controller/AnonymousController.java @@ -0,0 +1,55 @@ +package io.khasang.eshop.controller; + + +import io.khasang.eshop.entity.Anonymous; +import io.khasang.eshop.service.AnonymousService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller() +@RequestMapping("/anonymous") +public class AnonymousController { + private final AnonymousService anonymousService; + @Autowired + public AnonymousController(AnonymousService anonymousService){ + this.anonymousService = anonymousService; + } + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAllAnonymous() { + return anonymousService.getAllAnonymous(); + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Anonymous addAnonymous(@RequestBody Anonymous anonymous){ + return anonymousService.addAnonymous(anonymous); + } + + @RequestMapping(value = "/update", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public Anonymous updateAnonymous(@RequestBody Anonymous anonymous){ + return anonymousService.updateAnonymous(anonymous); + } + + @RequestMapping(value = "/patch", method = RequestMethod.PATCH, produces = "application/json;charset=utf-8") + @ResponseBody + public Anonymous patchAnonymous(@RequestBody Anonymous anonymous){ + return anonymousService.patchAnonymous(anonymous); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE, produces = "application/json;charset=utf-8") + @ResponseBody + public Anonymous deleteAnonymous(@RequestParam(value = "id") String id) { + return anonymousService.delete(Long.parseLong(id)); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Anonymous getAnonymousById(@PathVariable(value = "id") String id) { + return anonymousService.getById(Long.parseLong(id)); + } +} diff --git a/src/main/java/io/khasang/eshop/controller/UserController.java b/src/main/java/io/khasang/eshop/controller/UserController.java new file mode 100644 index 0000000..ced7e57 --- /dev/null +++ b/src/main/java/io/khasang/eshop/controller/UserController.java @@ -0,0 +1,58 @@ +package io.khasang.eshop.controller; + + +import io.khasang.eshop.entity.User; +import io.khasang.eshop.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping("/user") +public class UserController { + private final UserService userService; + @Autowired + public UserController(UserService userService){ + this.userService = userService; + } + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAllUsers() { + return userService.getAllUsers(); + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public User addUser(@RequestBody User user){ + return userService.addUser(user); + } + + @RequestMapping(value = "/update", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public User updateUser(@RequestBody User user){ + return userService.updateUser(user); + } + + @RequestMapping(value = "/patch", method = RequestMethod.PATCH, produces = "application/json;charset=utf-8") + @ResponseBody + public User patchUser(@RequestBody User user){ + return userService.patchUser(user); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE, produces = "application/json;charset=utf-8") + @ResponseBody + public User deleteUser(@RequestParam(value = "id") String id) { + return userService.delete(Long.parseLong(id)); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public User getUserById(@PathVariable(value = "id") String id) { + return userService.getById(Long.parseLong(id)); + } +} + + + diff --git a/src/main/java/io/khasang/eshop/dao/AnonymousDao.java b/src/main/java/io/khasang/eshop/dao/AnonymousDao.java new file mode 100644 index 0000000..67f1c8a --- /dev/null +++ b/src/main/java/io/khasang/eshop/dao/AnonymousDao.java @@ -0,0 +1,6 @@ +package io.khasang.eshop.dao; + +import io.khasang.eshop.entity.Anonymous; + +public interface AnonymousDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/eshop/dao/UserDao.java b/src/main/java/io/khasang/eshop/dao/UserDao.java new file mode 100644 index 0000000..b9a4161 --- /dev/null +++ b/src/main/java/io/khasang/eshop/dao/UserDao.java @@ -0,0 +1,7 @@ +package io.khasang.eshop.dao; + + +import io.khasang.eshop.entity.User; + +public interface UserDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/eshop/dao/impl/AnonymousDaoImpl.java b/src/main/java/io/khasang/eshop/dao/impl/AnonymousDaoImpl.java new file mode 100644 index 0000000..3692169 --- /dev/null +++ b/src/main/java/io/khasang/eshop/dao/impl/AnonymousDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.eshop.dao.impl; + +import io.khasang.eshop.dao.AnonymousDao; +import io.khasang.eshop.entity.Anonymous; + +public class AnonymousDaoImpl extends BasicDaoImpl implements AnonymousDao { + public AnonymousDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/eshop/dao/impl/UserDaoImpl.java b/src/main/java/io/khasang/eshop/dao/impl/UserDaoImpl.java new file mode 100644 index 0000000..ab46c69 --- /dev/null +++ b/src/main/java/io/khasang/eshop/dao/impl/UserDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.eshop.dao.impl; + +import io.khasang.eshop.dao.UserDao; +import io.khasang.eshop.entity.User; + +public class UserDaoImpl extends BasicDaoImpl implements UserDao { + public UserDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/eshop/entity/Anonymous.java b/src/main/java/io/khasang/eshop/entity/Anonymous.java new file mode 100644 index 0000000..1e6ad28 --- /dev/null +++ b/src/main/java/io/khasang/eshop/entity/Anonymous.java @@ -0,0 +1,43 @@ +package io.khasang.eshop.entity; + +import javax.persistence.*; + + +@Entity +@Table(name = "anonymous") +public class Anonymous { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "anonymous_id") + private long id; + private String name; + private String description; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + +} + + diff --git a/src/main/java/io/khasang/eshop/entity/User.java b/src/main/java/io/khasang/eshop/entity/User.java new file mode 100644 index 0000000..8ca14f6 --- /dev/null +++ b/src/main/java/io/khasang/eshop/entity/User.java @@ -0,0 +1,39 @@ +package io.khasang.eshop.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id") + private long id; + private String name; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + private String description; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/io/khasang/eshop/service/AnonymousService.java b/src/main/java/io/khasang/eshop/service/AnonymousService.java new file mode 100644 index 0000000..8c59170 --- /dev/null +++ b/src/main/java/io/khasang/eshop/service/AnonymousService.java @@ -0,0 +1,50 @@ +package io.khasang.eshop.service; + +import io.khasang.eshop.entity.Anonymous; + +import java.util.List; + +public interface AnonymousService { + + /** + * method for receiving all anonymous from DB + * @return List of all anonymous + */ + List getAllAnonymous(); + + /** + * method for receiving specify anonymous by id + * @param id = anonymous id + * @return anonymous by id + */ + Anonymous addAnonymous(Anonymous anonymous); + + /** + * method for update anonymous + * @param anonymous = updated anonymous + * @return updated anonymous + */ + Anonymous updateAnonymous(Anonymous anonymous); + + /** + * method for update anonymous + * @param anonymous = updated anonymous + * @return updated anonymous + */ + Anonymous patchAnonymous(Anonymous anonymous); + + /** + * method for delete specify anonymous by id + * + * @param id = anonymous id + * @return deleted anonymous by id + */ + Anonymous delete(long id); + + /** + * method for getbyid for anonymous + * @param id = anonymous + * @return anonymous + */ + Anonymous getById(long id); +} diff --git a/src/main/java/io/khasang/eshop/service/UserService.java b/src/main/java/io/khasang/eshop/service/UserService.java new file mode 100644 index 0000000..71b4655 --- /dev/null +++ b/src/main/java/io/khasang/eshop/service/UserService.java @@ -0,0 +1,51 @@ +package io.khasang.eshop.service; + +import io.khasang.eshop.entity.Cat; +import io.khasang.eshop.entity.User; + +import java.util.List; + +public interface UserService { + + /** + * method for receiving all user from DB + * @return List of all user + */ + List getAllUsers(); + + /** + * method for receiving specify user by id + * @param id = user's id + * @return user by id + */ + User addUser(User user); + + /** + * method for update user + * @param user = updated user + * @return updated user + */ + User updateUser(User user); + + /** + * method for update user + * @param user = updated user + * @return updated user + */ + User patchUser(User user); + + /** + * method for delete specify user by id + * + * @param id = user's id + * @return user by id + */ + User delete(long id); + + /** + * method for getbyid for user + * @param id = user + * @return user + */ + User getById(long id); +} diff --git a/src/main/java/io/khasang/eshop/service/impl/AnonymousServiceImpl.java b/src/main/java/io/khasang/eshop/service/impl/AnonymousServiceImpl.java new file mode 100644 index 0000000..f78c3d1 --- /dev/null +++ b/src/main/java/io/khasang/eshop/service/impl/AnonymousServiceImpl.java @@ -0,0 +1,45 @@ +package io.khasang.eshop.service.impl; + +import io.khasang.eshop.dao.AnonymousDao; +import io.khasang.eshop.entity.Anonymous; +import io.khasang.eshop.service.AnonymousService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("anonymousService") +public class AnonymousServiceImpl implements AnonymousService { + @Autowired + private AnonymousDao anonymousDao; + + @Override + public List getAllAnonymous() { + return anonymousDao.getList(); + } + + @Override + public Anonymous addAnonymous(Anonymous anonymous) { + return anonymousDao.add(anonymous); + } + + @Override + public Anonymous updateAnonymous(Anonymous anonymous) { + return anonymousDao.update(anonymous); + } + + @Override + public Anonymous patchAnonymous(Anonymous anonymous) { + return anonymousDao.update(anonymous); + } + + @Override + public Anonymous delete(long id) { + return anonymousDao.delete(getById(id)); + } + + @Override + public Anonymous getById(long id) { + return anonymousDao.getById(id); + } +} diff --git a/src/main/java/io/khasang/eshop/service/impl/UserServiceImpl.java b/src/main/java/io/khasang/eshop/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..6f75767 --- /dev/null +++ b/src/main/java/io/khasang/eshop/service/impl/UserServiceImpl.java @@ -0,0 +1,45 @@ +package io.khasang.eshop.service.impl; + +import io.khasang.eshop.dao.UserDao; +import io.khasang.eshop.entity.User; +import io.khasang.eshop.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("userService") +public class UserServiceImpl implements UserService { + @Autowired + private UserDao userDao; + + @Override + public List getAllUsers() { + return userDao.getList(); + } + + @Override + public User addUser(User user) { + return userDao.add(user); + } + + @Override + public User updateUser(User user) { + return userDao.update(user); + } + + @Override + public User patchUser(User user) { + return userDao.update(user); + } + + @Override + public User delete(long id) { + return userDao.delete(getById(id)); + } + + @Override + public User getById(long id) { + return userDao.getById(id); + } +} diff --git a/src/test/java/io/khasang/eshop/controller/AnonymousControllerIntegrationTest.java b/src/test/java/io/khasang/eshop/controller/AnonymousControllerIntegrationTest.java new file mode 100644 index 0000000..bbf5049 --- /dev/null +++ b/src/test/java/io/khasang/eshop/controller/AnonymousControllerIntegrationTest.java @@ -0,0 +1,139 @@ +package io.khasang.eshop.controller; + +import io.khasang.eshop.entity.Anonymous; +import org.junit.*; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class AnonymousControllerIntegrationTest { + + private static final String ROOT = "http://localhost:8080/anonymous"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String ALL = "/all"; + private static final String DELETE = "/delete"; + + @BeforeClass + public static void globalInit() { + System.out.println("Global init"); + } + + @AfterClass + public static void globalClean() { + System.out.println("Global Clean"); + } + + @Before + public void init() { + System.out.println("Init"); + } + + @After + public void clean() { + System.out.println("Clean"); + } + + @Test + public void addAnonymous() { + Anonymous anonymous = createdAnonymous(); + + RestTemplate template = new RestTemplate(); + + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Anonymous.class, + anonymous.getId() + ); + + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + Anonymous receivedAnonymous = responseEntity.getBody(); + assertNotNull(receivedAnonymous); + assertEquals(anonymous.getId(), receivedAnonymous.getId()); + assertNotNull(receivedAnonymous.getDescription()); + } + + @Test + public void getAllAnonymous() { + createdAnonymous(); + createdAnonymous(); + + RestTemplate template = new RestTemplate(); + ResponseEntity> responseEntity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + List anonymousList = responseEntity.getBody(); + assertNotNull(anonymousList.get(0)); + assertNotNull(anonymousList.get(1)); + } + + @Test + public void deleteAnonymous() { + Anonymous anonymous = createdAnonymous(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + DELETE + "/?id={id}", + HttpMethod.DELETE, + null, + Anonymous.class, + anonymous.getId() + ); + + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + + Anonymous deletedAnonymous = responseEntity.getBody(); + assertNotNull(deletedAnonymous.getName()); + + ResponseEntity responseForDeleteAnonymous = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Anonymous.class, + deletedAnonymous.getId() + ); + + assertEquals("OK", responseForDeleteAnonymous.getStatusCode().getReasonPhrase()); + assertNull(responseForDeleteAnonymous.getBody()); + } + + private Anonymous createdAnonymous() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Anonymous anonymous = prefillAnonymous("anonym"); + + HttpEntity httpEntity = new HttpEntity<>(anonymous, headers); + RestTemplate template = new RestTemplate(); + + Anonymous createdAnonymous = template.exchange( + ROOT + ADD, + HttpMethod.POST, + httpEntity, + Anonymous.class + ).getBody(); + + assertNotNull(createdAnonymous); + assertEquals(anonymous.getName(), createdAnonymous.getName()); + return createdAnonymous; + } + + private Anonymous prefillAnonymous(String anonym) { + Anonymous anonymous = new Anonymous(); + anonymous.setName(anonym); + return anonymous; + } +} diff --git a/src/test/java/io/khasang/eshop/controller/UserControllerIntegrationTest.java b/src/test/java/io/khasang/eshop/controller/UserControllerIntegrationTest.java new file mode 100644 index 0000000..c3909e7 --- /dev/null +++ b/src/test/java/io/khasang/eshop/controller/UserControllerIntegrationTest.java @@ -0,0 +1,140 @@ +package io.khasang.eshop.controller; + +import io.khasang.eshop.entity.User; +import org.junit.*; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class UserControllerIntegrationTest { + + private static final String ROOT = "http://localhost:8080/user"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String ALL = "/all"; + private static final String DELETE = "/delete"; + + @BeforeClass + public static void globalInit() { + System.out.println("Global init"); + } + + @AfterClass + public static void globalClean() { + System.out.println("Global Clean"); + } + + @Before + public void init() { + System.out.println("Init"); + } + + @After + public void clean() { + System.out.println("Clean"); + } + + @Test + public void addUser() { + User user = createdUser(); + + RestTemplate template = new RestTemplate(); + + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + User.class, + user.getId() + ); + + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + User receivedUser = responseEntity.getBody(); + assertNotNull(receivedUser); + assertEquals(user.getId(), receivedUser.getId()); + assertNotNull(receivedUser.getDescription()); + } + + @Test + public void getAllUser() { + createdUser(); + createdUser(); + + RestTemplate template = new RestTemplate(); + ResponseEntity> responseEntity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + List userList = responseEntity.getBody(); + assertNotNull(userList.get(0)); + assertNotNull(userList.get(1)); + } + + @Test + public void deleteUser() { + User user = createdUser(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + DELETE + "/?id={id}", + HttpMethod.DELETE, + null, + User.class, + user.getId() + ); + + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + + User deletedUser = responseEntity.getBody(); + assertNotNull(deletedUser.getName()); + + ResponseEntity responseForDeleteUser = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + User.class, + deletedUser.getId() + ); + + assertEquals("OK", responseForDeleteUser.getStatusCode().getReasonPhrase()); + assertNull(responseForDeleteUser.getBody()); + } + + private User createdUser() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + User user = prefillUser("userName"); + + HttpEntity httpEntity = new HttpEntity<>(user, headers); + RestTemplate template = new RestTemplate(); + + User createdUser = template.exchange( + ROOT + ADD, + HttpMethod.POST, + httpEntity, + User.class + ).getBody(); + + assertNotNull(createdUser); + assertEquals(user.getName(), createdUser.getName()); + return createdUser; + } + + private User prefillUser(String userName) { + User user = new User(); + user.setName(userName); + user.setDescription("Ivan"); + return user; + } +}