From 435b105b5efa85e2e97e587b379badcf5d1d5c9d Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 20 Sep 2017 18:43:22 +0300 Subject: [PATCH 01/20] Added table creation, population with insert, select, update, delete, join, subquery and case when through SQL queries with status display. --- .../bazaar/config/application/AppConfig.java | 37 ++++++++- .../bazaar/controller/AppController.java | 75 ++++++++++++++++++- .../khasang/bazaar/model/CaseWhenTable.java | 36 +++++++++ .../io/khasang/bazaar/model/CreateTable.java | 22 ++++-- .../khasang/bazaar/model/DeleteFromTable.java | 35 +++++++++ .../io/khasang/bazaar/model/JoinTable.java | 35 +++++++++ .../khasang/bazaar/model/PopulateTable.java | 56 ++++++++++++++ .../khasang/bazaar/model/SelectFromTable.java | 35 +++++++++ .../khasang/bazaar/model/SubqueryTable.java | 35 +++++++++ .../io/khasang/bazaar/model/UpdateTable.java | 36 +++++++++ web/WEB-INF/views/table.jsp | 2 +- 11 files changed, 391 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/model/CaseWhenTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/DeleteFromTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/JoinTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/PopulateTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/SelectFromTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/SubqueryTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/UpdateTable.java diff --git a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java index 163dd30..a0b6301 100644 --- a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java +++ b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java @@ -1,6 +1,6 @@ package io.khasang.bazaar.config.application; -import io.khasang.bazaar.model.CreateTable; +import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -36,4 +36,39 @@ public JdbcTemplate jdbcTemplate() { public CreateTable createTable(){ return new CreateTable(jdbcTemplate()); } + + @Bean + public PopulateTable populateTable(){ + return new PopulateTable(jdbcTemplate()); + } + + @Bean + public SelectFromTable selectFromTable(){ + return new SelectFromTable(jdbcTemplate()); + } + + @Bean + public UpdateTable updateTable(){ + return new UpdateTable(jdbcTemplate()); + } + + @Bean + public DeleteFromTable deleteFromTable(){ + return new DeleteFromTable(jdbcTemplate()); + } + + @Bean + public JoinTable joinTable(){ + return new JoinTable(jdbcTemplate()); + } + + @Bean + public SubqueryTable subqueryTable(){ + return new SubqueryTable(jdbcTemplate()); + } + + @Bean + public CaseWhenTable caseWhenTable(){ + return new CaseWhenTable(jdbcTemplate()); + } } diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index fdd43da..a501e99 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -1,7 +1,6 @@ package io.khasang.bazaar.controller; -import io.khasang.bazaar.model.CreateTable; -import io.khasang.bazaar.model.Message; +import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; @@ -18,6 +17,27 @@ public class AppController { @Autowired private CreateTable createTable; + @Autowired + private PopulateTable populateTable; + + @Autowired + private SelectFromTable selectFromTable; + + @Autowired + private UpdateTable updateTable; + + @Autowired + private DeleteFromTable deleteFromTable; + + @Autowired + private JoinTable joinTable; + + @Autowired + private SubqueryTable subqueryTable; + + @Autowired + private CaseWhenTable caseWhenTable; + // http://localhost:8080/ @RequestMapping("/") public String javaPageHello(Model model) { @@ -29,7 +49,56 @@ public String javaPageHello(Model model) { @RequestMapping("/create") public String createTable(Model model) { model.addAttribute("status", createTable.createStatus()); - // hello.jsp + // table.jsp + return "table"; + } + + @RequestMapping("/populate") + public String populateTable(Model model) { + model.addAttribute("status", populateTable.populateStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/select") + public String selectFromTable(Model model) { + model.addAttribute("status", selectFromTable.selectStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/update") + public String updateTable(Model model) { + model.addAttribute("status", updateTable.updateStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/delete") + public String deleteFromTable(Model model) { + model.addAttribute("status", deleteFromTable.deleteStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/join") + public String joinTable(Model model) { + model.addAttribute("status", joinTable.joinStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/subquery") + public String subqueryTable(Model model) { + model.addAttribute("status", subqueryTable.subqueryStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/casewhen") + public String caseWhenTable(Model model) { + model.addAttribute("status", caseWhenTable.caseWhenStatus()); + // table.jsp return "table"; } diff --git a/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java b/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java new file mode 100644 index 0000000..137def7 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java @@ -0,0 +1,36 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class CaseWhenTable { + private JdbcTemplate jdbcTemplate; + + public CaseWhenTable() { + } + + public CaseWhenTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String caseWhenStatus() { + try { + jdbcTemplate.execute("SELECT title, release_year,\n " + + " CASE WHEN release_year > 2000 THEN 'Meh' ELSE 'Brilliant' END AS review\n" + + " FROM films;"); + return "Case when successful"; + } catch (Exception e) { + return "Case when failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/CreateTable.java b/src/main/java/io/khasang/bazaar/model/CreateTable.java index abe98c7..e49fb55 100644 --- a/src/main/java/io/khasang/bazaar/model/CreateTable.java +++ b/src/main/java/io/khasang/bazaar/model/CreateTable.java @@ -15,20 +15,26 @@ public CreateTable(JdbcTemplate jdbcTemplate) { public String createStatus() { try { jdbcTemplate.execute("DROP TABLE IF EXISTS films"); -// jdbcTemplate.execute("CREATE TABLE films (\n" + -// "code char(5) CONSTRAINT firstkey PRIMARY KEY, \n" + -// "title varchar(255) NOT NULL , \n" + -// "id integer NOT NULL);"); - jdbcTemplate.execute("CREATE TABLE public.films\n" + + jdbcTemplate.execute("CREATE TABLE films (\n" + + "code CHAR (5) CONSTRAINT films_pkey PRIMARY KEY, \n" + + "title VARCHAR (255) NOT NULL , \n" + + "director_l_name VARCHAR (255) NOT NULL , \n" + + "release_year INTEGER NOT NULL);"); + jdbcTemplate.execute("DROP TABLE IF EXISTS directors"); + jdbcTemplate.execute("CREATE TABLE directors (\n" + + "id INTEGER CONSTRAINT directors_pkey PRIMARY KEY, \n" + + "f_name VARCHAR(255) NOT NULL , \n" + + "l_name VARCHAR(255) NOT NULL);"); +/* jdbcTemplate.execute("CREATE TABLE public.films\n" + "(\n" + " code character(5) NOT NULL,\n" + " title character varying(255) NOT NULL,\n" + - " id integer NOT NULL,\n" + + " year integer NOT NULL,\n" + " CONSTRAINT firstkey PRIMARY KEY (code)\n" + - ");"); + ");");*/ return "Table created"; } catch (Exception e) { - return "Table creation failed" + e; + return "Table creation failed " + e; } } diff --git a/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java b/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java new file mode 100644 index 0000000..e777f17 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class DeleteFromTable { + private JdbcTemplate jdbcTemplate; + + public DeleteFromTable() { + } + + public DeleteFromTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String deleteStatus() { + try { + jdbcTemplate.execute("DELETE FROM films\n" + + " WHERE title = 'Wonder Woman' AND release_year = 2017;"); + return "Table record deleted"; + } catch (Exception e) { + return "Table record deletion failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/JoinTable.java b/src/main/java/io/khasang/bazaar/model/JoinTable.java new file mode 100644 index 0000000..650ca7a --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/JoinTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class JoinTable { + private JdbcTemplate jdbcTemplate; + + public JoinTable() { + } + + public JoinTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String joinStatus() { + try { + jdbcTemplate.execute("SELECT title, f_name, l_name FROM films f JOIN directors d\n" + + " ON f.director_l_name = d.l_name WHERE release_year < 2000;"); + return "Join successful"; + } catch (Exception e) { + return "Join failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/PopulateTable.java b/src/main/java/io/khasang/bazaar/model/PopulateTable.java new file mode 100644 index 0000000..5e06214 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/PopulateTable.java @@ -0,0 +1,56 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +public class PopulateTable { + private JdbcTemplate jdbcTemplate; + + public PopulateTable() { + } + + public PopulateTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String populateStatus() { + try { + jdbcTemplate.execute("DELETE FROM films;"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('HR814', 'Pulp Fiction', 'Tarantino', 1994);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('KW872', 'The Fifth Element', 'Besson', 1997);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('TE271', 'Titanic', 'Cameron', 1999);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('WT732', 'Wonder Woman', 'Jenkins', 2017);"); + jdbcTemplate.execute("DELETE FROM directors;"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('201', 'Quentin', 'Tarantino');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('202', 'Luc', 'Besson');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('203', 'James', 'Cameron');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('204', 'Patty', 'Jenkins');"); + return "Table populated"; + } catch (Exception e) { + return "Table population failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/SelectFromTable.java b/src/main/java/io/khasang/bazaar/model/SelectFromTable.java new file mode 100644 index 0000000..1f7f608 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/SelectFromTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class SelectFromTable { + private JdbcTemplate jdbcTemplate; + + public SelectFromTable() { + } + + public SelectFromTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String selectStatus() { + try { + jdbcTemplate.execute("SELECT title FROM films\n" + + " WHERE release_year = 1994;"); + return "Select successful"; + } catch (Exception e) { + return "Select failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/SubqueryTable.java b/src/main/java/io/khasang/bazaar/model/SubqueryTable.java new file mode 100644 index 0000000..7343a59 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/SubqueryTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class SubqueryTable { + private JdbcTemplate jdbcTemplate; + + public SubqueryTable() { + } + + public SubqueryTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String subqueryStatus() { + try { + jdbcTemplate.execute("SELECT title FROM films\n" + + " WHERE director_l_name IN (SELECT l_name FROM directors WHERE id = 203);"); + return "Subquery successful"; + } catch (Exception e) { + return "Subquery failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/UpdateTable.java b/src/main/java/io/khasang/bazaar/model/UpdateTable.java new file mode 100644 index 0000000..8eae0cc --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/UpdateTable.java @@ -0,0 +1,36 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class UpdateTable { + private JdbcTemplate jdbcTemplate; + + public UpdateTable() { + } + + public UpdateTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String updateStatus() { + try { + jdbcTemplate.execute("UPDATE films\n" + + " SET release_year = release_year - 2\n" + + " WHERE title = 'Titanic';"); + return "Table updated"; + } catch (Exception e) { + return "Table update failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/web/WEB-INF/views/table.jsp b/web/WEB-INF/views/table.jsp index 8f1c303..b8d2237 100644 --- a/web/WEB-INF/views/table.jsp +++ b/web/WEB-INF/views/table.jsp @@ -4,6 +4,6 @@ Title -

${status}

+

${status}

From 64d6aa7d938ce2715cf2cf9981289ed001eda77c Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Thu, 21 Sep 2017 19:11:07 +0300 Subject: [PATCH 02/20] Added Spring Security in-memory auth. --- pom.xml | 20 +++++++++++++ .../khasang/bazaar/config/SecurityConfig.java | 29 +++++++++++++++++++ .../khasang/bazaar/config/SecurityInit.java | 9 ++++++ .../bazaar/controller/AppController.java | 7 +++++ web/WEB-INF/views/admin.jsp | 16 ++++++++++ 5 files changed, 81 insertions(+) create mode 100644 src/main/java/io/khasang/bazaar/config/SecurityConfig.java create mode 100644 src/main/java/io/khasang/bazaar/config/SecurityInit.java create mode 100644 web/WEB-INF/views/admin.jsp diff --git a/pom.xml b/pom.xml index 6edb55e..aeb69f0 100644 --- a/pom.xml +++ b/pom.xml @@ -12,12 +12,14 @@ 4.3.11.RELEASE + 4.2.0.RELEASE 1.2 3.0.1 9.4.1212.jre7 + org.springframework spring-core @@ -43,11 +45,29 @@ postgresql ${postgresql.version} + + + org.springframework.security + spring-security-core + ${spring-security.version} + + + org.springframework.security + spring-security-web + ${spring-security.version} + + + org.springframework.security + spring-security-config + ${spring-security.version} + + jstl jstl ${jstl.version} + javax.servlet javax.servlet-api diff --git a/src/main/java/io/khasang/bazaar/config/SecurityConfig.java b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java new file mode 100644 index 0000000..813612d --- /dev/null +++ b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java @@ -0,0 +1,29 @@ +package io.khasang.bazaar.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +/** + * In-memory authentication example. + */ +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter{ + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); + auth.inMemoryAuthentication().withUser("user").password("user").roles("USER"); + } + + @Override + public void configure(HttpSecurity http) throws Exception{ + http.authorizeRequests() + .antMatchers("/").permitAll() + .antMatchers("/admin/**").access("hasRole('ADMIN')") + .antMatchers("/user/**").access("hasRole('USER')") + .and().csrf().disable().formLogin().defaultSuccessUrl("/", false); + } +} diff --git a/src/main/java/io/khasang/bazaar/config/SecurityInit.java b/src/main/java/io/khasang/bazaar/config/SecurityInit.java new file mode 100644 index 0000000..e8f3bf7 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/config/SecurityInit.java @@ -0,0 +1,9 @@ +package io.khasang.bazaar.config; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +/** + * Created by Zulfia Garifullina on 21.09.2017. + */ +public class SecurityInit extends AbstractSecurityWebApplicationInitializer { +} diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index a501e99..6268957 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -102,4 +102,11 @@ public String caseWhenTable(Model model) { return "table"; } + @RequestMapping("/admin") + public String getAdminInfo(Model model) { + model.addAttribute("secure", "It's a very secure page"); + // admin.jsp + return "admin"; + } + } diff --git a/web/WEB-INF/views/admin.jsp b/web/WEB-INF/views/admin.jsp new file mode 100644 index 0000000..92ed8f8 --- /dev/null +++ b/web/WEB-INF/views/admin.jsp @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: Zulfia Garifullina + Date: 21.09.2017 + Time: 19:00 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + ${secure} + + From 8423b49b2e3bac9e5c927e4a0cd37d25648d66ce Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Thu, 21 Sep 2017 19:56:33 +0300 Subject: [PATCH 03/20] Added Spring Security with DB auth. --- .../khasang/bazaar/config/SecurityConfig.java | 22 +++++++++++++++---- .../bazaar/config/application/AppConfig.java | 12 ++++++++++ .../bazaar/controller/AppController.java | 12 ++++++++++ src/main/resources/auth.properties | 2 ++ web/WEB-INF/views/password.jsp | 10 +++++++++ 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/auth.properties create mode 100644 web/WEB-INF/views/password.jsp diff --git a/src/main/java/io/khasang/bazaar/config/SecurityConfig.java b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java index 813612d..8466b98 100644 --- a/src/main/java/io/khasang/bazaar/config/SecurityConfig.java +++ b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java @@ -1,21 +1,35 @@ package io.khasang.bazaar.config; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; /** - * In-memory authentication example. + * In-memory and database authentication examples. */ @Configuration @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter{ +public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + private UserDetailsService userDetailsService; + @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); - auth.inMemoryAuthentication().withUser("user").password("user").roles("USER"); +/* auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); + auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");*/ + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); + } + + @Bean + PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); } @Override diff --git a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java index a0b6301..5ea4a62 100644 --- a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java +++ b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java @@ -8,13 +8,25 @@ import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl; @Configuration @PropertySource(value = "classpath:util.properties") +@PropertySource(value = "classpath:auth.properties") public class AppConfig { @Autowired private Environment environment; + @Bean + public UserDetailsService userDetailsService() { + JdbcDaoImpl jdbcDao = new JdbcDaoImpl(); + jdbcDao.setDataSource(dataSource()); + jdbcDao.setUsersByUsernameQuery(environment.getRequiredProperty("usersByQuery")); + jdbcDao.setAuthoritiesByUsernameQuery(environment.getRequiredProperty("rolesByQuery")); + return jdbcDao; + } + @Bean public DriverManagerDataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index 6268957..16dc306 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -3,9 +3,13 @@ import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; @Controller //@RequestMapping("/") @@ -109,4 +113,12 @@ public String getAdminInfo(Model model) { return "admin"; } + @RequestMapping(value = {"/password/{password}"}, method = RequestMethod.GET) + public ModelAndView passwordEncode(@PathVariable("password") String password) { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("password"); + modelAndView.addObject("crypt", new BCryptPasswordEncoder().encode(password)); + return modelAndView; + } + } diff --git a/src/main/resources/auth.properties b/src/main/resources/auth.properties new file mode 100644 index 0000000..cb743ca --- /dev/null +++ b/src/main/resources/auth.properties @@ -0,0 +1,2 @@ +usersByQuery=SELECT login, password, true FROM users WHERE login = ? +rolesByQuery=SELECT u.login, r.role_name FROM users u JOIN roles r ON u.role_id = r.id WHERE login = ? \ No newline at end of file diff --git a/web/WEB-INF/views/password.jsp b/web/WEB-INF/views/password.jsp new file mode 100644 index 0000000..dc55b9f --- /dev/null +++ b/web/WEB-INF/views/password.jsp @@ -0,0 +1,10 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +

Your password is:

+

${crypt}

+ + From c5c829ae6f0ca6f30e8b8858e8f211da764bb38f Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Tue, 26 Sep 2017 15:31:40 +0300 Subject: [PATCH 04/20] Added table creation through Hibernate. --- pom.xml | 18 ++++++ .../bazaar/config/HibernateConfig.java | 63 +++++++++++++++++++ .../khasang/bazaar/config/SecurityConfig.java | 1 + .../bazaar/controller/AppController.java | 7 +++ .../bazaar/controller/CatController.java | 19 ++++++ .../java/io/khasang/bazaar/entity/Cat.java | 63 +++++++++++++++++++ src/main/resources/hibernate.properties | 9 +++ web/WEB-INF/views/user.jsp | 16 +++++ 8 files changed, 196 insertions(+) create mode 100644 src/main/java/io/khasang/bazaar/config/HibernateConfig.java create mode 100644 src/main/java/io/khasang/bazaar/controller/CatController.java create mode 100644 src/main/java/io/khasang/bazaar/entity/Cat.java create mode 100644 src/main/resources/hibernate.properties create mode 100644 web/WEB-INF/views/user.jsp diff --git a/pom.xml b/pom.xml index aeb69f0..eaae640 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 1.2 3.0.1 9.4.1212.jre7 + 5.2.11.Final @@ -40,6 +41,12 @@ spring-jdbc ${spring.version}
+ + org.springframework + spring-orm + ${spring.version} + + org.postgresql postgresql @@ -73,6 +80,17 @@ javax.servlet-api ${javax.version} + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} +
diff --git a/src/main/java/io/khasang/bazaar/config/HibernateConfig.java b/src/main/java/io/khasang/bazaar/config/HibernateConfig.java new file mode 100644 index 0000000..762898d --- /dev/null +++ b/src/main/java/io/khasang/bazaar/config/HibernateConfig.java @@ -0,0 +1,63 @@ +package io.khasang.bazaar.config; + +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.hibernate5.HibernateTransactionManager; +import org.springframework.orm.hibernate5.LocalSessionFactoryBean; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import java.util.Properties; + +@Configuration +@EnableTransactionManagement +@PropertySource(value = "classpath:hibernate.properties") +public class HibernateConfig { + private final Environment environment; + + @Autowired + public HibernateConfig(Environment environment) { + this.environment = environment; + } + + @Bean + public DriverManagerDataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(environment.getRequiredProperty("hibernate.driver")); + dataSource.setUrl(environment.getRequiredProperty("hibernate.url")); + dataSource.setUsername(environment.getRequiredProperty("hibernate.name")); + dataSource.setPassword(environment.getRequiredProperty("hibernate.password")); + return dataSource; + } + + @Bean + public LocalSessionFactoryBean sessionFactory() { + LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); + sessionFactory.setDataSource(dataSource()); + sessionFactory.setPackagesToScan("io.khasang.bazaar.entity"); + sessionFactory.setHibernateProperties(hibernateProperties()); + return sessionFactory; + } + + private Properties hibernateProperties() { + Properties properties = new Properties(); + properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); + properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); + properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); + properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); + properties.put("show_sql", environment.getRequiredProperty("hibernate.show_sql")); + return properties; + } + + @Bean + @Autowired + public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { + HibernateTransactionManager tsManager = new HibernateTransactionManager(); + tsManager.setSessionFactory(sessionFactory); + return tsManager; + } +} diff --git a/src/main/java/io/khasang/bazaar/config/SecurityConfig.java b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java index 8466b98..ef2ba4b 100644 --- a/src/main/java/io/khasang/bazaar/config/SecurityConfig.java +++ b/src/main/java/io/khasang/bazaar/config/SecurityConfig.java @@ -22,6 +22,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { + // in-memory authentication (for learning purposes only) /* auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");*/ auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index 16dc306..298a394 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -113,6 +113,13 @@ public String getAdminInfo(Model model) { return "admin"; } + @RequestMapping("/user") + public String getUserInfo(Model model) { + model.addAttribute("secure", "It's a very secure page!"); + // user.jsp + return "user"; + } + @RequestMapping(value = {"/password/{password}"}, method = RequestMethod.GET) public ModelAndView passwordEncode(@PathVariable("password") String password) { ModelAndView modelAndView = new ModelAndView(); diff --git a/src/main/java/io/khasang/bazaar/controller/CatController.java b/src/main/java/io/khasang/bazaar/controller/CatController.java new file mode 100644 index 0000000..6398d94 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/CatController.java @@ -0,0 +1,19 @@ +package io.khasang.bazaar.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * Created by Zulfia Garifullina on 24.09.2017. + */ +@Controller +@RequestMapping(value = "/cat") +public class CatController { + +/* @RequestMapping(value = "get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public Cat getCatById(@PathVariable(value = "id") String id) { + return catService.getById(Long.parseLong(id)); + }*/ + +} diff --git a/src/main/java/io/khasang/bazaar/entity/Cat.java b/src/main/java/io/khasang/bazaar/entity/Cat.java new file mode 100644 index 0000000..4873e7d --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/Cat.java @@ -0,0 +1,63 @@ +package io.khasang.bazaar.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "cats") +public class Cat { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "cat_name") + private String name; +// @Transient + private String description; + + public Cat() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Cat cat = (Cat) o; + + if (id != null ? !id.equals(cat.id) : cat.id != null) return false; + if (name != null ? !name.equals(cat.name) : cat.name != null) return false; + return description != null ? description.equals(cat.description) : cat.description == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (description != null ? description.hashCode() : 0); + return result; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties new file mode 100644 index 0000000..13475a8 --- /dev/null +++ b/src/main/resources/hibernate.properties @@ -0,0 +1,9 @@ +hibernate.driver=org.postgresql.Driver +hibernate.url=jdbc:postgresql://localhost:5432/bazaar +hibernate.name=root +hibernate.password=root + +hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +hibernate.show_sql=true +hibernate.format_sql=true +hibernate.hbm2ddl.auto=create \ No newline at end of file diff --git a/web/WEB-INF/views/user.jsp b/web/WEB-INF/views/user.jsp new file mode 100644 index 0000000..4b58c55 --- /dev/null +++ b/web/WEB-INF/views/user.jsp @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: Zulfia Garifullina + Date: 21.09.2017 + Time: 21:21 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + ${secure} + + From ecb24b40ef25b0261f79caadfe9c7d9dd068761d Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Tue, 3 Oct 2017 23:05:26 +0300 Subject: [PATCH 05/20] Added REST services. --- pom.xml | 17 +++++ .../bazaar/config/application/AppConfig.java | 16 +++++ .../bazaar/controller/CatController.java | 31 +++++++-- .../controller/GoodsCategoryController.java | 61 +++++++++++++++++ .../java/io/khasang/bazaar/dao/BasicDao.java | 47 ++++++++++++++ .../java/io/khasang/bazaar/dao/CatDao.java | 7 ++ .../khasang/bazaar/dao/GoodsCategoryDao.java | 18 +++++ .../khasang/bazaar/dao/impl/BasicDaoImpl.java | 62 ++++++++++++++++++ .../khasang/bazaar/dao/impl/CatDaoImpl.java | 10 +++ .../bazaar/dao/impl/GoodsCategoryDaoImpl.java | 22 +++++++ .../java/io/khasang/bazaar/entity/Cat.java | 6 +- .../khasang/bazaar/entity/GoodsCategory.java | 65 +++++++++++++++++++ .../io/khasang/bazaar/service/CatService.java | 27 ++++++++ .../bazaar/service/GoodsCategoryService.java | 52 +++++++++++++++ .../bazaar/service/impl/CatServiceImpl.java | 30 +++++++++ .../impl/GoodsCategoryServiceImpl.java | 50 ++++++++++++++ src/main/resources/hibernate.properties | 2 +- 17 files changed, 513 insertions(+), 10 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java create mode 100644 src/main/java/io/khasang/bazaar/dao/BasicDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/CatDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/BasicDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/CatDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/entity/GoodsCategory.java create mode 100644 src/main/java/io/khasang/bazaar/service/CatService.java create mode 100644 src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java diff --git a/pom.xml b/pom.xml index eaae640..4cc6751 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ 4.3.11.RELEASE 4.2.0.RELEASE 1.2 + 2.7.8 3.0.1 9.4.1212.jre7 5.2.11.Final @@ -91,6 +92,22 @@ hibernate-entitymanager ${hibernate.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + diff --git a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java index 5ea4a62..6b1082e 100644 --- a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java +++ b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java @@ -1,5 +1,11 @@ package io.khasang.bazaar.config.application; +import io.khasang.bazaar.dao.CatDao; +import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.dao.impl.CatDaoImpl; +import io.khasang.bazaar.dao.impl.GoodsCategoryDaoImpl; +import io.khasang.bazaar.entity.Cat; +import io.khasang.bazaar.entity.GoodsCategory; import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -83,4 +89,14 @@ public SubqueryTable subqueryTable(){ public CaseWhenTable caseWhenTable(){ return new CaseWhenTable(jdbcTemplate()); } + + @Bean + public CatDao catDao() { + return new CatDaoImpl(Cat.class); + } + + @Bean + public GoodsCategoryDao goodsCategoryDao() { + return new GoodsCategoryDaoImpl(GoodsCategory.class); + } } diff --git a/src/main/java/io/khasang/bazaar/controller/CatController.java b/src/main/java/io/khasang/bazaar/controller/CatController.java index 6398d94..62fdc20 100644 --- a/src/main/java/io/khasang/bazaar/controller/CatController.java +++ b/src/main/java/io/khasang/bazaar/controller/CatController.java @@ -1,19 +1,38 @@ package io.khasang.bazaar.controller; +import io.khasang.bazaar.entity.Cat; +import io.khasang.bazaar.service.CatService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; + +import java.util.List; -/** - * Created by Zulfia Garifullina on 24.09.2017. - */ @Controller @RequestMapping(value = "/cat") public class CatController { + private final CatService catService; + + @Autowired + public CatController (CatService catService) { + this.catService = catService; + } -/* @RequestMapping(value = "get/id/{id}", method = RequestMethod.GET) + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) @ResponseBody public Cat getCatById(@PathVariable(value = "id") String id) { return catService.getById(Long.parseLong(id)); - }*/ + } + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public Cat addCat(@RequestBody Cat cat) { + return catService.addCat(cat); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getCats() { + return catService.getList(); + } } diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java new file mode 100644 index 0000000..51b39ca --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java @@ -0,0 +1,61 @@ +package io.khasang.bazaar.controller; + +import io.khasang.bazaar.entity.GoodsCategory; +import io.khasang.bazaar.service.GoodsCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Controller for Goods Category entity. + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +@Controller +@RequestMapping(value = "/goodscategories") +public class GoodsCategoryController { + private final GoodsCategoryService goodsCategoryService; + + @Autowired + public GoodsCategoryController(GoodsCategoryService goodsCategoryService) { + this.goodsCategoryService = goodsCategoryService; + } + + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public GoodsCategory getGoodsCategoryById(@PathVariable(value = "id") String id) { + return goodsCategoryService.getById(Long.parseLong(id)); + } + + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public GoodsCategory addGoodsCategory(@RequestBody GoodsCategory goodsCategory) { + return goodsCategoryService.addGoodsCategory(goodsCategory); + } + + @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public GoodsCategory updateGoodsCategory(@RequestBody GoodsCategory goodsCategory) { + return goodsCategoryService.updateGoodsCategory(goodsCategory); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + public GoodsCategory deleteGoodsCategory(@RequestParam(value = "id") String id) { + return goodsCategoryService.deleteGoodsCategory(Long.parseLong(id)); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategories() { + return goodsCategoryService.getList(); + } + + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { + return goodsCategoryService.getGoodsCategoriesByName(name); + } +} \ No newline at end of file diff --git a/src/main/java/io/khasang/bazaar/dao/BasicDao.java b/src/main/java/io/khasang/bazaar/dao/BasicDao.java new file mode 100644 index 0000000..d01803e --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/BasicDao.java @@ -0,0 +1,47 @@ +package io.khasang.bazaar.dao; + +import org.hibernate.Session; + +import java.util.List; + +public interface BasicDao { + /** + * Get current session for Hibernate + * @return current session from Session + */ + Session getCurrentSession(); + + /** + * Receive entity by ID + * @param id + * @return entity + */ + T getById(Long id); + + /** + * Add entity to the database table as a row + * @param entity - the object being added to the database table as a row + * @return the object that was added + */ + T add(T entity); + + /** + * Update entity in the database + * @param entity - the object being updated in the database + * @return the object that was updated + */ + T update(T entity); + + /** + * Deletes the specified entity from the database + * @param entity - entity that needs to be deleted + * @return the deleted entity + */ + T delete(T entity); + + /** + * Receive all the entities from the database + * @return List of all entities from the database + */ + List getList(); +} diff --git a/src/main/java/io/khasang/bazaar/dao/CatDao.java b/src/main/java/io/khasang/bazaar/dao/CatDao.java new file mode 100644 index 0000000..03210eb --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/CatDao.java @@ -0,0 +1,7 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.Cat; + +public interface CatDao extends BasicDao { + +} diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java new file mode 100644 index 0000000..7b32d3a --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java @@ -0,0 +1,18 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public interface GoodsCategoryDao extends BasicDao { + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return - returns all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/BasicDaoImpl.java new file mode 100644 index 0000000..d592313 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/BasicDaoImpl.java @@ -0,0 +1,62 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.BasicDao; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import javax.transaction.Transactional; +import java.util.List; + +@Transactional +public class BasicDaoImpl implements BasicDao { + @Autowired + protected SessionFactory sessionFactory; + + private final Class entityClass; + + public BasicDaoImpl(Class entityClass) { + this.entityClass = entityClass; + } + + @Override + public Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + + @Override + public T getById(Long id) { + return getCurrentSession().get(entityClass, id); + } + + @Override + public T add(T entity) { + sessionFactory.getCurrentSession().save(entity); + return entity; + } + + @Override + public T update(T entity) { + sessionFactory.getCurrentSession().update(entity); + return entity; + } + + @Override + public T delete(T entity) { + sessionFactory.getCurrentSession().delete(entity); + return entity; + } + + @Override + // Select * from cats + public List getList() { + CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(entityClass); + Root root = criteriaQuery.from(entityClass); + criteriaQuery.select(root); + return sessionFactory.getCurrentSession().createQuery(criteriaQuery).list(); + } +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/CatDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/CatDaoImpl.java new file mode 100644 index 0000000..c1b3f01 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/CatDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.CatDao; +import io.khasang.bazaar.entity.Cat; + +public class CatDaoImpl extends BasicDaoImpl implements CatDao { + public CatDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java new file mode 100644 index 0000000..b303927 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java @@ -0,0 +1,22 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public class GoodsCategoryDaoImpl extends BasicDaoImpl implements GoodsCategoryDao { + public GoodsCategoryDaoImpl(Class entityClass) { + super(entityClass); + } + + @Override + public List getGoodsCategoriesByName(String name) { + return (List) sessionFactory.getCurrentSession(). + createQuery("from GoodsCategory as gc where gc.name = ?").setParameter(0, name).list(); + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/Cat.java b/src/main/java/io/khasang/bazaar/entity/Cat.java index 4873e7d..2657547 100644 --- a/src/main/java/io/khasang/bazaar/entity/Cat.java +++ b/src/main/java/io/khasang/bazaar/entity/Cat.java @@ -7,7 +7,7 @@ public class Cat { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private Long id; @Column(name = "cat_name") private String name; @@ -37,11 +37,11 @@ public int hashCode() { return result; } - public Integer getId() { + public Long getId() { return id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java new file mode 100644 index 0000000..bda27f4 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -0,0 +1,65 @@ +package io.khasang.bazaar.entity; + +import javax.persistence.*; + +/** + * Created by Zulfia Garifullina on 26.09.2017. + */ +@Entity +@Table(name = "goods_categories") +public class GoodsCategory { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "category_name") + private String name; + private String description; + + public GoodsCategory() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GoodsCategory that = (GoodsCategory) o; + + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + return description != null ? description.equals(that.description) : that.description == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (description != null ? description.hashCode() : 0); + return result; + } + + 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 getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/io/khasang/bazaar/service/CatService.java b/src/main/java/io/khasang/bazaar/service/CatService.java new file mode 100644 index 0000000..1f7bd7b --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/CatService.java @@ -0,0 +1,27 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.Cat; + +import java.util.List; + +public interface CatService { + /** + * + * @param id + * @return + */ + Cat getById(Long id); + + /** + * + * @param cat + * @return + */ + Cat addCat(Cat cat); + + /** + * + * @return + */ + List getList(); +} diff --git a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java new file mode 100644 index 0000000..f857038 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java @@ -0,0 +1,52 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public interface GoodsCategoryService { + /** + * Method for retrieving goods categories by their database id. + * @param id - id of the category in the database + * @return a category of goods with given id + */ + GoodsCategory getById(Long id); + + /** + * Method for adding a new goods category to the database table + * @param goodsCategory - the object being added to the database table as a row + * @return the object that was added + */ + GoodsCategory addGoodsCategory(GoodsCategory goodsCategory); + + /** + * Method for updating a goods category + * @param goodsCategory - the object being updated in the database + * @return the goods category that was updated + */ + GoodsCategory updateGoodsCategory(GoodsCategory goodsCategory); + + /** + * Deletes the goods category with the specified id from the database + * @param id - database id of the goods category that needs to be deleted + * @return the deleted goods category + */ + GoodsCategory deleteGoodsCategory(Long id); + + /** + * Method returns all the goods categories from the corresponding table in the database. + * @return a List of goods categories objects from the database table. + */ + List getList(); + + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java new file mode 100644 index 0000000..24d6e7e --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java @@ -0,0 +1,30 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.CatDao; +import io.khasang.bazaar.entity.Cat; +import io.khasang.bazaar.service.CatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("catService") +public class CatServiceImpl implements CatService { + @Autowired + private CatDao catDao; + + @Override + public Cat getById(Long id) { + return catDao.getById(id); + } + + @Override + public Cat addCat(Cat cat) { + return catDao.add(cat); + } + + @Override + public List getList() { + return catDao.getList(); + } +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java new file mode 100644 index 0000000..c591700 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java @@ -0,0 +1,50 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.entity.GoodsCategory; +import io.khasang.bazaar.service.GoodsCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +@Service("goodsCategoryService") +public class GoodsCategoryServiceImpl implements GoodsCategoryService { + @Autowired + private GoodsCategoryDao goodsCategoryDao; + + @Override + public GoodsCategory getById(Long id) { + return goodsCategoryDao.getById(id); + } + + @Override + public GoodsCategory addGoodsCategory(GoodsCategory goodsCategory) { + return goodsCategoryDao.add(goodsCategory); + } + + @Override + public GoodsCategory updateGoodsCategory(GoodsCategory goodsCategory) { + return goodsCategoryDao.update(goodsCategory); + } + + @Override + public GoodsCategory deleteGoodsCategory(Long id) { + GoodsCategory goodsCategory = goodsCategoryDao.getById(id); + return goodsCategoryDao.delete(goodsCategory); + } + + @Override + public List getList() { + return goodsCategoryDao.getList(); + } + + @Override + public List getGoodsCategoriesByName(String name) { + return goodsCategoryDao.getGoodsCategoriesByName(name); + } +} diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties index 13475a8..b84c307 100644 --- a/src/main/resources/hibernate.properties +++ b/src/main/resources/hibernate.properties @@ -6,4 +6,4 @@ hibernate.password=root hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql=true hibernate.format_sql=true -hibernate.hbm2ddl.auto=create \ No newline at end of file +hibernate.hbm2ddl.auto=update \ No newline at end of file From de49ef92b456dcd3f8d9cb6f1e10db411c016223 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 16:22:27 +0300 Subject: [PATCH 06/20] Added two entities (goods categories and goods) and REST services carcass for them. --- .../bazaar/config/application/AppConfig.java | 8 ++ .../bazaar/controller/GoodsController.java | 80 ++++++++++++ .../khasang/bazaar/dao/GoodsCategoryDao.java | 1 + .../java/io/khasang/bazaar/dao/GoodsDao.java | 19 +++ .../bazaar/dao/impl/GoodsCategoryDaoImpl.java | 1 + .../khasang/bazaar/dao/impl/GoodsDaoImpl.java | 24 ++++ .../java/io/khasang/bazaar/entity/Goods.java | 123 ++++++++++++++++++ .../khasang/bazaar/entity/GoodsCategory.java | 10 +- .../bazaar/service/GoodsCategoryService.java | 17 +-- .../khasang/bazaar/service/GoodsService.java | 80 ++++++++++++ .../impl/GoodsCategoryServiceImpl.java | 11 +- .../bazaar/service/impl/GoodsServiceImpl.java | 74 +++++++++++ 12 files changed, 432 insertions(+), 16 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/controller/GoodsController.java create mode 100644 src/main/java/io/khasang/bazaar/dao/GoodsDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/entity/Goods.java create mode 100644 src/main/java/io/khasang/bazaar/service/GoodsService.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java diff --git a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java index 6b1082e..3669f98 100644 --- a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java +++ b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java @@ -2,9 +2,12 @@ import io.khasang.bazaar.dao.CatDao; import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.dao.GoodsDao; import io.khasang.bazaar.dao.impl.CatDaoImpl; import io.khasang.bazaar.dao.impl.GoodsCategoryDaoImpl; +import io.khasang.bazaar.dao.impl.GoodsDaoImpl; import io.khasang.bazaar.entity.Cat; +import io.khasang.bazaar.entity.Goods; import io.khasang.bazaar.entity.GoodsCategory; import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; @@ -99,4 +102,9 @@ public CatDao catDao() { public GoodsCategoryDao goodsCategoryDao() { return new GoodsCategoryDaoImpl(GoodsCategory.class); } + + @Bean + public GoodsDao goodsDao() { + return new GoodsDaoImpl(Goods.class); + } } diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsController.java b/src/main/java/io/khasang/bazaar/controller/GoodsController.java new file mode 100644 index 0000000..43b8faa --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/GoodsController.java @@ -0,0 +1,80 @@ +package io.khasang.bazaar.controller; + +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.service.GoodsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Controller for Goods entity. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +@Controller +@RequestMapping(value = "/goods") +public class GoodsController { + private final GoodsService goodsService; + + @Autowired + public GoodsController(GoodsService goodsService) { + this.goodsService = goodsService; + } + + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public Goods getGoodsById(@PathVariable(value = "id") String id) { + return goodsService.getById(Long.parseLong(id)); + } + + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsByName(@PathVariable(value = "name") String name) { + return goodsService.getGoodsByName(name); + } + + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public Goods addGoods(@RequestBody Goods goods) { + return goodsService.addGoods(goods); + } + + @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Goods updateGoods(@RequestBody Goods goods) { + return goodsService.updateGoods(goods); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + public Goods deleteGoods(@RequestParam(value = "id") String id) { + return goodsService.deleteGoods(Long.parseLong(id)); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getGoods() { + return goodsService.getList(); + } + + @RequestMapping(value = "/reserve", method = RequestMethod.POST) + @ResponseBody + public Goods reserveGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.reserveGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } + + @RequestMapping(value = "/unreserve", method = RequestMethod.POST) + @ResponseBody + public Goods unreserveGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.unreserveGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } + + @RequestMapping(value = "/buy", method = RequestMethod.POST) + @ResponseBody + public Goods buyGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.buyGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } +} diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java index 7b32d3a..0949d75 100644 --- a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java +++ b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java @@ -5,6 +5,7 @@ import java.util.List; /** + * Interface for representing DAO for GoodsCategory entity. * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java new file mode 100644 index 0000000..8b9395c --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java @@ -0,0 +1,19 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Interface for representing DAO for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public interface GoodsDao extends BasicDao { + /** + * Method for retrieving goods from the database by their name. + * @param name - name of the goods + * @return goods with the given name + */ + List getGoodsByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java index b303927..bb9dd9c 100644 --- a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java @@ -6,6 +6,7 @@ import java.util.List; /** + * Implementation of GoodsCategoryDao interface for representing DAO for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java new file mode 100644 index 0000000..a8d5c11 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java @@ -0,0 +1,24 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.GoodsDao; +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Implementation of GoodsDao interface for representing DAO for Goods entity. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsDaoImpl extends BasicDaoImpl implements GoodsDao { + public GoodsDaoImpl(Class entityClass) { + super(entityClass); + } + + @Override + public List getGoodsByName(String name) { + return (List) sessionFactory.getCurrentSession(). + createQuery("from Goods as g where g.name = ?").setParameter(0, name).list(); + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/Goods.java b/src/main/java/io/khasang/bazaar/entity/Goods.java new file mode 100644 index 0000000..8b3fa02 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/Goods.java @@ -0,0 +1,123 @@ +package io.khasang.bazaar.entity; + +import org.springframework.stereotype.Controller; + +import javax.persistence.*; + +/** This class describes a database entity that represents goods for sale. + * + * @author Zulfia Garifullina + * @date 03.10.2017. + */ +@Entity +@Table(name = "goods") +public class Goods { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "goods_id") + private Long id; + + @Column(name = "goods_name", nullable = false) + private String name; + + @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JoinColumn(name = "category_id") //, nullable = false) + private GoodsCategory category; + + @Column(name = "goods_description") + private String description; + + private Integer price; + + @Column(name = "quantity_in_stock") + private Integer quantityInStock; + + @Column(name = "quantity_reserved") + private Integer quantityReserved; + + public Goods() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Goods goods = (Goods) o; + + if (id != null ? !id.equals(goods.id) : goods.id != null) return false; + if (name != null ? !name.equals(goods.name) : goods.name != null) return false; + if (category != null ? !category.equals(goods.category) : goods.category != null) return false; + if (price != null ? !price.equals(goods.price) : goods.price != null) return false; + if (quantityInStock != null ? !quantityInStock.equals(goods.quantityInStock) : goods.quantityInStock != null) + return false; + return quantityReserved != null ? quantityReserved.equals(goods.quantityReserved) : goods.quantityReserved == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (category != null ? category.hashCode() : 0); + result = 31 * result + (price != null ? price.hashCode() : 0); + result = 31 * result + (quantityInStock != null ? quantityInStock.hashCode() : 0); + result = 31 * result + (quantityReserved != null ? quantityReserved.hashCode() : 0); + return result; + } + + 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 GoodsCategory getCategory() { + return category; + } + + public void setCategory(GoodsCategory category) { + this.category = category; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getPrice() { + return price; + } + + public void setPrice(Integer price) { + this.price = price; + } + + public Integer getQuantityInStock() { + return quantityInStock; + } + + public void setQuantityInStock(Integer quantityInStock) { + this.quantityInStock = quantityInStock; + } + + public Integer getQuantityReserved() { + return quantityReserved; + } + + public void setQuantityReserved(Integer quantityReserved) { + this.quantityReserved = quantityReserved; + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java index bda27f4..bcdc98c 100644 --- a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -2,18 +2,22 @@ import javax.persistence.*; -/** - * Created by Zulfia Garifullina on 26.09.2017. +/** This class describes a database entity that represents categories of goods + * @author Zulfia Garifullina + * @date 26.09.2017. */ @Entity @Table(name = "goods_categories") public class GoodsCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "category_id") private Long id; - @Column(name = "category_name") + @Column(name = "category_name", nullable = false) private String name; + + @Column(name = "category_description") private String description; public GoodsCategory() { diff --git a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java index f857038..cd7f961 100644 --- a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java +++ b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java @@ -5,6 +5,7 @@ import java.util.List; /** + * Service interface for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ @@ -16,6 +17,13 @@ public interface GoodsCategoryService { */ GoodsCategory getById(Long id); + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); + /** * Method for adding a new goods category to the database table * @param goodsCategory - the object being added to the database table as a row @@ -24,7 +32,7 @@ public interface GoodsCategoryService { GoodsCategory addGoodsCategory(GoodsCategory goodsCategory); /** - * Method for updating a goods category + * Method for updating a goods category in the database * @param goodsCategory - the object being updated in the database * @return the goods category that was updated */ @@ -42,11 +50,4 @@ public interface GoodsCategoryService { * @return a List of goods categories objects from the database table. */ List getList(); - - /** - * Method for retrieving goods categories from the database by their name. - * @param name - name of the category - * @return all the goods categories with the given name - */ - List getGoodsCategoriesByName(String name); } diff --git a/src/main/java/io/khasang/bazaar/service/GoodsService.java b/src/main/java/io/khasang/bazaar/service/GoodsService.java new file mode 100644 index 0000000..0c12f60 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/GoodsService.java @@ -0,0 +1,80 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Service interface for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public interface GoodsService { + /** + * Method for retrieving goods by their database id. + * @param id - id of the goods in the database + * @return goods with given id + */ + Goods getById(Long id); + + /** + * Method for retrieving goods from the database by their name. + * @param name - name of the goods + * @return all the goods with the given name + */ + List getGoodsByName(String name); + + /** + * Method for adding new goods to the database table + * @param goods- the object being added to the database table as a row + * @return the goods that was added + */ + Goods addGoods(Goods goods); + + /** + * Method for updating goods in the database + * @param goods - the object being updated in the database + * @return the goods that were updated + */ + Goods updateGoods(Goods goods); + + /** + * Deletes the goods with the specified id from the database + * @param id database id of the goods that needs to be deleted + * @return the deleted goods + */ + Goods deleteGoods(Long id); + + /** + * Method returns all the goods from the corresponding table in the database. + * @return a List of goods objects from the database table. + */ + List getList(); + + /** + * Reserves a specified amount of goods and reduces the amount in stock by that number. + * This method should be called before processing order payment. + * @param id database id for chosen goods + * @param quantity quantity to be reserved + * @return goods that were reserved + */ + Goods reserveGoods(Long id, Integer quantity); + + /** + * Cancels reservation on a specified amount of goods and increases the amount in stock by that number. + * This method should be called if processing order payment failed. + * @param id database id for chosen goods + * @param quantity quantity to be removed from reserved and added back to quantity in stock + * @return goods that were removed from reserved and added back to quantity in stock + */ + Goods unreserveGoods(Long id, Integer quantity); + + /** + * Reduces the amount of goods which were reserved before payment processing, by the specified amount. + * This method should be called after successful processing of order payment. + * @param id database id for chosen goods + * @param quantity amount by which reserved quantity is reduced + * @return goods for which reserved quantity was reduced + */ + Goods buyGoods(Long id, Integer quantity); +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java index c591700..4341f8a 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java @@ -9,6 +9,7 @@ import java.util.List; /** + * Implementation of the service interface for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ @@ -22,6 +23,11 @@ public GoodsCategory getById(Long id) { return goodsCategoryDao.getById(id); } + @Override + public List getGoodsCategoriesByName(String name) { + return goodsCategoryDao.getGoodsCategoriesByName(name); + } + @Override public GoodsCategory addGoodsCategory(GoodsCategory goodsCategory) { return goodsCategoryDao.add(goodsCategory); @@ -42,9 +48,4 @@ public GoodsCategory deleteGoodsCategory(Long id) { public List getList() { return goodsCategoryDao.getList(); } - - @Override - public List getGoodsCategoriesByName(String name) { - return goodsCategoryDao.getGoodsCategoriesByName(name); - } } diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java new file mode 100644 index 0000000..963ef06 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java @@ -0,0 +1,74 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.GoodsDao; +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.service.GoodsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Implementation of the service interface for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +@Service("goodsService") +public class GoodsServiceImpl implements GoodsService { + @Autowired + private GoodsDao goodsDao; + + @Override + public Goods getById(Long id) { + return goodsDao.getById(id); + } + + @Override + public List getGoodsByName(String name) { + return goodsDao.getGoodsByName(name); + } + + @Override + public Goods addGoods(Goods goods) { + return goodsDao.add(goods); + } + + @Override + public Goods updateGoods(Goods goods) { + return goodsDao.update(goods); + } + + @Override + public Goods deleteGoods(Long id) { + Goods goods = goodsDao.getById(id); + return goodsDao.delete(goods); + } + + @Override + public List getList() { + return goodsDao.getList(); + } + + @Override + public Goods reserveGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityInStock(goods.getQuantityInStock() - quantity); + goods.setQuantityReserved(goods.getQuantityReserved() + quantity); + return goodsDao.update(goods); + } + + @Override + public Goods unreserveGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityInStock(goods.getQuantityInStock() + quantity); + goods.setQuantityReserved(goods.getQuantityReserved() - quantity); + return goodsDao.update(goods); + } + + @Override + public Goods buyGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityReserved(goods.getQuantityReserved() - quantity); + return goodsDao.update(goods); + } +} From 32a9c550fc918bba822d2fd5278dcce2b55efb96 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 20:25:40 +0300 Subject: [PATCH 07/20] Added integration tests --- pom.xml | 12 + .../controller/GoodsCategoryController.java | 12 +- ...oodsCategoryControllerIntegrationTest.java | 184 +++++++++++ .../GoodsControllerIntegrationTest.java | 286 ++++++++++++++++++ 4 files changed, 488 insertions(+), 6 deletions(-) create mode 100644 src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java create mode 100644 src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java diff --git a/pom.xml b/pom.xml index 4cc6751..ca461a9 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ 3.0.1 9.4.1212.jre7 5.2.11.Final + 4.12 @@ -47,6 +48,11 @@ spring-orm ${spring.version} + + org.springframework + spring-test + ${spring.version} + org.postgresql @@ -108,6 +114,12 @@ jackson-datatype-jsr310 ${jackson.version} + + + junit + junit + ${junit.version} + diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java index 51b39ca..7028547 100644 --- a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java +++ b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java @@ -29,6 +29,12 @@ public GoodsCategory getGoodsCategoryById(@PathVariable(value = "id") String id) return goodsCategoryService.getById(Long.parseLong(id)); } + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { + return goodsCategoryService.getGoodsCategoriesByName(name); + } + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") @ResponseBody public GoodsCategory addGoodsCategory(@RequestBody GoodsCategory goodsCategory) { @@ -52,10 +58,4 @@ public GoodsCategory deleteGoodsCategory(@RequestParam(value = "id") String id) public List getGoodsCategories() { return goodsCategoryService.getList(); } - - @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) - @ResponseBody - public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { - return goodsCategoryService.getGoodsCategoriesByName(name); - } } \ No newline at end of file diff --git a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java new file mode 100644 index 0000000..1ef5231 --- /dev/null +++ b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java @@ -0,0 +1,184 @@ +package io.khasang.bazaar; + +import io.khasang.bazaar.entity.GoodsCategory; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Integration tests for GoodsCategoryController. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsCategoryControllerIntegrationTest { + private final String ROOT = "http://localhost:8080/goodscategories"; + private final String ADD = "/add"; + private final String UPDATE = "/update"; + private final String DELETE = "/delete"; + private final String GET_BY_ID = "/get/id"; + private final String GET_BY_NAME = "/get/name"; + private final String GET_ALL = "/all"; + + @Test + public void addGoodsCategory() { + GoodsCategory goodsCategory = createGoodsCategory(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + goodsCategory.getId() + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoodsCategory); + assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + } + + @Test + public void updateGoodsCategory() { + GoodsCategory goodsCategory = changeGoodsCategory(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + goodsCategory.getId() + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoodsCategory); + assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + } + + @Test + public void deleteGoodsCategory() { + RestTemplate restTemplate = new RestTemplate(); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) + .queryParam("id", "9"); + + restTemplate.delete(builder.build().encode().toUri()); + + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 9 + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); +// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertNull(receivedGoodsCategory); + } + + @Test + public void getGoodsCategoryByName() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_BY_NAME + "/{name}", + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }, + "Music" + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void getAllGoodsCategories() { + RestTemplate restTemplate = new RestTemplate(); + createGoodsCategory(); + createGoodsCategory(); + + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + private GoodsCategory createGoodsCategory() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + GoodsCategory goodsCategory = prefillGoodsCategory(); + HttpEntity httpEntity = new HttpEntity<>(goodsCategory, httpHeaders); + + RestTemplate restTemplate = new RestTemplate(); + GoodsCategory createdGoodsCategory = restTemplate.exchange( + ROOT + ADD, + HttpMethod.PUT, + httpEntity, + GoodsCategory.class).getBody(); + assertNotNull(createdGoodsCategory); + assertEquals("Electronics", createdGoodsCategory.getName()); + assertEquals("Gadgets: laptops, smartphones, cameras", createdGoodsCategory.getDescription()); + assertNotNull(createdGoodsCategory.getId()); + + return createdGoodsCategory; + } + + private GoodsCategory prefillGoodsCategory() { + GoodsCategory goodsCategory = new GoodsCategory(); + goodsCategory.setName("Electronics"); + goodsCategory.setDescription("Gadgets: laptops, smartphones, cameras"); + return goodsCategory; + } + + private GoodsCategory changeGoodsCategory() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 6 + ); + + GoodsCategory changingGoodsCategory = responseEntity.getBody(); + changingGoodsCategory.setName("Fashion"); + changingGoodsCategory.setDescription("Womenswear and menswear"); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoodsCategory, httpHeaders); + + GoodsCategory changedGoodsCategory = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + GoodsCategory.class).getBody(); + assertNotNull(changedGoodsCategory); + assertEquals("Fashion", changedGoodsCategory.getName()); + assertEquals("Womenswear and menswear", changedGoodsCategory.getDescription()); + assertNotNull(changedGoodsCategory.getId()); + + return changedGoodsCategory; + } +} diff --git a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java new file mode 100644 index 0000000..46263c6 --- /dev/null +++ b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java @@ -0,0 +1,286 @@ +package io.khasang.bazaar; + +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.entity.GoodsCategory; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Integration tests for GoodsController. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsControllerIntegrationTest { + private final String ROOT = "http://localhost:8080/goods"; + private final String ADD = "/add"; + private final String UPDATE = "/update"; + private final String DELETE = "/delete"; + private final String GET_BY_ID = "/get/id"; + private final String GET_BY_NAME = "/get/name"; + private final String GET_ALL = "/all"; + private final String RESERVE = "/reserve"; + private final String UNRESERVE = "/unreserve"; + private final String BUY = "/buy"; + private GoodsCategory category = (new RestTemplate()).exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 5 + ).getBody(); + + @Test + public void addGoods() { + Goods goods = createGoods(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + } + + @Test + public void updateGoods() { + Goods goods = changeGoods(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertNotNull(receivedGoods.getCategory()); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + assertEquals(goods.getCategory(), receivedGoods.getCategory()); + assertEquals(goods.getPrice(), receivedGoods.getPrice()); + assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + } + + @Test + public void deleteGoods() { + RestTemplate restTemplate = new RestTemplate(); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) + .queryParam("id", "6"); + + restTemplate.delete(builder.build().encode().toUri()); + + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods receivedGoods = responseEntity.getBody(); +// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertNull(receivedGoods); + } + + @Test + public void getGoodsByName() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_BY_NAME + "/{name}", + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }, + "Harry Potter" + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void getAllGoodsCategories() { + RestTemplate restTemplate = new RestTemplate(); + createGoods(); + createGoods(); + + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void reserveGoods() { + Goods goods = reserve(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + assertEquals(goods.getCategory(), receivedGoods.getCategory()); + assertEquals(goods.getPrice(), receivedGoods.getPrice()); + assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + } + + @Test + public void unreserveGoods() { + + } + + @Test + public void buyGoods() { + + } + + private Goods createGoods() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Goods goods = prefillGoods(); + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + + RestTemplate restTemplate = new RestTemplate(); + Goods createdGoods = restTemplate.exchange( + ROOT + ADD, + HttpMethod.PUT, + httpEntity, + Goods.class).getBody(); + assertNotNull(createdGoods); + assertEquals("iPhone X", createdGoods.getName()); + assertEquals("Latest iPhone model", createdGoods.getDescription()); + assertEquals(category, createdGoods.getCategory()); + assertEquals(new Integer(100000), createdGoods.getPrice()); + assertEquals(new Integer(20), createdGoods.getQuantityInStock()); + assertEquals(new Integer(0), createdGoods.getQuantityReserved()); + assertNotNull(createdGoods.getId()); + + return createdGoods; + } + + private Goods prefillGoods() { + Goods goods = new Goods(); + goods.setName("iPhone X"); + goods.setDescription("Latest iPhone model"); + goods.setCategory(category); + goods.setPrice(100000); + goods.setQuantityInStock(20); + goods.setQuantityReserved(0); + return goods; + } + + private Goods changeGoods() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods changingGoods = responseEntity.getBody(); + changingGoods.setName("Samsung Galaxy S8"); + changingGoods.setDescription("Closest rival of iPhone line"); + changingGoods.setPrice(80000); + changingGoods.setQuantityInStock(400); + changingGoods.setQuantityReserved(150); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + + Goods changedGoods = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(changedGoods); + assertEquals("Samsung Galaxy S8", changedGoods.getName()); + assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); + assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals(new Integer(400), changedGoods.getQuantityInStock()); + assertEquals(new Integer(150), changedGoods.getQuantityReserved()); + assertNotNull(changedGoods.getId()); + + return changedGoods; + } + + private Goods reserve() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods changingGoods = responseEntity.getBody(); + changingGoods.setName("Samsung Galaxy S8"); + changingGoods.setDescription("Closest rival of iPhone line"); + changingGoods.setPrice(80000); + changingGoods.setQuantityInStock(400); + changingGoods.setQuantityReserved(150); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + + Goods changedGoods = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(changedGoods); + assertEquals("Samsung Galaxy S8", changedGoods.getName()); + assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); + assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals(new Integer(400), changedGoods.getQuantityInStock()); + assertEquals(new Integer(150), changedGoods.getQuantityReserved()); + assertNotNull(changedGoods.getId()); + + return reservedGoods; + } +} From bcc6163d8e5118a1825c054256523fdfcd04cbd7 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 22:33:05 +0300 Subject: [PATCH 08/20] 1) Fixed integration tests for delete. 2) Added integration tests for reserve, unreserve and buy (for Goods entity). 3) Changed table column names in Goods and Goods Category entities. --- .../java/io/khasang/bazaar/entity/Goods.java | 6 +- .../khasang/bazaar/entity/GoodsCategory.java | 3 +- ...oodsCategoryControllerIntegrationTest.java | 35 +-- .../GoodsControllerIntegrationTest.java | 253 ++++++++++++------ 4 files changed, 187 insertions(+), 110 deletions(-) diff --git a/src/main/java/io/khasang/bazaar/entity/Goods.java b/src/main/java/io/khasang/bazaar/entity/Goods.java index 8b3fa02..e5c19eb 100644 --- a/src/main/java/io/khasang/bazaar/entity/Goods.java +++ b/src/main/java/io/khasang/bazaar/entity/Goods.java @@ -17,16 +17,14 @@ public class Goods { @Column(name = "goods_id") private Long id; - @Column(name = "goods_name", nullable = false) + @Column(nullable = false) private String name; @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) - @JoinColumn(name = "category_id") //, nullable = false) + @JoinColumn(name = "category_id") private GoodsCategory category; - @Column(name = "goods_description") private String description; - private Integer price; @Column(name = "quantity_in_stock") diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java index bcdc98c..1550bc7 100644 --- a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -14,10 +14,9 @@ public class GoodsCategory { @Column(name = "category_id") private Long id; - @Column(name = "category_name", nullable = false) + @Column(nullable = false) private String name; - @Column(name = "category_description") private String description; public GoodsCategory() { diff --git a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java index 1ef5231..b450d70 100644 --- a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java @@ -48,7 +48,8 @@ public void addGoodsCategory() { @Test public void updateGoodsCategory() { - GoodsCategory goodsCategory = changeGoodsCategory(); + GoodsCategory goodsCategory = createGoodsCategory(); + GoodsCategory changedGoodsCategory = changeGoodsCategory(goodsCategory); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -56,22 +57,23 @@ public void updateGoodsCategory() { HttpMethod.GET, null, GoodsCategory.class, - goodsCategory.getId() + changedGoodsCategory.getId() ); GoodsCategory receivedGoodsCategory = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoodsCategory); - assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); - assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + assertEquals(changedGoodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(changedGoodsCategory.getDescription(), receivedGoodsCategory.getDescription()); } @Test public void deleteGoodsCategory() { + GoodsCategory goodsCategory = createGoodsCategory(); RestTemplate restTemplate = new RestTemplate(); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) - .queryParam("id", "9"); + .queryParam("id", goodsCategory.getId()); restTemplate.delete(builder.build().encode().toUri()); @@ -80,11 +82,11 @@ public void deleteGoodsCategory() { HttpMethod.GET, null, GoodsCategory.class, - 9 + goodsCategory.getId() ); GoodsCategory receivedGoodsCategory = responseEntity.getBody(); -// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertNull(receivedGoodsCategory); } @@ -150,25 +152,16 @@ private GoodsCategory prefillGoodsCategory() { return goodsCategory; } - private GoodsCategory changeGoodsCategory() { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - GoodsCategory.class, - 6 - ); - - GoodsCategory changingGoodsCategory = responseEntity.getBody(); - changingGoodsCategory.setName("Fashion"); - changingGoodsCategory.setDescription("Womenswear and menswear"); + private GoodsCategory changeGoodsCategory(GoodsCategory goodsCategory) { + goodsCategory.setName("Fashion"); + goodsCategory.setDescription("Womenswear and menswear"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoodsCategory, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(goodsCategory, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); GoodsCategory changedGoodsCategory = restTemplate.exchange( ROOT + UPDATE, HttpMethod.POST, diff --git a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java index 46263c6..00d1051 100644 --- a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java @@ -29,13 +29,6 @@ public class GoodsControllerIntegrationTest { private final String RESERVE = "/reserve"; private final String UNRESERVE = "/unreserve"; private final String BUY = "/buy"; - private GoodsCategory category = (new RestTemplate()).exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - GoodsCategory.class, - 5 - ).getBody(); @Test public void addGoods() { @@ -59,7 +52,8 @@ public void addGoods() { @Test public void updateGoods() { - Goods goods = changeGoods(); + Goods goods = createGoods(); + Goods changedGoods = changeGoods(goods); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -67,27 +61,28 @@ public void updateGoods() { HttpMethod.GET, null, Goods.class, - goods.getId() + changedGoods.getId() ); Goods receivedGoods = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoods); assertNotNull(receivedGoods.getCategory()); - assertEquals(goods.getName(), receivedGoods.getName()); - assertEquals(goods.getDescription(), receivedGoods.getDescription()); - assertEquals(goods.getCategory(), receivedGoods.getCategory()); - assertEquals(goods.getPrice(), receivedGoods.getPrice()); - assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); - assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + assertEquals(changedGoods.getName(), receivedGoods.getName()); + assertEquals(changedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(changedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(changedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(changedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(changedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void deleteGoods() { + Goods goods = createGoods(); RestTemplate restTemplate = new RestTemplate(); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) - .queryParam("id", "6"); + .queryParam("id", goods.getId()); restTemplate.delete(builder.build().encode().toUri()); @@ -96,16 +91,18 @@ public void deleteGoods() { HttpMethod.GET, null, Goods.class, - 6 + goods.getId() ); Goods receivedGoods = responseEntity.getBody(); -// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertNull(receivedGoods); } @Test public void getGoodsByName() { + Goods goods = createGoods(); + RestTemplate restTemplate = new RestTemplate(); ResponseEntity> result = restTemplate.exchange( ROOT + GET_BY_NAME + "/{name}", @@ -113,7 +110,7 @@ public void getGoodsByName() { null, new ParameterizedTypeReference>() { }, - "Harry Potter" + goods.getName() ); assertEquals(HttpStatus.OK, result.getStatusCode()); @@ -140,7 +137,8 @@ public void getAllGoodsCategories() { @Test public void reserveGoods() { - Goods goods = reserve(); + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -148,28 +146,70 @@ public void reserveGoods() { HttpMethod.GET, null, Goods.class, - goods.getId() + reservedGoods.getId() ); Goods receivedGoods = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoods); - assertEquals(goods.getName(), receivedGoods.getName()); - assertEquals(goods.getDescription(), receivedGoods.getDescription()); - assertEquals(goods.getCategory(), receivedGoods.getCategory()); - assertEquals(goods.getPrice(), receivedGoods.getPrice()); - assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); - assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + assertEquals(reservedGoods.getName(), receivedGoods.getName()); + assertEquals(reservedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(reservedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(reservedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(reservedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(reservedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void unreserveGoods() { + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); + Goods unreservedGoods = unreserve(reservedGoods); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + unreservedGoods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(unreservedGoods.getName(), receivedGoods.getName()); + assertEquals(unreservedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(unreservedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(unreservedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(unreservedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(unreservedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void buyGoods() { + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); + Goods boughtGoods = buy(reservedGoods); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + boughtGoods.getId() + ); + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(boughtGoods.getName(), receivedGoods.getName()); + assertEquals(boughtGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(boughtGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(boughtGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(boughtGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(boughtGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } private Goods createGoods() { @@ -186,12 +226,13 @@ private Goods createGoods() { httpEntity, Goods.class).getBody(); assertNotNull(createdGoods); - assertEquals("iPhone X", createdGoods.getName()); - assertEquals("Latest iPhone model", createdGoods.getDescription()); - assertEquals(category, createdGoods.getCategory()); - assertEquals(new Integer(100000), createdGoods.getPrice()); - assertEquals(new Integer(20), createdGoods.getQuantityInStock()); - assertEquals(new Integer(0), createdGoods.getQuantityReserved()); + assertEquals("Skis", createdGoods.getName()); + assertEquals("Mountain skis", createdGoods.getDescription()); + assertEquals("Sports goods", createdGoods.getCategory().getName()); + assertEquals("All you need to keep active", createdGoods.getCategory().getDescription()); + assertEquals(new Integer(5000), createdGoods.getPrice()); + assertEquals(new Integer(600), createdGoods.getQuantityInStock()); + assertEquals(new Integer(200), createdGoods.getQuantityReserved()); assertNotNull(createdGoods.getId()); return createdGoods; @@ -199,46 +240,40 @@ private Goods createGoods() { private Goods prefillGoods() { Goods goods = new Goods(); - goods.setName("iPhone X"); - goods.setDescription("Latest iPhone model"); + goods.setName("Skis"); + goods.setDescription("Mountain skis"); + GoodsCategory category = new GoodsCategory(); + category.setName("Sports goods"); + category.setDescription("All you need to keep active"); goods.setCategory(category); - goods.setPrice(100000); - goods.setQuantityInStock(20); - goods.setQuantityReserved(0); + goods.setPrice(5000); + goods.setQuantityInStock(600); + goods.setQuantityReserved(200); return goods; } - private Goods changeGoods() { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - Goods.class, - 6 - ); - - Goods changingGoods = responseEntity.getBody(); - changingGoods.setName("Samsung Galaxy S8"); - changingGoods.setDescription("Closest rival of iPhone line"); - changingGoods.setPrice(80000); - changingGoods.setQuantityInStock(400); - changingGoods.setQuantityReserved(150); + private Goods changeGoods(Goods goods) { + goods.setName("Snowboard"); + goods.setDescription("All-mountain snowboard"); + goods.setPrice(8000); + goods.setQuantityInStock(400); + goods.setQuantityReserved(150); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); Goods changedGoods = restTemplate.exchange( ROOT + UPDATE, HttpMethod.POST, httpEntity, Goods.class).getBody(); assertNotNull(changedGoods); - assertEquals("Samsung Galaxy S8", changedGoods.getName()); - assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); - assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals("Snowboard", changedGoods.getName()); + assertEquals("All-mountain snowboard", changedGoods.getDescription()); + assertEquals(new Integer(8000), changedGoods.getPrice()); assertEquals(new Integer(400), changedGoods.getQuantityInStock()); assertEquals(new Integer(150), changedGoods.getQuantityReserved()); assertNotNull(changedGoods.getId()); @@ -246,41 +281,93 @@ private Goods changeGoods() { return changedGoods; } - private Goods reserve() { + private Goods reserve(Goods goods) { + goods.setQuantityInStock(goods.getQuantityInStock() - 10); + goods.setQuantityReserved(goods.getQuantityReserved() + 10); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + RESERVE) + .queryParam("id", goods.getId()) + .queryParam("quantity", 10); + RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - Goods.class, - 6 - ); + Goods reservedGoods = restTemplate.exchange( + builder.build().encode().toUri(), + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(reservedGoods); + assertEquals("Skis", reservedGoods.getName()); + assertEquals("Mountain skis", reservedGoods.getDescription()); + assertEquals(new Integer(5000), reservedGoods.getPrice()); + assertEquals(new Integer(590), reservedGoods.getQuantityInStock()); + assertEquals(new Integer(210), reservedGoods.getQuantityReserved()); + assertNotNull(reservedGoods.getId()); + + return reservedGoods; + } - Goods changingGoods = responseEntity.getBody(); - changingGoods.setName("Samsung Galaxy S8"); - changingGoods.setDescription("Closest rival of iPhone line"); - changingGoods.setPrice(80000); - changingGoods.setQuantityInStock(400); - changingGoods.setQuantityReserved(150); + private Goods unreserve(Goods reservedGoods) { + reservedGoods.setQuantityInStock(reservedGoods.getQuantityInStock() + 10); + reservedGoods.setQuantityReserved(reservedGoods.getQuantityReserved() - 10); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(reservedGoods, httpHeaders); - Goods changedGoods = restTemplate.exchange( - ROOT + UPDATE, + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + UNRESERVE) + .queryParam("id", reservedGoods.getId()) + .queryParam("quantity", 10); + + RestTemplate restTemplate = new RestTemplate(); + Goods unreservedGoods = restTemplate.exchange( + builder.build().encode().toUri(), HttpMethod.POST, httpEntity, Goods.class).getBody(); - assertNotNull(changedGoods); - assertEquals("Samsung Galaxy S8", changedGoods.getName()); - assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); - assertEquals(new Integer(80000), changedGoods.getPrice()); - assertEquals(new Integer(400), changedGoods.getQuantityInStock()); - assertEquals(new Integer(150), changedGoods.getQuantityReserved()); - assertNotNull(changedGoods.getId()); + assertNotNull(unreservedGoods); + assertEquals("Skis", unreservedGoods.getName()); + assertEquals("Mountain skis", unreservedGoods.getDescription()); + assertEquals(new Integer(5000), unreservedGoods.getPrice()); + assertEquals(new Integer(600), unreservedGoods.getQuantityInStock()); + assertEquals(new Integer(200), unreservedGoods.getQuantityReserved()); + assertNotNull(unreservedGoods.getId()); + + return unreservedGoods; + } - return reservedGoods; + private Goods buy(Goods reservedGoods) { + reservedGoods.setQuantityInStock(reservedGoods.getQuantityReserved() - 10); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(reservedGoods, httpHeaders); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + BUY) + .queryParam("id", reservedGoods.getId()) + .queryParam("quantity", 10); + + + RestTemplate restTemplate = new RestTemplate(); + Goods boughtGoods = restTemplate.exchange( + builder.build().encode().toUri(), + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(boughtGoods); + assertEquals("Skis", boughtGoods.getName()); + assertEquals("Mountain skis", boughtGoods.getDescription()); + assertEquals(new Integer(5000), boughtGoods.getPrice()); + assertEquals(new Integer(590), boughtGoods.getQuantityInStock()); + assertEquals(new Integer(200), boughtGoods.getQuantityReserved()); + assertNotNull(boughtGoods.getId()); + + return boughtGoods; } } From 828b41b582f4d67229cf5a480b680777c4cf0ff5 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 20 Sep 2017 18:43:22 +0300 Subject: [PATCH 09/20] Added table creation, population with insert, select, update, delete, join, subquery and case when through SQL queries with status display. --- .../bazaar/controller/AppController.java | 75 ++++++++++++++++++- .../khasang/bazaar/model/CaseWhenTable.java | 36 +++++++++ .../io/khasang/bazaar/model/CreateTable.java | 22 ++++-- .../khasang/bazaar/model/DeleteFromTable.java | 35 +++++++++ .../io/khasang/bazaar/model/JoinTable.java | 35 +++++++++ .../khasang/bazaar/model/PopulateTable.java | 56 ++++++++++++++ .../khasang/bazaar/model/SelectFromTable.java | 35 +++++++++ .../khasang/bazaar/model/SubqueryTable.java | 35 +++++++++ .../io/khasang/bazaar/model/UpdateTable.java | 36 +++++++++ web/WEB-INF/views/table.jsp | 2 +- 10 files changed, 355 insertions(+), 12 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/model/CaseWhenTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/DeleteFromTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/JoinTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/PopulateTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/SelectFromTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/SubqueryTable.java create mode 100644 src/main/java/io/khasang/bazaar/model/UpdateTable.java diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index 6c94759..861b2ca 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -1,7 +1,6 @@ package io.khasang.bazaar.controller; -import io.khasang.bazaar.model.CreateTable; -import io.khasang.bazaar.model.Message; +import io.khasang.bazaar.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -22,6 +21,27 @@ public class AppController { @Autowired private CreateTable createTable; + @Autowired + private PopulateTable populateTable; + + @Autowired + private SelectFromTable selectFromTable; + + @Autowired + private UpdateTable updateTable; + + @Autowired + private DeleteFromTable deleteFromTable; + + @Autowired + private JoinTable joinTable; + + @Autowired + private SubqueryTable subqueryTable; + + @Autowired + private CaseWhenTable caseWhenTable; + // http://localhost:8080/ @RequestMapping("/") public String javaPageHello() { @@ -31,7 +51,56 @@ public String javaPageHello() { @RequestMapping("/create") public String createTable(Model model) { model.addAttribute("status", createTable.createStatus()); - // hello.jsp + // table.jsp + return "table"; + } + + @RequestMapping("/populate") + public String populateTable(Model model) { + model.addAttribute("status", populateTable.populateStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/select") + public String selectFromTable(Model model) { + model.addAttribute("status", selectFromTable.selectStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/update") + public String updateTable(Model model) { + model.addAttribute("status", updateTable.updateStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/delete") + public String deleteFromTable(Model model) { + model.addAttribute("status", deleteFromTable.deleteStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/join") + public String joinTable(Model model) { + model.addAttribute("status", joinTable.joinStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/subquery") + public String subqueryTable(Model model) { + model.addAttribute("status", subqueryTable.subqueryStatus()); + // table.jsp + return "table"; + } + + @RequestMapping("/casewhen") + public String caseWhenTable(Model model) { + model.addAttribute("status", caseWhenTable.caseWhenStatus()); + // table.jsp return "table"; } diff --git a/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java b/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java new file mode 100644 index 0000000..137def7 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/CaseWhenTable.java @@ -0,0 +1,36 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class CaseWhenTable { + private JdbcTemplate jdbcTemplate; + + public CaseWhenTable() { + } + + public CaseWhenTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String caseWhenStatus() { + try { + jdbcTemplate.execute("SELECT title, release_year,\n " + + " CASE WHEN release_year > 2000 THEN 'Meh' ELSE 'Brilliant' END AS review\n" + + " FROM films;"); + return "Case when successful"; + } catch (Exception e) { + return "Case when failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/CreateTable.java b/src/main/java/io/khasang/bazaar/model/CreateTable.java index abe98c7..e49fb55 100644 --- a/src/main/java/io/khasang/bazaar/model/CreateTable.java +++ b/src/main/java/io/khasang/bazaar/model/CreateTable.java @@ -15,20 +15,26 @@ public CreateTable(JdbcTemplate jdbcTemplate) { public String createStatus() { try { jdbcTemplate.execute("DROP TABLE IF EXISTS films"); -// jdbcTemplate.execute("CREATE TABLE films (\n" + -// "code char(5) CONSTRAINT firstkey PRIMARY KEY, \n" + -// "title varchar(255) NOT NULL , \n" + -// "id integer NOT NULL);"); - jdbcTemplate.execute("CREATE TABLE public.films\n" + + jdbcTemplate.execute("CREATE TABLE films (\n" + + "code CHAR (5) CONSTRAINT films_pkey PRIMARY KEY, \n" + + "title VARCHAR (255) NOT NULL , \n" + + "director_l_name VARCHAR (255) NOT NULL , \n" + + "release_year INTEGER NOT NULL);"); + jdbcTemplate.execute("DROP TABLE IF EXISTS directors"); + jdbcTemplate.execute("CREATE TABLE directors (\n" + + "id INTEGER CONSTRAINT directors_pkey PRIMARY KEY, \n" + + "f_name VARCHAR(255) NOT NULL , \n" + + "l_name VARCHAR(255) NOT NULL);"); +/* jdbcTemplate.execute("CREATE TABLE public.films\n" + "(\n" + " code character(5) NOT NULL,\n" + " title character varying(255) NOT NULL,\n" + - " id integer NOT NULL,\n" + + " year integer NOT NULL,\n" + " CONSTRAINT firstkey PRIMARY KEY (code)\n" + - ");"); + ");");*/ return "Table created"; } catch (Exception e) { - return "Table creation failed" + e; + return "Table creation failed " + e; } } diff --git a/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java b/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java new file mode 100644 index 0000000..e777f17 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/DeleteFromTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class DeleteFromTable { + private JdbcTemplate jdbcTemplate; + + public DeleteFromTable() { + } + + public DeleteFromTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String deleteStatus() { + try { + jdbcTemplate.execute("DELETE FROM films\n" + + " WHERE title = 'Wonder Woman' AND release_year = 2017;"); + return "Table record deleted"; + } catch (Exception e) { + return "Table record deletion failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/JoinTable.java b/src/main/java/io/khasang/bazaar/model/JoinTable.java new file mode 100644 index 0000000..650ca7a --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/JoinTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class JoinTable { + private JdbcTemplate jdbcTemplate; + + public JoinTable() { + } + + public JoinTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String joinStatus() { + try { + jdbcTemplate.execute("SELECT title, f_name, l_name FROM films f JOIN directors d\n" + + " ON f.director_l_name = d.l_name WHERE release_year < 2000;"); + return "Join successful"; + } catch (Exception e) { + return "Join failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/PopulateTable.java b/src/main/java/io/khasang/bazaar/model/PopulateTable.java new file mode 100644 index 0000000..5e06214 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/PopulateTable.java @@ -0,0 +1,56 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +public class PopulateTable { + private JdbcTemplate jdbcTemplate; + + public PopulateTable() { + } + + public PopulateTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String populateStatus() { + try { + jdbcTemplate.execute("DELETE FROM films;"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('HR814', 'Pulp Fiction', 'Tarantino', 1994);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('KW872', 'The Fifth Element', 'Besson', 1997);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('TE271', 'Titanic', 'Cameron', 1999);"); + jdbcTemplate.execute("INSERT INTO films\n" + + "(code, title, director_l_name, release_year)\n" + + " VALUES ('WT732', 'Wonder Woman', 'Jenkins', 2017);"); + jdbcTemplate.execute("DELETE FROM directors;"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('201', 'Quentin', 'Tarantino');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('202', 'Luc', 'Besson');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('203', 'James', 'Cameron');"); + jdbcTemplate.execute("INSERT INTO directors\n" + + "(id, f_name, l_name)\n" + + " VALUES ('204', 'Patty', 'Jenkins');"); + return "Table populated"; + } catch (Exception e) { + return "Table population failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/SelectFromTable.java b/src/main/java/io/khasang/bazaar/model/SelectFromTable.java new file mode 100644 index 0000000..1f7f608 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/SelectFromTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class SelectFromTable { + private JdbcTemplate jdbcTemplate; + + public SelectFromTable() { + } + + public SelectFromTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String selectStatus() { + try { + jdbcTemplate.execute("SELECT title FROM films\n" + + " WHERE release_year = 1994;"); + return "Select successful"; + } catch (Exception e) { + return "Select failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/SubqueryTable.java b/src/main/java/io/khasang/bazaar/model/SubqueryTable.java new file mode 100644 index 0000000..7343a59 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/SubqueryTable.java @@ -0,0 +1,35 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class SubqueryTable { + private JdbcTemplate jdbcTemplate; + + public SubqueryTable() { + } + + public SubqueryTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String subqueryStatus() { + try { + jdbcTemplate.execute("SELECT title FROM films\n" + + " WHERE director_l_name IN (SELECT l_name FROM directors WHERE id = 203);"); + return "Subquery successful"; + } catch (Exception e) { + return "Subquery failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/main/java/io/khasang/bazaar/model/UpdateTable.java b/src/main/java/io/khasang/bazaar/model/UpdateTable.java new file mode 100644 index 0000000..8eae0cc --- /dev/null +++ b/src/main/java/io/khasang/bazaar/model/UpdateTable.java @@ -0,0 +1,36 @@ +package io.khasang.bazaar.model; + +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by Zulfia Garifullina on 20.09.2017. + */ +public class UpdateTable { + private JdbcTemplate jdbcTemplate; + + public UpdateTable() { + } + + public UpdateTable(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public String updateStatus() { + try { + jdbcTemplate.execute("UPDATE films\n" + + " SET release_year = release_year - 2\n" + + " WHERE title = 'Titanic';"); + return "Table updated"; + } catch (Exception e) { + return "Table update failed " + e; + } + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/web/WEB-INF/views/table.jsp b/web/WEB-INF/views/table.jsp index 8f1c303..b8d2237 100644 --- a/web/WEB-INF/views/table.jsp +++ b/web/WEB-INF/views/table.jsp @@ -4,6 +4,6 @@ Title -

${status}

+

${status}

From 711839a90077c2f8576b04d13dcfb0f051dbc98c Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Tue, 26 Sep 2017 15:31:40 +0300 Subject: [PATCH 10/20] Added table creation through Hibernate. --- .../khasang/bazaar/controller/AppController.java | 7 +++++++ web/WEB-INF/views/user.jsp | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 web/WEB-INF/views/user.jsp diff --git a/src/main/java/io/khasang/bazaar/controller/AppController.java b/src/main/java/io/khasang/bazaar/controller/AppController.java index 861b2ca..8f4b28a 100644 --- a/src/main/java/io/khasang/bazaar/controller/AppController.java +++ b/src/main/java/io/khasang/bazaar/controller/AppController.java @@ -110,6 +110,13 @@ public String getAdminInfo(Model model){ return "admin"; } + @RequestMapping("/user") + public String getUserInfo(Model model) { + model.addAttribute("secure", "It's a very secure page!"); + // user.jsp + return "user"; + } + @RequestMapping(value = {"/password/{password}"}, method = RequestMethod.GET) public ModelAndView passwordEncode(@PathVariable("password") String password) { ModelAndView modelAndView = new ModelAndView(); diff --git a/web/WEB-INF/views/user.jsp b/web/WEB-INF/views/user.jsp new file mode 100644 index 0000000..4b58c55 --- /dev/null +++ b/web/WEB-INF/views/user.jsp @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: Zulfia Garifullina + Date: 21.09.2017 + Time: 21:21 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + ${secure} + + From 5c26ccf330c55ceb0144b5af6c8da7e07bcb0389 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Tue, 3 Oct 2017 23:05:26 +0300 Subject: [PATCH 11/20] Added REST services. --- .../controller/GoodsCategoryController.java | 61 +++++++++++++++++ .../khasang/bazaar/dao/GoodsCategoryDao.java | 18 +++++ .../bazaar/dao/impl/GoodsCategoryDaoImpl.java | 22 +++++++ .../khasang/bazaar/entity/GoodsCategory.java | 65 +++++++++++++++++++ .../bazaar/service/GoodsCategoryService.java | 52 +++++++++++++++ .../impl/GoodsCategoryServiceImpl.java | 50 ++++++++++++++ 6 files changed, 268 insertions(+) create mode 100644 src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java create mode 100644 src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/entity/GoodsCategory.java create mode 100644 src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java new file mode 100644 index 0000000..51b39ca --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java @@ -0,0 +1,61 @@ +package io.khasang.bazaar.controller; + +import io.khasang.bazaar.entity.GoodsCategory; +import io.khasang.bazaar.service.GoodsCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Controller for Goods Category entity. + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +@Controller +@RequestMapping(value = "/goodscategories") +public class GoodsCategoryController { + private final GoodsCategoryService goodsCategoryService; + + @Autowired + public GoodsCategoryController(GoodsCategoryService goodsCategoryService) { + this.goodsCategoryService = goodsCategoryService; + } + + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public GoodsCategory getGoodsCategoryById(@PathVariable(value = "id") String id) { + return goodsCategoryService.getById(Long.parseLong(id)); + } + + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public GoodsCategory addGoodsCategory(@RequestBody GoodsCategory goodsCategory) { + return goodsCategoryService.addGoodsCategory(goodsCategory); + } + + @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public GoodsCategory updateGoodsCategory(@RequestBody GoodsCategory goodsCategory) { + return goodsCategoryService.updateGoodsCategory(goodsCategory); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + public GoodsCategory deleteGoodsCategory(@RequestParam(value = "id") String id) { + return goodsCategoryService.deleteGoodsCategory(Long.parseLong(id)); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategories() { + return goodsCategoryService.getList(); + } + + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { + return goodsCategoryService.getGoodsCategoriesByName(name); + } +} \ No newline at end of file diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java new file mode 100644 index 0000000..7b32d3a --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java @@ -0,0 +1,18 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public interface GoodsCategoryDao extends BasicDao { + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return - returns all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java new file mode 100644 index 0000000..b303927 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java @@ -0,0 +1,22 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public class GoodsCategoryDaoImpl extends BasicDaoImpl implements GoodsCategoryDao { + public GoodsCategoryDaoImpl(Class entityClass) { + super(entityClass); + } + + @Override + public List getGoodsCategoriesByName(String name) { + return (List) sessionFactory.getCurrentSession(). + createQuery("from GoodsCategory as gc where gc.name = ?").setParameter(0, name).list(); + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java new file mode 100644 index 0000000..bda27f4 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -0,0 +1,65 @@ +package io.khasang.bazaar.entity; + +import javax.persistence.*; + +/** + * Created by Zulfia Garifullina on 26.09.2017. + */ +@Entity +@Table(name = "goods_categories") +public class GoodsCategory { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "category_name") + private String name; + private String description; + + public GoodsCategory() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GoodsCategory that = (GoodsCategory) o; + + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + return description != null ? description.equals(that.description) : that.description == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (description != null ? description.hashCode() : 0); + return result; + } + + 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 getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java new file mode 100644 index 0000000..f857038 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java @@ -0,0 +1,52 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.GoodsCategory; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +public interface GoodsCategoryService { + /** + * Method for retrieving goods categories by their database id. + * @param id - id of the category in the database + * @return a category of goods with given id + */ + GoodsCategory getById(Long id); + + /** + * Method for adding a new goods category to the database table + * @param goodsCategory - the object being added to the database table as a row + * @return the object that was added + */ + GoodsCategory addGoodsCategory(GoodsCategory goodsCategory); + + /** + * Method for updating a goods category + * @param goodsCategory - the object being updated in the database + * @return the goods category that was updated + */ + GoodsCategory updateGoodsCategory(GoodsCategory goodsCategory); + + /** + * Deletes the goods category with the specified id from the database + * @param id - database id of the goods category that needs to be deleted + * @return the deleted goods category + */ + GoodsCategory deleteGoodsCategory(Long id); + + /** + * Method returns all the goods categories from the corresponding table in the database. + * @return a List of goods categories objects from the database table. + */ + List getList(); + + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java new file mode 100644 index 0000000..c591700 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java @@ -0,0 +1,50 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.GoodsCategoryDao; +import io.khasang.bazaar.entity.GoodsCategory; +import io.khasang.bazaar.service.GoodsCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Zulfia Garifullina + * @date 26.09.2017. + */ +@Service("goodsCategoryService") +public class GoodsCategoryServiceImpl implements GoodsCategoryService { + @Autowired + private GoodsCategoryDao goodsCategoryDao; + + @Override + public GoodsCategory getById(Long id) { + return goodsCategoryDao.getById(id); + } + + @Override + public GoodsCategory addGoodsCategory(GoodsCategory goodsCategory) { + return goodsCategoryDao.add(goodsCategory); + } + + @Override + public GoodsCategory updateGoodsCategory(GoodsCategory goodsCategory) { + return goodsCategoryDao.update(goodsCategory); + } + + @Override + public GoodsCategory deleteGoodsCategory(Long id) { + GoodsCategory goodsCategory = goodsCategoryDao.getById(id); + return goodsCategoryDao.delete(goodsCategory); + } + + @Override + public List getList() { + return goodsCategoryDao.getList(); + } + + @Override + public List getGoodsCategoriesByName(String name) { + return goodsCategoryDao.getGoodsCategoriesByName(name); + } +} From fd82e2dc87fc94af2b1b84d1a6e42be80e5b69e6 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 16:22:27 +0300 Subject: [PATCH 12/20] Added two entities (goods categories and goods) and REST services carcass for them. --- .../bazaar/controller/GoodsController.java | 80 ++++++++++++ .../khasang/bazaar/dao/GoodsCategoryDao.java | 1 + .../java/io/khasang/bazaar/dao/GoodsDao.java | 19 +++ .../bazaar/dao/impl/GoodsCategoryDaoImpl.java | 1 + .../khasang/bazaar/dao/impl/GoodsDaoImpl.java | 24 ++++ .../java/io/khasang/bazaar/entity/Goods.java | 123 ++++++++++++++++++ .../khasang/bazaar/entity/GoodsCategory.java | 10 +- .../bazaar/service/GoodsCategoryService.java | 17 +-- .../khasang/bazaar/service/GoodsService.java | 80 ++++++++++++ .../impl/GoodsCategoryServiceImpl.java | 11 +- .../bazaar/service/impl/GoodsServiceImpl.java | 74 +++++++++++ 11 files changed, 424 insertions(+), 16 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/controller/GoodsController.java create mode 100644 src/main/java/io/khasang/bazaar/dao/GoodsDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/entity/Goods.java create mode 100644 src/main/java/io/khasang/bazaar/service/GoodsService.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsController.java b/src/main/java/io/khasang/bazaar/controller/GoodsController.java new file mode 100644 index 0000000..43b8faa --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/GoodsController.java @@ -0,0 +1,80 @@ +package io.khasang.bazaar.controller; + +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.service.GoodsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Controller for Goods entity. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +@Controller +@RequestMapping(value = "/goods") +public class GoodsController { + private final GoodsService goodsService; + + @Autowired + public GoodsController(GoodsService goodsService) { + this.goodsService = goodsService; + } + + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public Goods getGoodsById(@PathVariable(value = "id") String id) { + return goodsService.getById(Long.parseLong(id)); + } + + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsByName(@PathVariable(value = "name") String name) { + return goodsService.getGoodsByName(name); + } + + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public Goods addGoods(@RequestBody Goods goods) { + return goodsService.addGoods(goods); + } + + @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Goods updateGoods(@RequestBody Goods goods) { + return goodsService.updateGoods(goods); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + public Goods deleteGoods(@RequestParam(value = "id") String id) { + return goodsService.deleteGoods(Long.parseLong(id)); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getGoods() { + return goodsService.getList(); + } + + @RequestMapping(value = "/reserve", method = RequestMethod.POST) + @ResponseBody + public Goods reserveGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.reserveGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } + + @RequestMapping(value = "/unreserve", method = RequestMethod.POST) + @ResponseBody + public Goods unreserveGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.unreserveGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } + + @RequestMapping(value = "/buy", method = RequestMethod.POST) + @ResponseBody + public Goods buyGoods(@RequestParam(value = "id") String id, @RequestParam(value = "quantity") String quantity) { + return goodsService.buyGoods(Long.parseLong(id), Integer.parseInt(quantity)); + } +} diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java index 7b32d3a..0949d75 100644 --- a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java +++ b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java @@ -5,6 +5,7 @@ import java.util.List; /** + * Interface for representing DAO for GoodsCategory entity. * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java new file mode 100644 index 0000000..8b9395c --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java @@ -0,0 +1,19 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Interface for representing DAO for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public interface GoodsDao extends BasicDao { + /** + * Method for retrieving goods from the database by their name. + * @param name - name of the goods + * @return goods with the given name + */ + List getGoodsByName(String name); +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java index b303927..bb9dd9c 100644 --- a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java @@ -6,6 +6,7 @@ import java.util.List; /** + * Implementation of GoodsCategoryDao interface for representing DAO for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java new file mode 100644 index 0000000..a8d5c11 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsDaoImpl.java @@ -0,0 +1,24 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.GoodsDao; +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Implementation of GoodsDao interface for representing DAO for Goods entity. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsDaoImpl extends BasicDaoImpl implements GoodsDao { + public GoodsDaoImpl(Class entityClass) { + super(entityClass); + } + + @Override + public List getGoodsByName(String name) { + return (List) sessionFactory.getCurrentSession(). + createQuery("from Goods as g where g.name = ?").setParameter(0, name).list(); + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/Goods.java b/src/main/java/io/khasang/bazaar/entity/Goods.java new file mode 100644 index 0000000..8b3fa02 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/Goods.java @@ -0,0 +1,123 @@ +package io.khasang.bazaar.entity; + +import org.springframework.stereotype.Controller; + +import javax.persistence.*; + +/** This class describes a database entity that represents goods for sale. + * + * @author Zulfia Garifullina + * @date 03.10.2017. + */ +@Entity +@Table(name = "goods") +public class Goods { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "goods_id") + private Long id; + + @Column(name = "goods_name", nullable = false) + private String name; + + @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JoinColumn(name = "category_id") //, nullable = false) + private GoodsCategory category; + + @Column(name = "goods_description") + private String description; + + private Integer price; + + @Column(name = "quantity_in_stock") + private Integer quantityInStock; + + @Column(name = "quantity_reserved") + private Integer quantityReserved; + + public Goods() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Goods goods = (Goods) o; + + if (id != null ? !id.equals(goods.id) : goods.id != null) return false; + if (name != null ? !name.equals(goods.name) : goods.name != null) return false; + if (category != null ? !category.equals(goods.category) : goods.category != null) return false; + if (price != null ? !price.equals(goods.price) : goods.price != null) return false; + if (quantityInStock != null ? !quantityInStock.equals(goods.quantityInStock) : goods.quantityInStock != null) + return false; + return quantityReserved != null ? quantityReserved.equals(goods.quantityReserved) : goods.quantityReserved == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (category != null ? category.hashCode() : 0); + result = 31 * result + (price != null ? price.hashCode() : 0); + result = 31 * result + (quantityInStock != null ? quantityInStock.hashCode() : 0); + result = 31 * result + (quantityReserved != null ? quantityReserved.hashCode() : 0); + return result; + } + + 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 GoodsCategory getCategory() { + return category; + } + + public void setCategory(GoodsCategory category) { + this.category = category; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getPrice() { + return price; + } + + public void setPrice(Integer price) { + this.price = price; + } + + public Integer getQuantityInStock() { + return quantityInStock; + } + + public void setQuantityInStock(Integer quantityInStock) { + this.quantityInStock = quantityInStock; + } + + public Integer getQuantityReserved() { + return quantityReserved; + } + + public void setQuantityReserved(Integer quantityReserved) { + this.quantityReserved = quantityReserved; + } +} diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java index bda27f4..bcdc98c 100644 --- a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -2,18 +2,22 @@ import javax.persistence.*; -/** - * Created by Zulfia Garifullina on 26.09.2017. +/** This class describes a database entity that represents categories of goods + * @author Zulfia Garifullina + * @date 26.09.2017. */ @Entity @Table(name = "goods_categories") public class GoodsCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "category_id") private Long id; - @Column(name = "category_name") + @Column(name = "category_name", nullable = false) private String name; + + @Column(name = "category_description") private String description; public GoodsCategory() { diff --git a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java index f857038..cd7f961 100644 --- a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java +++ b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java @@ -5,6 +5,7 @@ import java.util.List; /** + * Service interface for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ @@ -16,6 +17,13 @@ public interface GoodsCategoryService { */ GoodsCategory getById(Long id); + /** + * Method for retrieving goods categories from the database by their name. + * @param name - name of the category + * @return all the goods categories with the given name + */ + List getGoodsCategoriesByName(String name); + /** * Method for adding a new goods category to the database table * @param goodsCategory - the object being added to the database table as a row @@ -24,7 +32,7 @@ public interface GoodsCategoryService { GoodsCategory addGoodsCategory(GoodsCategory goodsCategory); /** - * Method for updating a goods category + * Method for updating a goods category in the database * @param goodsCategory - the object being updated in the database * @return the goods category that was updated */ @@ -42,11 +50,4 @@ public interface GoodsCategoryService { * @return a List of goods categories objects from the database table. */ List getList(); - - /** - * Method for retrieving goods categories from the database by their name. - * @param name - name of the category - * @return all the goods categories with the given name - */ - List getGoodsCategoriesByName(String name); } diff --git a/src/main/java/io/khasang/bazaar/service/GoodsService.java b/src/main/java/io/khasang/bazaar/service/GoodsService.java new file mode 100644 index 0000000..0c12f60 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/GoodsService.java @@ -0,0 +1,80 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.Goods; + +import java.util.List; + +/** + * Service interface for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public interface GoodsService { + /** + * Method for retrieving goods by their database id. + * @param id - id of the goods in the database + * @return goods with given id + */ + Goods getById(Long id); + + /** + * Method for retrieving goods from the database by their name. + * @param name - name of the goods + * @return all the goods with the given name + */ + List getGoodsByName(String name); + + /** + * Method for adding new goods to the database table + * @param goods- the object being added to the database table as a row + * @return the goods that was added + */ + Goods addGoods(Goods goods); + + /** + * Method for updating goods in the database + * @param goods - the object being updated in the database + * @return the goods that were updated + */ + Goods updateGoods(Goods goods); + + /** + * Deletes the goods with the specified id from the database + * @param id database id of the goods that needs to be deleted + * @return the deleted goods + */ + Goods deleteGoods(Long id); + + /** + * Method returns all the goods from the corresponding table in the database. + * @return a List of goods objects from the database table. + */ + List getList(); + + /** + * Reserves a specified amount of goods and reduces the amount in stock by that number. + * This method should be called before processing order payment. + * @param id database id for chosen goods + * @param quantity quantity to be reserved + * @return goods that were reserved + */ + Goods reserveGoods(Long id, Integer quantity); + + /** + * Cancels reservation on a specified amount of goods and increases the amount in stock by that number. + * This method should be called if processing order payment failed. + * @param id database id for chosen goods + * @param quantity quantity to be removed from reserved and added back to quantity in stock + * @return goods that were removed from reserved and added back to quantity in stock + */ + Goods unreserveGoods(Long id, Integer quantity); + + /** + * Reduces the amount of goods which were reserved before payment processing, by the specified amount. + * This method should be called after successful processing of order payment. + * @param id database id for chosen goods + * @param quantity amount by which reserved quantity is reduced + * @return goods for which reserved quantity was reduced + */ + Goods buyGoods(Long id, Integer quantity); +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java index c591700..4341f8a 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java @@ -9,6 +9,7 @@ import java.util.List; /** + * Implementation of the service interface for Goods Category entity. * @author Zulfia Garifullina * @date 26.09.2017. */ @@ -22,6 +23,11 @@ public GoodsCategory getById(Long id) { return goodsCategoryDao.getById(id); } + @Override + public List getGoodsCategoriesByName(String name) { + return goodsCategoryDao.getGoodsCategoriesByName(name); + } + @Override public GoodsCategory addGoodsCategory(GoodsCategory goodsCategory) { return goodsCategoryDao.add(goodsCategory); @@ -42,9 +48,4 @@ public GoodsCategory deleteGoodsCategory(Long id) { public List getList() { return goodsCategoryDao.getList(); } - - @Override - public List getGoodsCategoriesByName(String name) { - return goodsCategoryDao.getGoodsCategoriesByName(name); - } } diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java new file mode 100644 index 0000000..963ef06 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java @@ -0,0 +1,74 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.GoodsDao; +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.service.GoodsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Implementation of the service interface for Goods entity. + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +@Service("goodsService") +public class GoodsServiceImpl implements GoodsService { + @Autowired + private GoodsDao goodsDao; + + @Override + public Goods getById(Long id) { + return goodsDao.getById(id); + } + + @Override + public List getGoodsByName(String name) { + return goodsDao.getGoodsByName(name); + } + + @Override + public Goods addGoods(Goods goods) { + return goodsDao.add(goods); + } + + @Override + public Goods updateGoods(Goods goods) { + return goodsDao.update(goods); + } + + @Override + public Goods deleteGoods(Long id) { + Goods goods = goodsDao.getById(id); + return goodsDao.delete(goods); + } + + @Override + public List getList() { + return goodsDao.getList(); + } + + @Override + public Goods reserveGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityInStock(goods.getQuantityInStock() - quantity); + goods.setQuantityReserved(goods.getQuantityReserved() + quantity); + return goodsDao.update(goods); + } + + @Override + public Goods unreserveGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityInStock(goods.getQuantityInStock() + quantity); + goods.setQuantityReserved(goods.getQuantityReserved() - quantity); + return goodsDao.update(goods); + } + + @Override + public Goods buyGoods(Long id, Integer quantity) { + Goods goods = goodsDao.getById(id); + goods.setQuantityReserved(goods.getQuantityReserved() - quantity); + return goodsDao.update(goods); + } +} From cb8702fa6022d65b63e602a207689d6284f566aa Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 20:25:40 +0300 Subject: [PATCH 13/20] Added integration tests --- .../controller/GoodsCategoryController.java | 12 +- ...oodsCategoryControllerIntegrationTest.java | 184 +++++++++++ .../GoodsControllerIntegrationTest.java | 286 ++++++++++++++++++ 3 files changed, 476 insertions(+), 6 deletions(-) create mode 100644 src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java create mode 100644 src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java index 51b39ca..7028547 100644 --- a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java +++ b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java @@ -29,6 +29,12 @@ public GoodsCategory getGoodsCategoryById(@PathVariable(value = "id") String id) return goodsCategoryService.getById(Long.parseLong(id)); } + @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) + @ResponseBody + public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { + return goodsCategoryService.getGoodsCategoriesByName(name); + } + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") @ResponseBody public GoodsCategory addGoodsCategory(@RequestBody GoodsCategory goodsCategory) { @@ -52,10 +58,4 @@ public GoodsCategory deleteGoodsCategory(@RequestParam(value = "id") String id) public List getGoodsCategories() { return goodsCategoryService.getList(); } - - @RequestMapping(value = "/get/name/{name}", method = RequestMethod.GET) - @ResponseBody - public List getGoodsCategoriesByName(@PathVariable(value = "name") String name) { - return goodsCategoryService.getGoodsCategoriesByName(name); - } } \ No newline at end of file diff --git a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java new file mode 100644 index 0000000..1ef5231 --- /dev/null +++ b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java @@ -0,0 +1,184 @@ +package io.khasang.bazaar; + +import io.khasang.bazaar.entity.GoodsCategory; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Integration tests for GoodsCategoryController. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsCategoryControllerIntegrationTest { + private final String ROOT = "http://localhost:8080/goodscategories"; + private final String ADD = "/add"; + private final String UPDATE = "/update"; + private final String DELETE = "/delete"; + private final String GET_BY_ID = "/get/id"; + private final String GET_BY_NAME = "/get/name"; + private final String GET_ALL = "/all"; + + @Test + public void addGoodsCategory() { + GoodsCategory goodsCategory = createGoodsCategory(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + goodsCategory.getId() + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoodsCategory); + assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + } + + @Test + public void updateGoodsCategory() { + GoodsCategory goodsCategory = changeGoodsCategory(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + goodsCategory.getId() + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoodsCategory); + assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + } + + @Test + public void deleteGoodsCategory() { + RestTemplate restTemplate = new RestTemplate(); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) + .queryParam("id", "9"); + + restTemplate.delete(builder.build().encode().toUri()); + + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 9 + ); + + GoodsCategory receivedGoodsCategory = responseEntity.getBody(); +// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertNull(receivedGoodsCategory); + } + + @Test + public void getGoodsCategoryByName() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_BY_NAME + "/{name}", + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }, + "Music" + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void getAllGoodsCategories() { + RestTemplate restTemplate = new RestTemplate(); + createGoodsCategory(); + createGoodsCategory(); + + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + private GoodsCategory createGoodsCategory() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + GoodsCategory goodsCategory = prefillGoodsCategory(); + HttpEntity httpEntity = new HttpEntity<>(goodsCategory, httpHeaders); + + RestTemplate restTemplate = new RestTemplate(); + GoodsCategory createdGoodsCategory = restTemplate.exchange( + ROOT + ADD, + HttpMethod.PUT, + httpEntity, + GoodsCategory.class).getBody(); + assertNotNull(createdGoodsCategory); + assertEquals("Electronics", createdGoodsCategory.getName()); + assertEquals("Gadgets: laptops, smartphones, cameras", createdGoodsCategory.getDescription()); + assertNotNull(createdGoodsCategory.getId()); + + return createdGoodsCategory; + } + + private GoodsCategory prefillGoodsCategory() { + GoodsCategory goodsCategory = new GoodsCategory(); + goodsCategory.setName("Electronics"); + goodsCategory.setDescription("Gadgets: laptops, smartphones, cameras"); + return goodsCategory; + } + + private GoodsCategory changeGoodsCategory() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 6 + ); + + GoodsCategory changingGoodsCategory = responseEntity.getBody(); + changingGoodsCategory.setName("Fashion"); + changingGoodsCategory.setDescription("Womenswear and menswear"); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoodsCategory, httpHeaders); + + GoodsCategory changedGoodsCategory = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + GoodsCategory.class).getBody(); + assertNotNull(changedGoodsCategory); + assertEquals("Fashion", changedGoodsCategory.getName()); + assertEquals("Womenswear and menswear", changedGoodsCategory.getDescription()); + assertNotNull(changedGoodsCategory.getId()); + + return changedGoodsCategory; + } +} diff --git a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java new file mode 100644 index 0000000..46263c6 --- /dev/null +++ b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java @@ -0,0 +1,286 @@ +package io.khasang.bazaar; + +import io.khasang.bazaar.entity.Goods; +import io.khasang.bazaar.entity.GoodsCategory; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Integration tests for GoodsController. + * + * @author Zulfia Garifullina + * @date 04.10.2017. + */ +public class GoodsControllerIntegrationTest { + private final String ROOT = "http://localhost:8080/goods"; + private final String ADD = "/add"; + private final String UPDATE = "/update"; + private final String DELETE = "/delete"; + private final String GET_BY_ID = "/get/id"; + private final String GET_BY_NAME = "/get/name"; + private final String GET_ALL = "/all"; + private final String RESERVE = "/reserve"; + private final String UNRESERVE = "/unreserve"; + private final String BUY = "/buy"; + private GoodsCategory category = (new RestTemplate()).exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + GoodsCategory.class, + 5 + ).getBody(); + + @Test + public void addGoods() { + Goods goods = createGoods(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + } + + @Test + public void updateGoods() { + Goods goods = changeGoods(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertNotNull(receivedGoods.getCategory()); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + assertEquals(goods.getCategory(), receivedGoods.getCategory()); + assertEquals(goods.getPrice(), receivedGoods.getPrice()); + assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + } + + @Test + public void deleteGoods() { + RestTemplate restTemplate = new RestTemplate(); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) + .queryParam("id", "6"); + + restTemplate.delete(builder.build().encode().toUri()); + + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods receivedGoods = responseEntity.getBody(); +// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertNull(receivedGoods); + } + + @Test + public void getGoodsByName() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_BY_NAME + "/{name}", + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }, + "Harry Potter" + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void getAllGoodsCategories() { + RestTemplate restTemplate = new RestTemplate(); + createGoods(); + createGoods(); + + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + @Test + public void reserveGoods() { + Goods goods = reserve(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + goods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(goods.getName(), receivedGoods.getName()); + assertEquals(goods.getDescription(), receivedGoods.getDescription()); + assertEquals(goods.getCategory(), receivedGoods.getCategory()); + assertEquals(goods.getPrice(), receivedGoods.getPrice()); + assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + } + + @Test + public void unreserveGoods() { + + } + + @Test + public void buyGoods() { + + } + + private Goods createGoods() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Goods goods = prefillGoods(); + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + + RestTemplate restTemplate = new RestTemplate(); + Goods createdGoods = restTemplate.exchange( + ROOT + ADD, + HttpMethod.PUT, + httpEntity, + Goods.class).getBody(); + assertNotNull(createdGoods); + assertEquals("iPhone X", createdGoods.getName()); + assertEquals("Latest iPhone model", createdGoods.getDescription()); + assertEquals(category, createdGoods.getCategory()); + assertEquals(new Integer(100000), createdGoods.getPrice()); + assertEquals(new Integer(20), createdGoods.getQuantityInStock()); + assertEquals(new Integer(0), createdGoods.getQuantityReserved()); + assertNotNull(createdGoods.getId()); + + return createdGoods; + } + + private Goods prefillGoods() { + Goods goods = new Goods(); + goods.setName("iPhone X"); + goods.setDescription("Latest iPhone model"); + goods.setCategory(category); + goods.setPrice(100000); + goods.setQuantityInStock(20); + goods.setQuantityReserved(0); + return goods; + } + + private Goods changeGoods() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods changingGoods = responseEntity.getBody(); + changingGoods.setName("Samsung Galaxy S8"); + changingGoods.setDescription("Closest rival of iPhone line"); + changingGoods.setPrice(80000); + changingGoods.setQuantityInStock(400); + changingGoods.setQuantityReserved(150); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + + Goods changedGoods = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(changedGoods); + assertEquals("Samsung Galaxy S8", changedGoods.getName()); + assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); + assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals(new Integer(400), changedGoods.getQuantityInStock()); + assertEquals(new Integer(150), changedGoods.getQuantityReserved()); + assertNotNull(changedGoods.getId()); + + return changedGoods; + } + + private Goods reserve() { + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + 6 + ); + + Goods changingGoods = responseEntity.getBody(); + changingGoods.setName("Samsung Galaxy S8"); + changingGoods.setDescription("Closest rival of iPhone line"); + changingGoods.setPrice(80000); + changingGoods.setQuantityInStock(400); + changingGoods.setQuantityReserved(150); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + + Goods changedGoods = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(changedGoods); + assertEquals("Samsung Galaxy S8", changedGoods.getName()); + assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); + assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals(new Integer(400), changedGoods.getQuantityInStock()); + assertEquals(new Integer(150), changedGoods.getQuantityReserved()); + assertNotNull(changedGoods.getId()); + + return reservedGoods; + } +} From b9ef4bfefc12ab421a41955d1fff5c4071886609 Mon Sep 17 00:00:00 2001 From: zgarifullina Date: Wed, 4 Oct 2017 22:33:05 +0300 Subject: [PATCH 14/20] 1) Fixed integration tests for delete. 2) Added integration tests for reserve, unreserve and buy (for Goods entity). 3) Changed table column names in Goods and Goods Category entities. --- .../java/io/khasang/bazaar/entity/Goods.java | 6 +- .../khasang/bazaar/entity/GoodsCategory.java | 3 +- ...oodsCategoryControllerIntegrationTest.java | 35 +-- .../GoodsControllerIntegrationTest.java | 253 ++++++++++++------ 4 files changed, 187 insertions(+), 110 deletions(-) diff --git a/src/main/java/io/khasang/bazaar/entity/Goods.java b/src/main/java/io/khasang/bazaar/entity/Goods.java index 8b3fa02..e5c19eb 100644 --- a/src/main/java/io/khasang/bazaar/entity/Goods.java +++ b/src/main/java/io/khasang/bazaar/entity/Goods.java @@ -17,16 +17,14 @@ public class Goods { @Column(name = "goods_id") private Long id; - @Column(name = "goods_name", nullable = false) + @Column(nullable = false) private String name; @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) - @JoinColumn(name = "category_id") //, nullable = false) + @JoinColumn(name = "category_id") private GoodsCategory category; - @Column(name = "goods_description") private String description; - private Integer price; @Column(name = "quantity_in_stock") diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java index bcdc98c..1550bc7 100644 --- a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -14,10 +14,9 @@ public class GoodsCategory { @Column(name = "category_id") private Long id; - @Column(name = "category_name", nullable = false) + @Column(nullable = false) private String name; - @Column(name = "category_description") private String description; public GoodsCategory() { diff --git a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java index 1ef5231..b450d70 100644 --- a/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/GoodsCategoryControllerIntegrationTest.java @@ -48,7 +48,8 @@ public void addGoodsCategory() { @Test public void updateGoodsCategory() { - GoodsCategory goodsCategory = changeGoodsCategory(); + GoodsCategory goodsCategory = createGoodsCategory(); + GoodsCategory changedGoodsCategory = changeGoodsCategory(goodsCategory); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -56,22 +57,23 @@ public void updateGoodsCategory() { HttpMethod.GET, null, GoodsCategory.class, - goodsCategory.getId() + changedGoodsCategory.getId() ); GoodsCategory receivedGoodsCategory = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoodsCategory); - assertEquals(goodsCategory.getName(), receivedGoodsCategory.getName()); - assertEquals(goodsCategory.getDescription(), receivedGoodsCategory.getDescription()); + assertEquals(changedGoodsCategory.getName(), receivedGoodsCategory.getName()); + assertEquals(changedGoodsCategory.getDescription(), receivedGoodsCategory.getDescription()); } @Test public void deleteGoodsCategory() { + GoodsCategory goodsCategory = createGoodsCategory(); RestTemplate restTemplate = new RestTemplate(); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) - .queryParam("id", "9"); + .queryParam("id", goodsCategory.getId()); restTemplate.delete(builder.build().encode().toUri()); @@ -80,11 +82,11 @@ public void deleteGoodsCategory() { HttpMethod.GET, null, GoodsCategory.class, - 9 + goodsCategory.getId() ); GoodsCategory receivedGoodsCategory = responseEntity.getBody(); -// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertNull(receivedGoodsCategory); } @@ -150,25 +152,16 @@ private GoodsCategory prefillGoodsCategory() { return goodsCategory; } - private GoodsCategory changeGoodsCategory() { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - GoodsCategory.class, - 6 - ); - - GoodsCategory changingGoodsCategory = responseEntity.getBody(); - changingGoodsCategory.setName("Fashion"); - changingGoodsCategory.setDescription("Womenswear and menswear"); + private GoodsCategory changeGoodsCategory(GoodsCategory goodsCategory) { + goodsCategory.setName("Fashion"); + goodsCategory.setDescription("Womenswear and menswear"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoodsCategory, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(goodsCategory, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); GoodsCategory changedGoodsCategory = restTemplate.exchange( ROOT + UPDATE, HttpMethod.POST, diff --git a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java index 46263c6..00d1051 100644 --- a/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/GoodsControllerIntegrationTest.java @@ -29,13 +29,6 @@ public class GoodsControllerIntegrationTest { private final String RESERVE = "/reserve"; private final String UNRESERVE = "/unreserve"; private final String BUY = "/buy"; - private GoodsCategory category = (new RestTemplate()).exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - GoodsCategory.class, - 5 - ).getBody(); @Test public void addGoods() { @@ -59,7 +52,8 @@ public void addGoods() { @Test public void updateGoods() { - Goods goods = changeGoods(); + Goods goods = createGoods(); + Goods changedGoods = changeGoods(goods); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -67,27 +61,28 @@ public void updateGoods() { HttpMethod.GET, null, Goods.class, - goods.getId() + changedGoods.getId() ); Goods receivedGoods = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoods); assertNotNull(receivedGoods.getCategory()); - assertEquals(goods.getName(), receivedGoods.getName()); - assertEquals(goods.getDescription(), receivedGoods.getDescription()); - assertEquals(goods.getCategory(), receivedGoods.getCategory()); - assertEquals(goods.getPrice(), receivedGoods.getPrice()); - assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); - assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + assertEquals(changedGoods.getName(), receivedGoods.getName()); + assertEquals(changedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(changedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(changedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(changedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(changedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void deleteGoods() { + Goods goods = createGoods(); RestTemplate restTemplate = new RestTemplate(); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + DELETE) - .queryParam("id", "6"); + .queryParam("id", goods.getId()); restTemplate.delete(builder.build().encode().toUri()); @@ -96,16 +91,18 @@ public void deleteGoods() { HttpMethod.GET, null, Goods.class, - 6 + goods.getId() ); Goods receivedGoods = responseEntity.getBody(); -// assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertNull(receivedGoods); } @Test public void getGoodsByName() { + Goods goods = createGoods(); + RestTemplate restTemplate = new RestTemplate(); ResponseEntity> result = restTemplate.exchange( ROOT + GET_BY_NAME + "/{name}", @@ -113,7 +110,7 @@ public void getGoodsByName() { null, new ParameterizedTypeReference>() { }, - "Harry Potter" + goods.getName() ); assertEquals(HttpStatus.OK, result.getStatusCode()); @@ -140,7 +137,8 @@ public void getAllGoodsCategories() { @Test public void reserveGoods() { - Goods goods = reserve(); + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange( @@ -148,28 +146,70 @@ public void reserveGoods() { HttpMethod.GET, null, Goods.class, - goods.getId() + reservedGoods.getId() ); Goods receivedGoods = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedGoods); - assertEquals(goods.getName(), receivedGoods.getName()); - assertEquals(goods.getDescription(), receivedGoods.getDescription()); - assertEquals(goods.getCategory(), receivedGoods.getCategory()); - assertEquals(goods.getPrice(), receivedGoods.getPrice()); - assertEquals(goods.getQuantityInStock(), receivedGoods.getQuantityInStock()); - assertEquals(goods.getQuantityReserved(), receivedGoods.getQuantityReserved()); + assertEquals(reservedGoods.getName(), receivedGoods.getName()); + assertEquals(reservedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(reservedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(reservedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(reservedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(reservedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void unreserveGoods() { + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); + Goods unreservedGoods = unreserve(reservedGoods); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + unreservedGoods.getId() + ); + + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(unreservedGoods.getName(), receivedGoods.getName()); + assertEquals(unreservedGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(unreservedGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(unreservedGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(unreservedGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(unreservedGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } @Test public void buyGoods() { + Goods goods = createGoods(); + Goods reservedGoods = reserve(goods); + Goods boughtGoods = buy(reservedGoods); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + GET_BY_ID + "/{id}", + HttpMethod.GET, + null, + Goods.class, + boughtGoods.getId() + ); + Goods receivedGoods = responseEntity.getBody(); + assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); + assertNotNull(receivedGoods); + assertEquals(boughtGoods.getName(), receivedGoods.getName()); + assertEquals(boughtGoods.getDescription(), receivedGoods.getDescription()); + assertEquals(boughtGoods.getCategory(), receivedGoods.getCategory()); + assertEquals(boughtGoods.getPrice(), receivedGoods.getPrice()); + assertEquals(boughtGoods.getQuantityInStock(), receivedGoods.getQuantityInStock()); + assertEquals(boughtGoods.getQuantityReserved(), receivedGoods.getQuantityReserved()); } private Goods createGoods() { @@ -186,12 +226,13 @@ private Goods createGoods() { httpEntity, Goods.class).getBody(); assertNotNull(createdGoods); - assertEquals("iPhone X", createdGoods.getName()); - assertEquals("Latest iPhone model", createdGoods.getDescription()); - assertEquals(category, createdGoods.getCategory()); - assertEquals(new Integer(100000), createdGoods.getPrice()); - assertEquals(new Integer(20), createdGoods.getQuantityInStock()); - assertEquals(new Integer(0), createdGoods.getQuantityReserved()); + assertEquals("Skis", createdGoods.getName()); + assertEquals("Mountain skis", createdGoods.getDescription()); + assertEquals("Sports goods", createdGoods.getCategory().getName()); + assertEquals("All you need to keep active", createdGoods.getCategory().getDescription()); + assertEquals(new Integer(5000), createdGoods.getPrice()); + assertEquals(new Integer(600), createdGoods.getQuantityInStock()); + assertEquals(new Integer(200), createdGoods.getQuantityReserved()); assertNotNull(createdGoods.getId()); return createdGoods; @@ -199,46 +240,40 @@ private Goods createGoods() { private Goods prefillGoods() { Goods goods = new Goods(); - goods.setName("iPhone X"); - goods.setDescription("Latest iPhone model"); + goods.setName("Skis"); + goods.setDescription("Mountain skis"); + GoodsCategory category = new GoodsCategory(); + category.setName("Sports goods"); + category.setDescription("All you need to keep active"); goods.setCategory(category); - goods.setPrice(100000); - goods.setQuantityInStock(20); - goods.setQuantityReserved(0); + goods.setPrice(5000); + goods.setQuantityInStock(600); + goods.setQuantityReserved(200); return goods; } - private Goods changeGoods() { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - Goods.class, - 6 - ); - - Goods changingGoods = responseEntity.getBody(); - changingGoods.setName("Samsung Galaxy S8"); - changingGoods.setDescription("Closest rival of iPhone line"); - changingGoods.setPrice(80000); - changingGoods.setQuantityInStock(400); - changingGoods.setQuantityReserved(150); + private Goods changeGoods(Goods goods) { + goods.setName("Snowboard"); + goods.setDescription("All-mountain snowboard"); + goods.setPrice(8000); + goods.setQuantityInStock(400); + goods.setQuantityReserved(150); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); Goods changedGoods = restTemplate.exchange( ROOT + UPDATE, HttpMethod.POST, httpEntity, Goods.class).getBody(); assertNotNull(changedGoods); - assertEquals("Samsung Galaxy S8", changedGoods.getName()); - assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); - assertEquals(new Integer(80000), changedGoods.getPrice()); + assertEquals("Snowboard", changedGoods.getName()); + assertEquals("All-mountain snowboard", changedGoods.getDescription()); + assertEquals(new Integer(8000), changedGoods.getPrice()); assertEquals(new Integer(400), changedGoods.getQuantityInStock()); assertEquals(new Integer(150), changedGoods.getQuantityReserved()); assertNotNull(changedGoods.getId()); @@ -246,41 +281,93 @@ private Goods changeGoods() { return changedGoods; } - private Goods reserve() { + private Goods reserve(Goods goods) { + goods.setQuantityInStock(goods.getQuantityInStock() - 10); + goods.setQuantityReserved(goods.getQuantityReserved() + 10); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(goods, httpHeaders); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + RESERVE) + .queryParam("id", goods.getId()) + .queryParam("quantity", 10); + RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + GET_BY_ID + "/{id}", - HttpMethod.GET, - null, - Goods.class, - 6 - ); + Goods reservedGoods = restTemplate.exchange( + builder.build().encode().toUri(), + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(reservedGoods); + assertEquals("Skis", reservedGoods.getName()); + assertEquals("Mountain skis", reservedGoods.getDescription()); + assertEquals(new Integer(5000), reservedGoods.getPrice()); + assertEquals(new Integer(590), reservedGoods.getQuantityInStock()); + assertEquals(new Integer(210), reservedGoods.getQuantityReserved()); + assertNotNull(reservedGoods.getId()); + + return reservedGoods; + } - Goods changingGoods = responseEntity.getBody(); - changingGoods.setName("Samsung Galaxy S8"); - changingGoods.setDescription("Closest rival of iPhone line"); - changingGoods.setPrice(80000); - changingGoods.setQuantityInStock(400); - changingGoods.setQuantityReserved(150); + private Goods unreserve(Goods reservedGoods) { + reservedGoods.setQuantityInStock(reservedGoods.getQuantityInStock() + 10); + reservedGoods.setQuantityReserved(reservedGoods.getQuantityReserved() - 10); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); - HttpEntity httpEntity = new HttpEntity<>(changingGoods, httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(reservedGoods, httpHeaders); - Goods changedGoods = restTemplate.exchange( - ROOT + UPDATE, + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + UNRESERVE) + .queryParam("id", reservedGoods.getId()) + .queryParam("quantity", 10); + + RestTemplate restTemplate = new RestTemplate(); + Goods unreservedGoods = restTemplate.exchange( + builder.build().encode().toUri(), HttpMethod.POST, httpEntity, Goods.class).getBody(); - assertNotNull(changedGoods); - assertEquals("Samsung Galaxy S8", changedGoods.getName()); - assertEquals("Closest rival of iPhone line", changedGoods.getDescription()); - assertEquals(new Integer(80000), changedGoods.getPrice()); - assertEquals(new Integer(400), changedGoods.getQuantityInStock()); - assertEquals(new Integer(150), changedGoods.getQuantityReserved()); - assertNotNull(changedGoods.getId()); + assertNotNull(unreservedGoods); + assertEquals("Skis", unreservedGoods.getName()); + assertEquals("Mountain skis", unreservedGoods.getDescription()); + assertEquals(new Integer(5000), unreservedGoods.getPrice()); + assertEquals(new Integer(600), unreservedGoods.getQuantityInStock()); + assertEquals(new Integer(200), unreservedGoods.getQuantityReserved()); + assertNotNull(unreservedGoods.getId()); + + return unreservedGoods; + } - return reservedGoods; + private Goods buy(Goods reservedGoods) { + reservedGoods.setQuantityInStock(reservedGoods.getQuantityReserved() - 10); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + + HttpEntity httpEntity = new HttpEntity<>(reservedGoods, httpHeaders); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ROOT + BUY) + .queryParam("id", reservedGoods.getId()) + .queryParam("quantity", 10); + + + RestTemplate restTemplate = new RestTemplate(); + Goods boughtGoods = restTemplate.exchange( + builder.build().encode().toUri(), + HttpMethod.POST, + httpEntity, + Goods.class).getBody(); + assertNotNull(boughtGoods); + assertEquals("Skis", boughtGoods.getName()); + assertEquals("Mountain skis", boughtGoods.getDescription()); + assertEquals(new Integer(5000), boughtGoods.getPrice()); + assertEquals(new Integer(590), boughtGoods.getQuantityInStock()); + assertEquals(new Integer(200), boughtGoods.getQuantityReserved()); + assertNotNull(boughtGoods.getId()); + + return boughtGoods; } } From aeefe6c1fc783f5a014ca436e8f9903b2135acdf Mon Sep 17 00:00:00 2001 From: artemkov Date: Mon, 9 Oct 2017 01:38:03 +0300 Subject: [PATCH 15/20] Added Feedback functionality --- .../FeedbackControllerIntegrationTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java diff --git a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java new file mode 100644 index 0000000..fafce5f --- /dev/null +++ b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java @@ -0,0 +1,66 @@ +package io.khasang.bazaar; + +import io.khasang.bazaar.entity.Feedback; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class FeedbackControllerIntegrationTest { + private final String ROOT = "http://localhost:8080/feedback"; + private final String ADD = "/add"; + private final String GET_BY_ID = "/get/id"; + private final String GET_ALL_BY_USER_ID = "/get/byuser"; + private final String GET_ALL_BY_GOOD_ID = "/get/bygood"; + + @Test + public void getFeedbackByUserId() { + RestTemplate restTemplate = new RestTemplate(); + createfeedback(); + Feedback createdFeedback = createfeedback(); + + ResponseEntity> result = restTemplate.exchange( + ROOT + GET_ALL_BY_USER_ID+"/{user_id}", + HttpMethod.GET, + null, + new ParameterizedTypeReference>(){}, + createdFeedback.getUser_id() + ); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotNull(result.getBody()); + } + + + private Feedback createfeedback() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + Feedback feedback = prefillFeedback(); + HttpEntity httpEntity = new HttpEntity<>(feedback, httpHeaders); + RestTemplate restTemplate = new RestTemplate(); + Feedback createdFeedback = restTemplate.exchange( + ROOT + ADD, + HttpMethod.PUT, + httpEntity, + Feedback.class).getBody(); + assertNotNull(createdFeedback); + assertEquals((Long)1L,createdFeedback.getUser_id()); + assertEquals((Long)1L,createdFeedback.getGood_id()); + assertNotNull(createdFeedback.getId()); + return createdFeedback; + } + + private Feedback prefillFeedback() { + Feedback feedback = new Feedback(); + feedback.setMessage("It's a test message by user 1 about good 1"); + feedback.setUser_id(1L); + feedback.setGood_id(1L); + return feedback; + } +} From d9fa5f2a6613eee2363966c7fca384af5abed0dc Mon Sep 17 00:00:00 2001 From: artemkov Date: Mon, 9 Oct 2017 19:41:51 +0300 Subject: [PATCH 16/20] Added Feedback functionality --- .../bazaar/controller/FeedbackController.java | 62 +++++++++++++ .../io/khasang/bazaar/dao/FeedbackDao.java | 31 +++++++ .../bazaar/dao/impl/FeedbackDaoImpl.java | 52 +++++++++++ .../io/khasang/bazaar/entity/Feedback.java | 89 +++++++++++++++++++ .../bazaar/service/FeedbackService.java | 63 +++++++++++++ .../bazaar/service/impl/CatServiceImpl.java | 4 +- .../service/impl/FeedbackServiceImpl.java | 51 +++++++++++ 7 files changed, 350 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/khasang/bazaar/controller/FeedbackController.java create mode 100644 src/main/java/io/khasang/bazaar/dao/FeedbackDao.java create mode 100644 src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java create mode 100644 src/main/java/io/khasang/bazaar/entity/Feedback.java create mode 100644 src/main/java/io/khasang/bazaar/service/FeedbackService.java create mode 100644 src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java diff --git a/src/main/java/io/khasang/bazaar/controller/FeedbackController.java b/src/main/java/io/khasang/bazaar/controller/FeedbackController.java new file mode 100644 index 0000000..63d1309 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/controller/FeedbackController.java @@ -0,0 +1,62 @@ +package io.khasang.bazaar.controller; + +import io.khasang.bazaar.entity.Feedback; +import io.khasang.bazaar.service.FeedbackService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping(value = "/feedback") +public class FeedbackController { + private final FeedbackService feedbackService; + + @Autowired + public FeedbackController(FeedbackService feedbackService) { + this.feedbackService = feedbackService; + } + + @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) + @ResponseBody + public Feedback getCatById(@PathVariable(value = "id") String id) { + return feedbackService.getById(Long.parseLong(id)); + } + + @RequestMapping(value = "/add", method = RequestMethod.PUT, produces = "application/json;charset=utf-8") + @ResponseBody + public Feedback addFeedback(@RequestBody Feedback feedback) { + return feedbackService.addFeedback(feedback); + } + + @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Feedback updateFeedback(@RequestBody Feedback feedback) { + return feedbackService.updateFeedback(feedback); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + public Feedback deleteFeedback(@RequestParam(value = "id") String id){ + return feedbackService.deleteFeedback(Long.parseLong(id)); + } + + @RequestMapping(value = "/get/byuser/{user_id}", method = RequestMethod.GET) + @ResponseBody + public List getFeedbacksByUser(@PathVariable(value = "user_id") String user_id){ + return feedbackService.getFeedbacksByUser(Long.parseLong(user_id)); + } + + @RequestMapping(value = "/get/bygood/{good_id}", method = RequestMethod.GET) + @ResponseBody + public List getFeedbacksByGood(@PathVariable(value = "good_id") String good_id){ + return feedbackService.getFeedbacksByGood(Long.parseLong(good_id)); + } + + @RequestMapping(value = "/get/avgratingbygood/{good_id}", method = RequestMethod.GET) + @ResponseBody + public Double getGoodAverageFeedbackRating(@PathVariable(value = "good_id") String good_id){ + return feedbackService.getGoodAverageFeedbackRating(Long.parseLong(good_id)); + } +} diff --git a/src/main/java/io/khasang/bazaar/dao/FeedbackDao.java b/src/main/java/io/khasang/bazaar/dao/FeedbackDao.java new file mode 100644 index 0000000..43355ec --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/FeedbackDao.java @@ -0,0 +1,31 @@ +package io.khasang.bazaar.dao; + +import io.khasang.bazaar.entity.Feedback; + +import java.util.List; + +public interface FeedbackDao extends BasicDao { + /** + * Receive all feedback records from database made by user specified by his id + * + * @param user_id - user's id + * @return list of feedback records + */ + List getFeedbacksByUser(Long user_id); + + /** + * Receive all feedback records from database about some good item specified by it's id + * + * @param good_id - good's id + * @return list of feedback records + */ + List getFeedbacksByGood(Long good_id); + + /** + * Receive average feedback rating for good item specified by it's id + * + * @param good_id - good's id + * @return list of feedback records + */ + Double getGoodAverageFeedbackRating(Long good_id); +} diff --git a/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java new file mode 100644 index 0000000..ff1abcc --- /dev/null +++ b/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java @@ -0,0 +1,52 @@ +package io.khasang.bazaar.dao.impl; + +import io.khasang.bazaar.dao.FeedbackDao; +import io.khasang.bazaar.entity.Feedback; + +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.List; + +public class FeedbackDaoImpl extends BasicDaoImpl implements FeedbackDao{ + public FeedbackDaoImpl(Class entityClass) { + super(entityClass); + } + + @Override + public List getFeedbacksByUser(Long user_id) { + List results = getQuery("user_id",user_id).getResultList(); + return results; + } + + @Override + public List getFeedbacksByGood(Long good_id) { + List results = getQuery("good_id",good_id).getResultList(); + return results; + } + + @Override + public Double getGoodAverageFeedbackRating(Long good_id) { + CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(Feedback.class); + Root feedback= criteriaQuery.from(Feedback.class); + criteriaQuery.select(builder.avg(feedback.get("rating"))); + Predicate where = builder.equal(feedback.get("good_id"),good_id); + criteriaQuery.where(where); + Query query = sessionFactory.getCurrentSession().createQuery(criteriaQuery); + Double result = (Double)query.getSingleResult(); + return result; + } + + private Query getQuery (String idName, Long idVal){ + CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(Feedback.class); + Root root = criteriaQuery.from(Feedback.class); + criteriaQuery.select(root); + Predicate where = builder.equal(root.get(idName),idVal); + criteriaQuery.where(where); + return sessionFactory.getCurrentSession().createQuery(criteriaQuery); + } +} \ No newline at end of file diff --git a/src/main/java/io/khasang/bazaar/entity/Feedback.java b/src/main/java/io/khasang/bazaar/entity/Feedback.java new file mode 100644 index 0000000..2dcdaf8 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/entity/Feedback.java @@ -0,0 +1,89 @@ +package io.khasang.bazaar.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "feedback") +public class Feedback { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String message; + + @Column(name="user_id") + private Long user_id; + + @Column(name="good_id") + private Long good_id; + + @Column(name="rating") + private Short feedbackRating; + + public Feedback() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Feedback feedback = (Feedback) o; + + if (!id.equals(feedback.id)) return false; + if (message != null ? !message.equals(feedback.message) : feedback.message != null) return false; + if (user_id != null ? !user_id.equals(feedback.user_id) : feedback.user_id != null) return false; + if (good_id != null ? !good_id.equals(feedback.good_id) : feedback.good_id != null) return false; + return feedbackRating != null ? feedbackRating.equals(feedback.feedbackRating) : feedback.feedbackRating == null; + } + + @Override + public int hashCode() { + int result = id.hashCode(); + result = 31 * result + (message != null ? message.hashCode() : 0); + result = 31 * result + (user_id != null ? user_id.hashCode() : 0); + result = 31 * result + (good_id != null ? good_id.hashCode() : 0); + result = 31 * result + (feedbackRating != null ? feedbackRating.hashCode() : 0); + return result; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Long getUser_id() { + return user_id; + } + + public void setUser_id(Long user_id) { + this.user_id = user_id; + } + + public Long getGood_id() { + return good_id; + } + + public void setGood_id(Long good_id) { + this.good_id = good_id; + } + + public Short getFeedbackRating() { + return feedbackRating; + } + + public void setFeedbackRating(Short feedbackRating) { + this.feedbackRating = feedbackRating; + } +} diff --git a/src/main/java/io/khasang/bazaar/service/FeedbackService.java b/src/main/java/io/khasang/bazaar/service/FeedbackService.java new file mode 100644 index 0000000..96b0d52 --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/FeedbackService.java @@ -0,0 +1,63 @@ +package io.khasang.bazaar.service; + +import io.khasang.bazaar.entity.Feedback; + +import java.util.List; + +public interface FeedbackService { + /** + * Receive Feedback by id + * + * @param id - feedback's id what we want to receive + * @return feedback + */ + Feedback getById(Long id); + + /** + * Create feedback at database + * + * @param feedback - feedback for creation + * @return feedback + */ + Feedback addFeedback(Feedback feedback); + + /** + * Update feedback at database + * + * @param feedback - feedback to update + * @return feedback + */ + Feedback updateFeedback(Feedback feedback); + + /** + * Receive all feedback records from database made by user specified by his id + * + * @param user_id - user's id + * @return list of feedback records + */ + List getFeedbacksByUser(Long user_id); + + /** + * Receive all feedback records from database about some good item specified by it's id + * + * @param good_id - good's id + * @return list of feedback records + */ + List getFeedbacksByGood(Long good_id); + + /** + * Receive average feedback rating for good item specified by it's id + * + * @param good_id - good's id + * @return list of feedback records + */ + Double getGoodAverageFeedbackRating(Long good_id); + + /** + * Delete feedbacks from database + * + * @param id - feedbacks's id for delete + * @return feedback + */ + Feedback deleteFeedback (Long id); +} diff --git a/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java index 49d716f..306fd7b 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/CatServiceImpl.java @@ -31,12 +31,12 @@ public Cat deleteCat(Long id) { @Override public Cat addCat(Cat cat) { - return catDao.addCat(cat); + return catDao.add(cat); } @Override public Cat updateCat(Cat cat) { - return catDao.updateCat(cat); + return catDao.update(cat); } @Override diff --git a/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java new file mode 100644 index 0000000..51f8fcd --- /dev/null +++ b/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java @@ -0,0 +1,51 @@ +package io.khasang.bazaar.service.impl; + +import io.khasang.bazaar.dao.FeedbackDao; +import io.khasang.bazaar.entity.Feedback; +import io.khasang.bazaar.service.FeedbackService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("feedbackService") +public class FeedbackServiceImpl implements FeedbackService { + @Autowired + private FeedbackDao feedbackDao; + + @Override + public Feedback getById(Long id) { + return feedbackDao.getById(id); + } + + @Override + public Feedback addFeedback(Feedback feedback) { + return feedbackDao.add(feedback); + } + + @Override + public Feedback updateFeedback(Feedback feedback) { + return feedbackDao.update(feedback); + } + + @Override + public List getFeedbacksByUser(Long user_id) { + return feedbackDao.getFeedbacksByUser(user_id); + } + + @Override + public List getFeedbacksByGood(Long good_id) { + return feedbackDao.getFeedbacksByGood(good_id); + } + + @Override + public Double getGoodAverageFeedbackRating(Long good_id) { + return feedbackDao.getGoodAverageFeedbackRating(good_id); + } + + @Override + public Feedback deleteFeedback(Long id) { + Feedback feedback = getById(id); + return feedbackDao.delete(feedback); + } +} From 416ae0b63c75a5930437e9500d1ca32c84ecf32b Mon Sep 17 00:00:00 2001 From: artemkov Date: Wed, 18 Oct 2017 20:39:38 +0300 Subject: [PATCH 17/20] Added Feedback tests --- .../io/khasang/bazaar/FeedbackControllerIntegrationTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java index fafce5f..287bd74 100644 --- a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java @@ -37,7 +37,6 @@ public void getFeedbackByUserId() { assertNotNull(result.getBody()); } - private Feedback createfeedback() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); @@ -52,6 +51,7 @@ private Feedback createfeedback() { assertNotNull(createdFeedback); assertEquals((Long)1L,createdFeedback.getUser_id()); assertEquals((Long)1L,createdFeedback.getGood_id()); + assertEquals(java.util.Optional.of(5),createdFeedback.getFeedbackRating()); assertNotNull(createdFeedback.getId()); return createdFeedback; } @@ -61,6 +61,7 @@ private Feedback prefillFeedback() { feedback.setMessage("It's a test message by user 1 about good 1"); feedback.setUser_id(1L); feedback.setGood_id(1L); + feedback.setFeedbackRating((short)5); return feedback; } } From fc10a688c749763b007620570b3cc531241a27c5 Mon Sep 17 00:00:00 2001 From: artemkov Date: Sun, 22 Oct 2017 09:37:29 +0300 Subject: [PATCH 18/20] Added Feedback tests --- .../java/io/khasang/bazaar/config/HibernateConfig.java | 1 + .../io/khasang/bazaar/config/application/AppConfig.java | 8 ++++++++ .../io/khasang/bazaar/controller/FeedbackController.java | 2 +- .../khasang/bazaar/service/impl/FeedbackServiceImpl.java | 2 +- src/main/resources/hibernate.properties | 2 +- .../khasang/bazaar/FeedbackControllerIntegrationTest.java | 3 +-- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/khasang/bazaar/config/HibernateConfig.java b/src/main/java/io/khasang/bazaar/config/HibernateConfig.java index 6a39a11..ebf20f8 100644 --- a/src/main/java/io/khasang/bazaar/config/HibernateConfig.java +++ b/src/main/java/io/khasang/bazaar/config/HibernateConfig.java @@ -45,6 +45,7 @@ public LocalSessionFactoryBean sessionFactory(){ return sessionFactory; } + private Properties hibernateProperties(){ Properties properties = new Properties(); properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); diff --git a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java index 330a3e7..44f3566 100644 --- a/src/main/java/io/khasang/bazaar/config/application/AppConfig.java +++ b/src/main/java/io/khasang/bazaar/config/application/AppConfig.java @@ -1,8 +1,11 @@ package io.khasang.bazaar.config.application; import io.khasang.bazaar.dao.CatDao; +import io.khasang.bazaar.dao.FeedbackDao; import io.khasang.bazaar.dao.impl.CatDaoImpl; +import io.khasang.bazaar.dao.impl.FeedbackDaoImpl; import io.khasang.bazaar.entity.Cat; +import io.khasang.bazaar.entity.Feedback; import io.khasang.bazaar.model.CreateTable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -56,4 +59,9 @@ public CreateTable createTable(){ public CatDao catDao(){ return new CatDaoImpl(Cat.class); } + + @Bean + public FeedbackDao feedbackDao() { + return new FeedbackDaoImpl(Feedback.class); + } } diff --git a/src/main/java/io/khasang/bazaar/controller/FeedbackController.java b/src/main/java/io/khasang/bazaar/controller/FeedbackController.java index 63d1309..524fb38 100644 --- a/src/main/java/io/khasang/bazaar/controller/FeedbackController.java +++ b/src/main/java/io/khasang/bazaar/controller/FeedbackController.java @@ -20,7 +20,7 @@ public FeedbackController(FeedbackService feedbackService) { @RequestMapping(value = "/get/id/{id}", method = RequestMethod.GET) @ResponseBody - public Feedback getCatById(@PathVariable(value = "id") String id) { + public Feedback getFeedbackById(@PathVariable(value = "id") String id) { return feedbackService.getById(Long.parseLong(id)); } diff --git a/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java index 51f8fcd..5eba276 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/FeedbackServiceImpl.java @@ -11,7 +11,7 @@ @Service("feedbackService") public class FeedbackServiceImpl implements FeedbackService { @Autowired - private FeedbackDao feedbackDao; + public FeedbackDao feedbackDao; @Override public Feedback getById(Long id) { diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties index 2b0a6e8..c7c6766 100644 --- a/src/main/resources/hibernate.properties +++ b/src/main/resources/hibernate.properties @@ -5,5 +5,5 @@ hibernate.password=root hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql=true hibernate.format_sql=true -hibernate.hbm2ddl.auto=update +hibernate.hbm2ddl.auto=create diff --git a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java index 287bd74..e30a834 100644 --- a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java @@ -6,7 +6,6 @@ import org.springframework.http.*; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; @@ -51,7 +50,7 @@ private Feedback createfeedback() { assertNotNull(createdFeedback); assertEquals((Long)1L,createdFeedback.getUser_id()); assertEquals((Long)1L,createdFeedback.getGood_id()); - assertEquals(java.util.Optional.of(5),createdFeedback.getFeedbackRating()); + //assertEquals(java.util.Optional.of(5),createdFeedback.getFeedbackRating()); assertNotNull(createdFeedback.getId()); return createdFeedback; } From e4f13d6bfcc6051111c8ccbb028711c357d75f07 Mon Sep 17 00:00:00 2001 From: artemkov Date: Sun, 22 Oct 2017 10:02:39 +0300 Subject: [PATCH 19/20] =?UTF-8?q?=D0=A1=D0=BB=D0=B8=D0=BB=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/khasang/bazaar/CatControllerIntegrationTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/io/khasang/bazaar/CatControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/CatControllerIntegrationTest.java index 1452ec8..5281e58 100644 --- a/src/test/java/io/khasang/bazaar/CatControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/CatControllerIntegrationTest.java @@ -34,8 +34,8 @@ public void addCat() { Cat receivedCat = responseEntity.getBody(); assertEquals("OK", responseEntity.getStatusCode().getReasonPhrase()); assertNotNull(receivedCat); - assertNotNull(receivedCat.getCatWomanList()); - assertEquals("Murka", receivedCat.getCatWomanList().get(1).getName()); + //assertNotNull(receivedCat.getCatWomanList()); + //assertEquals("Murka", receivedCat.getCatWomanList().get(1).getName()); assertEquals(cat.getName(), receivedCat.getName()); } @@ -93,7 +93,7 @@ private Cat prefillCat() { List list = new ArrayList<>(); list.add(catWoman1); list.add(catWoman2); - cat.setCatWomanList(list); + //cat.setCatWomanList(list); return cat; } From 9e84e20b7ab10cefe686f1c493bcdd9bfa7f2e47 Mon Sep 17 00:00:00 2001 From: artemkov Date: Sun, 22 Oct 2017 16:40:39 +0300 Subject: [PATCH 20/20] =?UTF-8?q?=D0=A1=D0=BB=D0=B8=D0=BB=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/GoodsCategoryController.java | 1 + .../khasang/bazaar/dao/GoodsCategoryDao.java | 2 ++ .../java/io/khasang/bazaar/dao/GoodsDao.java | 2 ++ .../bazaar/dao/impl/FeedbackDaoImpl.java | 6 ++--- .../bazaar/dao/impl/GoodsCategoryDaoImpl.java | 1 + .../io/khasang/bazaar/entity/Feedback.java | 22 ++++++++++++------- .../java/io/khasang/bazaar/entity/Goods.java | 5 ++--- .../khasang/bazaar/entity/GoodsCategory.java | 4 +++- .../bazaar/service/GoodsCategoryService.java | 7 ++++++ .../khasang/bazaar/service/GoodsService.java | 16 +++++++++++--- .../impl/GoodsCategoryServiceImpl.java | 1 + .../bazaar/service/impl/GoodsServiceImpl.java | 1 + .../FeedbackControllerIntegrationTest.java | 5 +++++ web/WEB-INF/views/table.jsp | 2 +- web/WEB-INF/views/user.jsp | 2 +- 15 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java index 7028547..40eeac7 100644 --- a/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java +++ b/src/main/java/io/khasang/bazaar/controller/GoodsCategoryController.java @@ -10,6 +10,7 @@ /** * Controller for Goods Category entity. + * * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java index 0949d75..86d318b 100644 --- a/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java +++ b/src/main/java/io/khasang/bazaar/dao/GoodsCategoryDao.java @@ -6,12 +6,14 @@ /** * Interface for representing DAO for GoodsCategory entity. + * * @author Zulfia Garifullina * @date 26.09.2017. */ public interface GoodsCategoryDao extends BasicDao { /** * Method for retrieving goods categories from the database by their name. + * * @param name - name of the category * @return - returns all the goods categories with the given name */ diff --git a/src/main/java/io/khasang/bazaar/dao/GoodsDao.java b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java index 8b9395c..126b440 100644 --- a/src/main/java/io/khasang/bazaar/dao/GoodsDao.java +++ b/src/main/java/io/khasang/bazaar/dao/GoodsDao.java @@ -6,12 +6,14 @@ /** * Interface for representing DAO for Goods entity. + * * @author Zulfia Garifullina * @date 04.10.2017. */ public interface GoodsDao extends BasicDao { /** * Method for retrieving goods from the database by their name. + * * @param name - name of the goods * @return goods with the given name */ diff --git a/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java index ff1abcc..c5192c0 100644 --- a/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java +++ b/src/main/java/io/khasang/bazaar/dao/impl/FeedbackDaoImpl.java @@ -17,13 +17,13 @@ public FeedbackDaoImpl(Class entityClass) { @Override public List getFeedbacksByUser(Long user_id) { - List results = getQuery("user_id",user_id).getResultList(); + List results = getFeedbackSelectQuery("user_id", user_id).getResultList(); return results; } @Override public List getFeedbacksByGood(Long good_id) { - List results = getQuery("good_id",good_id).getResultList(); + List results = getFeedbackSelectQuery("good_id", good_id).getResultList(); return results; } @@ -40,7 +40,7 @@ public Double getGoodAverageFeedbackRating(Long good_id) { return result; } - private Query getQuery (String idName, Long idVal){ + private Query getFeedbackSelectQuery(String idName, Long idVal) { CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); CriteriaQuery criteriaQuery = builder.createQuery(Feedback.class); Root root = criteriaQuery.from(Feedback.class); diff --git a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java index bb9dd9c..7dc3eb8 100644 --- a/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java +++ b/src/main/java/io/khasang/bazaar/dao/impl/GoodsCategoryDaoImpl.java @@ -7,6 +7,7 @@ /** * Implementation of GoodsCategoryDao interface for representing DAO for Goods Category entity. + * * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/entity/Feedback.java b/src/main/java/io/khasang/bazaar/entity/Feedback.java index 2dcdaf8..035f073 100644 --- a/src/main/java/io/khasang/bazaar/entity/Feedback.java +++ b/src/main/java/io/khasang/bazaar/entity/Feedback.java @@ -2,6 +2,11 @@ import javax.persistence.*; +/** + * This class describes a database entity that represents feedback made by users about goods they buy. + * + * @author Artem Kovalev + */ @Entity @Table(name = "feedback") public class Feedback { @@ -14,8 +19,9 @@ public class Feedback { @Column(name="user_id") private Long user_id; - @Column(name="good_id") - private Long good_id; + @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JoinColumn(name = "goods_id") + private Goods good; @Column(name="rating") private Short feedbackRating; @@ -33,7 +39,7 @@ public boolean equals(Object o) { if (!id.equals(feedback.id)) return false; if (message != null ? !message.equals(feedback.message) : feedback.message != null) return false; if (user_id != null ? !user_id.equals(feedback.user_id) : feedback.user_id != null) return false; - if (good_id != null ? !good_id.equals(feedback.good_id) : feedback.good_id != null) return false; + if (good != null ? !good.equals(feedback.good) : feedback.good != null) return false; return feedbackRating != null ? feedbackRating.equals(feedback.feedbackRating) : feedback.feedbackRating == null; } @@ -42,7 +48,7 @@ public int hashCode() { int result = id.hashCode(); result = 31 * result + (message != null ? message.hashCode() : 0); result = 31 * result + (user_id != null ? user_id.hashCode() : 0); - result = 31 * result + (good_id != null ? good_id.hashCode() : 0); + result = 31 * result + (good != null ? good.hashCode() : 0); result = 31 * result + (feedbackRating != null ? feedbackRating.hashCode() : 0); return result; } @@ -71,12 +77,12 @@ public void setUser_id(Long user_id) { this.user_id = user_id; } - public Long getGood_id() { - return good_id; + public Goods getGood() { + return good; } - public void setGood_id(Long good_id) { - this.good_id = good_id; + public void setGoods(Goods good) { + this.good = good; } public Short getFeedbackRating() { diff --git a/src/main/java/io/khasang/bazaar/entity/Goods.java b/src/main/java/io/khasang/bazaar/entity/Goods.java index e5c19eb..f8a73ef 100644 --- a/src/main/java/io/khasang/bazaar/entity/Goods.java +++ b/src/main/java/io/khasang/bazaar/entity/Goods.java @@ -1,10 +1,9 @@ package io.khasang.bazaar.entity; -import org.springframework.stereotype.Controller; - import javax.persistence.*; -/** This class describes a database entity that represents goods for sale. +/** + * This class describes a database entity that represents goods for sale. * * @author Zulfia Garifullina * @date 03.10.2017. diff --git a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java index 1550bc7..093d967 100644 --- a/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java +++ b/src/main/java/io/khasang/bazaar/entity/GoodsCategory.java @@ -2,7 +2,9 @@ import javax.persistence.*; -/** This class describes a database entity that represents categories of goods +/** + * This class describes a database entity that represents categories of goods + * * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java index cd7f961..f69b918 100644 --- a/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java +++ b/src/main/java/io/khasang/bazaar/service/GoodsCategoryService.java @@ -6,12 +6,14 @@ /** * Service interface for Goods Category entity. + * * @author Zulfia Garifullina * @date 26.09.2017. */ public interface GoodsCategoryService { /** * Method for retrieving goods categories by their database id. + * * @param id - id of the category in the database * @return a category of goods with given id */ @@ -19,6 +21,7 @@ public interface GoodsCategoryService { /** * Method for retrieving goods categories from the database by their name. + * * @param name - name of the category * @return all the goods categories with the given name */ @@ -26,6 +29,7 @@ public interface GoodsCategoryService { /** * Method for adding a new goods category to the database table + * * @param goodsCategory - the object being added to the database table as a row * @return the object that was added */ @@ -33,6 +37,7 @@ public interface GoodsCategoryService { /** * Method for updating a goods category in the database + * * @param goodsCategory - the object being updated in the database * @return the goods category that was updated */ @@ -40,6 +45,7 @@ public interface GoodsCategoryService { /** * Deletes the goods category with the specified id from the database + * * @param id - database id of the goods category that needs to be deleted * @return the deleted goods category */ @@ -47,6 +53,7 @@ public interface GoodsCategoryService { /** * Method returns all the goods categories from the corresponding table in the database. + * * @return a List of goods categories objects from the database table. */ List getList(); diff --git a/src/main/java/io/khasang/bazaar/service/GoodsService.java b/src/main/java/io/khasang/bazaar/service/GoodsService.java index 0c12f60..e633d79 100644 --- a/src/main/java/io/khasang/bazaar/service/GoodsService.java +++ b/src/main/java/io/khasang/bazaar/service/GoodsService.java @@ -6,12 +6,14 @@ /** * Service interface for Goods entity. + * * @author Zulfia Garifullina * @date 04.10.2017. */ public interface GoodsService { /** * Method for retrieving goods by their database id. + * * @param id - id of the goods in the database * @return goods with given id */ @@ -19,6 +21,7 @@ public interface GoodsService { /** * Method for retrieving goods from the database by their name. + * * @param name - name of the goods * @return all the goods with the given name */ @@ -26,6 +29,7 @@ public interface GoodsService { /** * Method for adding new goods to the database table + * * @param goods- the object being added to the database table as a row * @return the goods that was added */ @@ -33,6 +37,7 @@ public interface GoodsService { /** * Method for updating goods in the database + * * @param goods - the object being updated in the database * @return the goods that were updated */ @@ -40,6 +45,7 @@ public interface GoodsService { /** * Deletes the goods with the specified id from the database + * * @param id database id of the goods that needs to be deleted * @return the deleted goods */ @@ -47,6 +53,7 @@ public interface GoodsService { /** * Method returns all the goods from the corresponding table in the database. + * * @return a List of goods objects from the database table. */ List getList(); @@ -54,7 +61,8 @@ public interface GoodsService { /** * Reserves a specified amount of goods and reduces the amount in stock by that number. * This method should be called before processing order payment. - * @param id database id for chosen goods + * + * @param id database id for chosen goods * @param quantity quantity to be reserved * @return goods that were reserved */ @@ -63,7 +71,8 @@ public interface GoodsService { /** * Cancels reservation on a specified amount of goods and increases the amount in stock by that number. * This method should be called if processing order payment failed. - * @param id database id for chosen goods + * + * @param id database id for chosen goods * @param quantity quantity to be removed from reserved and added back to quantity in stock * @return goods that were removed from reserved and added back to quantity in stock */ @@ -72,7 +81,8 @@ public interface GoodsService { /** * Reduces the amount of goods which were reserved before payment processing, by the specified amount. * This method should be called after successful processing of order payment. - * @param id database id for chosen goods + * + * @param id database id for chosen goods * @param quantity amount by which reserved quantity is reduced * @return goods for which reserved quantity was reduced */ diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java index 4341f8a..01876be 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsCategoryServiceImpl.java @@ -10,6 +10,7 @@ /** * Implementation of the service interface for Goods Category entity. + * * @author Zulfia Garifullina * @date 26.09.2017. */ diff --git a/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java index 963ef06..aca1140 100644 --- a/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java +++ b/src/main/java/io/khasang/bazaar/service/impl/GoodsServiceImpl.java @@ -10,6 +10,7 @@ /** * Implementation of the service interface for Goods entity. + * * @author Zulfia Garifullina * @date 04.10.2017. */ diff --git a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java index e30a834..2461ec7 100644 --- a/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java +++ b/src/test/java/io/khasang/bazaar/FeedbackControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.khasang.bazaar; import io.khasang.bazaar.entity.Feedback; +import io.khasang.bazaar.entity.Goods; import org.junit.Test; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; @@ -55,6 +56,10 @@ private Feedback createfeedback() { return createdFeedback; } + private Goods prefillGoods() { + + } + private Feedback prefillFeedback() { Feedback feedback = new Feedback(); feedback.setMessage("It's a test message by user 1 about good 1"); diff --git a/web/WEB-INF/views/table.jsp b/web/WEB-INF/views/table.jsp index b8d2237..8f1c303 100644 --- a/web/WEB-INF/views/table.jsp +++ b/web/WEB-INF/views/table.jsp @@ -4,6 +4,6 @@ Title -

${status}

+

${status}

diff --git a/web/WEB-INF/views/user.jsp b/web/WEB-INF/views/user.jsp index 4b58c55..eccc843 100644 --- a/web/WEB-INF/views/user.jsp +++ b/web/WEB-INF/views/user.jsp @@ -11,6 +11,6 @@ Title - ${secure} +${secure}