From 7aa3c14a44b3d62d42d31fe4a6d64f8186369d1e Mon Sep 17 00:00:00 2001 From: HoyoenKim Date: Mon, 30 Jan 2023 00:53:13 +0900 Subject: [PATCH 1/5] [#13] Feat: specmeal input done --- .../com/example/helper/constant/Messages.java | 17 ++++ .../helper/constant/SpecMealInputsEng.java | 36 +++++++ .../helper/constant/SpecMealInputsKor.java | 31 ++++++ .../com/example/helper/constant/Types.java | 9 +- .../helper/controller/MealController.java | 98 ++++--------------- .../example/helper/service/MealService.java | 72 +++++++++----- 6 files changed, 162 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/example/helper/constant/Messages.java create mode 100644 src/main/java/com/example/helper/constant/SpecMealInputsEng.java create mode 100644 src/main/java/com/example/helper/constant/SpecMealInputsKor.java diff --git a/src/main/java/com/example/helper/constant/Messages.java b/src/main/java/com/example/helper/constant/Messages.java new file mode 100644 index 0000000..5edaca9 --- /dev/null +++ b/src/main/java/com/example/helper/constant/Messages.java @@ -0,0 +1,17 @@ +package com.example.helper.constant; + +public enum Messages { + EXIST_MEAL_ERROR("이미 존재하는 식단입니다."), + NO_EXIST_MEAL_ERROR("조건에 맞는 식단이 존재하지 않습니다."), + NO_MEAL_KOR("식단 준비중입니다."), + NO_MEAL_ENG("The meal is being prepared."), + DUMMY_MEAL_KOR("2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"), + DUMMY_MEAL_ENG("2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n"); + private String message; + Messages(String message) { + this.message = message; + } + public String getMessages() { + return message; + } +} diff --git a/src/main/java/com/example/helper/constant/SpecMealInputsEng.java b/src/main/java/com/example/helper/constant/SpecMealInputsEng.java new file mode 100644 index 0000000..156a3b2 --- /dev/null +++ b/src/main/java/com/example/helper/constant/SpecMealInputsEng.java @@ -0,0 +1,36 @@ +package com.example.helper.constant; + +import jakarta.persistence.criteria.CriteriaBuilder; + +public enum SpecMealInputsEng { + TODAY("today"), + TOMORROW("tomorrow"), + MON("Mon", Types.DATE_MON.getType()), + TUE("Tue", Types.DATE_TUE.getType()), + WED("Wed", Types.DATE_WED.getType()), + THR("Thr", Types.DATE_THR.getType()), + FRI("Fri", Types.DATE_FRI.getType()), + SAT("Sat", Types.DATE_SAT.getType()), + SUM("Sun", Types.DATE_SUN.getType()), + DAY_1("st"), + DAY_2("nd"), + DAY_3("rd"), + DAY_OTHER("th"), + BREAKFAST("breakfast", Types.KIND_BREAKFAST.getType()), + LUNCH("lunch", Types.KIND_LUNCH.getType()), + DINNER("dinner", Types.KIND_DINNER.getType()); + private String input; + private Integer inputValue; + SpecMealInputsEng (String input) { + this.input = input; + } + + SpecMealInputsEng (String input, Integer inputValue) { + this.input = input; + this.inputValue = inputValue; + } + public String getInputs() { + return input; + } + public Integer getInputValue() { return inputValue; } +} diff --git a/src/main/java/com/example/helper/constant/SpecMealInputsKor.java b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java new file mode 100644 index 0000000..54a088d --- /dev/null +++ b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java @@ -0,0 +1,31 @@ +package com.example.helper.constant; + + +public enum SpecMealInputsKor { + TODAY("오늘"), + TOMORROW("내일"), + MON("월", Types.DATE_MON.getType()), + TUE("화", Types.DATE_TUE.getType()), + WED("수", Types.DATE_WED.getType()), + THR("목", Types.DATE_THR.getType()), + FRI("금", Types.DATE_FRI.getType()), + SAT("토", Types.DATE_SAT.getType()), + SUM("일", Types.DATE_SUN.getType()), + DAY("일"), + BREAKFAST("조식", Types.KIND_BREAKFAST.getType()), + LUNCH("중식", Types.KIND_LUNCH.getType()), + DINNER("석식", Types.KIND_DINNER.getType()); + private String input; + private Integer inputValue; + SpecMealInputsKor(String input) { + this.input = input; + } + SpecMealInputsKor(String input, Integer inputValue) { + this.input = input; + this.inputValue = inputValue; + } + public String getInputs() { + return input; + } + public Integer getInputValue() { return inputValue; } +} diff --git a/src/main/java/com/example/helper/constant/Types.java b/src/main/java/com/example/helper/constant/Types.java index d5a0c4c..4a2fee1 100644 --- a/src/main/java/com/example/helper/constant/Types.java +++ b/src/main/java/com/example/helper/constant/Types.java @@ -9,7 +9,14 @@ public enum Types { KIND_BREAKFAST(0), KIND_LUNCH(1), KIND_DINNER(2), - KIND_LUNCH_CORNER(3); + KIND_LUNCH_CORNER(3), + DATE_MON(0), + DATE_TUE(1), + DATE_WED(2), + DATE_THR(3), + DATE_FRI(4), + DATE_SAT(5), + DATE_SUN(6); private Integer type; diff --git a/src/main/java/com/example/helper/controller/MealController.java b/src/main/java/com/example/helper/controller/MealController.java index 6a11616..16a1848 100644 --- a/src/main/java/com/example/helper/controller/MealController.java +++ b/src/main/java/com/example/helper/controller/MealController.java @@ -62,9 +62,6 @@ public Map readKorMeal() throws JsonProcessingException { String nowMeal = mealService.getNowKorMeal(); Map responseBody = mealService.responseMeal(nowMeal); - // if need to stratify. - // ObjectMapper objectMapper = new ObjectMapper(); - // String result = objectMapper.writeValueAsString(responseBody); return responseBody; } @@ -77,104 +74,49 @@ public Map readEngMeal() throws JsonProcessingException { String nowMeal = mealService.getNowEngMeal(); Map responseBody = mealService.responseMeal(nowMeal); - // if need to stratify. - // ObjectMapper objectMapper = new ObjectMapper(); - // String result = objectMapper.writeValueAsString(responseBody); - return responseBody; } - @PostMapping("/spectest") - public Map readSpecKortest(@RequestBody Map requestBody) throws JsonProcessingException { - // input : 날짜요일내일 + 아점저 + 1/2학 + @PostMapping("/speckor") + public Map readSpecKorMeal(@RequestBody Map requestBody) throws JsonProcessingException { + // input : 날짜요일내일 + 아점저 // output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - Map action = new HashMap<>(); - action.put("action", requestBody.get("action")); - - Map params = new HashMap<>(); - params.put("params", action.get("action")); - - Map paramssss = new HashMap<>(); - paramssss.put("params", params.get("params")); - - String dateCustom = (String) paramssss.get("dateCustom"); - String bld = (String) paramssss.get("bld"); - - log.info("req body : " + requestBody.toString()); - log.info("action body : " + action.toString()); - log.info("params body : " + params.toString()); - log.info("paramssss body : " + paramssss.toString()); - - for (Entry entrySet : requestBody.entrySet()) { - log.info(entrySet.getKey() + " : " + entrySet.getValue()); - } - - log.info("###########RESULT############"); - log.info(dateCustom + " " + bld); - log.info(dateCustom + " " + bld); + // how to print the request body + //for (Entry entrySet : requestBody.entrySet()) { + // log.info(entrySet.getKey() + " : " + entrySet.getValue()); + //} ObjectMapper objectMapper = new ObjectMapper(); - Map action2 = objectMapper.convertValue(requestBody.get("action"), Map.class); - Map params2 = objectMapper.convertValue(action2.get("params"), Map.class); - log.info(params2.get("dateCustom").toString() + " " + params2.get("bld").toString()); - - //Map params2 = new HashMap<>(); - //params2.put() - //log.info(params2.get("dateCustom") + " " + params2.get("bld")); - - String specMeal = mealService.getSpecKorMeal(dateCustom, bld); - Map responseBody = mealService.responseMeal(specMeal); - - // if need to stratify. - // ObjectMapper objectMapper = new ObjectMapper(); - // String result = objectMapper.writeValueAsString(responseBody); - - return responseBody; - } - - @PostMapping("/speckor") - public Map readSpecKorMeal(@RequestBody Map>> requestBody) throws JsonProcessingException { - // input : 날짜요일내일 + 아점저 + 1/2학 - // output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - - Map> action = requestBody.get("action"); - Map params = action.get("params"); - String dateCustom = (String) params.get("dateCustom"); - String bld = (String) params.get("bld"); + Map action = objectMapper.convertValue(requestBody.get("action"), Map.class); + Map params = objectMapper.convertValue(action.get("params"), Map.class); - log.info(dateCustom + " " + bld); - log.info(dateCustom + " " + bld); + //log.info(params2.get("dateCustom").toString() + " " + params2.get("bld").toString()); + String dateCustom = params.get("dateCustom").toString(); + String bld = params.get("bld").toString(); String specMeal = mealService.getSpecKorMeal(dateCustom, bld); Map responseBody = mealService.responseMeal(specMeal); - // if need to stratify. - // ObjectMapper objectMapper = new ObjectMapper(); - // String result = objectMapper.writeValueAsString(responseBody); - return responseBody; } @PostMapping("/speceng") - public Map readSpecEngMeal(@RequestBody Map>> requestBody) throws JsonProcessingException { - // input : 날짜요일내일 + 아점저 + 1/2학 + public Map readSpecEngMeal(@RequestBody Map requestBody) throws JsonProcessingException { + // input : 날짜요일내일 + 아점저 // output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) - Map> action = requestBody.get("action"); - Map params = action.get("params"); - String dateCustom = (String) params.get("dateCustom"); - String bld = (String) params.get("bld"); + ObjectMapper objectMapper = new ObjectMapper(); + Map action = objectMapper.convertValue(requestBody.get("action"), Map.class); + Map params = objectMapper.convertValue(action.get("params"), Map.class); - log.info(dateCustom + " " + bld); + //log.info(params2.get("dateCustom").toString() + " " + params2.get("bld").toString()); + String dateCustom = params.get("dateCustom").toString(); + String bld = params.get("bld").toString(); String specMeal = mealService.getSpecEngMeal(dateCustom, bld); Map responseBody = mealService.responseMeal(specMeal); - // if need to stratify. - // ObjectMapper objectMapper = new ObjectMapper(); - // String result = objectMapper.writeValueAsString(responseBody); - return responseBody; } diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 308ac56..7c36f8f 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -1,5 +1,8 @@ package com.example.helper.service; +import com.example.helper.constant.Messages; +import com.example.helper.constant.SpecMealInputsKor; +import com.example.helper.constant.Types; import com.example.helper.dto.DateMealDto; import com.example.helper.dto.DateReqDto; import com.example.helper.entity.Meal; @@ -39,7 +42,7 @@ private void validateDuplicateMeal(Meal meal) { // DB 중복 체크 sqlMealRepository.findByPk(meal.getBldgType(), meal.getLangType(), meal.getDateType(), meal.getKindType(), meal.getDate()) .ifPresent(m -> { - throw new IllegalStateException("이미 존재하는 식단입니다."); + throw new IllegalStateException(Messages.EXIST_MEAL_ERROR.getMessages()); }); } @@ -63,62 +66,83 @@ else if(19 <= hour && hour < 24) { currentDateTime = currentDateTime.plusDays(1); } - log.info("currentDateTime Obj : " + currentDateTime.toString()); - String date = currentDateTime.getYear() + "-"; date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-"; date += String.format("%02d", currentDateTime.getDayOfMonth()) + ""; - log.info("date Obj : " + date); - log.info("langType Obj : " + langType); - log.info("kindType Obj : " + kindType); - Optional result = sqlMealRepository.findByDate(2, langType, kindType, date); + Optional result = sqlMealRepository.findByDate(Types.BLDG2_1ST.getType(), langType, kindType, date); if(result.isEmpty()) { - //throw new IllegalStateException("조건에 맞는 식단이 존재하지 않습니다."); + //throw new IllegalStateException(Messages.EXIST_MEAL_ERROR.getMessages()); if(langType == 0) { - return "식단 준비중입니다."; + return Messages.NO_MEAL_KOR.getMessages(); } else { - return "The meal is being prepared."; + return Messages.NO_MEAL_ENG.getMessages(); } } Meal meal = result.get(); return meal.generateMenu(); } + private Boolean specInputValidation(String dateCustom, String bld) { + // len = 0 or null or ... + Boolean ret = true; + + return ret; + } + public String getNowKorMeal() { - return getNowMeal(0); + return getNowMeal(Types.LANG_KOR.getType()); } public String getNowEngMeal() { - return getNowMeal(1); + return getNowMeal(Types.LANG_ENG.getType()); } public String getSpecKorMeal(String dateCustom, String bld) { - //TODO sqlMealRepository.findSpecKorMeal + if (!specInputValidation(dateCustom, bld)) { + return Messages.NO_MEAL_KOR.getMessages(); + } + + if(dateCustom.equals(SpecMealInputsKor.TODAY.getInputs())) { + // 오늘 + } + else if(dateCustom.equals(SpecMealInputsKor.TOMORROW.getInputs())) { + // 내일 + } + else if(dateCustom.length() == 1) { + // 요일 + } + else if((dateCustom.charAt(dateCustom.length() - 1) + "").equals(SpecMealInputsKor.DAY.getInputs())) { + // 특정날짜 + } + return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"; } public String getSpecEngMeal(String dateCustom, String bld) { - //TODO sqlMealRepository.findSpecEngMeal + if (!specInputValidation(dateCustom, bld)) { + return Messages.NO_MEAL_ENG.getMessages(); + } 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", + // responseBody: { + // version: "2.0", // template: { // outputs: [ + // { + // simpleText: // { - // simpleText: { - // text: nowMeal - // } + // text: meal // } - // ] - // } - // }; + // } + // ] + // } + // }; Map simpleText = new HashMap<>(); simpleText.put("text", menu); @@ -136,6 +160,10 @@ public Map responseMeal(String menu) { responseBody.put("version", "2.0"); responseBody.put("template", template); + // stratify json to string + // ObjectMapper objectMapper = new ObjectMapper(); + // String result = objectMapper.writeValueAsString(responseBody); + return responseBody; } } From 231a5d9f4a6332f749dcd49a3689f30a671a5d96 Mon Sep 17 00:00:00 2001 From: HoyoenKim Date: Mon, 30 Jan 2023 02:58:50 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[#15]=20Feature:=20specmenu=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20with=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../helper/constant/SpecMealInputsEng.java | 2 +- .../com/example/helper/constant/Types.java | 14 +- .../helper/controller/MealController.java | 10 +- .../java/com/example/helper/entity/Meal.java | 13 +- .../example/helper/service/MealService.java | 121 +++++++++++++++++- .../helper/service/MealServiceTest.java | 51 ++++++++ 6 files changed, 196 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/example/helper/constant/SpecMealInputsEng.java b/src/main/java/com/example/helper/constant/SpecMealInputsEng.java index 156a3b2..dd51bfe 100644 --- a/src/main/java/com/example/helper/constant/SpecMealInputsEng.java +++ b/src/main/java/com/example/helper/constant/SpecMealInputsEng.java @@ -11,7 +11,7 @@ public enum SpecMealInputsEng { THR("Thr", Types.DATE_THR.getType()), FRI("Fri", Types.DATE_FRI.getType()), SAT("Sat", Types.DATE_SAT.getType()), - SUM("Sun", Types.DATE_SUN.getType()), + SUN("Sun", Types.DATE_SUN.getType()), DAY_1("st"), DAY_2("nd"), DAY_3("rd"), diff --git a/src/main/java/com/example/helper/constant/Types.java b/src/main/java/com/example/helper/constant/Types.java index 4a2fee1..c646b35 100644 --- a/src/main/java/com/example/helper/constant/Types.java +++ b/src/main/java/com/example/helper/constant/Types.java @@ -10,13 +10,13 @@ public enum Types { KIND_LUNCH(1), KIND_DINNER(2), KIND_LUNCH_CORNER(3), - DATE_MON(0), - DATE_TUE(1), - DATE_WED(2), - DATE_THR(3), - DATE_FRI(4), - DATE_SAT(5), - DATE_SUN(6); + DATE_MON(1), + DATE_TUE(2), + DATE_WED(3), + DATE_THR(4), + DATE_FRI(5), + DATE_SAT(6), + DATE_SUN(7); private Integer type; diff --git a/src/main/java/com/example/helper/controller/MealController.java b/src/main/java/com/example/helper/controller/MealController.java index 16a1848..9002988 100644 --- a/src/main/java/com/example/helper/controller/MealController.java +++ b/src/main/java/com/example/helper/controller/MealController.java @@ -50,9 +50,13 @@ public String createMeal(@RequestBody Mealdto mealDto) { BeanUtils.copyProperties(mealDto, meal); // DB Save - Long saved = mealService.mealCreate(meal); - - return "saved"; + try { + Long saved = mealService.mealCreate(meal); + return "saved"; + } catch (IllegalStateException e) { + throw new ResponseStatusException( + HttpStatus.NOT_ACCEPTABLE, e.getMessage()); + } } @PostMapping("/kor") diff --git a/src/main/java/com/example/helper/entity/Meal.java b/src/main/java/com/example/helper/entity/Meal.java index c06e6a5..7eedcfc 100644 --- a/src/main/java/com/example/helper/entity/Meal.java +++ b/src/main/java/com/example/helper/entity/Meal.java @@ -1,5 +1,6 @@ package com.example.helper.entity; +import com.example.helper.constant.Types; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -45,9 +46,15 @@ public String generateMenu() { menu += this.date + " " + this.kind + "\n\n"; menu += this.bldg + "\n\n"; menu += this.menu; - if(kindType == 1) { - menu += "\n\\코너\\\n"; - menu += this.special; + if(kindType == Types.KIND_LUNCH.getType()) { + if(langType == Types.LANG_KOR.getType()) { + menu += "\n\\코너\\\n"; + menu += this.special; + } + else if(langType == Types.LANG_ENG.getType()) { + menu += "\n\\Coner\\\n"; + menu += this.special; + } } return menu; } diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 7c36f8f..0bae264 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -1,6 +1,7 @@ package com.example.helper.service; import com.example.helper.constant.Messages; +import com.example.helper.constant.SpecMealInputsEng; import com.example.helper.constant.SpecMealInputsKor; import com.example.helper.constant.Types; import com.example.helper.dto.DateMealDto; @@ -11,6 +12,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -120,12 +123,128 @@ else if((dateCustom.charAt(dateCustom.length() - 1) + "").equals(SpecMealInputsK return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"; } + public Boolean dateFormatValidation(String date) { + Boolean ret = true; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + sdf.setLenient(false); + sdf.parse(date); + } catch(ParseException e) { + ret = false; + } + return ret; + } public String getSpecEngMeal(String dateCustom, String bld) { if (!specInputValidation(dateCustom, bld)) { return Messages.NO_MEAL_ENG.getMessages(); } - return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n"; + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + + Integer year = currentDateTime.getYear(); + Integer month = currentDateTime.getMonth().getValue(); + Integer day = currentDateTime.getDayOfMonth(); + Integer currentDateNumber = currentDateTime.getDayOfWeek().getValue(); + + Integer dateCustomLen = dateCustom.length(); + if(dateCustom.equals(SpecMealInputsEng.TODAY.getInputs())) { + // 오늘 + } + else if(dateCustom.equals(SpecMealInputsEng.TOMORROW.getInputs())) { + // 내일 + currentDateTime = currentDateTime.plusDays(1); + year = currentDateTime.getYear(); + month = currentDateTime.getMonth().getValue(); + day = currentDateTime.getDayOfMonth(); + } + else if(dateCustomLen > 2) { + String dateCustomPostfix = dateCustom.substring(dateCustomLen - 2, dateCustomLen); + if( dateCustomPostfix.equals(SpecMealInputsEng.DAY_1.getInputs()) || + dateCustomPostfix.equals(SpecMealInputsEng.DAY_2.getInputs()) || + dateCustomPostfix.equals(SpecMealInputsEng.DAY_3.getInputs()) || + dateCustomPostfix.equals(SpecMealInputsEng.DAY_OTHER.getInputs())) { + // 특정날짜 + String dateCustomPrefix = (dateCustomLen == 3) ? dateCustom.substring(0, 1) : dateCustom.substring(0, 2); + + try{ + day = Integer.valueOf(dateCustomPrefix); + } + catch (NumberFormatException ex){ + day = 0; + } + } + else { + //요일 + Integer dateNumber = 0; + if(dateCustom.equals(SpecMealInputsEng.MON.getInputs())) { + dateNumber = SpecMealInputsEng.MON.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.TUE.getInputs())) { + dateNumber = SpecMealInputsEng.TUE.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.WED.getInputs())) { + dateNumber = SpecMealInputsEng.WED.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.THR.getInputs())) { + dateNumber = SpecMealInputsEng.THR.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.FRI.getInputs())) { + dateNumber = SpecMealInputsEng.FRI.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.SAT.getInputs())) { + dateNumber = SpecMealInputsEng.SAT.getInputValue(); + } + else if(dateCustom.equals(SpecMealInputsEng.SUN.getInputs())) { + dateNumber = SpecMealInputsEng.SUN.getInputValue(); + } + + if(dateNumber == 0) { + day = 0; + } + else { + Integer dateDiff = dateNumber - currentDateNumber; + Integer dateDiffAbs = (dateDiff > 0) ? dateDiff : dateDiff * -1; + currentDateTime = (dateDiff > 0) ? currentDateTime.plusDays(dateDiffAbs) : currentDateTime.minusDays(dateDiffAbs); + year = currentDateTime.getYear(); + month = currentDateTime.getMonth().getValue(); + day = currentDateTime.getDayOfMonth(); + } + + } + } + + Integer kindType = -1; + if(bld.equals(SpecMealInputsEng.BREAKFAST.getInputs())) { + kindType = SpecMealInputsEng.BREAKFAST.getInputValue(); + } + else if(bld.equals(SpecMealInputsEng.LUNCH.getInputs())) { + kindType = SpecMealInputsEng.LUNCH.getInputValue(); + } + else if(bld.equals(SpecMealInputsEng.DINNER.getInputs())) { + kindType = SpecMealInputsEng.DINNER.getInputValue(); + } + + if( (day < 1 && day > 31) || (kindType < 0 || kindType > 2)) { + return Messages.NO_MEAL_ENG.getMessages(); + } + + String date = year + "-"; + date += String.format("%02d", month) + "-"; + date += String.format("%02d", day) + ""; + + //형식이 잘못되면 Query 에서 NULL 을 반환한다. + //if(!dateFormatValidation(date)) { + // return Messages.NO_MEAL_ENG.getMessages(); + //} + + Optional result = sqlMealRepository.findByDate(Types.BLDG2_1ST.getType(), Types.LANG_ENG.getType(), kindType, date); + + if(result.isEmpty()) { + //throw new IllegalStateException(Messages.EXIST_MEAL_ERROR.getMessages()); + return Messages.NO_MEAL_ENG.getMessages(); + } + Meal meal = result.get(); + return meal.generateMenu(); } public Map responseMeal(String menu) { diff --git a/src/test/java/com/example/helper/service/MealServiceTest.java b/src/test/java/com/example/helper/service/MealServiceTest.java index dfa783d..5b7482a 100644 --- a/src/test/java/com/example/helper/service/MealServiceTest.java +++ b/src/test/java/com/example/helper/service/MealServiceTest.java @@ -1,13 +1,21 @@ package com.example.helper.service; +import com.example.helper.constant.SpecMealInputsEng; import com.example.helper.repository.SqlMealRepository; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; +@SpringBootTest public class MealServiceTest { + @Autowired + private MealService mealService; @Test void getNowTest() { LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); @@ -39,4 +47,47 @@ else if(19 <= hour && hour < 24) { System.out.println(kindType); } + @Test + void specEngTest() { + List dateCustomTestList = new ArrayList<>(); + for(int i = 1 ; i <= 31 ; i++) { + String tc = i + ""; + if(i == 1) { + tc += "st"; + } + else if(i == 2) { + tc += "nd"; + } + else if(i == 3) { + tc += "rd"; + } + else { + tc += "th"; + } + dateCustomTestList.add(tc); + } + dateCustomTestList.add(SpecMealInputsEng.TODAY.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.TOMORROW.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.MON.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.THR.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.WED.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.THR.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.FRI.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.SAT.getInputs()); + dateCustomTestList.add(SpecMealInputsEng.SUN.getInputs()); + + List bldTestList = new ArrayList<>(); + bldTestList.add(SpecMealInputsEng.BREAKFAST.getInputs()); + bldTestList.add(SpecMealInputsEng.LUNCH.getInputs()); + bldTestList.add(SpecMealInputsEng.DINNER.getInputs()); + + for(String dateCustom : dateCustomTestList) { + for(String bld : bldTestList) { + String specMeal = mealService.getSpecEngMeal(dateCustom, bld); + System.out.println(dateCustom + " " + bld); + System.out.println(specMeal); + } + } + } + } From c61aa9fd7a50f5483dd0b53be99c14b4e8b11d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=82=B0?= Date: Mon, 30 Jan 2023 02:59:01 +0900 Subject: [PATCH 3/5] [#14] Feat, Test: converting kind of meal to its type --- build.gradle | 4 +-- .../helper/constant/SpecMealInputsKor.java | 8 +++++ .../com/example/helper/constant/Types.java | 14 ++++----- .../example/helper/service/MealService.java | 21 ++++++++++--- .../constant/SpecMealInputsKorTest.java | 30 +++++++++++++++++++ 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 src/test/java/com/example/helper/constant/SpecMealInputsKorTest.java diff --git a/build.gradle b/build.gradle index 2bc7dc0..7a01909 100644 --- a/build.gradle +++ b/build.gradle @@ -25,8 +25,8 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.junit.platform:junit-platform-launcher:1.5.0' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.0' - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.5.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.9.1' } diff --git a/src/main/java/com/example/helper/constant/SpecMealInputsKor.java b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java index 54a088d..b002a29 100644 --- a/src/main/java/com/example/helper/constant/SpecMealInputsKor.java +++ b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java @@ -28,4 +28,12 @@ public String getInputs() { return input; } public Integer getInputValue() { return inputValue; } + + public static Integer getTypeByString(String str){ + for(SpecMealInputsKor each : values()) + if (each.getInputs().equals(str)) { + return each.getInputValue(); + } + return null; + } } diff --git a/src/main/java/com/example/helper/constant/Types.java b/src/main/java/com/example/helper/constant/Types.java index 4a2fee1..c646b35 100644 --- a/src/main/java/com/example/helper/constant/Types.java +++ b/src/main/java/com/example/helper/constant/Types.java @@ -10,13 +10,13 @@ public enum Types { KIND_LUNCH(1), KIND_DINNER(2), KIND_LUNCH_CORNER(3), - DATE_MON(0), - DATE_TUE(1), - DATE_WED(2), - DATE_THR(3), - DATE_FRI(4), - DATE_SAT(5), - DATE_SUN(6); + DATE_MON(1), + DATE_TUE(2), + DATE_WED(3), + DATE_THR(4), + DATE_FRI(5), + DATE_SAT(6), + DATE_SUN(7); private Integer type; diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 7c36f8f..48e46cb 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -72,6 +72,7 @@ else if(19 <= hour && hour < 24) { Optional result = sqlMealRepository.findByDate(Types.BLDG2_1ST.getType(), langType, kindType, date); + // TODO: 함수로 분리 if(result.isEmpty()) { //throw new IllegalStateException(Messages.EXIST_MEAL_ERROR.getMessages()); if(langType == 0) { @@ -86,10 +87,11 @@ else if(19 <= hour && hour < 24) { } private Boolean specInputValidation(String dateCustom, String bld) { - // len = 0 or null or ... - Boolean ret = true; - - return ret; + // input arguments : null, empty, " " + if (dateCustom == null || bld == null || dateCustom.isBlank() || bld.isBlank()) { + return false; + } + return true; } public String getNowKorMeal() { @@ -105,8 +107,19 @@ public String getSpecKorMeal(String dateCustom, String bld) { return Messages.NO_MEAL_KOR.getMessages(); } + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + if(dateCustom.equals(SpecMealInputsKor.TODAY.getInputs())) { // 오늘 + String date = currentDateTime.getYear() + "-"; + date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-"; + date += String.format("%02d", currentDateTime.getDayOfMonth()) + ""; + + Optional result = sqlMealRepository.findByDate( + Types.BLDG2_1ST.getType(), + Types.LANG_KOR.getType(), + SpecMealInputsKor.getTypeByString(bld), + date); } else if(dateCustom.equals(SpecMealInputsKor.TOMORROW.getInputs())) { // 내일 diff --git a/src/test/java/com/example/helper/constant/SpecMealInputsKorTest.java b/src/test/java/com/example/helper/constant/SpecMealInputsKorTest.java new file mode 100644 index 0000000..3229a9e --- /dev/null +++ b/src/test/java/com/example/helper/constant/SpecMealInputsKorTest.java @@ -0,0 +1,30 @@ +package com.example.helper.constant; + +import static com.example.helper.constant.SpecMealInputsKor.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class SpecMealInputsKorTest { + + @ParameterizedTest + @MethodSource("provideStringsForIsTypes") + void enum_한국어식단_타입변환(String kind, Integer expected) { + // given + // when + Integer result = getTypeByString(kind); + // then + assertEquals(expected, result); + } + + private static Stream provideStringsForIsTypes() { + return Stream.of( + Arguments.of(BREAKFAST.getInputs(), BREAKFAST.getInputValue()), + Arguments.of(LUNCH.getInputs(), LUNCH.getInputValue()), + Arguments.of(DINNER.getInputs(), DINNER.getInputValue()) + ); + } +} From b79df31eb5cd16c52060a6ed994ad941ad2ab3e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=82=B0?= Date: Mon, 30 Jan 2023 03:50:49 +0900 Subject: [PATCH 4/5] [#14] Feat: tomorrow, days, specific date --- .../com/example/helper/constant/Messages.java | 1 + .../helper/constant/SpecMealInputsKor.java | 2 +- .../helper/controller/MealController.java | 5 +- .../example/helper/service/MealService.java | 60 ++++++++++++------- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/example/helper/constant/Messages.java b/src/main/java/com/example/helper/constant/Messages.java index 5edaca9..8cc80fe 100644 --- a/src/main/java/com/example/helper/constant/Messages.java +++ b/src/main/java/com/example/helper/constant/Messages.java @@ -5,6 +5,7 @@ public enum Messages { NO_EXIST_MEAL_ERROR("조건에 맞는 식단이 존재하지 않습니다."), NO_MEAL_KOR("식단 준비중입니다."), NO_MEAL_ENG("The meal is being prepared."), + INVALID_DATE("유효하지 않은 날짜입니다."), DUMMY_MEAL_KOR("2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"), DUMMY_MEAL_ENG("2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n"); private String message; diff --git a/src/main/java/com/example/helper/constant/SpecMealInputsKor.java b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java index b002a29..fc8af17 100644 --- a/src/main/java/com/example/helper/constant/SpecMealInputsKor.java +++ b/src/main/java/com/example/helper/constant/SpecMealInputsKor.java @@ -34,6 +34,6 @@ public static Integer getTypeByString(String str){ if (each.getInputs().equals(str)) { return each.getInputValue(); } - return null; + return -1; } } diff --git a/src/main/java/com/example/helper/controller/MealController.java b/src/main/java/com/example/helper/controller/MealController.java index 16a1848..ff34a88 100644 --- a/src/main/java/com/example/helper/controller/MealController.java +++ b/src/main/java/com/example/helper/controller/MealController.java @@ -7,6 +7,8 @@ import com.example.helper.service.MealService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Map.Entry; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -95,7 +97,8 @@ public Map readSpecKorMeal(@RequestBody Map requ String dateCustom = params.get("dateCustom").toString(); String bld = params.get("bld").toString(); - String specMeal = mealService.getSpecKorMeal(dateCustom, bld); + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + String specMeal = mealService.getSpecKorMeal(dateCustom, bld, currentDateTime); Map responseBody = mealService.responseMeal(specMeal); return responseBody; diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 48e46cb..8495413 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -102,36 +102,50 @@ public String getNowEngMeal() { return getNowMeal(Types.LANG_ENG.getType()); } - public String getSpecKorMeal(String dateCustom, String bld) { + public String getSpecKorMeal(String dateCustom, String bld, LocalDateTime currentDateTime) { + // test를 위해 LocalDateTime 객체를 argument로 받도록 변경 + if (!specInputValidation(dateCustom, bld)) { return Messages.NO_MEAL_KOR.getMessages(); } - LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); - - if(dateCustom.equals(SpecMealInputsKor.TODAY.getInputs())) { - // 오늘 - String date = currentDateTime.getYear() + "-"; - date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-"; - date += String.format("%02d", currentDateTime.getDayOfMonth()) + ""; - - Optional result = sqlMealRepository.findByDate( - Types.BLDG2_1ST.getType(), - Types.LANG_KOR.getType(), - SpecMealInputsKor.getTypeByString(bld), - date); - } - else if(dateCustom.equals(SpecMealInputsKor.TOMORROW.getInputs())) { - // 내일 - } - else if(dateCustom.length() == 1) { - // 요일 + try { + if (dateCustom.equals(SpecMealInputsKor.TOMORROW.getInputs())) { + // 내일 + currentDateTime = currentDateTime.plusDays(1); + } else if (dateCustom.length() == 1) { + // 요일 + Integer dateDiff = getDateDifference(dateCustom, currentDateTime); + currentDateTime = currentDateTime.plusDays(dateDiff); + } else if ((dateCustom.charAt(dateCustom.length() - 1) + "").equals(SpecMealInputsKor.DAY.getInputs())) { + // 특정날짜 + currentDateTime = currentDateTime.withDayOfMonth( + Integer.parseInt(dateCustom.substring(0, dateCustom.length() - 1))); + } + } catch (Exception e) { + return Messages.INVALID_DATE.getMessages(); } - else if((dateCustom.charAt(dateCustom.length() - 1) + "").equals(SpecMealInputsKor.DAY.getInputs())) { - // 특정날짜 + + String date = currentDateTime.getYear() + "-"; + date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-"; + date += String.format("%02d", currentDateTime.getDayOfMonth()) + ""; + + Optional result = sqlMealRepository.findByDate( + Types.BLDG2_1ST.getType(), + Types.LANG_KOR.getType(), + SpecMealInputsKor.getTypeByString(bld), + date); + + // TODO : 존재하지 않는 식단이면, error message 반환. + if(result.isEmpty()) { + return Messages.NO_MEAL_KOR.getMessages(); } - return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"; + return result.get().generateMenu(); + } + + public Integer getDateDifference(String day, LocalDateTime currentDateTime) { + return (Integer) currentDateTime.getDayOfWeek().getValue() - SpecMealInputsKor.getTypeByString(day); } public String getSpecEngMeal(String dateCustom, String bld) { From 0fbeddca34d665cf27f2e0f9a2033040522221d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=82=B0?= Date: Mon, 30 Jan 2023 04:08:20 +0900 Subject: [PATCH 5/5] [#14] Fix: miss subtract --- src/main/java/com/example/helper/service/MealService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 0b8603b..e4b4743 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -148,7 +148,7 @@ public String getSpecKorMeal(String dateCustom, String bld, LocalDateTime curren } public Integer getDateDifference(String day, LocalDateTime currentDateTime) { - return (Integer) currentDateTime.getDayOfWeek().getValue() - SpecMealInputsKor.getTypeByString(day); + return SpecMealInputsKor.getTypeByString(day) - (Integer) currentDateTime.getDayOfWeek().getValue(); } public Boolean dateFormatValidation(String date) { Boolean ret = true;