diff --git a/src/main/java/io/khasang/pm/config/AppConfig.java b/src/main/java/io/khasang/pm/config/AppConfig.java index 2e12eac..d9812fe 100644 --- a/src/main/java/io/khasang/pm/config/AppConfig.java +++ b/src/main/java/io/khasang/pm/config/AppConfig.java @@ -1,14 +1,8 @@ package io.khasang.pm.config; -import io.khasang.pm.dao.CatDao; -import io.khasang.pm.dao.ProjectDao; -import io.khasang.pm.dao.DocumentDao; -import io.khasang.pm.dao.impl.CatDaoImpl; -import io.khasang.pm.dao.impl.ProjectDaoImpl; -import io.khasang.pm.dao.impl.DocumentDaoImpl; -import io.khasang.pm.entity.Cat; -import io.khasang.pm.entity.Project; -import io.khasang.pm.entity.Document; +import io.khasang.pm.dao.*; +import io.khasang.pm.dao.impl.*; +import io.khasang.pm.entity.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @@ -22,6 +16,11 @@ public CatDao catDao() { return new CatDaoImpl(Cat.class); } + @Bean + public UserDao userDao() { + return new UserDaoImpl(User.class); + } + @Bean public ProjectDao projectDao() {return new ProjectDaoImpl(Project.class); } @@ -31,4 +30,10 @@ public DocumentDao documentDao(){ return new DocumentDaoImpl(Document.class); } + @Bean + public EmployeeDao employeeDao(){ + return new EmployeeDaoImpl(Employee.class); + } + + } diff --git a/src/main/java/io/khasang/pm/controller/AppController.java b/src/main/java/io/khasang/pm/controller/AppController.java index 863ccfc..11bac31 100644 --- a/src/main/java/io/khasang/pm/controller/AppController.java +++ b/src/main/java/io/khasang/pm/controller/AppController.java @@ -51,6 +51,11 @@ public String getUserPage() { return "user"; } + @RequestMapping("/users") + public String getUsersPage() { + return "users"; + } + // localhost:8080/password/admin @RequestMapping("/password/{password}") public String getEncryptPassword(@PathVariable("password") String password, Model model) { diff --git a/src/main/java/io/khasang/pm/controller/CatController.java b/src/main/java/io/khasang/pm/controller/CatController.java index c3d8403..25b5c02 100644 --- a/src/main/java/io/khasang/pm/controller/CatController.java +++ b/src/main/java/io/khasang/pm/controller/CatController.java @@ -36,4 +36,4 @@ public List getAll(){ public void setCatService(CatService catService) { this.catService = catService; } -} +} \ No newline at end of file diff --git a/src/main/java/io/khasang/pm/controller/EmployeeController.java b/src/main/java/io/khasang/pm/controller/EmployeeController.java new file mode 100644 index 0000000..28512e4 --- /dev/null +++ b/src/main/java/io/khasang/pm/controller/EmployeeController.java @@ -0,0 +1,38 @@ +package io.khasang.pm.controller; + +import io.khasang.pm.entity.Employee; +import io.khasang.pm.service.EmployeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping("/employee") +public class EmployeeController { + private EmployeeService employeeService; + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Employee addEmployee(@RequestBody Employee employee) { + return employeeService.add(employee); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Employee getById(@PathVariable("id") long id) { + return employeeService.getById(id); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll() { + return employeeService.getAll(); + } + + @Autowired + public void setEmployeeService(EmployeeService employeeService) { + this.employeeService = employeeService; + } +} diff --git a/src/main/java/io/khasang/pm/controller/UserController.java b/src/main/java/io/khasang/pm/controller/UserController.java new file mode 100644 index 0000000..eb8ddeb --- /dev/null +++ b/src/main/java/io/khasang/pm/controller/UserController.java @@ -0,0 +1,38 @@ +package io.khasang.pm.controller; + +import io.khasang.pm.entity.User; +import io.khasang.pm.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("/users") +public class UserController { + private UserService userService; + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public User addUser(@RequestBody User user) { + return userService.add(user); + } + + @RequestMapping(value = "/get/{login}", method = RequestMethod.GET) + @ResponseBody + public User getByLogin(@PathVariable("login") String login) { + return userService.getByLogin(login); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll(){ + return userService.getAll(); + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } +} \ No newline at end of file diff --git a/src/main/java/io/khasang/pm/dao/BasicDao.java b/src/main/java/io/khasang/pm/dao/BasicDao.java index d16e7af..d2668c1 100644 --- a/src/main/java/io/khasang/pm/dao/BasicDao.java +++ b/src/main/java/io/khasang/pm/dao/BasicDao.java @@ -19,6 +19,14 @@ public interface BasicDao { */ T getById(long id); + /** + * getting specify entity by ID + * + * @param login entity's login for receiving + * @return entity by login + */ + T getByLogin(String login); + /** * getting all entities * diff --git a/src/main/java/io/khasang/pm/dao/EmployeeDao.java b/src/main/java/io/khasang/pm/dao/EmployeeDao.java new file mode 100644 index 0000000..77d3137 --- /dev/null +++ b/src/main/java/io/khasang/pm/dao/EmployeeDao.java @@ -0,0 +1,7 @@ +package io.khasang.pm.dao; + +import io.khasang.pm.entity.Cat; +import io.khasang.pm.entity.Employee; + +public interface EmployeeDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/pm/dao/UserDao.java b/src/main/java/io/khasang/pm/dao/UserDao.java new file mode 100644 index 0000000..97bef7b --- /dev/null +++ b/src/main/java/io/khasang/pm/dao/UserDao.java @@ -0,0 +1,8 @@ +package io.khasang.pm.dao; + +import io.khasang.pm.entity.User; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +public interface UserDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/pm/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/pm/dao/impl/BasicDaoImpl.java index a56fa2b..3f8263d 100644 --- a/src/main/java/io/khasang/pm/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/pm/dao/impl/BasicDaoImpl.java @@ -32,6 +32,11 @@ public T getById(long id) { return getSession().get(entityClass, id); } + @Override + public T getByLogin(String login) { + return getSession().get(entityClass, login); + } + @Override public List getAll() { // select * from table diff --git a/src/main/java/io/khasang/pm/dao/impl/EmployeeDaoImpl.java b/src/main/java/io/khasang/pm/dao/impl/EmployeeDaoImpl.java new file mode 100644 index 0000000..d177118 --- /dev/null +++ b/src/main/java/io/khasang/pm/dao/impl/EmployeeDaoImpl.java @@ -0,0 +1,13 @@ +package io.khasang.pm.dao.impl; + +import io.khasang.pm.dao.BasicDao; +import io.khasang.pm.dao.CatDao; +import io.khasang.pm.dao.EmployeeDao; +import io.khasang.pm.entity.Cat; +import io.khasang.pm.entity.Employee; + +public class EmployeeDaoImpl extends BasicDaoImpl implements EmployeeDao { + public EmployeeDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/pm/dao/impl/UserDaoImpl.java b/src/main/java/io/khasang/pm/dao/impl/UserDaoImpl.java new file mode 100644 index 0000000..a1c48bf --- /dev/null +++ b/src/main/java/io/khasang/pm/dao/impl/UserDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.pm.dao.impl; + +import io.khasang.pm.dao.UserDao; +import io.khasang.pm.entity.User; + +public class UserDaoImpl extends BasicDaoImpl implements UserDao { + public UserDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/pm/entity/Car.java b/src/main/java/io/khasang/pm/entity/Car.java new file mode 100644 index 0000000..a82bd47 --- /dev/null +++ b/src/main/java/io/khasang/pm/entity/Car.java @@ -0,0 +1,52 @@ +package io.khasang.pm.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jdk.nashorn.internal.ir.annotations.Ignore; + +import javax.persistence.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name="cars") +public class Car { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String model; + private LocalDate year; + + //@JsonIgnore + @ManyToMany(fetch = FetchType.EAGER, mappedBy = "carList") + private List employees = new ArrayList<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public LocalDate getYear() { + return year; + } + + public void setYear(LocalDate year) { + this.year = year; + } + + public void setEmployees(List employees) { + this.employees = employees; + } +} diff --git a/src/main/java/io/khasang/pm/entity/Employee.java b/src/main/java/io/khasang/pm/entity/Employee.java new file mode 100644 index 0000000..48e8732 --- /dev/null +++ b/src/main/java/io/khasang/pm/entity/Employee.java @@ -0,0 +1,51 @@ +package io.khasang.pm.entity; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "employees") +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + private String title; + + @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + private List carList= new ArrayList<>(); + + 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; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getCarList() { + return carList; + } + + public void setCarList(List carList) { + this.carList = carList; + } +} diff --git a/src/main/java/io/khasang/pm/entity/User.java b/src/main/java/io/khasang/pm/entity/User.java new file mode 100644 index 0000000..0a82844 --- /dev/null +++ b/src/main/java/io/khasang/pm/entity/User.java @@ -0,0 +1,47 @@ +package io.khasang.pm.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "users") +public class User { + private String name; + + @Id + @Column(unique = true, nullable = false) + private String login; + private String password; + private String function; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFunction() { + return function; + } + + public void setFunction(String function) { + this.function = function; + } +} diff --git a/src/main/java/io/khasang/pm/service/EmployeeService.java b/src/main/java/io/khasang/pm/service/EmployeeService.java new file mode 100644 index 0000000..1dae227 --- /dev/null +++ b/src/main/java/io/khasang/pm/service/EmployeeService.java @@ -0,0 +1,30 @@ +package io.khasang.pm.service; + +import io.khasang.pm.entity.Employee; + +import java.util.List; + +public interface EmployeeService { + /** + * required for adding employee to db + * + * @param employee - employee for adding + * @return added employee + */ + Employee add(Employee employee); + + /** + * getting specify employee by ID + * + * @param id - employee's id for receiving + * @return employee by id + */ + Employee getById(long id); + + /** + * getting all employees + * + * @return all employees from DB + */ + List getAll(); +} diff --git a/src/main/java/io/khasang/pm/service/UserService.java b/src/main/java/io/khasang/pm/service/UserService.java new file mode 100644 index 0000000..a8accd7 --- /dev/null +++ b/src/main/java/io/khasang/pm/service/UserService.java @@ -0,0 +1,31 @@ +package io.khasang.pm.service; + +import io.khasang.pm.entity.Cat; +import io.khasang.pm.entity.User; + +import java.util.List; + +public interface UserService { + /** + * required for adding cats to db + * + * @param user - user for adding + * @return added user + */ + User add(User user); + + /** + * getting specify user by ID + * + * @param login - user's id for receiving + * @return user by id + */ + User getByLogin(String login); + + /** + * getting all users + * + * @return all users from DB + */ + List getAll(); +} diff --git a/src/main/java/io/khasang/pm/service/impl/EmployeeServiceImpl.java b/src/main/java/io/khasang/pm/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..59e3aa3 --- /dev/null +++ b/src/main/java/io/khasang/pm/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,35 @@ +package io.khasang.pm.service.impl; + +import io.khasang.pm.dao.CatDao; +import io.khasang.pm.dao.EmployeeDao; +import io.khasang.pm.entity.Employee; +import io.khasang.pm.service.EmployeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("employeeService") +public class EmployeeServiceImpl implements EmployeeService { + private EmployeeDao employeeDao; + + @Override + public Employee add(Employee employee) { + return employeeDao.add(employee); + } + + @Override + public Employee getById(long id) { + return employeeDao.getById(id); + } + + @Override + public List getAll() { + return employeeDao.getAll(); + } + + @Autowired + public void setEmployeeDao(EmployeeDao employeeDao) { + this.employeeDao = employeeDao; + } +} diff --git a/src/main/java/io/khasang/pm/service/impl/UserServiceImpl.java b/src/main/java/io/khasang/pm/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..a469c11 --- /dev/null +++ b/src/main/java/io/khasang/pm/service/impl/UserServiceImpl.java @@ -0,0 +1,34 @@ +package io.khasang.pm.service.impl; + +import io.khasang.pm.dao.UserDao; +import io.khasang.pm.entity.User; +import io.khasang.pm.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 { + private UserDao userDao; + + @Override + public User add(User user) { + return userDao.add(user); + } + + @Override + public User getByLogin(String login) { + return userDao.getByLogin(login); + } + + @Override + public List getAll() { + return userDao.getAll(); + } + + @Autowired + public void setUserDao(UserDao userDao) { + this.userDao = userDao; + } +} diff --git a/src/main/resources/ioc.xml b/src/main/resources/ioc.xml index 04676fa..78063c3 100644 --- a/src/main/resources/ioc.xml +++ b/src/main/resources/ioc.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - - + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/users.jsp b/src/main/webapp/WEB-INF/views/users.jsp new file mode 100644 index 0000000..ae434e8 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/users.jsp @@ -0,0 +1,115 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + Title + + + + +

User Menu

+ + + + + + + + + + + + + + + + + + + + + + +
Request typeURLValue
Get All users - GET/users/all + +
Get user by login - GET/users/get/{login} + login: + +
add new user - POST/users/add + name: + login: + password: + function: + +
+ +
+
+ RESPONSE> +
+
+
+ + \ No newline at end of file diff --git a/src/test/java/io/khasang/pm/controller/CatControllerIntegrationTest.java b/src/test/java/io/khasang/pm/controller/CatControllerIntegrationTest.java index e5ea300..bb130e8 100644 --- a/src/test/java/io/khasang/pm/controller/CatControllerIntegrationTest.java +++ b/src/test/java/io/khasang/pm/controller/CatControllerIntegrationTest.java @@ -100,6 +100,4 @@ private Cat prefillCat() { return cat; } - - } diff --git a/src/test/java/io/khasang/pm/controller/EmployeeControllerIntegrationTest.java b/src/test/java/io/khasang/pm/controller/EmployeeControllerIntegrationTest.java new file mode 100644 index 0000000..b79f3ec --- /dev/null +++ b/src/test/java/io/khasang/pm/controller/EmployeeControllerIntegrationTest.java @@ -0,0 +1,104 @@ +package io.khasang.pm.controller; + +import io.khasang.pm.entity.Car; +import io.khasang.pm.entity.Employee; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class EmployeeControllerIntegrationTest { + private static final String ROOT = "http://localhost:8080/employee"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String ALL = "/all"; + + @Test + public void checkAddEmployee() { + Employee barsik = createEmployee(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Employee.class, + barsik.getId() + ); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Employee receivedEmployee = responseEntity.getBody(); + Assert.assertNotNull(receivedEmployee); + + + } + + @Test + public void checkGettingAllEmployees() { + createEmployee(); + createEmployee(); + + RestTemplate template = new RestTemplate(); + ResponseEntity> responseEntity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + List receivedEmployees = responseEntity.getBody(); + assertNotNull(receivedEmployees); + } + + private Employee createEmployee() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Employee employee = prefillEmployee(); + + HttpEntity entity = new HttpEntity<>(employee, headers); + RestTemplate template = new RestTemplate(); + Employee createdEmployee = template.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + Employee.class + ).getBody(); + + Assert.assertNotNull(createdEmployee); + assertEquals("Barsik", createdEmployee.getName()); + return createdEmployee; + } + + private Employee prefillEmployee() { + Employee employee = new Employee(); + employee.setTitle("Boss"); + employee.setName("Barsik"); + + Car car1 = new Car(); + car1.setModel("BMW"); + car1.setYear(LocalDate.of(2008, 11, 21)); + + Car car2 = new Car(); + car2.setModel("Lada"); + car2.setYear(LocalDate.of(2013, 3, 16)); + + List cars = new ArrayList<>(); + cars.add(car1); + cars.add(car2); + + employee.setCarList(cars); + + return employee; + } + +} diff --git a/src/test/java/io/khasang/pm/controller/UserControllerIntegrationTest.java b/src/test/java/io/khasang/pm/controller/UserControllerIntegrationTest.java new file mode 100644 index 0000000..b445f13 --- /dev/null +++ b/src/test/java/io/khasang/pm/controller/UserControllerIntegrationTest.java @@ -0,0 +1,83 @@ +package io.khasang.pm.controller; + +import io.khasang.pm.entity.User; +import org.junit.Assert; +import org.junit.Test; +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; + +public class UserControllerIntegrationTest { + + private static final String ROOT = "http://localhost:8080/users"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String ALL = "/all"; + + @Test + public void checkGetUser() { + User user = createUser("asdf1"); + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/" + user.getLogin(), + HttpMethod.GET, + null, + User.class, + user.getLogin() + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + User receivedUser = responseEntity.getBody(); + Assert.assertNotNull(receivedUser); + Assert.assertEquals(user.getLogin(), receivedUser.getLogin()); + } + + @Test + public void checkGettingAllUsers() { + createUser("asdf2"); + createUser("asdf3"); + + RestTemplate template = new RestTemplate(); + ResponseEntity> responseEntity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + List receivedUsers = responseEntity.getBody(); + assertNotNull(receivedUsers); + } + + private User createUser(String login) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + User user = prefillUser(login); + HttpEntity entity = new HttpEntity<>(user, headers); + RestTemplate template = new RestTemplate(); + User createdUser = template.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + User.class + ).getBody(); + + Assert.assertNotNull(createdUser); + assertEquals("igor", createdUser.getName()); + return createdUser; + } + + private User prefillUser(String login) { + User user = new User(); + user.setName("igor"); + user.setLogin(login); + user.setPassword("igor"); + user.setFunction("spec"); + return user; + } +}