Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
182 changes: 38 additions & 144 deletions src/main/java/com/example/helper/controller/MealController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,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;
Expand Down Expand Up @@ -57,183 +58,76 @@ public String createMeal(@RequestBody Mealdto mealDto) {
}

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

// TODO 아래 기능 구현해 주세요.
String nowMeal = mealService.getNowKorMeal();
Map<String, Object> 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<String, Object> simpleText = new HashMap<>();
simpleText.put("text", nowMeal);

Map<String, Object> simpleTextWrapper = new HashMap<>();
simpleTextWrapper.put("simpleText", simpleText);

List<Object> outputs = new ArrayList(1);
outputs.add(simpleTextWrapper);

Map<String, Object> template = new HashMap<>();
template.put("outputs", outputs);

Map<String, Object> 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("/eng")
public String readEngMeal() throws JsonProcessingException {
public Map<String, Object> readEngMeal() throws JsonProcessingException {
// input : None (먼저 서버에서 현재 시간 측정)
// output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.)

// TODO 아래 기능 구현해 주세요.
String nowMeal = mealService.getNowEngMeal();
Map<String, Object> responseBody = mealService.responseMeal(nowMeal);

// Response Body Construct
// TODO 더 좋은 방식이 있으면 구현해 주세요. ex) dto 이용.
// const responseBody = {
// version: "2.0",
// template: {
// outputs: [
// {
// simpleText: {
// text: nowMeal
// }
// }
// ]
// }
// };

Map<String, Object> simpleText = new HashMap<>();
simpleText.put("text", nowMeal);

Map<String, Object> simpleTextWrapper = new HashMap<>();
simpleTextWrapper.put("simpleText", simpleText);

List<Object> outputs = new ArrayList(1);
outputs.add(simpleTextWrapper);

Map<String, Object> template = new HashMap<>();
template.put("outputs", outputs);

Map<String, Object> 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("/speckor")
public String readSpecKorMeal() throws JsonProcessingException {
public Map<String, Object> readSpecKorMeal(@RequestBody Map<String, Map<String, Map<String, String>>> 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<String, Object> simpleText = new HashMap<>();
simpleText.put("text", specMeal);

Map<String, Object> simpleTextWrapper = new HashMap<>();
simpleTextWrapper.put("simpleText", simpleText);

List<Object> outputs = new ArrayList(1);
outputs.add(simpleTextWrapper);
Map<String, Map<String, String>> action = requestBody.get("action");
Map<String, String> params = action.get("params");
String dateCustom = params.get("dateCustom");
String bld = params.get("bld");

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

Map<String, Object> responseBody = new HashMap<>();
responseBody.put("version", "2.0");
responseBody.put("template", template);
String specMeal = mealService.getSpecKorMeal(dateCustom, bld);
Map<String, Object> 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;
}

@PostMapping("/speceng")
public String readSpecEngMeal() throws JsonProcessingException {
public Map<String, Object> readSpecEngMeal(@RequestBody Map<String, Map<String, Map<String, String>>> 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<String, Object> simpleText = new HashMap<>();
simpleText.put("text", specMeal);

Map<String, Object> simpleTextWrapper = new HashMap<>();
simpleTextWrapper.put("simpleText", simpleText);

List<Object> outputs = new ArrayList(1);
outputs.add(simpleTextWrapper);
Map<String, Map<String, String>> action = requestBody.get("action");
Map<String, String> params = action.get("params");
String dateCustom = params.get("dateCustom");
String bld = params.get("bld");

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

Map<String, Object> responseBody = new HashMap<>();
responseBody.put("version", "2.0");
responseBody.put("template", template);
String specMeal = mealService.getSpecEngMeal(dateCustom, bld);
Map<String, Object> 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;
}

// FE쪽에서 query에 담아주면 아래처럼 dto 객체 하나만 req로 받으면 되서 코드 깔끔함.
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/example/helper/entity/Meal.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/example/helper/repository/SqlMealRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,19 @@ public Optional<Meal> findById(Long mealId) {
return Optional.ofNullable(meal);
}

public Optional<Meal> findByDate(Integer bldgType, Integer langType, Integer kindType, String date) {
List<Meal> 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;
Expand Down
90 changes: 84 additions & 6 deletions src/main/java/com/example/helper/service/MealService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,21 @@
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 java.util.List;
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)
Expand All @@ -35,23 +43,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<Meal> 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<String, Object> responseMeal(String menu) {
// Response Body Construct
// const responseBody = {
// version: "2.0",
// template: {
// outputs: [
// {
// simpleText: {
// text: nowMeal
// }
// }
// ]
// }
// };

Map<String, Object> simpleText = new HashMap<>();
simpleText.put("text", menu);

Map<String, Object> simpleTextWrapper = new HashMap<>();
simpleTextWrapper.put("simpleText", simpleText);

List<Object> outputs = new ArrayList(1);
outputs.add(simpleTextWrapper);

Map<String, Object> template = new HashMap<>();
template.put("outputs", outputs);

Map<String, Object> responseBody = new HashMap<>();
responseBody.put("version", "2.0");
responseBody.put("template", template);

return responseBody;
}
}
Loading