diff --git a/src/main/java/com/example/helper/controller/MealController.java b/src/main/java/com/example/helper/controller/MealController.java index ba96de7..09af679 100644 --- a/src/main/java/com/example/helper/controller/MealController.java +++ b/src/main/java/com/example/helper/controller/MealController.java @@ -1,15 +1,18 @@ package com.example.helper.controller; -import com.example.helper.dto.MealWrapper; +import com.example.helper.dto.Mealdto; import com.example.helper.entity.Meal; import com.example.helper.service.MealService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @RestController @@ -25,57 +28,202 @@ public String hello() { return "Hello HELPERs. 초기 세팅 완료."; } + @PostMapping("/test") + public @ResponseBody void test(String testStr) { + log.info(testStr); + } @PostMapping("/create") - public @ResponseBody String createMeal(MealWrapper mealWrapper) { - // 여기 구현해주세 222 - Meal meal = mealWrapper.getMeal(); - // merge test -// Meal saved = mealService.save(meal); + public @ResponseBody String createMeal(@RequestBody Mealdto mealDto) { + // input : 식단 json + // output : None + + // DTO to Entity + Meal meal = new Meal(); + BeanUtils.copyProperties(mealDto, meal); + + // DB Save + Long saved = mealService.mealCreate(meal); - return "saved"; // Responsebody 넣어서 보내는거 해보세요 + return "saved"; } @PostMapping("/kor") - public @ResponseBody String readKorMeal() { - // input : utc - // output : 카톡 서버맞게 한국어식단 JSON으로 -// const responseBody = { -// version: "2.0", -// template: { -// outputs: [ -// { -// simpleText: { -// text: rows[0].menu -// } -// } -// ] -// } -// }; -// res.status(200).send(responseBody); - return "saved"; // Responsebody 넣어서 보내는거 해보세요 + public @ResponseBody String readKorMeal() throws JsonProcessingException { + // input : None (먼저 서버에서 현재 시간 측정) + // output : 한국어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) + + // TODO 아래 기능 구현해 주세요. + String nowMeal = mealService.getNowKorMeal(); + + // 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; } @PostMapping("/eng") - public @ResponseBody String readEngMeal() { - // input : utc - // output : 카톡 서버맞게 영어식단 JSON으로 + public @ResponseBody String readEngMeal() throws JsonProcessingException { + // input : None (먼저 서버에서 현재 시간 측정) + // output : 영어 식단이 포함된 JSON (단, JSON은 카톡 서버가 받을 수 있는 형식이여야 함.) + + // TODO 아래 기능 구현해 주세요. + String nowMeal = mealService.getNowEngMeal(); + + // 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); - return "saved"; // Responsebody 넣어서 보내는거 해보세요 + Map responseBody = new HashMap<>(); + responseBody.put("version", "2.0"); + responseBody.put("template", template); + + ObjectMapper objectMapper = new ObjectMapper(); + String result = objectMapper.writeValueAsString(responseBody); + + return result; } @PostMapping("/speckor") - public @ResponseBody String readSpecKorMeal() { + public @ResponseBody String readSpecKorMeal() throws JsonProcessingException { // input : 날짜요일내일 + 아점저 + 1/2학 - // output : 해당 식단 찾아 카톡 서버맞게 JSON으로 + // 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); + + 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 "saved"; // Responsebody 넣어서 보내는거 해보세요 + ObjectMapper objectMapper = new ObjectMapper(); + String result = objectMapper.writeValueAsString(responseBody); + + return result; } @PostMapping("/speceng") - public @ResponseBody String readSpecEngMeal() { + public @ResponseBody String readSpecEngMeal() throws JsonProcessingException { // input : 날짜요일내일 + 아점저 + 1/2학 - // output : 해당 식단 찾아 카톡 서버맞게 JSON으로 + // 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 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 "saved"; // Responsebody 넣어서 보내는거 해보세요 + return result; } } diff --git a/src/main/java/com/example/helper/dto/MealWrapper.java b/src/main/java/com/example/helper/dto/MealWrapper.java deleted file mode 100644 index 3623ff1..0000000 --- a/src/main/java/com/example/helper/dto/MealWrapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.helper.dto; - -import com.example.helper.entity.Meal; -import lombok.Getter; - -@Getter -public class MealWrapper { - private Meal meal; -} diff --git a/src/main/java/com/example/helper/dto/Mealdto.java b/src/main/java/com/example/helper/dto/Mealdto.java index 8fb4638..f43f0a6 100644 --- a/src/main/java/com/example/helper/dto/Mealdto.java +++ b/src/main/java/com/example/helper/dto/Mealdto.java @@ -1,25 +1,21 @@ package com.example.helper.dto; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import jakarta.persistence.Column; +import lombok.*; @ToString @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public class Mealdto { - - - public Mealdto(String title, String meal_date, String kind_of_meal, String menu) { - this.title = title; - this.meal_date = meal_date; - this.kind_of_meal = kind_of_meal; - this.menu = menu; - } - - private String title; - private String meal_date; - private String kind_of_meal; + private Integer bldgType; + private Integer langType; + private Integer dateType; + private Integer kindType; + private String bldg; + private String date; + private String kind; private String menu; - + private String special; } diff --git a/src/main/java/com/example/helper/entity/Meal.java b/src/main/java/com/example/helper/entity/Meal.java index 72f5d23..3b1e168 100644 --- a/src/main/java/com/example/helper/entity/Meal.java +++ b/src/main/java/com/example/helper/entity/Meal.java @@ -21,16 +21,22 @@ public class Meal { @Id @GeneratedValue private Long id; - @Column - private String title; - + private Integer bldgType; @Column - private String meal_date; - + private Integer langType; @Column - private String kind_of_meal; - + private Integer dateType; + @Column + private Integer kindType; + @Column + private String bldg; + @Column + private String date; + @Column + private String kind; @Column private String menu; + @Column + private String special; } diff --git a/src/main/java/com/example/helper/repository/MealRepository.java b/src/main/java/com/example/helper/repository/MealRepository.java index 704d822..902c2d4 100644 --- a/src/main/java/com/example/helper/repository/MealRepository.java +++ b/src/main/java/com/example/helper/repository/MealRepository.java @@ -2,12 +2,14 @@ import com.example.helper.entity.Meal; +import java.util.Optional; + public interface MealRepository { Meal save(Meal meal); - Long findIdByDateTitleKind(String title, String meal_date, String kind_of_meal); + Optional findByPk(Integer bldgType, Integer langType, Integer dateType, Integer kindType, String date); - Meal findById(Long mealId); + Optional findById(Long mealId); Long delete(Long mealId); } \ No newline at end of file diff --git a/src/main/java/com/example/helper/repository/SqlMealRepository.java b/src/main/java/com/example/helper/repository/SqlMealRepository.java new file mode 100644 index 0000000..c20ff84 --- /dev/null +++ b/src/main/java/com/example/helper/repository/SqlMealRepository.java @@ -0,0 +1,46 @@ +package com.example.helper.repository; + +import com.example.helper.entity.Meal; +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class SqlMealRepository implements MealRepository { + private final EntityManager em; + public SqlMealRepository(EntityManager em) { + this.em = em; + } + @Override + public Meal save(Meal meal) { + em.persist(meal); + return meal; + } + + @Override + public Optional findByPk(Integer bldgType, Integer langType, Integer dateType, Integer kindType, String date) { + List result = em.createQuery("select m from Meal m where " + + "m.bldgType = :bldgType and m.langType = :langType and m.dateType = :dateType " + + "and m.kindType = :kindType and m.date = :date", Meal.class) + .setParameter("bldgType", bldgType) + .setParameter("langType", langType) + .setParameter("dateType", dateType) + .setParameter("kindType", kindType) + .setParameter("date", date) + .getResultList(); + return result.stream().findAny(); + } + + @Override + public Optional findById(Long mealId) { + Meal meal = em.find(Meal.class, mealId); + return Optional.ofNullable(meal); + } + + @Override + public Long delete(Long mealId) { + return null; + } +} diff --git a/src/main/java/com/example/helper/repository/SqliteMealRepository.java b/src/main/java/com/example/helper/repository/SqliteMealRepository.java deleted file mode 100644 index 0398d2e..0000000 --- a/src/main/java/com/example/helper/repository/SqliteMealRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.helper.repository; - -import com.example.helper.entity.Meal; -import org.springframework.stereotype.Repository; - -@Repository -public class SqliteMealRepository implements MealRepository { - @Override - public Meal save(Meal meal) { - return null; - } - - @Override - public Long findIdByDateTitleKind(String title, String meal_date, String kind_of_meal) { - return null; - } - - @Override - public Meal findById(Long mealId) { - return null; - } - - @Override - public Long delete(Long mealId) { - return null; - } - -// private final SqliteConnection sqliteConnection; -// -// public SqliteMealRepository(SqliteConnection sqliteConnection) { -// this.sqliteConnection = sqliteConnection; -// } -// -// @Override -// public Meal save(Meal meal) { -// String sql = "INSERT INTO meal (title, meal_date, kind_of_meal, menu) VALUES (?, ?, ?, ?)"; -// Long mealId = sqliteConnection.insert(sql, meal.getTitle(), meal.getMeal_date(), meal.getKind_of_meal(), -// meal.getMenu()); -// return findById(meal.getId()); -// } - - -} diff --git a/src/main/java/com/example/helper/service/MealService.java b/src/main/java/com/example/helper/service/MealService.java index 698d084..f7a8e0a 100644 --- a/src/main/java/com/example/helper/service/MealService.java +++ b/src/main/java/com/example/helper/service/MealService.java @@ -2,39 +2,54 @@ import com.example.helper.entity.Meal; import com.example.helper.repository.MealRepository; +import com.example.helper.repository.SqlMealRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service +@Transactional public class MealService { @Autowired(required = true) - private MealRepository mealRepository; -// -// public Meal save(Meal mael) { -// Meal n = new Meal(); -// -// n.setTitle(meal.getTitle()); -// n.setStart(reqMeal.getStart()); -// n.setEnd(reqMeal.getEnd()); -// n.setUser(reqMeal.getUser()); -// -// // 중복 모르겠고 일단 다 넣자. -//// if ( -//// !timetableService.validateDay(reqTime.getDay()) -//// || !timetableService.validateTime(reqTime.getStart(), reqTime.getEnd()) -//// || timetableService.isDuplicateNew(n, newBuildingTimetableRepository.findByDay(reqTime.getDay())) -//// ) { -//// Throwable ex = new Throwable(); -//// throw new ResponseStatusException( -//// HttpStatus.NOT_ACCEPTABLE, "Invalid day, time", ex); -//// } -//// mealRepository.save(n); -// } -// -// public Meal findByMeal(Meal meal) { -// Meal result = new Meal(); -// Integer target = mealRepository.findByDateTitlealfajflkfdj() -// -// } + private SqlMealRepository sqlMealRepository; + + public MealService(SqlMealRepository sqlMealRepository) { + this.sqlMealRepository = sqlMealRepository; + } + + public Long mealCreate(Meal meal) { + validateDuplicateMeal(meal); + sqlMealRepository.save(meal); + return meal.getId(); + } + + private void validateDuplicateMeal(Meal meal) { + // DB 중복 체크 + sqlMealRepository.findByPk(meal.getBldgType(), meal.getLangType(), meal.getDateType(), meal.getKindType(), meal.getDate()) + .ifPresent(m -> { + throw new IllegalStateException("이미 존재하는 식단입니다."); + }); + } + + public String getNowKorMeal() { + //TODO sqlMealRepository.findNowKorMeal + return "2023-01-27 조식\n\n제2학생회관1층\n\n얼갈이된장국\n"; + } + + public String getNowEngMeal() { + //TODO sqlMealRepository.findNowEngMeal + return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nSoybean Paste Soup\n"; + } + + public String getSpecKorMeal() { + //TODO sqlMealRepository.findSpecKorMeal + return "2023-01-27 조식\n\n제2학생회관1층\n\n흰밥*김가루양념밥\n"; + } + + public String getSpecEngMeal() { + //TODO sqlMealRepository.findSpecEngMeal + return "2023-01-27 Breakfast\n\nStudent Union Bldg.2 1st floor\n\nWhite rice*Seasoned rice with seaweed\n"; + } + }