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..5616170 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,89 @@ 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", userId); + + + if (meal.isNew()) { + Number newKey = insertMeal.executeAndReturnKey(map); + meal.setId(newKey.intValue()); + } else { + + 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; } @Override public boolean delete(int id, int userId) { - return false; + return jdbcTemplate.update("DELETE FROM meals WHERE id=? and userId = ? ", id, userId) != 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; + + 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/initDB.sql b/src/main/resources/db/initDB.sql index a0631c7..b11bfaa 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) ON DELETE CASCADE +); + diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql index 199e2ac..d34c5e1 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,17 @@ VALUES ('Admin', 'admin@gmail.com', 'admin'); 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 , 100000), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100000), + (now()+ interval '1 hour', 'Катлетос', 800 , 100000), + (now()+ interval '1 minute', 'Сасисон', 800 , 100000), + (now(), 'Кекс', 800 , 100000), + (now(), 'Сасисон', 800 , 100001), + (now()+ interval '1 hour', 'Катлетос', 800 , 100001), + (now()+ interval '1 minute', 'Кекс', 800 , 100001), + (TIMESTAMP 'yesterday', 'Катлетос', 800 , 100001), + (TIMESTAMP 'yesterday', 'Сасисон', 800 , 100001); 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-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 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 {