Skip to content

Commit cd9dbd6

Browse files
author
HoyoenKim
committed
[#7] soonmenu specmenu 구현
1 parent c8a1cfb commit cd9dbd6

File tree

6 files changed

+189
-151
lines changed

6 files changed

+189
-151
lines changed

src/main/java/com/example/helper/controller/MealController.java

Lines changed: 39 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.example.helper.service.MealService;
55
import com.fasterxml.jackson.core.JsonProcessingException;
66
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import jakarta.servlet.http.HttpServletRequest;
78
import lombok.extern.slf4j.Slf4j;
89
import org.springframework.beans.BeanUtils;
910
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,182 +49,76 @@ public String hello() {
4849
}
4950

5051
@PostMapping("/kor")
51-
public @ResponseBody String readKorMeal() throws JsonProcessingException {
52+
public Map<String, Object> readKorMeal() throws JsonProcessingException {
5253
// input : None (먼저 서버에서 현재 시간 측정)
5354
// output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.)
5455

55-
// TODO 아래 기능 구현해 주세요.
5656
String nowMeal = mealService.getNowKorMeal();
57+
Map<String, Object> responseBody = mealService.responseMeal(nowMeal);
5758

58-
// Response Body Construct
59-
// TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용.
60-
// const responseBody = {
61-
// version: "2.0",
62-
// template: {
63-
// outputs: [
64-
// {
65-
// simpleText: {
66-
// text: nowMeal
67-
// }
68-
// }
69-
// ]
70-
// }
71-
// };
72-
73-
Map<String, Object> simpleText = new HashMap<>();
74-
simpleText.put("text", nowMeal);
75-
76-
Map<String, Object> simpleTextWrapper = new HashMap<>();
77-
simpleTextWrapper.put("simpleText", simpleText);
78-
79-
List<Object> outputs = new ArrayList(1);
80-
outputs.add(simpleTextWrapper);
81-
82-
Map<String, Object> template = new HashMap<>();
83-
template.put("outputs", outputs);
84-
85-
Map<String, Object> responseBody = new HashMap<>();
86-
responseBody.put("version", "2.0");
87-
responseBody.put("template", template);
88-
89-
ObjectMapper objectMapper = new ObjectMapper();
90-
String result = objectMapper.writeValueAsString(responseBody);
91-
92-
return result;
59+
// if need to stratify.
60+
// ObjectMapper objectMapper = new ObjectMapper();
61+
// String result = objectMapper.writeValueAsString(responseBody);
62+
63+
return responseBody;
9364
}
9465

9566
@PostMapping("/eng")
96-
public @ResponseBody String readEngMeal() throws JsonProcessingException {
67+
public Map<String, Object> readEngMeal() throws JsonProcessingException {
9768
// input : None (먼저 서버에서 현재 시간 측정)
9869
// output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.)
9970

100-
// TODO 아래 기능 구현해 주세요.
10171
String nowMeal = mealService.getNowEngMeal();
72+
Map<String, Object> responseBody = mealService.responseMeal(nowMeal);
73+
74+
// if need to stratify.
75+
// ObjectMapper objectMapper = new ObjectMapper();
76+
// String result = objectMapper.writeValueAsString(responseBody);
10277

103-
// Response Body Construct
104-
// TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용.
105-
// const responseBody = {
106-
// version: "2.0",
107-
// template: {
108-
// outputs: [
109-
// {
110-
// simpleText: {
111-
// text: nowMeal
112-
// }
113-
// }
114-
// ]
115-
// }
116-
// };
117-
118-
Map<String, Object> simpleText = new HashMap<>();
119-
simpleText.put("text", nowMeal);
120-
121-
Map<String, Object> simpleTextWrapper = new HashMap<>();
122-
simpleTextWrapper.put("simpleText", simpleText);
123-
124-
List<Object> outputs = new ArrayList(1);
125-
outputs.add(simpleTextWrapper);
126-
127-
Map<String, Object> template = new HashMap<>();
128-
template.put("outputs", outputs);
129-
130-
Map<String, Object> responseBody = new HashMap<>();
131-
responseBody.put("version", "2.0");
132-
responseBody.put("template", template);
133-
134-
ObjectMapper objectMapper = new ObjectMapper();
135-
String result = objectMapper.writeValueAsString(responseBody);
136-
137-
return result;
78+
return responseBody;
13879
}
13980

14081
@PostMapping("/speckor")
141-
public @ResponseBody String readSpecKorMeal() throws JsonProcessingException {
82+
public Map<String, Object> readSpecKorMeal(@RequestBody Map<String, Map<String, Map<String, String>>> requestBody) throws JsonProcessingException {
14283
// input : 날짜요일내일 + 아점저 + 1/2학
14384
// output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.)
14485

145-
// TODO 아래 기능 구현해 주세요.
146-
String specMeal = mealService.getSpecKorMeal();
147-
148-
// Response Body Construct
149-
// TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용.
150-
// const responseBody = {
151-
// version: "2.0",
152-
// template: {
153-
// outputs: [
154-
// {
155-
// simpleText: {
156-
// text: specMeal
157-
// }
158-
// }
159-
// ]
160-
// }
161-
// };
162-
163-
Map<String, Object> simpleText = new HashMap<>();
164-
simpleText.put("text", specMeal);
165-
166-
Map<String, Object> simpleTextWrapper = new HashMap<>();
167-
simpleTextWrapper.put("simpleText", simpleText);
86+
Map<String, Map<String, String>> action = requestBody.get("action");
87+
Map<String, String> params = action.get("params");
88+
String dateCustom = params.get("dateCustom");
89+
String bld = params.get("bld");
16890

169-
List<Object> outputs = new ArrayList(1);
170-
outputs.add(simpleTextWrapper);
91+
log.info(dateCustom + " " + bld);
17192

172-
Map<String, Object> template = new HashMap<>();
173-
template.put("outputs", outputs);
93+
String specMeal = mealService.getSpecKorMeal(dateCustom, bld);
94+
Map<String, Object> responseBody = mealService.responseMeal(specMeal);
17495

175-
Map<String, Object> responseBody = new HashMap<>();
176-
responseBody.put("version", "2.0");
177-
responseBody.put("template", template);
96+
// if need to stratify.
97+
// ObjectMapper objectMapper = new ObjectMapper();
98+
// String result = objectMapper.writeValueAsString(responseBody);
17899

179-
ObjectMapper objectMapper = new ObjectMapper();
180-
String result = objectMapper.writeValueAsString(responseBody);
181-
182-
return result;
100+
return responseBody;
183101
}
184102

185103
@PostMapping("/speceng")
186-
public @ResponseBody String readSpecEngMeal() throws JsonProcessingException {
104+
public Map<String, Object> readSpecEngMeal(@RequestBody Map<String, Map<String, Map<String, String>>> requestBody) throws JsonProcessingException {
187105
// input : 날짜요일내일 + 아점저 + 1/2학
188106
// output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.)
189107

190-
// TODO 아래 기능 구현해 주세요.
191-
String specMeal = mealService.getSpecEngMeal();
192-
193-
// Response Body Construct
194-
// TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용.
195-
// const responseBody = {
196-
// version: "2.0",
197-
// template: {
198-
// outputs: [
199-
// {
200-
// simpleText: {
201-
// text: specMeal
202-
// }
203-
// }
204-
// ]
205-
// }
206-
// };
207-
208-
Map<String, Object> simpleText = new HashMap<>();
209-
simpleText.put("text", specMeal);
210-
211-
Map<String, Object> simpleTextWrapper = new HashMap<>();
212-
simpleTextWrapper.put("simpleText", simpleText);
213-
214-
List<Object> outputs = new ArrayList(1);
215-
outputs.add(simpleTextWrapper);
108+
Map<String, Map<String, String>> action = requestBody.get("action");
109+
Map<String, String> params = action.get("params");
110+
String dateCustom = params.get("dateCustom");
111+
String bld = params.get("bld");
216112

217-
Map<String, Object> template = new HashMap<>();
218-
template.put("outputs", outputs);
113+
log.info(dateCustom + " " + bld);
219114

220-
Map<String, Object> responseBody = new HashMap<>();
221-
responseBody.put("version", "2.0");
222-
responseBody.put("template", template);
115+
String specMeal = mealService.getSpecEngMeal(dateCustom, bld);
116+
Map<String, Object> responseBody = mealService.responseMeal(specMeal);
223117

224-
ObjectMapper objectMapper = new ObjectMapper();
225-
String result = objectMapper.writeValueAsString(responseBody);
118+
// if need to stratify.
119+
// ObjectMapper objectMapper = new ObjectMapper();
120+
// String result = objectMapper.writeValueAsString(responseBody);
226121

227-
return result;
122+
return responseBody;
228123
}
229124
}

src/main/java/com/example/helper/entity/Meal.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,16 @@ public class Meal {
3939
private String menu;
4040
@Column
4141
private String special;
42+
43+
public String generateMenu() {
44+
String menu = "";
45+
menu += this.date + " " + this.kind + "\n\n";
46+
menu += this.bldg + "\n\n";
47+
menu += this.menu;
48+
if(kindType == 1) {
49+
menu += "\n\\코너\\\n";
50+
menu += this.special;
51+
}
52+
return menu;
53+
}
4254
}

src/main/java/com/example/helper/repository/SqlMealRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ public Optional<Meal> findById(Long mealId) {
3939
return Optional.ofNullable(meal);
4040
}
4141

42+
public Optional<Meal> findByDate(Integer bldgType, Integer langType, Integer kindType, String date) {
43+
List<Meal> result = em.createQuery("select m from Meal m where " +
44+
"m.bldgType = :bldgType and m.langType = :langType and m.kindType = :kindType " +
45+
"and m.date = :date", Meal.class)
46+
.setParameter("bldgType", bldgType)
47+
.setParameter("langType", langType)
48+
.setParameter("kindType", kindType)
49+
.setParameter("date", date)
50+
.getResultList();
51+
52+
return result.stream().findAny();
53+
}
54+
4255
@Override
4356
public Long delete(Long mealId) {
4457
return null;

src/main/java/com/example/helper/service/MealService.java

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
import com.example.helper.entity.Meal;
44
import com.example.helper.repository.MealRepository;
55
import com.example.helper.repository.SqlMealRepository;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import lombok.extern.slf4j.Slf4j;
68
import org.springframework.beans.factory.annotation.Autowired;
79
import org.springframework.stereotype.Service;
810
import org.springframework.transaction.annotation.Transactional;
911

12+
import java.time.LocalDateTime;
13+
import java.time.ZoneId;
14+
import java.util.*;
15+
1016
@Service
1117
@Transactional
18+
@Slf4j
1219
public class MealService {
1320

1421
@Autowired(required = true)
@@ -32,24 +39,93 @@ private void validateDuplicateMeal(Meal meal) {
3239
});
3340
}
3441

42+
private String getNowMeal(Integer langType) {
43+
LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul"));
44+
45+
Integer hour = currentDateTime.getHour();
46+
Integer kindType = 0;
47+
if(9 <= hour && hour < 13) {
48+
kindType = 1;
49+
}
50+
else if(13 <= hour && hour < 19) {
51+
kindType = 2;
52+
}
53+
else if(19 <= hour && hour < 24) {
54+
kindType = 0;
55+
}
56+
else {
57+
kindType = 0;
58+
currentDateTime.plusDays(1);
59+
}
60+
61+
String date = currentDateTime.getYear() + "-";
62+
date += String.format("%02d", currentDateTime.getMonth().getValue()) + "-";
63+
date += String.format("%02d", currentDateTime.getDayOfMonth()) + "";
64+
65+
Optional<Meal> result = sqlMealRepository.findByDate(2, langType, kindType, date);
66+
67+
if(result.isEmpty()) {
68+
//throw new IllegalStateException("조건에 맞는 식단이 존재하지 않습니다.");
69+
if(langType == 0) {
70+
return "식단 준비중입니다.";
71+
}
72+
else {
73+
return "The meal is being prepared.";
74+
}
75+
}
76+
Meal meal = result.get();
77+
return meal.generateMenu();
78+
}
79+
3580
public String getNowKorMeal() {
36-
//TODO sqlMealRepository.findNowKorMeal
37-
return "2023-01-27 조식\n\n제2학생회관1층\n\n얼갈이된장국\n";
81+
return getNowMeal(0);
3882
}
3983

4084
public String getNowEngMeal() {
41-
//TODO sqlMealRepository.findNowEngMeal
42-
return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nSoybean Paste Soup\n";
85+
return getNowMeal(1);
4386
}
4487

45-
public String getSpecKorMeal() {
88+
public String getSpecKorMeal(String dateCustom, String bld) {
4689
//TODO sqlMealRepository.findSpecKorMeal
4790
return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n";
4891
}
4992

50-
public String getSpecEngMeal() {
93+
public String getSpecEngMeal(String dateCustom, String bld) {
5194
//TODO sqlMealRepository.findSpecEngMeal
5295
return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n";
5396
}
5497

98+
public Map<String, Object> responseMeal(String menu) {
99+
// Response Body Construct
100+
// const responseBody = {
101+
// version: "2.0",
102+
// template: {
103+
// outputs: [
104+
// {
105+
// simpleText: {
106+
// text: nowMeal
107+
// }
108+
// }
109+
// ]
110+
// }
111+
// };
112+
113+
Map<String, Object> simpleText = new HashMap<>();
114+
simpleText.put("text", menu);
115+
116+
Map<String, Object> simpleTextWrapper = new HashMap<>();
117+
simpleTextWrapper.put("simpleText", simpleText);
118+
119+
List<Object> outputs = new ArrayList(1);
120+
outputs.add(simpleTextWrapper);
121+
122+
Map<String, Object> template = new HashMap<>();
123+
template.put("outputs", outputs);
124+
125+
Map<String, Object> responseBody = new HashMap<>();
126+
responseBody.put("version", "2.0");
127+
responseBody.put("template", template);
128+
129+
return responseBody;
130+
}
55131
}

src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/helper_db
33
spring.datasource.username=helper
44
spring.datasource.password=12345678
55
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
6-
spring.jpa.hibernate.ddl-auto=create
6+
spring.jpa.hibernate.ddl-auto=validate
77

88
spring.jpa.show-sql=true
99
spring.jpa.properties.hibernate.format_sql=true

0 commit comments

Comments
 (0)