From 4ea3e4420b9d6e017dbc659b551bdca60fd3f9d9 Mon Sep 17 00:00:00 2001 From: Ivan Romanov Date: Wed, 12 Apr 2017 00:40:11 +0200 Subject: [PATCH 1/4] HW03 done main part --- .../ru/javawebinar/topjava/model/Meal.java | 22 ++++++- .../jdbc/JdbcMealRepositoryImpl.java | 64 +++++++++++++++++-- src/main/resources/db/initDB.sql | 11 ++++ src/main/resources/db/populateDB.sql | 13 ++++ src/main/resources/spring/spring-app.xml | 2 + 5 files changed, 104 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/javawebinar/topjava/model/Meal.java b/src/main/java/ru/javawebinar/topjava/model/Meal.java index 74e0de0..88d4106 100644 --- a/src/main/java/ru/javawebinar/topjava/model/Meal.java +++ b/src/main/java/ru/javawebinar/topjava/model/Meal.java @@ -9,11 +9,15 @@ * 11.01.2015. */ public class Meal extends BaseEntity { - private final LocalDateTime dateTime; + private LocalDateTime dateTime; - private final String description; + private String description; - private final int calories; + private int calories; + + public Meal(){ + super(); + } public Meal(LocalDateTime dateTime, String description, int calories) { this(null, dateTime, description, calories); @@ -46,6 +50,18 @@ public LocalTime getTime() { return dateTime.toLocalTime(); } + public void setDateTime(LocalDateTime dateTime) { + this.dateTime = dateTime; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setCalories(int calories) { + this.calories = calories; + } + @Override public String toString() { return "Meal{" + diff --git a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java index 3e48b40..2412281 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java @@ -1,37 +1,91 @@ package ru.javawebinar.topjava.repository.jdbc; +import org.springframework.dao.support.DataAccessUtils; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import org.springframework.stereotype.Repository; +import ru.javawebinar.topjava.AuthorizedUser; import ru.javawebinar.topjava.model.Meal; import ru.javawebinar.topjava.repository.MealRepository; +import ru.javawebinar.topjava.util.DateTimeUtil; +import javax.sql.DataSource; import java.time.LocalDateTime; +import java.util.Iterator; import java.util.List; @Repository public class JdbcMealRepositoryImpl implements MealRepository { + public static final BeanPropertyRowMapper ROW_MAPPER = BeanPropertyRowMapper.newInstance(Meal.class); + + private final JdbcTemplate jdbcTemplate; + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final SimpleJdbcInsert insertMeal; + + public JdbcMealRepositoryImpl(DataSource dataSource, JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.insertMeal = new SimpleJdbcInsert(dataSource) + .withTableName("meals") + .usingGeneratedKeyColumns("id"); + + this.jdbcTemplate = jdbcTemplate; + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + @Override public Meal save(Meal meal, int userId) { - return null; + MapSqlParameterSource map = new MapSqlParameterSource() + .addValue("id", meal.getId()) + .addValue("dateTime", meal.getDateTime()) + .addValue("description", meal.getDescription()) + .addValue("calories", meal.getCalories()) + .addValue("userId", AuthorizedUser.id()); + + if (meal.isNew()){ + Number newKey = insertMeal.executeAndReturnKey(map); + meal.setId(newKey.intValue()); + }else{ + namedParameterJdbcTemplate.update( + "UPDATE meals SET dateTime=:dateTime, description=:description, calories=:calories " + + "where id=:id", map + ); + } + + return meal; } @Override public boolean delete(int id, int userId) { - return false; + return jdbcTemplate.update("DELETE FROM meals WHERE id=? and userId = ? ", id , AuthorizedUser.id()) != 0; } @Override public Meal get(int id, int userId) { - return null; + List meals = jdbcTemplate.query("SELECT * FROM meals WHERE id =? and userId = ?", ROW_MAPPER, id, userId); + return DataAccessUtils.singleResult(meals); } @Override public List getAll(int userId) { - return null; + return jdbcTemplate.query("SELECT * FROM meals WHERE userId = ? ORDER BY dateTime DESC", ROW_MAPPER, userId); } @Override public List getBetween(LocalDateTime startDate, LocalDateTime endDate, int userId) { - return null; + List list = getAll(userId); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + Meal current = iterator.next(); + //Make remove if not applicable + if (!DateTimeUtil.isBetween(current.getDateTime(), startDate , endDate)){ + iterator.remove(); + } + } + return list; } } diff --git a/src/main/resources/db/initDB.sql b/src/main/resources/db/initDB.sql index a0631c7..e8c2084 100644 --- a/src/main/resources/db/initDB.sql +++ b/src/main/resources/db/initDB.sql @@ -1,3 +1,4 @@ +DROP TABLE IF EXISTS meals; DROP TABLE IF EXISTS user_roles; DROP TABLE IF EXISTS users; DROP SEQUENCE IF EXISTS global_seq; @@ -23,3 +24,13 @@ CREATE TABLE user_roles CONSTRAINT user_roles_idx UNIQUE (user_id, role), FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ); + +CREATE TABLE meals +( + id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'), + dateTime TIMESTAMP NOT NULL, + description VARCHAR NOT NULL, + calories INTEGER NOT NULL, + userId INTEGER REFERENCES users(id) +); + diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql index 199e2ac..0a1f1f2 100644 --- a/src/main/resources/db/populateDB.sql +++ b/src/main/resources/db/populateDB.sql @@ -1,3 +1,4 @@ +DELETE FROM meals; DELETE FROM user_roles; DELETE FROM users; ALTER SEQUENCE global_seq RESTART WITH 100000; @@ -11,3 +12,15 @@ VALUES ('Admin', 'admin@gmail.com', 'admin'); INSERT INTO user_roles (role, user_id) VALUES ('ROLE_USER', 100000), ('ROLE_ADMIN', 100001); + +INSERT INTO meals (dateTime, description, calories, userId) VALUES + (TIMESTAMP 'yesterday', 'Катлетос', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), + (now(), 'Катлетос', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), + (now(), 'Сасисон', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), + (now(), 'Кекс', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), + (now(), 'Катлетос', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), + (now(), 'Сасисон', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), + (now(), 'Кекс', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), + (TIMESTAMP 'yesterday', 'Катлетос', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')); diff --git a/src/main/resources/spring/spring-app.xml b/src/main/resources/spring/spring-app.xml index 04810da..5eafbcc 100644 --- a/src/main/resources/spring/spring-app.xml +++ b/src/main/resources/spring/spring-app.xml @@ -20,4 +20,6 @@ + + \ No newline at end of file From 3a5f80e34eacad0c8e124401b41124127de1f1ae Mon Sep 17 00:00:00 2001 From: Ivan Romanov Date: Wed, 12 Apr 2017 21:39:42 +0200 Subject: [PATCH 2/4] HW03 bug fixing --- .../jdbc/JdbcMealRepositoryImpl.java | 28 ++++++++----------- src/main/resources/db/populateDB.sql | 22 ++++++++------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java index 2412281..6a60841 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java @@ -39,29 +39,30 @@ public JdbcMealRepositoryImpl(DataSource dataSource, JdbcTemplate jdbcTemplate, @Override public Meal save(Meal meal, int userId) { + MapSqlParameterSource map = new MapSqlParameterSource() .addValue("id", meal.getId()) .addValue("dateTime", meal.getDateTime()) .addValue("description", meal.getDescription()) .addValue("calories", meal.getCalories()) - .addValue("userId", AuthorizedUser.id()); + .addValue("userId", userId); + - if (meal.isNew()){ + if (meal.isNew()) { Number newKey = insertMeal.executeAndReturnKey(map); meal.setId(newKey.intValue()); - }else{ + } else { namedParameterJdbcTemplate.update( "UPDATE meals SET dateTime=:dateTime, description=:description, calories=:calories " + - "where id=:id", map + "where id=:id and userId=:userId", map ); } - return meal; } @Override public boolean delete(int id, int userId) { - return jdbcTemplate.update("DELETE FROM meals WHERE id=? and userId = ? ", id , AuthorizedUser.id()) != 0; + return jdbcTemplate.update("DELETE FROM meals WHERE id=? and userId = ? ", id, userId) != 0; } @Override @@ -77,15 +78,10 @@ public List getAll(int userId) { @Override public List getBetween(LocalDateTime startDate, LocalDateTime endDate, int userId) { - List list = getAll(userId); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - Meal current = iterator.next(); - //Make remove if not applicable - if (!DateTimeUtil.isBetween(current.getDateTime(), startDate , endDate)){ - iterator.remove(); - } - } - return list; + + return jdbcTemplate.query("SELECT * FROM meals WHERE userId = ? " + + "and dateTime >= ? " + + "and dateTime <= ? ORDER BY dateTime DESC", + ROW_MAPPER, userId, startDate , endDate); } } diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql index 0a1f1f2..a825aba 100644 --- a/src/main/resources/db/populateDB.sql +++ b/src/main/resources/db/populateDB.sql @@ -13,14 +13,16 @@ INSERT INTO user_roles (role, user_id) VALUES ('ROLE_USER', 100000), ('ROLE_ADMIN', 100001); +SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru'; + INSERT INTO meals (dateTime, description, calories, userId) VALUES - (TIMESTAMP 'yesterday', 'Катлетос', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), - (TIMESTAMP 'yesterday', 'Сасисон', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), - (now(), 'Катлетос', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), - (now(), 'Сасисон', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), - (now(), 'Кекс', 800 , (SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru')), - (now(), 'Катлетос', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), - (now(), 'Сасисон', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), - (now(), 'Кекс', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), - (TIMESTAMP 'yesterday', 'Катлетос', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')), - (TIMESTAMP 'yesterday', 'Сасисон', 800 , (SELECT id from users WHERE name = 'Admin' and email = 'admin@gmail.com')); + (TIMESTAMP 'yesterday', 'Катлетос', 800 , 100000), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100000), + (now(), 'Катлетос', 800 , 100000), + (now(), 'Сасисон', 800 , 100000), + (now(), 'Кекс', 800 , 100000), + (now(), 'Сасисон', 800 , 100001), + (now(), 'Катлетос', 800 , 100001), + (now(), 'Кекс', 800 , 100001), + (TIMESTAMP 'yesterday', 'Катлетос', 800 , 100001), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100001); From 3884570b865f011e001779652317095a313f7c56 Mon Sep 17 00:00:00 2001 From: Ivan Romanov Date: Wed, 12 Apr 2017 22:28:45 +0200 Subject: [PATCH 3/4] HW03 bug fixing --- src/main/resources/db/populateDB.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql index a825aba..d34c5e1 100644 --- a/src/main/resources/db/populateDB.sql +++ b/src/main/resources/db/populateDB.sql @@ -18,11 +18,11 @@ SELECT id from users WHERE name = 'User' and email = 'user@yandex.ru'; INSERT INTO meals (dateTime, description, calories, userId) VALUES (TIMESTAMP 'yesterday', 'Катлетос', 800 , 100000), (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100000), - (now(), 'Катлетос', 800 , 100000), - (now(), 'Сасисон', 800 , 100000), + (now()+ interval '1 hour', 'Катлетос', 800 , 100000), + (now()+ interval '1 minute', 'Сасисон', 800 , 100000), (now(), 'Кекс', 800 , 100000), (now(), 'Сасисон', 800 , 100001), - (now(), 'Катлетос', 800 , 100001), - (now(), 'Кекс', 800 , 100001), + (now()+ interval '1 hour', 'Катлетос', 800 , 100001), + (now()+ interval '1 minute', 'Кекс', 800 , 100001), (TIMESTAMP 'yesterday', 'Катлетос', 800 , 100001), (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100001); From 34aee63e3ddba095c34d21d85bb30cd3f1bcfaeb Mon Sep 17 00:00:00 2001 From: Ivan Romanov Date: Thu, 13 Apr 2017 00:23:52 +0200 Subject: [PATCH 4/4] HW03 bug fixing --- .../topjava/repository/jdbc/JdbcMealRepositoryImpl.java | 4 +++- src/main/resources/db/initDB.sql | 2 +- src/main/resources/logback.xml | 5 +++++ src/main/resources/spring/spring-db.xml | 2 +- .../java/ru/javawebinar/topjava/service/UserServiceTest.java | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java index 6a60841..5616170 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java @@ -52,10 +52,12 @@ public Meal save(Meal meal, int userId) { Number newKey = insertMeal.executeAndReturnKey(map); meal.setId(newKey.intValue()); } else { - namedParameterJdbcTemplate.update( + + int result = namedParameterJdbcTemplate.update( "UPDATE meals SET dateTime=:dateTime, description=:description, calories=:calories " + "where id=:id and userId=:userId", map ); + if (result == 0) meal = null; } return meal; } diff --git a/src/main/resources/db/initDB.sql b/src/main/resources/db/initDB.sql index e8c2084..b11bfaa 100644 --- a/src/main/resources/db/initDB.sql +++ b/src/main/resources/db/initDB.sql @@ -31,6 +31,6 @@ CREATE TABLE meals dateTime TIMESTAMP NOT NULL, description VARCHAR NOT NULL, calories INTEGER NOT NULL, - userId INTEGER REFERENCES users(id) + userId INTEGER REFERENCES users(id) ON DELETE CASCADE ); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index e9b900b..e6fdd30 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -21,6 +21,11 @@ + + + + + diff --git a/src/main/resources/spring/spring-db.xml b/src/main/resources/spring/spring-db.xml index a9a6032..55325c7 100644 --- a/src/main/resources/spring/spring-db.xml +++ b/src/main/resources/spring/spring-db.xml @@ -6,7 +6,7 @@ - + diff --git a/src/test/java/ru/javawebinar/topjava/service/UserServiceTest.java b/src/test/java/ru/javawebinar/topjava/service/UserServiceTest.java index 8f3de6e..b28d14b 100644 --- a/src/test/java/ru/javawebinar/topjava/service/UserServiceTest.java +++ b/src/test/java/ru/javawebinar/topjava/service/UserServiceTest.java @@ -21,7 +21,7 @@ @ContextConfiguration({ "classpath:spring/spring-app.xml", - "classpath:spring/spring-db.xml" +// "classpath:spring/spring-db.xml" }) @RunWith(SpringJUnit4ClassRunner.class) public class UserServiceTest {