From cd9dbd672b2fefe020fd0be95472d46709198796 Mon Sep 17 00:00:00 2001 From: HoyoenKim Date: Sat, 28 Jan 2023 22:40:11 +0900 Subject: [PATCH] =?UTF-8?q?[#7]=20soonmenu=20specmenu=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/controller/MealController.java | 183 ++++-------------- .../java/com/example/helper/entity/Meal.java | 12 ++ .../helper/repository/SqlMealRepository.java | 13 ++ .../example/helper/service/MealService.java | 88 ++++++++- src/main/resources/application.properties | 2 +- .../helper/service/MealServiceTest.java | 42 ++++ 6 files changed, 189 insertions(+), 151 deletions(-) create mode 100644 src/test/java/com/example/helper/service/MealServiceTest.java diff --git a/src/main/java/com/example/helper/controller/MealController.java b/src/main/java/com/example/helper/controller/MealController.java index 09af679..6f5d3d3 100644 --- a/src/main/java/com/example/helper/controller/MealController.java +++ b/src/main/java/com/example/helper/controller/MealController.java @@ -4,6 +4,7 @@ import com.example.helper.service.MealService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -48,182 +49,76 @@ public String hello() { } @PostMapping("/kor") - public @ResponseBody String readKorMeal() throws JsonProcessingException { + public Map readKorMeal() throws JsonProcessingException { // input : None (먼저 서버에서 현재 시간 측정) // output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - // TODO 아래 기능 구현해 주세요. String nowMeal = mealService.getNowKorMeal(); + Map responseBody = mealService.responseMeal(nowMeal); - // Response Body Construct - // TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용. - // const responseBody = { - // version: "2.0", - // template: { - // outputs: [ - // { - // simpleText: { - // text: nowMeal - // } - // } - // ] - // } - // }; - - Map simpleText = new HashMap<>(); - simpleText.put("text", nowMeal); - - Map simpleTextWrapper = new HashMap<>(); - simpleTextWrapper.put("simpleText", simpleText); - - List outputs = new ArrayList(1); - outputs.add(simpleTextWrapper); - - Map template = new HashMap<>(); - template.put("outputs", outputs); - - Map responseBody = new HashMap<>(); - responseBody.put("version", "2.0"); - responseBody.put("template", template); - - ObjectMapper objectMapper = new ObjectMapper(); - String result = objectMapper.writeValueAsString(responseBody); - - return result; + // if need to stratify. + // ObjectMapper objectMapper = new ObjectMapper(); + // String result = objectMapper.writeValueAsString(responseBody); + + return responseBody; } @PostMapping("/eng") - public @ResponseBody String readEngMeal() throws JsonProcessingException { + public Map readEngMeal() throws JsonProcessingException { // input : None (먼저 서버에서 현재 시간 측정) // output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - // TODO 아래 기능 구현해 주세요. String nowMeal = mealService.getNowEngMeal(); + Map responseBody = mealService.responseMeal(nowMeal); + + // if need to stratify. + // ObjectMapper objectMapper = new ObjectMapper(); + // String result = objectMapper.writeValueAsString(responseBody); - // Response Body Construct - // TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용. - // const responseBody = { - // version: "2.0", - // template: { - // outputs: [ - // { - // simpleText: { - // text: nowMeal - // } - // } - // ] - // } - // }; - - Map simpleText = new HashMap<>(); - simpleText.put("text", nowMeal); - - Map simpleTextWrapper = new HashMap<>(); - simpleTextWrapper.put("simpleText", simpleText); - - List outputs = new ArrayList(1); - outputs.add(simpleTextWrapper); - - Map template = new HashMap<>(); - template.put("outputs", outputs); - - Map responseBody = new HashMap<>(); - responseBody.put("version", "2.0"); - responseBody.put("template", template); - - ObjectMapper objectMapper = new ObjectMapper(); - String result = objectMapper.writeValueAsString(responseBody); - - return result; + return responseBody; } @PostMapping("/speckor") - public @ResponseBody String readSpecKorMeal() throws JsonProcessingException { + public Map readSpecKorMeal(@RequestBody Map>> requestBody) throws JsonProcessingException { // input : 날짜요일내일 + 아점저 + 1/2학 // output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - // TODO 아래 기능 구현해 주세요. - String specMeal = mealService.getSpecKorMeal(); - - // Response Body Construct - // TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용. - // const responseBody = { - // version: "2.0", - // template: { - // outputs: [ - // { - // simpleText: { - // text: specMeal - // } - // } - // ] - // } - // }; - - Map simpleText = new HashMap<>(); - simpleText.put("text", specMeal); - - Map simpleTextWrapper = new HashMap<>(); - simpleTextWrapper.put("simpleText", simpleText); + Map> action = requestBody.get("action"); + Map params = action.get("params"); + String dateCustom = params.get("dateCustom"); + String bld = params.get("bld"); - List outputs = new ArrayList(1); - outputs.add(simpleTextWrapper); + log.info(dateCustom + " " + bld); - Map template = new HashMap<>(); - template.put("outputs", outputs); + String specMeal = mealService.getSpecKorMeal(dateCustom, bld); + Map responseBody = mealService.responseMeal(specMeal); - Map responseBody = new HashMap<>(); - responseBody.put("version", "2.0"); - responseBody.put("template", template); + // if need to stratify. + // ObjectMapper objectMapper = new ObjectMapper(); + // String result = objectMapper.writeValueAsString(responseBody); - ObjectMapper objectMapper = new ObjectMapper(); - String result = objectMapper.writeValueAsString(responseBody); - - return result; + return responseBody; } @PostMapping("/speceng") - public @ResponseBody String readSpecEngMeal() throws JsonProcessingException { + public Map readSpecEngMeal(@RequestBody Map>> requestBody) throws JsonProcessingException { // input : 날짜요일내일 + 아점저 + 1/2학 // output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - // TODO 아래 기능 구현해 주세요. - String specMeal = mealService.getSpecEngMeal(); - - // Response Body Construct - // TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용. - // const responseBody = { - // version: "2.0", - // template: { - // outputs: [ - // { - // simpleText: { - // text: specMeal - // } - // } - // ] - // } - // }; - - Map simpleText = new HashMap<>(); - simpleText.put("text", specMeal); - - Map simpleTextWrapper = new HashMap<>(); - simpleTextWrapper.put("simpleText", simpleText); - - List outputs = new ArrayList(1); - outputs.add(simpleTextWrapper); + Map> action = requestBody.get("action"); + Map params = action.get("params"); + String dateCustom = params.get("dateCustom"); + String bld = params.get("bld"); - Map template = new HashMap<>(); - template.put("outputs", outputs); + log.info(dateCustom + " " + bld); - Map responseBody = new HashMap<>(); - responseBody.put("version", "2.0"); - responseBody.put("template", template); + String specMeal = mealService.getSpecEngMeal(dateCustom, bld); + Map responseBody = mealService.responseMeal(specMeal); - ObjectMapper objectMapper = new ObjectMapper(); - String result = objectMapper.writeValueAsString(responseBody); + // if need to stratify. + // ObjectMapper objectMapper = new ObjectMapper(); + // String result = objectMapper.writeValueAsString(responseBody); - return result; + return responseBody; } } diff --git a/src/main/java/com/example/helper/entity/Meal.java b/src/main/java/com/example/helper/entity/Meal.java index 3b1e168..c06e6a5 100644 --- a/src/main/java/com/example/helper/entity/Meal.java +++ b/src/main/java/com/example/helper/entity/Meal.java @@ -39,4 +39,16 @@ public class Meal { private String menu; @Column private String special; + + public String generateMenu() { + String menu = ""; + menu += this.date + " " + this.kind + "\n\n"; + menu += this.bldg + "\n\n"; + menu += this.menu; + if(kindType == 1) { + menu += "\n\\코너\\\n"; + menu += this.special; + } + return menu; + } } diff --git a/src/main/java/com/example/helper/repository/SqlMealRepository.java b/src/main/java/com/example/helper/repository/SqlMealRepository.java index c20ff84..cc30c22 100644 --- a/src/main/java/com/example/helper/repository/SqlMealRepository.java +++ b/src/main/java/com/example/helper/repository/SqlMealRepository.java @@ -39,6 +39,19 @@ public Optional findById(Long mealId) { return Optional.ofNullable(meal); } + public Optional findByDate(Integer bldgType, Integer langType, Integer kindType, String date) { + List result = em.createQuery("select m from Meal m where " + + "m.bldgType = :bldgType and m.langType = :langType and m.kindType = :kindType " + + "and m.date = :date", Meal.class) + .setParameter("bldgType", bldgType) + .setParameter("langType", langType) + .setParameter("kindType", kindType) + .setParameter("date", date) + .getResultList(); + + return result.stream().findAny(); + } + @Override public Long delete(Long mealId) { return null; diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index f7a8e0a..c0581f5 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -3,12 +3,19 @@ import com.example.helper.entity.Meal; import com.example.helper.repository.MealRepository; import com.example.helper.repository.SqlMealRepository; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + @Service @Transactional +@Slf4j public class MealService { @Autowired(required = true) @@ -32,24 +39,93 @@ private void validateDuplicateMeal(Meal meal) { }); } + private String getNowMeal(Integer langType) { + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + + Integer hour = currentDateTime.getHour(); + Integer kindType = 0; + if(9 <= hour && hour < 13) { + kindType = 1; + } + else if(13 <= hour && hour < 19) { + kindType = 2; + } + else if(19 <= hour && hour < 24) { + kindType = 0; + } + else { + kindType = 0; + currentDateTime.plusDays(1); + } + + String date = currentDateTime.getYear() + "-"; + date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-"; + date += String.format("%02d", currentDateTime.getDayOfMonth()) + ""; + + Optional result = sqlMealRepository.findByDate(2, langType, kindType, date); + + if(result.isEmpty()) { + //throw new IllegalStateException("조건에 맞는 식단이 존재하지 않습니다."); + if(langType == 0) { + return "식단 준비중입니다."; + } + else { + return "The meal is being prepared."; + } + } + Meal meal = result.get(); + return meal.generateMenu(); + } + public String getNowKorMeal() { - //TODO sqlMealRepository.findNowKorMeal - return "2023-01-27 조식\n\n제2학생회관1층\n\n얼갈이된장국\n"; + return getNowMeal(0); } public String getNowEngMeal() { - //TODO sqlMealRepository.findNowEngMeal - return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nSoybean Paste Soup\n"; + return getNowMeal(1); } - public String getSpecKorMeal() { + public String getSpecKorMeal(String dateCustom, String bld) { //TODO sqlMealRepository.findSpecKorMeal return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"; } - public String getSpecEngMeal() { + public String getSpecEngMeal(String dateCustom, String bld) { //TODO sqlMealRepository.findSpecEngMeal return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n"; } + public Map responseMeal(String menu) { + // Response Body Construct + // const responseBody = { + // version: "2.0", + // template: { + // outputs: [ + // { + // simpleText: { + // text: nowMeal + // } + // } + // ] + // } + // }; + + Map simpleText = new HashMap<>(); + simpleText.put("text", menu); + + Map simpleTextWrapper = new HashMap<>(); + simpleTextWrapper.put("simpleText", simpleText); + + List outputs = new ArrayList(1); + outputs.add(simpleTextWrapper); + + Map template = new HashMap<>(); + template.put("outputs", outputs); + + Map responseBody = new HashMap<>(); + responseBody.put("version", "2.0"); + responseBody.put("template", template); + + return responseBody; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3edd3e0..b77058e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,7 +3,7 @@ spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/helper_db spring.datasource.username=helper spring.datasource.password=12345678 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true diff --git a/src/test/java/com/example/helper/service/MealServiceTest.java b/src/test/java/com/example/helper/service/MealServiceTest.java new file mode 100644 index 0000000..dfa783d --- /dev/null +++ b/src/test/java/com/example/helper/service/MealServiceTest.java @@ -0,0 +1,42 @@ +package com.example.helper.service; + +import com.example.helper.repository.SqlMealRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; + +public class MealServiceTest { + @Test + void getNowTest() { + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + + Integer hour = currentDateTime.getHour(); + Integer kindType = 0; + if(9 <= hour && hour < 13) { + kindType = 1; + } + else if(13 <= hour && hour < 19) { + kindType = 2; + } + else if(19 <= hour && hour < 24) { + kindType = 0; + } + else { + kindType = 0; + currentDateTime.plusDays(1); + } + + Integer year = currentDateTime.getYear(); + Integer month = currentDateTime.getMonth().getValue(); + Integer day = currentDateTime.getDayOfMonth(); + + System.out.println(year); + System.out.println(month); + System.out.println(day); + System.out.println(hour); + System.out.println(kindType); + } + +}