diff --git a/src/main/java/koreatech/in/controller/CalendarController.java b/src/main/java/koreatech/in/controller/CalendarController.java index e89c1645..9ee82ab9 100644 --- a/src/main/java/koreatech/in/controller/CalendarController.java +++ b/src/main/java/koreatech/in/controller/CalendarController.java @@ -13,6 +13,7 @@ import javax.inject.Inject; import java.util.List; +import java.util.Map; @Controller public class CalendarController { @@ -27,7 +28,7 @@ ResponseEntity> getCalendars(@ApiParam(required = true) @RequestP @RequestMapping(value = "/term", method = RequestMethod.GET) public @ResponseBody - ResponseEntity getTerm() throws Exception { + ResponseEntity> getTerm() throws Exception { return new ResponseEntity<>(calendarService.getTerm(), HttpStatus.OK); } } diff --git a/src/main/java/koreatech/in/controller/KakaoBotController.java b/src/main/java/koreatech/in/controller/KakaoBotController.java index d84637d9..a6f3aa7c 100644 --- a/src/main/java/koreatech/in/controller/KakaoBotController.java +++ b/src/main/java/koreatech/in/controller/KakaoBotController.java @@ -3,7 +3,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParser; import koreatech.in.service.KakaoBotService; -import koreatech.in.skillresponse.KakaoBotEnum; +import koreatech.in.skillresponse.KakaoBot; import koreatech.in.skillresponse.SkillResponse; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -25,17 +25,17 @@ public class KakaoBotController { @RequestMapping(value = "/dinings", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public @ResponseBody - ResponseEntity requestDinings(@RequestBody String body) { - JsonParser jsonParser = new JsonParser(); - JsonElement jsonElement = jsonParser.parse(body); - - // ['action']['params']['mealtime'] - JsonElement action = jsonElement.getAsJsonObject().get("action"); - JsonElement params = action.getAsJsonObject().get("params"); - String mealtime = params.getAsJsonObject().get("mealtime").getAsString(); - + ResponseEntity requestDinings(@RequestBody String body) { String result; try { + JsonParser jsonParser = new JsonParser(); + JsonElement jsonElement = jsonParser.parse(body); + + // ['action']['params']['mealtime'] + JsonElement action = jsonElement.getAsJsonObject().get("action"); + JsonElement params = action.getAsJsonObject().get("params"); + String mealtime = params.getAsJsonObject().get("mealtime").getAsString(); + result = kakaoBotService.crawlHaksik(mealtime); } catch (Exception e) { SkillResponse errorMsg = new SkillResponse(); @@ -43,41 +43,41 @@ ResponseEntity requestDinings(@RequestBody String body) { result = errorMsg.getSkillPayload().toString(); } - return new ResponseEntity(result, HttpStatus.OK); + return new ResponseEntity<>(result, HttpStatus.OK); } @RequestMapping(value = "/buses/request", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public @ResponseBody - ResponseEntity requestBuses(@RequestBody String body) { + ResponseEntity requestBuses(@RequestBody String body) { SkillResponse busSkill = new SkillResponse(); - busSkill.addQujckReplies("한기대→야우리", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "한기대→야우리"); - busSkill.addQujckReplies("한기대→천안역", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "한기대→천안역"); - busSkill.addQujckReplies("야우리→한기대", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "야우리→한기대"); - busSkill.addQujckReplies("야우리→천안역", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "야우리→천안역"); - busSkill.addQujckReplies("천안역→한기대", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "천안역→한기대"); - busSkill.addQujckReplies("천안역→야우리", KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText(), "천안역→야우리"); + busSkill.addQujckReplies("한기대→야우리", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "한기대→야우리"); + busSkill.addQujckReplies("한기대→천안역", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "한기대→천안역"); + busSkill.addQujckReplies("야우리→한기대", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "야우리→한기대"); + busSkill.addQujckReplies("야우리→천안역", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "야우리→천안역"); + busSkill.addQujckReplies("천안역→한기대", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "천안역→한기대"); + busSkill.addQujckReplies("천안역→야우리", KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText(), "천안역→야우리"); busSkill.addSimpleText("선택하세요!"); String busSkillStr = busSkill.getSkillPayload().toString(); - return new ResponseEntity(busSkillStr, HttpStatus.OK); + return new ResponseEntity<>(busSkillStr, HttpStatus.OK); } @RequestMapping(value = "/buses", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public @ResponseBody - ResponseEntity returnBuses(@RequestBody String body) { - JsonParser jsonParser = new JsonParser(); - JsonElement jsonElement = jsonParser.parse(body); - - // ['action']['params']['place'], ['action']['params']['place1'] - JsonElement action = jsonElement.getAsJsonObject().get("action"); - JsonElement params = action.getAsJsonObject().get("params"); - String depart = params.getAsJsonObject().get("place").getAsString(); - String arrival = params.getAsJsonObject().get("place1").getAsString(); - + ResponseEntity returnBuses(@RequestBody String body) { String result; try { + JsonParser jsonParser = new JsonParser(); + JsonElement jsonElement = jsonParser.parse(body); + + // ['action']['params']['place'], ['action']['params']['place1'] + JsonElement action = jsonElement.getAsJsonObject().get("action"); + JsonElement params = action.getAsJsonObject().get("params"); + String depart = params.getAsJsonObject().get("place").getAsString(); + String arrival = params.getAsJsonObject().get("place1").getAsString(); + result = kakaoBotService.calculateBus(depart, arrival); } catch (Exception e) { SkillResponse errorMsg = new SkillResponse(); @@ -85,6 +85,6 @@ ResponseEntity returnBuses(@RequestBody String body) { result = errorMsg.getSkillPayload().toString(); } - return new ResponseEntity(result, HttpStatus.OK); + return new ResponseEntity<>(result, HttpStatus.OK); } } diff --git a/src/main/java/koreatech/in/controller/LostAndFoundController.java b/src/main/java/koreatech/in/controller/LostAndFoundController.java index 0ae8723d..0e39585c 100644 --- a/src/main/java/koreatech/in/controller/LostAndFoundController.java +++ b/src/main/java/koreatech/in/controller/LostAndFoundController.java @@ -64,7 +64,7 @@ ResponseEntity getLostItem(@ApiParam(required = true) @PathVariable int id) thro @ApiOperation(value = "", authorizations = {@Authorization(value="Authorization")}) @RequestMapping(value = "/lost/lostItems/{id}", method = RequestMethod.PUT) public @ResponseBody - ResponseEntity updateLostItem(@ApiParam(value="(optional: type, title, location, date, content, state, phone, is_phone_open, thumbnail)", required = false) @RequestBody @Validated(ValidationGroups.Update.class) LostItem lostItem, BindingResult bindingResult, @ApiParam(required = true) @PathVariable int id) throws Exception { + ResponseEntity updateLostItem(@ApiParam(value="(required: type), (optional: title, location, date, content, state, phone, is_phone_open, thumbnail)", required = false) @RequestBody @Validated(ValidationGroups.Update.class) LostItem lostItem, BindingResult bindingResult, @ApiParam(required = true) @PathVariable int id) throws Exception { LostItem clear = new LostItem(); return new ResponseEntity(lostAndFoundService.updateLostItem((LostItem) StringXssChecker.xssCheck(lostItem, clear), id), HttpStatus.CREATED); } diff --git a/src/main/java/koreatech/in/controller/admin/AdminCalendarController.java b/src/main/java/koreatech/in/controller/admin/AdminCalendarController.java index 61095af2..0b7fd633 100644 --- a/src/main/java/koreatech/in/controller/admin/AdminCalendarController.java +++ b/src/main/java/koreatech/in/controller/admin/AdminCalendarController.java @@ -24,7 +24,7 @@ public class AdminCalendarController { @ApiOperation(value = "", authorizations = {@Authorization(value="Authorization")}) @RequestMapping(value = "/admin/term", method = RequestMethod.POST) public @ResponseBody - ResponseEntity createTerm(@ApiParam(required = true, value = "10: 1학기 정규, 11: 1학기 계절, 20: 2학기 정규, 21: 2학기 계절") @RequestBody String term) { + ResponseEntity createTerm(@ApiParam(required = true, value = "10: 1학기 정규, 11: 1학기 계절, 12: 1학기 계절 이후, 20: 2학기 정규, 21: 2학기 계절, 22: 2학기 계절 이후") @RequestBody String term) { return new ResponseEntity<>(calendarService.createTermForAdmin(term), HttpStatus.CREATED); } diff --git a/src/main/java/koreatech/in/domain/BokDuck/Land.java b/src/main/java/koreatech/in/domain/BokDuck/Land.java index 54ef3639..0c49d677 100644 --- a/src/main/java/koreatech/in/domain/BokDuck/Land.java +++ b/src/main/java/koreatech/in/domain/BokDuck/Land.java @@ -4,17 +4,17 @@ import io.swagger.annotations.ApiModelProperty; import koreatech.in.annotation.ValidationGroups; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.validation.constraints.*; import java.util.Date; public class Land { @ApiModelProperty(notes = "고유 id", example = "10") private Integer id; - @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "원룸 건물 이름은 비워둘 수 없습니다.") - @ApiModelProperty(notes = "원룸 건물 이름", example = "10") + @Size(max = 255, message = "건물 이름은 255자 이내여야 합니다.") + @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "건물 이름은 비워둘 수 없습니다.") + @ApiModelProperty(notes = "건물 이름", example = "라이프") private String name; - @ApiModelProperty(notes = "고유 링크", example = "라이프") + @ApiModelProperty(hidden = true) private String internal_name; @ApiModelProperty(notes = "방 크기", example = "3.5") private Double size; @@ -33,14 +33,20 @@ public class Land { private String address; @ApiModelProperty(notes = "세부사항", example = "세부사항입니다.") private String description; + @Max(value = Integer.MAX_VALUE, message = "입력할 수 없는 층수입니다.") + @Min(value = 0, message = "입력할 수 없는 층수입니다.") @ApiModelProperty(notes = "층수", example = "4") private Integer floor; + @Size(max = 255, message = "보증금은 255자 이내여야 합니다.") @ApiModelProperty(notes = "보증금", example = "35.5") private String deposit; + @Size(max = 255, message = "월세는 255자 이내여야 합니다.") @ApiModelProperty(notes = "월세", example = "170(6개월)") private String monthly_fee; + @Size(max = 255, message = "전세는 255자 이내여야 합니다.") @ApiModelProperty(notes = "전세", example = "43.2") private String charter_fee; + @Size(max = 255, message = "관리비는 255자 이내여야 합니다.") @ApiModelProperty(notes = "관리비", example = "21(1인)/22(2인)/23(3인)") private String management_fee; @ApiModelProperty(notes = "냉장고 보유 여부", example = "1") diff --git a/src/main/java/koreatech/in/domain/Circle/Circle.java b/src/main/java/koreatech/in/domain/Circle/Circle.java index 398bcdb9..526ee901 100644 --- a/src/main/java/koreatech/in/domain/Circle/Circle.java +++ b/src/main/java/koreatech/in/domain/Circle/Circle.java @@ -5,6 +5,7 @@ import koreatech.in.annotation.ValidationGroups; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -15,6 +16,7 @@ public class Circle { @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "동아리 카테고리는 비워둘 수 없습니다.") @ApiModelProperty(notes = "예술분야(C001), 공연분야(C002), 운동분야(C003), 학술분야(C004), 종교분야(C005), 사회봉사(C006), 준동아리(C007)", example = "C001") private String category; + @Size(max = 50, message = "동아리 이름은 50자 이내여야 합니다.") @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "동아리 이름은 비워둘 수 없습니다.") @ApiModelProperty(notes = "동아리 이름", example = "BCSD LAB") private String name; @@ -33,11 +35,14 @@ public class Circle { private Boolean is_deleted; @ApiModelProperty(notes = "담당교수", example = "교수님") private String professor; + @Size(max = 255, message = "동아리방 위치 설명은 255자 이내여야 합니다.") @ApiModelProperty(notes = "동아리방 위치", example = "동아리방 412호") private String location; + @Size(max = 255, message = "주요사업 설명은 255자 이내여야 합니다.") @ApiModelProperty(notes = "주요사업", example = "컴퓨터 고치기") private String major_business; - @ApiModelProperty(notes = "메인 소개 홈페이지", example = "https://bcsdlab.com") + @Size(max = 255, message = "동아리 홈페이지 링크는 255자 이내여야 합니다.") + @ApiModelProperty(notes = "동아리 홈페이지", example = "https://bcsdlab.com") private String introduce_url; @ApiModelProperty(hidden = true) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") diff --git a/src/main/java/koreatech/in/domain/Community/Article.java b/src/main/java/koreatech/in/domain/Community/Article.java index dbdc3824..d0930234 100644 --- a/src/main/java/koreatech/in/domain/Community/Article.java +++ b/src/main/java/koreatech/in/domain/Community/Article.java @@ -7,6 +7,7 @@ import org.jsoup.Jsoup; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; public class Article { @@ -16,6 +17,7 @@ public class Article { @NotNull(groups = { ValidationGroups.Create.class, ValidationGroups.CreateAdmin.class, ValidationGroups.Update.class, ValidationGroups.UpdateAdmin.class }, message = "board_id는 비워둘 수 없습니다.") @ApiModelProperty(notes = "게시판의 고유 id", example = "10") private Integer board_id; + @Size(max = 255, message = "제목은 255자 이내여야 합니다.") @NotNull(groups = { ValidationGroups.Create.class, ValidationGroups.CreateAdmin.class }, message = "게시글 제목은 비워둘 수 없습니다.") @ApiModelProperty(notes = "제목", example = "제목입니다.") private String title; diff --git a/src/main/java/koreatech/in/domain/Faq/Faq.java b/src/main/java/koreatech/in/domain/Faq/Faq.java index f59fa51f..28d97794 100644 --- a/src/main/java/koreatech/in/domain/Faq/Faq.java +++ b/src/main/java/koreatech/in/domain/Faq/Faq.java @@ -5,11 +5,13 @@ import koreatech.in.annotation.ValidationGroups; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; public class Faq { @ApiModelProperty(notes = "고유 id", example = "10") private Integer id; + @Size(max = 255, message = "질문은 255자 이내여야 합니다.") @NotNull(groups = { ValidationGroups.CreateAdmin.class, ValidationGroups.UpdateAdmin.class }, message = "질문은 비워둘 수 없습니다.") @ApiModelProperty(notes = "질문", example = "질문1") private String question; diff --git a/src/main/java/koreatech/in/domain/KakaoBot.java b/src/main/java/koreatech/in/domain/KakaoBot.java deleted file mode 100644 index 8e456381..00000000 --- a/src/main/java/koreatech/in/domain/KakaoBot.java +++ /dev/null @@ -1,496 +0,0 @@ -package koreatech.in.domain; - -import koreatech.in.skillresponse.KakaoBotEnum; -import org.springframework.data.redis.core.ValueOperations; - -import javax.annotation.Resource; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - -public class KakaoBot { - private static final Map changeWord = new HashMap() {{ - put("아침", "BREAKFAST"); - put("점심", "LUNCH"); - put("저녁", "DINNER"); - put("한기대", "koreatech"); - put("야우리", "terminal"); - put("천안역", "station"); - }}; - - private static final String[] restaurantList = {"한식", "일품식", "특식", "양식", "능수관"}; //, "수박여", "2캠퍼스" - - // 통학중 셔틀 정보 : https://www.koreatech.ac.kr/kor/CMS/Contents/Contents.do?mCode=MN317 - // 방학중 셔틀 정보 : https://www.koreatech.ac.kr/kor/CMS/Contents/Contents.do?mCode=MN318 - // 2019년 겨울 방학 셔틀 : https://www.koreatech.ac.kr/kor/CMS/NoticeMgr/view.do?mCode=MN230&post_seq=25166&board_id=14 - private static final String[] expressFromKoreatechToTerminal = { - "08:35", - "09:35", - "10:35", - "11:30", - "12:35", - "13:35", - "14:35", - "15:30", - "16:35", - "17:35", - "18:35", - "19:35", - "20:30", - "22:05" - }; - - private static final String[] expressFromTerminalToKoreatech = { - "07:00", - "08:00", - "09:00", - "10:00", - "11:00", - "12:00", - "13:00", - "14:00", - "15:00", - "16:00", - "17:00", - "18:00", - "19:00", - "20:30", - }; - private static final String[][] shuttleFromKoreatech = { - { // 월요일 - "14:00", - "18:10", - }, - { // 화요일 - "14:00", - "18:10", - }, - { // 수요일 - "14:00", - "18:10", - }, - { // 목요일 - "14:00", - "18:10", - }, - { // 금요일 - "14:00", - "18:10", - }, - { // 토요일 - }, - { // 일요일 - } - }; - // private static final String[][] shuttleFromKoreatech = { -// { // 월요일 -// "09:10", -// "11:00", -// "14:00", -// "15:00", -// "16:00", -// "16:30", -// "17:00", -// "19:30", -// "21:00", -// "22:40" -// }, -// { // 화요일 -// "09:10", -// "11:00", -// "14:00", -// "15:00", -// "16:00", -// "16:30", -// "17:00", -// "19:30", -// "21:00", -// "22:40" -// }, -// { // 수요일 -// "09:10", -// "11:00", -// "14:00", -// "15:00", -// "16:00", -// "16:30", -// "17:00", -// "19:30", -// "21:00", -// "22:40" -// }, -// { // 목요일 -// "09:10", -// "11:00", -// "14:00", -// "15:00", -// "16:00", -// "16:30", -// "17:00", -// "19:30", -// "21:00", -// "22:40" -// }, -// { // 금요일 -// "09:10", -// "11:00", -// "14:00", -// "14:30", -// "15:00", -// "16:00", -// "16:30", -// "17:00", -// "19:30", -// "21:00", -// "22:40" -// }, -// { // 토요일 -// "14:00" -// }, -// { // 일요일 -// "17:00" -// } -// }; - //방학기간 - private static final String[][] shuttleFromTerminal = { - { // 월요일 - "08:00", - "14:25" - }, - { // 화요일 - "08:00", - "14:25" - }, - { // 수요일 - "08:00", - "14:25" - }, - { // 목요일 - "08:00", - "14:25" - }, - { // 금요일 - "08:00", - "14:25" - }, - { // 토요일 - - }, - { // 일요일 - - } - }; - //통학기간 -// private static final String[][] shuttleFromTerminal = { -// { // 월요일 -// "08:00", -// "10:10", -// "11:25", -// "14:25", -// "16:05", -// "16:25", -// "16:55", -// "17:25", -// "18:45", -// "19:55", -// "22:00" -// }, -// { // 화요일 -// "08:00", -// "10:10", -// "11:25", -// "14:25", -// "16:05", -// "16:25", -// "16:55", -// "17:25", -// "18:45", -// "19:55", -// "22:00" -// }, -// { // 수요일 -// "08:00", -// "10:10", -// "11:25", -// "14:25", -// "16:05", -// "16:25", -// "16:55", -// "17:25", -// "18:45", -// "19:55", -// "22:00" -// }, -// { // 목요일 -// "08:00", -// "10:10", -// "11:25", -// "14:25", -// "16:05", -// "16:25", -// "16:55", -// "17:25", -// "18:45", -// "19:55", -// "22:00" -// }, -// { // 금요일 -// "08:00", -// "10:10", -// "11:25", -// "14:25", -// "16:05", -// "16:25", -// "16:55", -// "17:25", -// "18:45", -// "19:55", -// "22:00" -// }, -// { // 토요일 -// "14:25", -// "18:45" -// }, -// { // 일요일 -// "17:30", -// "21:15", -// "21:30" -// } -// }; - - - - - //방학기간 - private static final String[][] shuttleFromStationToKoreatech = { - { // 월요일 - "08:05", - "14:30" - }, - { // 화요일 - "08:05", - "14:30" - }, - { // 수요일 - "08:05", - "14:30" - }, - { // 목요일 - "08:05", - "14:30" - }, - { // 금요일 - "08:05", - "14:30" - }, - { // 토요일 - }, - { // 일요일 - } - }; -//통학기간 -// private static final String[][] shuttleFromStationToKoreatech = { -// { // 월요일 -// "08:05", -// "10:15", -// "11:30", -// "14:30", -// "16:10", -// "16:30", -// "17:00", -// "17:30", -// "18:50", -// "20:00", -// "22:05" -// }, -// { // 화요일 -// "08:05", -// "10:15", -// "11:30", -// "14:30", -// "16:10", -// "16:30", -// "17:00", -// "17:30", -// "18:50", -// "20:00", -// "22:05" -// }, -// { // 수요일 -// "08:05", -// "10:15", -// "11:30", -// "14:30", -// "16:10", -// "16:30", -// "17:00", -// "17:30", -// "18:50", -// "20:00", -// "22:05" -// }, -// { // 목요일 -// "08:05", -// "10:15", -// "11:30", -// "14:30", -// "16:10", -// "16:30", -// "17:00", -// "17:30", -// "18:50", -// "20:00", -// "22:05" -// }, -// { // 금요일 -// "08:05", -// "10:15", -// "11:30", -// "14:30", -// "16:10", -// "16:30", -// "17:00", -// "17:30", -// "18:50", -// "20:00", -// "22:05" -// }, -// { // 토요일 -// "14:30", -// "18:50" -// }, -// { // 일요일 -// "17:35", -// "21:20", -// "21:35" -// } -// }; - - - private static final String[][] shuttleFromStationToTerminal = { - { // 월요일 - }, - { // 화요일 - }, - { // 수요일 - }, - { // 목요일 - }, - { // 금요일 - }, - { // 토요일 - }, - { // 일요일 - } - }; -// 통학기간 -// private static final String[][] shuttleFromStationToTerminal = { -// { // 월요일 -// "09:30", -// "15:20" -// }, -// { // 화요일 -// "09:30", -// "15:20" -// }, -// { // 수요일 -// "09:30", -// "15:20" -// }, -// { // 목요일 -// "09:30", -// "15:20" -// }, -// { // 금요일 -// "09:30", -// "15:20" -// }, -// { // 토요일 -// }, -// { // 일요일 -// } -// }; - - private static final Map shuttleTimeTables = new HashMap() {{ - put("koreatech", shuttleFromKoreatech); - put("terminal", shuttleFromTerminal); - }}; - - private static int appendTime(String[] timetable, int startIndex, int busCode, StringBuilder result) throws ParseException { - String busName = KakaoBotEnum.BusType.values()[busCode].getTypeText(); // 학교셔틀 / 대성고속 / 시내버스 - - TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); - Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 - - Calendar currentBusTime = Calendar.getInstance(timeZone); // 현재 버스 시간의 Calendar 객체 - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); // 시간표 포맷 - simpleDateFormat.setTimeZone(timeZone); - - if(timetable.length == 0) { // 오늘의 운행 시간표가 없다면 ? - result.append(String.format("%s 미운행\n", busName)); - return -1; - } - - for (int i = startIndex; i < timetable.length; i++) { - currentBusTime.setTime(simpleDateFormat.parse(timetable[i])); - currentBusTime.set(currentTime.get(Calendar.YEAR), currentTime.get(Calendar.MONTH), currentTime.get(Calendar.DAY_OF_MONTH)); - // 오늘 일자로 시간 설정 - long timeDifference = currentBusTime.getTimeInMillis() - currentTime.getTimeInMillis(); - - if (timeDifference > 0) { // 오늘 남은 버스가 존재한다면 ? - int second = (int) (timeDifference / 1000) % 60; - int minute = (int) ((timeDifference / (1000 * 60)) % 60); - int hour = (int) ((timeDifference / (1000 * 60 * 60)) % 24); - result.append(String.format("%s, %d시간 %d분 %d초 남음\n", busName, hour, minute, second)); - return i; - } - } - result.append(String.format("%s 운행정보없음\n", busName)); - return -1; - } - - public static void searchShuttleTime(String departEng, String arrivalEng, StringBuilder resultNow, StringBuilder resultNext) throws ParseException { - TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); - Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 - - String[] shuttleTimeTable; - int dayType = (currentTime.get(Calendar.DAY_OF_WEEK) + 5) % 7; - - if (!departEng.equals("station")) { // 출발지가 천안역이 아니라면 ? - String[][] timeTable = (String[][]) shuttleTimeTables.get(departEng); // 출발지로 시간표 가져옴 - shuttleTimeTable = timeTable[dayType]; - } // 천안역이라면 ? - else - shuttleTimeTable = arrivalEng.equals("koreatech") ? shuttleFromStationToKoreatech[dayType] : shuttleFromStationToTerminal[dayType]; - // 도착지에 따라 다른 시간표 가져옴 - - int resultIndex = appendTime(shuttleTimeTable, 0, KakaoBotEnum.BusType.SHUTTLE.ordinal(), resultNow); - resultIndex = appendTime(shuttleTimeTable, resultIndex + 1, KakaoBotEnum.BusType.SHUTTLE.ordinal(), resultNext); - } - - public static void searchExpressTime(String departEnglish, String arrivalEnglish, StringBuilder resultNow, StringBuilder resultNext) throws ParseException { - String[] expressTimeTable; - - if (departEnglish.equals("koreatech") && arrivalEnglish.equals("terminal")) { // 학교에서 야우리 - expressTimeTable = expressFromKoreatechToTerminal; - } else if (departEnglish.equals("terminal") && arrivalEnglish.equals("koreatech")) { // 야우리에서 학교 - expressTimeTable = expressFromTerminalToKoreatech; - } else { // 그 외에는 운행하지 않으므로 - resultNow.append("대성고속 미운행\n"); - resultNext.append("대성고속 미운행\n"); - return; - } - - int resultIndex = appendTime(expressTimeTable, 0, KakaoBotEnum.BusType.EXPRESS.ordinal(), resultNow); - resultIndex = appendTime(expressTimeTable, resultIndex + 1, KakaoBotEnum.BusType.EXPRESS.ordinal(), resultNext); - } - - public static String[] getRestaurantList() { - return restaurantList; - } - - public static String getChangedWord(String beforeWord) { - return changeWord.get(beforeWord); - } -} diff --git a/src/main/java/koreatech/in/domain/KakaoBot/BusFactory.java b/src/main/java/koreatech/in/domain/KakaoBot/BusFactory.java new file mode 100644 index 00000000..ae6b7cf9 --- /dev/null +++ b/src/main/java/koreatech/in/domain/KakaoBot/BusFactory.java @@ -0,0 +1,20 @@ +package koreatech.in.domain.KakaoBot; + +public class BusFactory { + public static BusForTerm createBus(String termCode) { + int termInt = Integer.parseInt(termCode); + BusForTerm bus; + switch (termInt % 10) { + case 0: default: + bus = new RegularSemester(); + break; + case 1: + bus = new SeasonalSemester(); + break; + case 2: + bus = new Vacation(); + break; + } + return bus; + } +} diff --git a/src/main/java/koreatech/in/domain/KakaoBot/BusForTerm.java b/src/main/java/koreatech/in/domain/KakaoBot/BusForTerm.java new file mode 100644 index 00000000..7a922a60 --- /dev/null +++ b/src/main/java/koreatech/in/domain/KakaoBot/BusForTerm.java @@ -0,0 +1,109 @@ +package koreatech.in.domain.KakaoBot; + +import koreatech.in.skillresponse.KakaoBot; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; + +public abstract class BusForTerm { + // 통학중 셔틀 정보 : https://www.koreatech.ac.kr/kor/CMS/Contents/Contents.do?mCode=MN317 + // 방학중 셔틀 정보 : https://www.koreatech.ac.kr/kor/CMS/Contents/Contents.do?mCode=MN318 + // 2019년 겨울 방학 셔틀 : https://www.koreatech.ac.kr/kor/CMS/NoticeMgr/view.do?mCode=MN230&post_seq=25166&board_id=14 + + protected String[] expressFromKoreatechToTerminal = { + "08:35", + "09:35", + "10:35", + "11:30", + "12:35", + "13:35", + "14:35", + "15:30", + "16:35", + "17:35", + "18:35", + "19:35", + "20:30", + "22:05" + }; + + protected String[] expressFromTerminalToKoreatech = { + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:30", + }; + + public int appendTime(String[] timetable, int startIndex, int busCode, StringBuilder result) throws ParseException { + String busName = KakaoBot.BusType.values()[busCode].getTypeText(); // 학교셔틀 / 대성고속 / 시내버스 + + TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); + Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 + + Calendar currentBusTime = Calendar.getInstance(timeZone); // 현재 버스 시간의 Calendar 객체 + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); // 시간표 포맷 + simpleDateFormat.setTimeZone(timeZone); + + if(timetable.length == 0) { // 오늘의 운행 시간표가 없다면 ? + result.append(String.format("%s 미운행\n", busName)); + return -1; + } + + for (int i = startIndex; i < timetable.length; i++) { + currentBusTime.setTime(simpleDateFormat.parse(timetable[i])); + currentBusTime.set(currentTime.get(Calendar.YEAR), currentTime.get(Calendar.MONTH), currentTime.get(Calendar.DAY_OF_MONTH)); + // 오늘 일자로 시간 설정 + long timeDifference = currentBusTime.getTimeInMillis() - currentTime.getTimeInMillis(); + + if (timeDifference > 0) { // 오늘 남은 버스가 존재한다면 ? + int second = (int) (timeDifference / 1000) % 60; + int minute = (int) ((timeDifference / (1000 * 60)) % 60); + int hour = (int) ((timeDifference / (1000 * 60 * 60)) % 24); + result.append(String.format("%s, %d시간 %d분 %d초 남음\n", busName, hour, minute, second)); + return i; + } + } + result.append(String.format("%s 운행정보없음\n", busName)); + return -1; + } + + public void searchShuttleTime(String departEng, String arrivalEng, StringBuilder resultNow, StringBuilder resultNext) throws ParseException { + String[] shuttleTimeTable = getShuttleTimetable(departEng, arrivalEng); + + int resultIndex = appendTime(shuttleTimeTable, 0, KakaoBot.BusType.SHUTTLE.ordinal(), resultNow); + resultIndex = appendTime(shuttleTimeTable, resultIndex + 1, KakaoBot.BusType.SHUTTLE.ordinal(), resultNext); + } + + public void searchExpressTime(String departEng, String arrivalEng, StringBuilder resultNow, StringBuilder resultNext) throws ParseException { + String[] expressTimeTable; + + if (departEng.equalsIgnoreCase("koreatech") && arrivalEng.equalsIgnoreCase("terminal")) { // 학교에서 야우리 + expressTimeTable = expressFromKoreatechToTerminal; + } else if (departEng.equalsIgnoreCase("terminal") && arrivalEng.equalsIgnoreCase("koreatech")) { // 야우리에서 학교 + expressTimeTable = expressFromTerminalToKoreatech; + } else { // 그 외에는 운행하지 않으므로 + resultNow.append("대성고속 미운행\n"); + resultNext.append("대성고속 미운행\n"); + return; + } + + int resultIndex = appendTime(expressTimeTable, 0, KakaoBot.BusType.EXPRESS.ordinal(), resultNow); + resultIndex = appendTime(expressTimeTable, resultIndex + 1, KakaoBot.BusType.EXPRESS.ordinal(), resultNext); + } + + // Hook Method + protected abstract String[] getShuttleTimetable(String departEng, String arrivalEng); +} diff --git a/src/main/java/koreatech/in/domain/KakaoBot/RegularSemester.java b/src/main/java/koreatech/in/domain/KakaoBot/RegularSemester.java new file mode 100644 index 00000000..24e7cb9d --- /dev/null +++ b/src/main/java/koreatech/in/domain/KakaoBot/RegularSemester.java @@ -0,0 +1,270 @@ +package koreatech.in.domain.KakaoBot; + +import java.util.Calendar; +import java.util.TimeZone; + +public class RegularSemester extends BusForTerm { + private static final String[][] shuttleFromKoreatech = { + { // 월요일 + "09:10", + "11:00", + "14:00", + "15:00", + "16:00", + "16:30", + "17:00", + "19:30", + "21:00", + "22:40" + }, + { // 화요일 + "09:10", + "11:00", + "14:00", + "15:00", + "16:00", + "16:30", + "17:00", + "19:30", + "21:00", + "22:40" + }, + { // 수요일 + "09:10", + "11:00", + "14:00", + "15:00", + "16:00", + "16:30", + "17:00", + "19:30", + "21:00", + "22:40" + }, + { // 목요일 + "09:10", + "11:00", + "14:00", + "15:00", + "16:00", + "16:30", + "17:00", + "19:30", + "21:00", + "22:40" + }, + { // 금요일 + "09:10", + "11:00", + "14:00", + "14:30", + "15:00", + "16:00", + "16:30", + "17:00", + "19:30", + "21:00", + "22:40" + }, + { // 토요일 + "14:00" + }, + { // 일요일 + "17:00" + } + }; + + private static final String[][] shuttleFromTerminal = { + { // 월요일 + "08:00", + "10:10", + "11:25", + "14:25", + "16:05", + "16:25", + "16:55", + "17:25", + "18:45", + "19:55", + "22:00" + }, + { // 화요일 + "08:00", + "10:10", + "11:25", + "14:25", + "16:05", + "16:25", + "16:55", + "17:25", + "18:45", + "19:55", + "22:00" + }, + { // 수요일 + "08:00", + "10:10", + "11:25", + "14:25", + "16:05", + "16:25", + "16:55", + "17:25", + "18:45", + "19:55", + "22:00" + }, + { // 목요일 + "08:00", + "10:10", + "11:25", + "14:25", + "16:05", + "16:25", + "16:55", + "17:25", + "18:45", + "19:55", + "22:00" + }, + { // 금요일 + "08:00", + "10:10", + "11:25", + "14:25", + "16:05", + "16:25", + "16:55", + "17:25", + "18:45", + "19:55", + "22:00" + }, + { // 토요일 + "14:25", + "18:45" + }, + { // 일요일 + "17:30", + "21:15", + "21:30" + } + }; + + private static final String[][] shuttleFromStationToKoreatech = { + { // 월요일 + "08:05", + "10:15", + "11:30", + "14:30", + "16:10", + "16:30", + "17:00", + "17:30", + "18:50", + "20:00", + "22:05" + }, + { // 화요일 + "08:05", + "10:15", + "11:30", + "14:30", + "16:10", + "16:30", + "17:00", + "17:30", + "18:50", + "20:00", + "22:05" + }, + { // 수요일 + "08:05", + "10:15", + "11:30", + "14:30", + "16:10", + "16:30", + "17:00", + "17:30", + "18:50", + "20:00", + "22:05" + }, + { // 목요일 + "08:05", + "10:15", + "11:30", + "14:30", + "16:10", + "16:30", + "17:00", + "17:30", + "18:50", + "20:00", + "22:05" + }, + { // 금요일 + "08:05", + "10:15", + "11:30", + "14:30", + "16:10", + "16:30", + "17:00", + "17:30", + "18:50", + "20:00", + "22:05" + }, + { // 토요일 + "14:30", + "18:50" + }, + { // 일요일 + "17:35", + "21:20", + "21:35" + } + }; + + private static final String[][] shuttleFromStationToTerminal = { + { // 월요일 + "09:30", + "15:20" + }, + { // 화요일 + "09:30", + "15:20" + }, + { // 수요일 + "09:30", + "15:20" + }, + { // 목요일 + "09:30", + "15:20" + }, + { // 금요일 + "09:30", + "15:20" + }, + { // 토요일 + }, + { // 일요일 + } + }; + + @Override + protected String[] getShuttleTimetable(String departEng, String arrivalEng) { + TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); + Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 + int dayType = (currentTime.get(Calendar.DAY_OF_WEEK) + 5) % 7; + + if (!departEng.equalsIgnoreCase("station")) { // 출발지가 천안역이 아니라면? + return departEng.equalsIgnoreCase("koreatech") ? shuttleFromKoreatech[dayType] : shuttleFromTerminal[dayType]; + } else { // 천안역이라면? + return arrivalEng.equalsIgnoreCase("koreatech") ? shuttleFromStationToKoreatech[dayType] : shuttleFromStationToTerminal[dayType]; + } + } +} diff --git a/src/main/java/koreatech/in/domain/KakaoBot/SeasonalSemester.java b/src/main/java/koreatech/in/domain/KakaoBot/SeasonalSemester.java new file mode 100644 index 00000000..9aef20e1 --- /dev/null +++ b/src/main/java/koreatech/in/domain/KakaoBot/SeasonalSemester.java @@ -0,0 +1,140 @@ +package koreatech.in.domain.KakaoBot; + +import java.util.Calendar; +import java.util.TimeZone; + +public class SeasonalSemester extends BusForTerm { + private static final String[][] shuttleFromKoreatech = { + { // 월요일 + "14:00", + }, + { // 화요일 + "14:00", + }, + { // 수요일 + "14:00", + }, + { // 목요일 + "14:00", + }, + { // 금요일 + "14:00", + }, + { // 토요일 + }, + { // 일요일 + } + }; + + private static final String[][] shuttleFromTerminalToKoreatech = { + { // 월요일 + "08:00", + "14:25" + }, + { // 화요일 + "08:00", + "14:25" + }, + { // 수요일 + "08:00", + "14:25" + }, + { // 목요일 + "08:00", + "14:25" + }, + { // 금요일 + "08:00", + "14:25" + }, + { // 토요일 + + }, + { // 일요일 + + } + }; + + private static final String[][] shuttleFromTerminalToStation = { + { // 월요일 + "14:25", + }, + { // 화요일 + "14:25", + }, + { // 수요일 + "14:25", + }, + { // 목요일 + "14:25", + }, + { // 금요일 + "14:25", + }, + { // 토요일 + + }, + { // 일요일 + + } + }; + + private static final String[][] shuttleFromStationToKoreatech = { + { // 월요일 + "08:05", + "14:30" + }, + { // 화요일 + "08:05", + "14:30" + }, + { // 수요일 + "08:05", + "14:30" + }, + { // 목요일 + "08:05", + "14:30" + }, + { // 금요일 + "08:05", + "14:30" + }, + { // 토요일 + }, + { // 일요일 + } + }; + + private static final String[][] shuttleFromStationToTerminal = { + { // 월요일 + }, + { // 화요일 + }, + { // 수요일 + }, + { // 목요일 + }, + { // 금요일 + }, + { // 토요일 + }, + { // 일요일 + } + }; + + @Override + protected String[] getShuttleTimetable(String departEng, String arrivalEng) { + TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); + Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 + int dayType = (currentTime.get(Calendar.DAY_OF_WEEK) + 5) % 7; + + if (departEng.equalsIgnoreCase("koreatech")) { // 출발지가 학교라면 + return shuttleFromKoreatech[dayType]; + } else if (departEng.equalsIgnoreCase("station")) { // 천안역이라면? + return arrivalEng.equalsIgnoreCase("koreatech") ? shuttleFromStationToKoreatech[dayType] : shuttleFromStationToTerminal[dayType]; + } else { // 터미널이라면? + return arrivalEng.equalsIgnoreCase("koreatech") ? shuttleFromTerminalToKoreatech[dayType] : shuttleFromTerminalToStation[dayType]; + } + } +} diff --git a/src/main/java/koreatech/in/domain/KakaoBot/Vacation.java b/src/main/java/koreatech/in/domain/KakaoBot/Vacation.java new file mode 100644 index 00000000..7ca66b66 --- /dev/null +++ b/src/main/java/koreatech/in/domain/KakaoBot/Vacation.java @@ -0,0 +1,132 @@ +package koreatech.in.domain.KakaoBot; + +import java.util.Calendar; +import java.util.TimeZone; + +public class Vacation extends BusForTerm { + private static final String[][] shuttleFromKoreatech = { + { // 월요일 + "14:00", + }, + { // 화요일 + "14:00", + }, + { // 수요일 + "14:00", + }, + { // 목요일 + "14:00", + }, + { // 금요일 + "14:00", + }, + { // 토요일 + }, + { // 일요일 + } + }; + + private static final String[][] shuttleFromTerminal = { + { // 월요일 + "08:00", + "14:25" + }, + { // 화요일 + "08:00", + "14:25" + }, + { // 수요일 + "08:00", + "14:25" + }, + { // 목요일 + "08:00", + "14:25" + }, + { // 금요일 + "08:00", + "14:25" + }, + { // 토요일 + + }, + { // 일요일 + + } + }; + + private static final String[][] shuttleFromStationToKoreatech = { + { // 월요일 + "08:05", + "14:30" + }, + { // 화요일 + "08:05", + "14:30" + }, + { // 수요일 + "08:05", + "14:30" + }, + { // 목요일 + "08:05", + "14:30" + }, + { // 금요일 + "08:05", + "14:30" + }, + { // 토요일 + }, + { // 일요일 + } + }; + + private static final String[][] shuttleFromStationToTerminal = { + { // 월요일 + }, + { // 화요일 + }, + { // 수요일 + }, + { // 목요일 + }, + { // 금요일 + }, + { // 토요일 + }, + { // 일요일 + } + }; + +// @Override +// public void searchShuttleTime(String departEng, String arrivalEng, StringBuilder resultNow, StringBuilder resultNext) throws ParseException { +// TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); +// Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 +// +// String[] shuttleTimeTable; +// int dayType = (currentTime.get(Calendar.DAY_OF_WEEK) + 5) % 7; +// +// if (!departEng.equalsIgnoreCase("station")) { // 출발지가 천안역이 아니라면? +// shuttleTimeTable = departEng.equalsIgnoreCase("koreatech") ? shuttleFromKoreatech[dayType] : shuttleFromTerminal[dayType]; +// } else { // 천안역이라면? +// shuttleTimeTable = arrivalEng.equalsIgnoreCase("koreatech") ? shuttleFromStationToKoreatech[dayType] : shuttleFromStationToTerminal[dayType]; +// } +// +// int resultIndex = appendTime(shuttleTimeTable, 0, KakaoBotEnum.BusType.SHUTTLE.ordinal(), resultNow); +// resultIndex = appendTime(shuttleTimeTable, resultIndex + 1, KakaoBotEnum.BusType.SHUTTLE.ordinal(), resultNext); +// } + + @Override + protected String[] getShuttleTimetable(String departEng, String arrivalEng) { + TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); + Calendar currentTime = Calendar.getInstance(timeZone); // 오늘 일자의 Calendar 객체 + int dayType = (currentTime.get(Calendar.DAY_OF_WEEK) + 5) % 7; + + if (!departEng.equalsIgnoreCase("station")) { // 출발지가 천안역이 아니라면? + return departEng.equalsIgnoreCase("koreatech") ? shuttleFromKoreatech[dayType] : shuttleFromTerminal[dayType]; + } else { // 천안역이라면? + return arrivalEng.equalsIgnoreCase("koreatech") ? shuttleFromStationToKoreatech[dayType] : shuttleFromStationToTerminal[dayType]; + } + } +} diff --git a/src/main/java/koreatech/in/domain/LostAndFound/LostItem.java b/src/main/java/koreatech/in/domain/LostAndFound/LostItem.java index f0c4c388..03e6de6f 100644 --- a/src/main/java/koreatech/in/domain/LostAndFound/LostItem.java +++ b/src/main/java/koreatech/in/domain/LostAndFound/LostItem.java @@ -5,10 +5,7 @@ import koreatech.in.annotation.ValidationGroups; import koreatech.in.domain.User.User; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.validation.constraints.*; import java.util.Date; public class LostItem { @@ -20,10 +17,12 @@ public class LostItem { @Max(value = 1, message = "서비스 타입은 0 또는 1이여야 합니다.") @ApiModelProperty(notes = "서비스 타입(0: 습득 서비스, 1: 분실 서비스)", example = "0") private Integer type; + @Size(max = 255, message = "제목은 255자 이내여야 합니다.") @NotNull(groups = { ValidationGroups.CreateAdmin.class, ValidationGroups.Create.class }, message = "게시글 제목은 비워둘 수 없습니다.") @ApiModelProperty(notes = "제목", example = "아이패드 주웠습니다") private String title; - @ApiModelProperty(notes = "주운 장소", example = "2공 앞 벤치") + @Size(max = 255, message = "분실물 위치는 255자 이내여야 합니다.") + @ApiModelProperty(notes = "분실물 위치", example = "2공 앞 벤치") private String location; @ApiModelProperty(notes = "내용", example = "내용") private String content; @@ -39,11 +38,12 @@ public class LostItem { @ApiModelProperty(notes = "전화번호(포맷형식: 010-0000-0000, 010-000-0000", example = "010-0000-0000") private String phone; @ApiModelProperty(notes = "전화번호 공개 여부(0: 비공개, 1: 공개)", example = "0") - private Boolean is_phone_open=false; + private Boolean is_phone_open = false; @ApiModelProperty(notes = "이미지 링크, string으로 받아서 저장 후 json 으로 반환", example = "['http://url.com', 'http://url.com']") private String image_urls; @ApiModelProperty(hidden = true) private Boolean is_deleted; + @Size(max = 510, message = "썸네일 이미지 링크는 510자 이내여야 합니다.") @ApiModelProperty(notes = "대표이미지, 썸네일 이미지", example = "http://url.com") private String thumbnail; @ApiModelProperty(notes = "조회수", example = "1") diff --git a/src/main/java/koreatech/in/domain/MarketPlace/Item.java b/src/main/java/koreatech/in/domain/MarketPlace/Item.java index eb7cd73a..92799851 100644 --- a/src/main/java/koreatech/in/domain/MarketPlace/Item.java +++ b/src/main/java/koreatech/in/domain/MarketPlace/Item.java @@ -5,10 +5,7 @@ import koreatech.in.annotation.ValidationGroups; import koreatech.in.domain.User.User; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.validation.constraints.*; import java.util.Date; public class Item { @@ -20,6 +17,7 @@ public class Item { @Max(value = 1, message = "서비스 타입은 0 또는 1이여야 합니다.") @ApiModelProperty(notes = "서비스 타입(0: 팝니다 서비스, 1: 삽니다 서비스)", example = "0") private Integer type; + @Size(max = 255, message = "제목은 255자 이내여야 합니다.") @NotNull(groups = { ValidationGroups.CreateAdmin.class, ValidationGroups.Create.class }, message = "게시글 제목은 비워둘 수 없습니다.") @ApiModelProperty(notes = "제목", example = "아이패드 팝니다") private String title; @@ -33,15 +31,18 @@ public class Item { @Max(value = 2, message = "상태 정보는 0, 1, 2 중 하나여야 합니다.") @ApiModelProperty(notes = "상태 정보(0: 판매중, 1: 판매완료, 2: 판매중지)", example = "0") private Integer state; + @Max(value = Integer.MAX_VALUE, message = "입력할 수 없는 가격입니다.") + @Min(value = 0, message = "입력할 수 없는 가격입니다.") @ApiModelProperty(notes = "가격", example = "21000") - private Integer price=0; + private Integer price = 0; @Pattern(regexp = "^[0-9]{3}-[0-9]{3,4}-[0-9]{4}", message = "전화번호 형식이 올바르지 않습니다.") @ApiModelProperty(notes = "전화번호(포맷형식: 010-0000-0000, 010-000-0000", example = "010-0000-0000") private String phone; @ApiModelProperty(notes = "전화번호 공개 여부(0: 비공개, 1: 공개)", example = "0") - private Boolean is_phone_open=false; + private Boolean is_phone_open = false; @ApiModelProperty(hidden = true) private Boolean is_deleted; + @Size(max = 510, message = "썸네일 이미지 링크는 510자 이내여야 합니다.") @ApiModelProperty(notes = "대표이미지, 썸네일 이미지", example = "http://url.com") private String thumbnail; @ApiModelProperty(notes = "조회수", example = "1") diff --git a/src/main/java/koreatech/in/domain/NotiSlack.java b/src/main/java/koreatech/in/domain/NotiSlack.java index 279cad33..e7dcb8ce 100644 --- a/src/main/java/koreatech/in/domain/NotiSlack.java +++ b/src/main/java/koreatech/in/domain/NotiSlack.java @@ -1,9 +1,5 @@ package koreatech.in.domain; -import org.springframework.beans.factory.annotation.Value; - -import java.util.Map; - public class NotiSlack { private String color; private String author_name; diff --git a/src/main/java/koreatech/in/domain/Shop/Menu.java b/src/main/java/koreatech/in/domain/Shop/Menu.java index f1a5ebfe..78aaec05 100644 --- a/src/main/java/koreatech/in/domain/Shop/Menu.java +++ b/src/main/java/koreatech/in/domain/Shop/Menu.java @@ -5,6 +5,7 @@ import koreatech.in.annotation.ValidationGroups; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; public class Menu { @@ -12,6 +13,7 @@ public class Menu { private Integer id; @ApiModelProperty(notes = "상점의 고유 id", example = "10") private Integer shop_id; + @Size(max = 255, message = "메뉴 이름은 255자 이내여야 합니다.") @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "메뉴 이름은 비워둘 수 없습니다.") @ApiModelProperty(notes = "메뉴", example = "치즈불닭") private String name; diff --git a/src/main/java/koreatech/in/domain/Shop/Shop.java b/src/main/java/koreatech/in/domain/Shop/Shop.java index db6b0df2..ebc7602c 100644 --- a/src/main/java/koreatech/in/domain/Shop/Shop.java +++ b/src/main/java/koreatech/in/domain/Shop/Shop.java @@ -4,13 +4,13 @@ import io.swagger.annotations.ApiModelProperty; import koreatech.in.annotation.ValidationGroups; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.validation.constraints.*; import java.util.*; public class Shop { @ApiModelProperty(notes = "고유 id", example = "10") private Integer id; + @Size(max = 50, message = "가게 이름은 50자 이내여야 합니다.") @NotNull(groups = ValidationGroups.CreateAdmin.class, message = "가게 이름은 비워둘 수 없습니다.") @ApiModelProperty(notes = "가게 이름", example = "써니 숯불 도시락") private String name; @@ -38,8 +38,10 @@ public class Shop { private String description; @ApiModelProperty(notes = "배달 가능 여부", example = "false") private Boolean delivery; + @Max(value = Integer.MAX_VALUE, message = "입력할 수 없는 가격입니다.") + @Min(value = 0, message = "입력할 수 없는 가격입니다.") @ApiModelProperty(notes = "배달 금액", example = "20000") - private Integer delivery_price=0; + private Integer delivery_price = 0; @ApiModelProperty(notes = "카드 가능 여부", example = "false") private Boolean pay_card; @ApiModelProperty(notes = "계좌이체 가능 여부", example = "false") diff --git a/src/main/java/koreatech/in/domain/TemporaryCommunity/TempArticle.java b/src/main/java/koreatech/in/domain/TemporaryCommunity/TempArticle.java index d785e769..0d38080f 100644 --- a/src/main/java/koreatech/in/domain/TemporaryCommunity/TempArticle.java +++ b/src/main/java/koreatech/in/domain/TemporaryCommunity/TempArticle.java @@ -6,16 +6,19 @@ import org.jsoup.Jsoup; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; public class TempArticle { @ApiModelProperty(notes = "고유 id", example = "10") private Integer id; + @Size(max = 255, message = "제목은 255자 이내여야 합니다.") @NotNull(groups = ValidationGroups.Create.class, message = "게시글 제목은 비워둘 수 없습니다.") @ApiModelProperty(notes = "제목", example = "제목입니다.") private String title; @ApiModelProperty(notes = "내용", example = "내용입니다.") private String content; + @Size(max = 50, message = "닉네임은 50자 이내여야 합니다.") @NotNull(groups = ValidationGroups.Create.class, message = "닉네임은 비워둘 수 없습니다.") @ApiModelProperty(notes = "작성자의 닉네임", example = "jahona") private String nickname; diff --git a/src/main/java/koreatech/in/domain/TemporaryCommunity/TempComment.java b/src/main/java/koreatech/in/domain/TemporaryCommunity/TempComment.java index b67125b0..a8e96b58 100644 --- a/src/main/java/koreatech/in/domain/TemporaryCommunity/TempComment.java +++ b/src/main/java/koreatech/in/domain/TemporaryCommunity/TempComment.java @@ -5,6 +5,7 @@ import koreatech.in.annotation.ValidationGroups; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.Date; public class TempComment { @@ -15,6 +16,7 @@ public class TempComment { @NotNull(groups = ValidationGroups.Create.class, message = "댓글 내용은 비워둘 수 없습니다.") @ApiModelProperty(notes = "내용", example = "내용입니다.") private String content; + @Size(max = 50, message = "닉네임은 50자 이내여야 합니다.") @NotNull(groups = ValidationGroups.Create.class, message = "닉네임은 비워둘 수 없습니다.") @ApiModelProperty(notes = "작성자의 닉네임", example = "jahona") private String nickname; diff --git a/src/main/java/koreatech/in/domain/User/User.java b/src/main/java/koreatech/in/domain/User/User.java index 10554f1a..a4a48c04 100644 --- a/src/main/java/koreatech/in/domain/User/User.java +++ b/src/main/java/koreatech/in/domain/User/User.java @@ -8,6 +8,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; import java.util.Collection; import java.util.Date; @@ -21,12 +22,15 @@ public class User implements UserDetails { @NotNull(groups = {ValidationGroups.CreateAdmin.class, ValidationGroups.Create.class}, message = "비밀번호는 비워둘 수 없습니다.") @ApiModelProperty(notes = "비밀번호", example = "a0240120305812krlakdsflsa;1235") protected String password; + @Size(max = 10, message = "닉네임은 10자 이내여야 합니다.") @ApiModelProperty(notes = "닉네임", example = "bbo") protected String nickname; @ApiModelProperty(notes = "익명 닉네임", example = "익명_1522771686642") protected String anonymous_nickname; - @ApiModelProperty(notes = "이름", example = "정혁") + @Size(max = 50, message = "이름은 50자 이내여야 합니다.") + @ApiModelProperty(notes = "이름", example = "정보혁") protected String name; + @Size(max = 50, message = "학번은 50자 이내여야 합니다.") @ApiModelProperty(notes = "학번", example = "2013136000") protected String student_number; @ApiModelProperty(notes = "기계공학부, 컴퓨터공학부, 메카트로닉스공학부, 전기전자통신공학부, 디자인건축공학부, 에너지신소재화학공학부, 산업경영학부", example = "컴퓨터공학부") diff --git a/src/main/java/koreatech/in/repository/MarketPlaceMapper.java b/src/main/java/koreatech/in/repository/MarketPlaceMapper.java index 1005c826..2693bcfe 100644 --- a/src/main/java/koreatech/in/repository/MarketPlaceMapper.java +++ b/src/main/java/koreatech/in/repository/MarketPlaceMapper.java @@ -84,6 +84,9 @@ public interface MarketPlaceMapper { @Select("SELECT COUNT(*) AS totalCount FROM koin.items WHERE IS_DELETED = 0 AND TYPE=#{type}") Integer totalItemCountByType(@Param("type") int type); + @Select("SELECT COUNT(*) AS totalCount FROM koin.items WHERE TYPE=#{type} AND USER_ID = #{user_id} AND IS_DELETED = 0") + Integer totalMyItemCountByType(@Param("type") int type, @Param("user_id") int user_id); + @Select("SELECT COUNT(*) AS totalCount FROM koin.items WHERE TYPE=#{type}") Integer totalItemCountByTypeForAdmin(@Param("type") int type); diff --git a/src/main/java/koreatech/in/repository/UserMapper.java b/src/main/java/koreatech/in/repository/UserMapper.java index 8a14ceca..5bc785d6 100644 --- a/src/main/java/koreatech/in/repository/UserMapper.java +++ b/src/main/java/koreatech/in/repository/UserMapper.java @@ -43,13 +43,13 @@ public interface UserMapper { @Update("UPDATE koin.users_owners AS owner SET owner.email = #{email} WHERE owner.user_id = #{id}") void updateOwner(Owner owner); - @Select("SELECT COUNT(*) AS totalCount FROM koin.users") + @Select("SELECT COUNT(*) AS totalCount FROM koin.users WHERE IS_DELETED = 0") Integer totalCount(); - @Select("SELECT * FROM koin.users WHERE PORTAL_ACCOUNT = #{portal_account}") + @Select("SELECT * FROM koin.users WHERE PORTAL_ACCOUNT = #{portal_account} AND IS_DELETED = 0") User getUserByPortalAccount(String portal_account); - @Select("SELECT * FROM koin.users WHERE NICKNAME = #{nickname}") + @Select("SELECT * FROM koin.users WHERE NICKNAME = #{nickname} AND IS_DELETED = 0") User getUserByNickName(String nickname); @Select("SELECT * FROM koin.users WHERE AUTH_TOKEN = #{authToken}") diff --git a/src/main/java/koreatech/in/schedule/BusTago.java b/src/main/java/koreatech/in/schedule/BusTago.java index 0dd3402a..d7d6ef42 100644 --- a/src/main/java/koreatech/in/schedule/BusTago.java +++ b/src/main/java/koreatech/in/schedule/BusTago.java @@ -1,8 +1,9 @@ package koreatech.in.schedule; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import koreatech.in.domain.BusArrivalInfo; -import koreatech.in.domain.NotiSlack; import koreatech.in.service.JsonConstructor; import koreatech.in.util.SlackNotiSender; import org.springframework.beans.factory.annotation.Autowired; @@ -24,20 +25,6 @@ @Service("busTagoSchedule") public class BusTago { - private String CACHE_KEY_BUS_ARRIVAL_INFO = "Tago@busArrivalInfo.%s.%s"; - - @Value("${OPEN_API_KEY}") - private static String OPEN_API_KEY; - @Value("${OPEN_API_KEY}") - private void setOpenApiKey(String key) { OPEN_API_KEY = key; } - public static String getOpenApiKey() { return OPEN_API_KEY; } - - public int[] avaliableBus = {400, 401, 402, 493}; - - @Autowired - SlackNotiSender slackNotiSender; - - private static String cityCode = "34010"; public static List> nodeIds = new ArrayList>() {{ add(new ArrayList() {{ add("CAB285000405"); @@ -56,25 +43,31 @@ public class BusTago { add("terminal"); }}); }}; - + private static String OPEN_API_KEY; + private static String cityCode = "34010"; private static ValueOperations>> valueOps; - @Resource(name = "redisTemplate") - public void setValueOps(ValueOperations>> _valueOps) { - valueOps = _valueOps; - } + public int[] avaliableBus = {400, 401, 402, 493}; - private void updateAndCacheBusArrivalInfo(String cityCode, List nodeId) throws IOException { - String cacheKey = getBusArrivalInfoCacheKey(cityCode, nodeId.get(0)); + @Autowired + SlackNotiSender slackNotiSender; - List> info = requestBusArrivalInfo(cityCode, nodeId); + private static JsonConstructor con; - valueOps.set(cacheKey, info); + private String CACHE_KEY_BUS_ARRIVAL_INFO = "Tago@busArrivalInfo.%s.%s"; + + @Value("${OPEN_API_KEY}") + private void setOpenApiKey(String key) { + OPEN_API_KEY = key; + } + + @Autowired + private void setCon(JsonConstructor jsonConstructor) { + con = jsonConstructor; } private static List> requestBusArrivalInfo(String cityCode, List nodeId) throws IOException { List> result = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); StringBuilder urlBuilder = new StringBuilder("http://openapi.tago.go.kr/openapi/service/ArvlInfoInqireService/getSttnAcctoArvlPrearngeInfoList"); /*URL*/ urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=" + OPEN_API_KEY); /*Service Key*/ @@ -101,9 +94,8 @@ private static List> requestBusArrivalInfo(String cityCode, } rd.close(); conn.disconnect(); -// System.out.println(sb.toString()); - if (!con.isObjectParse(sb.toString())) return result; + if (!con.isJsonObject(sb.toString())) return result; JsonObject nodeInfo = new JsonParser().parse(sb.toString()).getAsJsonObject(); @@ -113,25 +105,36 @@ private static List> requestBusArrivalInfo(String cityCode, int count = nodeInfo.getAsJsonObject("response").getAsJsonObject("body").get("totalCount").getAsInt(); - Gson gson = new Gson(); - if (count <=1) { + if (count <= 1) { BusArrivalInfo col = new BusArrivalInfo(); if (count == 1) { - result.add(con.objectParse(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonObject("item"))); + result.add(con.parseJsonObject(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonObject("item"))); } return result; } - result = con.arrayObjectParse(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonArray("item")); - + result = con.parseJsonArrayWithObject(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonArray("item")); return result; } + @Resource(name = "redisTemplate") + public void setValueOps(ValueOperations>> _valueOps) { + valueOps = _valueOps; + } + + private void updateAndCacheBusArrivalInfo(String cityCode, List nodeId) throws IOException { + String cacheKey = getBusArrivalInfoCacheKey(cityCode, nodeId.get(0)); + + List> info = requestBusArrivalInfo(cityCode, nodeId); + + valueOps.set(cacheKey, info); + } + @Scheduled(cron = "0 */1 * * * *") public void handle() { try { - for (List nodeId: nodeIds) { - System.out.println("updating...("+cityCode+","+nodeId.get(0)+","+nodeId.get(1)+")\n"); + for (List nodeId : nodeIds) { + System.out.println("updating...(" + cityCode + "," + nodeId.get(0) + "," + nodeId.get(1) + ")\n"); updateAndCacheBusArrivalInfo(cityCode, nodeId); } } catch (NullPointerException e) { @@ -153,7 +156,7 @@ private List> getBusArrivalInfo(String cityCode, String node } public List> getBusArrivalInfo(String nodeId) { - return getBusArrivalInfo(cityCode,nodeId); + return getBusArrivalInfo(cityCode, nodeId); } // private void sendError(Exception e) { diff --git a/src/main/java/koreatech/in/service/ActivityServiceImpl.java b/src/main/java/koreatech/in/service/ActivityServiceImpl.java index a373ebad..f093cc66 100644 --- a/src/main/java/koreatech/in/service/ActivityServiceImpl.java +++ b/src/main/java/koreatech/in/service/ActivityServiceImpl.java @@ -5,7 +5,9 @@ import koreatech.in.exception.NotFoundException; import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.ActivityMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.text.SimpleDateFormat; @@ -13,7 +15,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; import static koreatech.in.domain.DomainToMap.domainToMap; @@ -22,6 +23,9 @@ public class ActivityServiceImpl implements ActivityService { @Resource(name = "activityMapper") private ActivityMapper activityMapper; + @Autowired + private JsonConstructor con; + @Override public Map getActivities(String year) throws Exception { Map map = new HashMap(); @@ -35,16 +39,9 @@ public Map getActivities(String year) throws Exception { List> appendActivities = new ArrayList>(); Map convertActivity; - JsonConstructor con = new JsonConstructor(); for(Activity activity : activities) { convertActivity = domainToMap(activity); - - if (activity.getImage_urls() != null && !activity.getImage_urls().isEmpty()) { - try { - convertActivity.replace("image_urls", con.arrayStringParse(activity.getImage_urls())); - } catch (Exception e) { - } - } + convertActivity.replace("image_urls", con.parseJsonArrayWithOnlyString(activity.getImage_urls())); appendActivities.add(convertActivity); } @@ -68,16 +65,9 @@ public Map getActivitiesForAdmin(String year) throws Exception { List> appendActivities = new ArrayList>(); Map convertActivity; - JsonConstructor con = new JsonConstructor(); for(Activity activity : activities) { convertActivity = domainToMap(activity); - - if (activity.getImage_urls() != null && !activity.getImage_urls().isEmpty()) { - try { - convertActivity.replace("image_urls", con.arrayStringParse(activity.getImage_urls())); - } catch (Exception e) { - } - } + convertActivity.replace("image_urls", con.parseJsonArrayWithOnlyString(activity.getImage_urls())); appendActivities.add(convertActivity); } diff --git a/src/main/java/koreatech/in/service/CalendarService.java b/src/main/java/koreatech/in/service/CalendarService.java index b1a046d6..ec43e5e8 100644 --- a/src/main/java/koreatech/in/service/CalendarService.java +++ b/src/main/java/koreatech/in/service/CalendarService.java @@ -4,11 +4,12 @@ import koreatech.in.domain.kut.Calendar; import java.util.List; +import java.util.Map; public interface CalendarService { List getCalendars(String year); - String getTerm() throws Exception; + Map getTerm() throws Exception; String createTermForAdmin(String term); } diff --git a/src/main/java/koreatech/in/service/CalendarServiceImpl.java b/src/main/java/koreatech/in/service/CalendarServiceImpl.java index 970c74d0..ac1be68b 100644 --- a/src/main/java/koreatech/in/service/CalendarServiceImpl.java +++ b/src/main/java/koreatech/in/service/CalendarServiceImpl.java @@ -5,12 +5,15 @@ import koreatech.in.exception.NotFoundException; import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.CalendarMapper; +import koreatech.in.skillresponse.KakaoBot; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.inject.Inject; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class CalendarServiceImpl implements CalendarService { @@ -29,19 +32,24 @@ public List getCalendars(String year) { } @Override - public String getTerm() throws Exception { - String term = valueOps.get("termCode"); + public Map getTerm() { + String termCode = valueOps.get("termCode"); // 데이터 존재여부 확인 - if(term == null) { + if (termCode == null) { throw new NotFoundException(new ErrorMessage("저장된 학기 코드가 없습니다.", 0)); } - return term; + return new HashMap() {{ + put("term", termCode); + }}; } @Override - public String createTermForAdmin(String term) { - valueOps.set("termCode", term); - return term; + public String createTermForAdmin(String termCode) { + if (!KakaoBot.TermCode.isValidTermCode(termCode)) { + throw new PreconditionFailedException(new ErrorMessage("올바른 학기 코드가 아닙니다.", 0)); + } + valueOps.set("termCode", termCode); + return termCode; } } diff --git a/src/main/java/koreatech/in/service/CircleServiceImpl.java b/src/main/java/koreatech/in/service/CircleServiceImpl.java index 6ed4874d..29115070 100644 --- a/src/main/java/koreatech/in/service/CircleServiceImpl.java +++ b/src/main/java/koreatech/in/service/CircleServiceImpl.java @@ -4,25 +4,22 @@ import koreatech.in.domain.Circle.Circle; import koreatech.in.domain.Circle.CircleResponseType; import koreatech.in.domain.Criteria.Criteria; -import koreatech.in.domain.DomainToMap; import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Faq.Faq; import koreatech.in.domain.Faq.FaqResponseType; -import koreatech.in.domain.User.User; -import koreatech.in.exception.*; +import koreatech.in.exception.ConflictException; +import koreatech.in.exception.NotFoundException; +import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.CircleMapper; import koreatech.in.repository.FaqMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.inject.Inject; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import static koreatech.in.domain.DomainToMap.domainToMap; -import static koreatech.in.domain.DomainToMap.domainToMapWithExcept; - @Service public class CircleServiceImpl implements CircleService { @Inject @@ -31,8 +28,8 @@ public class CircleServiceImpl implements CircleService { @Inject FaqMapper faqMapper; - @Inject - JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; @Override public Map getCirclesForAdmin(Criteria criteria) throws Exception { @@ -40,8 +37,8 @@ public Map getCirclesForAdmin(Criteria criteria) throws Exceptio double totalCount = circleMapper.totalCount(); double countByLimit = totalCount / criteria.getLimit(); - int totalPage = countByLimit == Double.POSITIVE_INFINITY || countByLimit == Double.NEGATIVE_INFINITY ? 0 : (int)Math.ceil(totalCount / criteria.getLimit()); - if (totalPage<0) + int totalPage = countByLimit == Double.POSITIVE_INFINITY || countByLimit == Double.NEGATIVE_INFINITY ? 0 : (int) Math.ceil(totalCount / criteria.getLimit()); + if (totalPage < 0) throw new PreconditionFailedException(new ErrorMessage("invalid page number", 2)); List circleList = circleMapper.getCircleListForAdmin(criteria.getCursor(), criteria.getLimit()); @@ -64,11 +61,9 @@ public Circle createCircleForAdmin(Circle circle) throws Exception { throw new ConflictException(new ErrorMessage("exists circle name", 0)); } - JsonConstructor con = new JsonConstructor(); //link_urls 체크 - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) - if(con.isArrayObjectParse(circle.getLink_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (circle.getLink_urls() != null && !con.isJsonArrayWithOnlyObject(circle.getLink_urls())) + throw new PreconditionFailedException(new ErrorMessage("link_urls are not valid", 0)); if (circle.getIs_deleted() == null) { circle.setIs_deleted(false); @@ -85,8 +80,8 @@ public Map getCircles(Criteria criteria) throws Exception { double totalCount = circleMapper.totalCount(); double countByLimit = totalCount / criteria.getLimit(); - int totalPage = countByLimit == Double.POSITIVE_INFINITY || countByLimit == Double.NEGATIVE_INFINITY ? 0 : (int)Math.ceil(totalCount / criteria.getLimit()); - if (totalPage<0) + int totalPage = countByLimit == Double.POSITIVE_INFINITY || countByLimit == Double.NEGATIVE_INFINITY ? 0 : (int) Math.ceil(totalCount / criteria.getLimit()); + if (totalPage < 0) throw new PreconditionFailedException(new ErrorMessage("invalid page number", 2)); List circles = circleMapper.getCircleList(criteria.getCursor(), criteria.getLimit()); @@ -114,22 +109,14 @@ public Map getCircle(int page, int limit, int id) throws Excepti int faqTotalCount = faqMapper.totalCountByCircle(id); int faqTotalPage = (int) Math.ceil(faqTotalCount / (double) limit); - int cursor = (page -1) * limit; + int cursor = (page - 1) * limit; Map faq = new HashMap(); faq.put("items", BeanSerializer.getSerializedResult(Faq.class, new BeanSerializer(FaqResponseType.getArray()), faqMapper.getFaqListByCircle(cursor, limit, id), List.class)); faq.put("totalPage", faqTotalPage); faq.put("totalItemCount", faqTotalCount); - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) { - JsonConstructor con = new JsonConstructor(); - //link_urls 컬럼을 list로 - try { - //link_url 리스트를 JsonArray로 변환하고 다시 for문으로 하나씩 map으로 변환해 새 리스트에 add - map.replace("link_urls", con.arrayObjectParse(circle.getLink_urls())); - } catch (Exception e) { - } - } + map.replace("link_urls", con.parseJsonArrayWithObject(circle.getLink_urls())); map.put("faq", faq); return map; @@ -162,11 +149,9 @@ public Circle updateCircleForAdmin(Circle circle, int id) throws Exception { throw new PreconditionFailedException(new ErrorMessage("invalid category name", 1)); } - JsonConstructor con = new JsonConstructor(); //link_urls 체크 - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) - if(!con.isArrayObjectParse(circle.getLink_urls())) - throw new PreconditionFailedException(new ErrorMessage("link_urls are not valid", 0)); + if (circle.getLink_urls() != null && !con.isJsonArrayWithOnlyObject(circle.getLink_urls())) + throw new PreconditionFailedException(new ErrorMessage("link_urls are not valid", 0)); selectCircle.update(circle); circleMapper.updateCircleForAdmin(selectCircle); diff --git a/src/main/java/koreatech/in/service/CommunityServiceImpl.java b/src/main/java/koreatech/in/service/CommunityServiceImpl.java index 067179d1..36bf6443 100644 --- a/src/main/java/koreatech/in/service/CommunityServiceImpl.java +++ b/src/main/java/koreatech/in/service/CommunityServiceImpl.java @@ -455,19 +455,15 @@ public List> getCachedHotArticle() throws Exception { @Override public Article createArticle(Article article) throws Exception { User user = jwtValidator.validate(); + if (user.getNickname() == null) + throw new PreconditionFailedException(new ErrorMessage("닉네임이 필요합니다.", 2)); Board board = communityMapper.getBoard(article.getBoard_id()); if (board == null) throw new NotFoundException(new ErrorMessage("invalid board id", 2)); -// if (board.getIs_notice() && (user.getAuthority() == null || !user.getAuthority().getGrant_community())) { -// throw new ConflictException(new ErrorMessage("invalid authenticate", 0)); -// } -// else { article.setIs_notice(false); -// } - article.setUser_id(user.getId()); //TODO: (B)기존 Purifier로 content 필터링했던 부분 추가 article.setNickname(user.getNickname()); @@ -556,6 +552,8 @@ public Map getArticle(int id) throws Exception { @Override public Article updateArticle(Article article, int id) throws Exception { User user = jwtValidator.validate(); + if (user.getNickname() == null) + throw new PreconditionFailedException(new ErrorMessage("닉네임이 필요합니다.", 2)); Article article_old = communityMapper.getArticle(id); if (article_old == null) @@ -602,7 +600,7 @@ public Comment createComment(Comment comment, int article_id) throws Exception { User user = jwtValidator.validate(); if (user.getNickname() == null) - throw new PreconditionFailedException(new ErrorMessage("nickname is required", 0)); + throw new PreconditionFailedException(new ErrorMessage("닉네임이 필요합니다.", 0)); Article article = communityMapper.getArticle(article_id); if (article == null) diff --git a/src/main/java/koreatech/in/service/DiningServiceImpl.java b/src/main/java/koreatech/in/service/DiningServiceImpl.java index 98fdc591..45a45154 100644 --- a/src/main/java/koreatech/in/service/DiningServiceImpl.java +++ b/src/main/java/koreatech/in/service/DiningServiceImpl.java @@ -4,6 +4,7 @@ import koreatech.in.domain.ErrorMessage; import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.DiningMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.inject.Inject; @@ -22,6 +23,9 @@ public class DiningServiceImpl implements DiningService { @Inject DiningMapper diningMapper; + @Autowired + private JsonConstructor con; + @Override public List> getDinings(String from) throws Exception { LocalDate localDate; @@ -36,13 +40,9 @@ public List> getDinings(String from) throws Exception { List dinings = diningMapper.getList(localDate.format(DateTimeFormatter.ISO_DATE)); List> menus = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (DiningMenu dining : dinings) { Map convertMenu = domainToMap(dining); - try { - convertMenu.replace("menu", con.arrayStringParse(dining.getMenu())); - } catch (Exception e) { - } + convertMenu.replace("menu", con.parseJsonArrayWithOnlyString(dining.getMenu())); menus.add(convertMenu); } diff --git a/src/main/java/koreatech/in/service/JsonConstructor.java b/src/main/java/koreatech/in/service/JsonConstructor.java index 36f8accb..0890e6a2 100644 --- a/src/main/java/koreatech/in/service/JsonConstructor.java +++ b/src/main/java/koreatech/in/service/JsonConstructor.java @@ -2,131 +2,173 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; +import org.springframework.stereotype.Component; -import java.lang.reflect.Type; import java.util.*; import static koreatech.in.domain.DomainToMap.isContain; +@Component public class JsonConstructor { - private Gson gson = new Gson(); - public JsonConstructor(){} + private static Gson gson = new Gson(); + private static JsonParser parser = new JsonParser(); - // ["~~~"] 형태 - public List> arrayStringParse(String jsonString) { - List> list = new ArrayList<>(); + public JsonConstructor() { + } + + // 내부에 문자열만 존재하는 ["~~~"] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List parseJsonArrayWithOnlyString(String jsonString) { + if (jsonString == null) return null; + List list; try { - Type type = new TypeToken>() {}.getType(); - list = gson.fromJson(jsonString, type); + list = gson.fromJson(jsonString, new TypeToken>() {}.getType()); } catch (Exception e) { + return null; } return list; } - public Boolean isArrayStringParse(String jsonString) { + + // 내부에 문자열만 존재하는 ["~~~"] 형태인지 검사 + public Boolean isJsonArrayWithOnlyString(String jsonString) { + if (jsonString == null) return false; + JsonElement jsonElement; try { - arrayStringParse(jsonString); + jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return false; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + for (JsonElement element : jsonArray) { + if (element.isJsonObject()) + return false; + } } catch (Exception e) { return false; } return true; } - // [{"~~~", "~~~"}] 형태 - public List> arrayObjectParse(JsonArray jsonArray) { - Gson gson = new Gson(); - Iterator iterator = jsonArray.iterator(); - JsonElement jsonElement; - Type type = new TypeToken>>(){}.getType(); - - for (int i = 0; i < jsonArray.size(); i++) { - jsonElement = jsonArray.get(i); - objectParse(jsonElement.getAsJsonObject()); + // [{"~~~": "~~~", "~~~": "~~~"}] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List> parseJsonArrayWithObject(JsonArray jsonArray) { + if (jsonArray == null) return null; + List> list; + try { + for (JsonElement element : jsonArray) { + parseJsonObject((element.getAsJsonObject())); + } + list = gson.fromJson(jsonArray, new TypeToken>>() {}.getType()); + } catch (Exception e) { + return null; } - return gson.fromJson(jsonArray, type); + return list; } - public List> arrayObjectParse(String jsonString) throws JsonParseException { - List> list = new ArrayList<>(); - JsonArray jsonArray = new JsonParser().parse(jsonString).getAsJsonArray(); - list = arrayObjectParse(jsonArray); + // [{"~~~": "~~~", "~~~": "~~~"}] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List> parseJsonArrayWithObject(String jsonString) { + if (jsonString == null) return null; + List> list; + try { + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return null; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + list = parseJsonArrayWithObject(jsonArray); + } catch (Exception e) { + return null; + } return list; } - public Boolean isArrayObjectParse(String jsonString) { + // 내부에 JSON Object만 존재하는 [{"~~~": "~~~", "~~~": "~~~"}] 형태인지 검사 + public Boolean isJsonArrayWithOnlyObject(String jsonString) { + if (jsonString == null) return false; + JsonElement jsonElement; try { - arrayObjectParse(jsonString); + jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return false; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + for (JsonElement element : jsonArray) { + if (!element.isJsonObject()) + return false; + } } catch (Exception e) { return false; } return true; } - private Map objectParse(JsonObject jsonObject, String[] arrAllowKeys) { - Gson gson = new Gson(); - Iterator> iterator = jsonObject.entrySet().iterator(); - Map.Entry entry; - Type type = new TypeToken>(){}.getType(); - - while (iterator.hasNext()) { - entry = iterator.next(); + private Map parseJsonObject(JsonObject jsonObject, String[] arrAllowKeys) throws JsonSyntaxException, JsonIOException { + for (Map.Entry entry : jsonObject.entrySet()) { if (arrAllowKeys != null && !isContain(arrAllowKeys, entry.getKey())) continue; JsonElement value = entry.getValue(); if (value.isJsonPrimitive()) { try { entry.setValue(new JsonPrimitive(entry.getValue().getAsString())); - } catch (Exception e) {} - + } catch (Exception e) { + } } else if (value.isJsonObject()) { - objectParse(value.getAsJsonObject(), arrAllowKeys); - + parseJsonObject(value.getAsJsonObject(), arrAllowKeys); } else if (value.isJsonArray()) { JsonArray jsonArray = value.getAsJsonArray(); - JsonElement jsonElement; - for (int i = 0; i < jsonArray.size(); i++) { - jsonElement = jsonArray.get(i); - objectParse(jsonElement.getAsJsonObject(), arrAllowKeys); + for (JsonElement element : jsonArray) { + parseJsonObject(element.getAsJsonObject(), arrAllowKeys); } } } - return gson.fromJson(jsonObject, type); + return gson.fromJson(jsonObject, new TypeToken>() {}.getType()); } - public Map objectParse(JsonObject jsonObject) { - Map map = new HashMap<>(); + public Map parseJsonObject(JsonObject jsonObject) { + if (jsonObject == null) return null; + Map map; try { - map = objectParse(jsonObject, null); + map = parseJsonObject(jsonObject, null); } catch (Exception e) { + return null; } return map; } - public Map objectParse(String jsonString, String[] arrAllowKeys) { - Map map = new HashMap<>(); + public Map parseJsonObject(String jsonString, String[] arrAllowKeys) { + if (jsonString == null) return null; + Map map; try { - JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject(); - map = objectParse(jsonObject, arrAllowKeys); + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonObject()) + return null; + + map = parseJsonObject(jsonElement.getAsJsonObject(), arrAllowKeys); } catch (Exception e) { + return null; } return map; } - public Map objectParse(String jsonString) { - Map map = new HashMap<>(); + public Map parseJsonObject(String jsonString) { + if (jsonString == null) return null; + Map map; try { - JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject(); - map = objectParse(jsonObject, null); + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonObject()) + return null; + + map = parseJsonObject(jsonElement.getAsJsonObject(), null); } catch (Exception e) { + return null; } return map; } - public Boolean isObjectParse(String jsonString) { + public Boolean isJsonObject(String jsonString) { + if (jsonString == null) return false; try { - objectParse(jsonString); + JsonElement jsonElement = parser.parse(jsonString); + return jsonElement != null && jsonElement.isJsonObject(); } catch (Exception e) { return false; } - return true; } - } diff --git a/src/main/java/koreatech/in/service/KakaoBotServiceImpl.java b/src/main/java/koreatech/in/service/KakaoBotServiceImpl.java index 020be427..2d6a450e 100644 --- a/src/main/java/koreatech/in/service/KakaoBotServiceImpl.java +++ b/src/main/java/koreatech/in/service/KakaoBotServiceImpl.java @@ -4,10 +4,14 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import koreatech.in.domain.KakaoBot; +import koreatech.in.domain.KakaoBot.BusFactory; +import koreatech.in.domain.KakaoBot.BusForTerm; +import koreatech.in.skillresponse.KakaoBot; import koreatech.in.skillresponse.SkillResponse; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -21,6 +25,8 @@ @Service public class KakaoBotServiceImpl implements KakaoBotService { + @Resource(name="redisTemplate") + private ValueOperations valueOps; @Override public String checkJsonNull(JsonElement nullableJson) { @@ -106,22 +112,11 @@ public String calculateBus(String departKorean, String arrivalKorean) throws IOE StringBuilder resultNow = new StringBuilder("[바로 도착]\n"); StringBuilder resultNext = new StringBuilder("[다음 도착]\n"); + BusForTerm bus = BusFactory.createBus(valueOps.get("termCode")); // 셔틀버스 운행정보 - KakaoBot.searchShuttleTime(departEnglish, arrivalEnglish, resultNow, resultNext); // 학기중 셔틀버스 - // 방학중 셔틀버스(주말과 공휴일 운영 X) - /* - 대학 출발 - 14:00 - - 터미널 출발 - 14:25 - - 천안역 > 학교 - 14:30 - */ - + bus.searchShuttleTime(departEnglish, arrivalEnglish, resultNow, resultNext); // 대성고속 운행정보 - KakaoBot.searchExpressTime(departEnglish, arrivalEnglish, resultNow, resultNext); + bus.searchExpressTime(departEnglish, arrivalEnglish, resultNow, resultNext); // 시내버스 운행정보 String URL = String.format("https://api.koreatech.in/buses?depart=%s&arrival=%s", departEnglish, arrivalEnglish); diff --git a/src/main/java/koreatech/in/service/LandServiceImpl.java b/src/main/java/koreatech/in/service/LandServiceImpl.java index ece02a36..c5060b8a 100644 --- a/src/main/java/koreatech/in/service/LandServiceImpl.java +++ b/src/main/java/koreatech/in/service/LandServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.net.URLEncoder; @@ -29,6 +30,9 @@ public class LandServiceImpl implements LandService { @Autowired JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; + @Transactional @Override public Land createLandForAdmin(Land land) throws Exception { @@ -40,11 +44,9 @@ public Land createLandForAdmin(Land land) throws Exception { land.init(); land.setInternal_name(land.getName().replace(" ","").toLowerCase()); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(land.getImage_urls() != null && !land.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(land.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (land.getImage_urls() != null && !con.isJsonArrayWithOnlyString(land.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); landMapper.createLandForAdmin(land); @@ -62,11 +64,9 @@ public Land updateLandForAdmin(Land land, int id) throws Exception { land.setInternal_name(land.getName().replace(" ", "").toLowerCase()); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(land.getImage_urls() != null && !land.getImage_urls().isEmpty()) - if (!con.isArrayStringParse(land.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (land.getImage_urls() != null && !con.isJsonArrayWithOnlyString(land.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); land_old.update(land); landMapper.updateLandForAdmin(land_old); @@ -127,14 +127,8 @@ public Map getLand(int id) throws Exception { } } Map convertLand = domainToMap(land); - JsonConstructor con = new JsonConstructor(); - if (land.getImage_urls() != null && !land.getImage_urls().isEmpty()) { - try { - convertLand.replace("image_urls", con.arrayStringParse(land.getImage_urls())); - } catch (Exception e) { - } - } + convertLand.replace("image_urls", con.parseJsonArrayWithOnlyString(land.getImage_urls())); convertLand.put("permalink", URLEncoder.encode(land.getInternal_name(), "UTF-8")); convertLand.put("comments", landComments); diff --git a/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java b/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java index 312ff0d0..951f0011 100644 --- a/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java +++ b/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile; @@ -45,6 +46,9 @@ public class LostAndFoundServiceImpl implements LostAndFoundService { @Autowired private SearchUtil searchUtil; + @Autowired + private JsonConstructor con; + @Transactional @Override public LostItem createLostItemForAdmin(LostItem lostItem) throws Exception { @@ -70,11 +74,9 @@ public LostItem createLostItemForAdmin(LostItem lostItem) throws Exception { lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (lostItem.getImage_urls() != null && !con.isJsonArrayWithOnlyString(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); if (lostItem.getIs_deleted() == null) { lostItem.setIs_deleted(false); @@ -108,16 +110,9 @@ public Map getLostItemsForAdmin(int type, Criteria criteria) thr List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : lostItems) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } @@ -150,14 +145,7 @@ public Map getLostItemForAdmin(int id) throws Exception { Map map = domainToMap(lostItem); Map profile = new HashMap(); - JsonConstructor con = new JsonConstructor(); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); profile.put("profile_image_url", user != null ? user.getProfile_image_url() : null); map.put("user", profile); map.put("comments", comments); @@ -184,11 +172,9 @@ public LostItem updateLostItemForAdmin(LostItem lostItem, int id) throws Excepti ip = req.getRemoteAddr(); lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (lostItem.getImage_urls() != null && !con.isJsonArrayWithOnlyString(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); //TODO : validator를 사용해 입력된 정보의 유효화 검사 후 입력된 부분만 기존 내용에 반영 if (!lostItem.getIs_phone_open()) { @@ -320,11 +306,9 @@ public LostItem createLostItem(LostItem lostItem) throws Exception { lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (lostItem.getImage_urls() != null && !con.isJsonArrayWithOnlyString(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); lostAndFoundMapper.createLostItem(lostItem); searchUtil.createArticle(lostItem); @@ -363,16 +347,9 @@ public Map getLostItems(int type, Criteria criteria) throws Exce List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : lostItems) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } @@ -421,14 +398,7 @@ public Map getLostItem(int id) throws Exception { Map map = domainToMap(lostItem); Map profile = new HashMap(); - JsonConstructor con = new JsonConstructor(); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); profile.put("profile_image_url", user != null ? user.getProfile_image_url() : null); map.put("user", profile); map.put("comments", comments); @@ -458,11 +428,9 @@ public LostItem updateLostItem(LostItem lostItem, int id) throws Exception { ip = req.getRemoteAddr(); lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (lostItem.getImage_urls() != null && !con.isJsonArrayWithOnlyString(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); //TODO : validator를 사용해 입력된 정보의 유효화 검사 후 입력된 부분만 기존 내용에 반영 lostItem.setNickname(user.getNickname()); @@ -539,16 +507,9 @@ public Map getMyLostItemList(int type, Criteria criteria) throws List items = lostAndFoundMapper.getMyLostItemList(criteria.getCursor(), criteria.getLimit(), type, user.getId()); List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : items) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } diff --git a/src/main/java/koreatech/in/service/MarketPlaceServiceImpl.java b/src/main/java/koreatech/in/service/MarketPlaceServiceImpl.java index 8c8fa7e6..c7cd5efa 100644 --- a/src/main/java/koreatech/in/service/MarketPlaceServiceImpl.java +++ b/src/main/java/koreatech/in/service/MarketPlaceServiceImpl.java @@ -452,7 +452,7 @@ public Map getMyItemList(int type, Criteria criteria) throws Exc throw new PreconditionFailedException(new ErrorMessage("invalid type", 0)); } - double totalCount = marketPlaceMapper.totalItemCountByType(type); + double totalCount = marketPlaceMapper.totalMyItemCountByType(type, user.getId()); //TODO: paging을 위한 중복코드, 반복코드 개선방법 찾기 int totalPage = (int)Math.ceil(totalCount / criteria.getLimit()); diff --git a/src/main/java/koreatech/in/service/SearchServiceImpl.java b/src/main/java/koreatech/in/service/SearchServiceImpl.java index 9db7fe9c..bfdcd638 100644 --- a/src/main/java/koreatech/in/service/SearchServiceImpl.java +++ b/src/main/java/koreatech/in/service/SearchServiceImpl.java @@ -4,8 +4,6 @@ import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Search.SearchArticles; import koreatech.in.domain.Search.SearchArticlesMinified; -import koreatech.in.domain.Search.SearchComments; -import koreatech.in.domain.Search.SearchCommentsMinified; import koreatech.in.domain.Shop.Menu; import koreatech.in.domain.Shop.Shop; import koreatech.in.exception.PreconditionFailedException; @@ -27,13 +25,15 @@ public class SearchServiceImpl implements SearchService { @Autowired private SearchMapper searchMapper; + @Autowired + private JsonConstructor con; + public Map searchShop(SearchCriteria searchCriteria) throws Exception { if (!StringUtils.hasText(searchCriteria.getQuery())) throw new PreconditionFailedException(new ErrorMessage("공백으로는 검색할 수 없습니다.", 0)); Map map = new HashMap<>(); double totalCount, countByLimit, totalPage; - JsonConstructor con = new JsonConstructor(); switch (searchCriteria.getSearchType()) { case 0: default: // 상점명 검색 @@ -49,8 +49,8 @@ public Map searchShop(SearchCriteria searchCriteria) throws Exce for (Shop shop : shops) { shop.setPermalink(shop.getInternal_name()); Map shopMap = domainToMap(shop); - if (shopMap.get("image_urls") != null && con.isArrayStringParse(shop.getImage_urls())) { - shopMap.replace("image_urls", con.arrayStringParse(shop.getImage_urls())); + if (shopMap.get("image_urls") != null && con.isJsonArrayWithOnlyString(shop.getImage_urls())) { + shopMap.replace("image_urls", con.parseJsonArrayWithOnlyString(shop.getImage_urls())); } shopsMapList.add(shopMap); } @@ -69,8 +69,8 @@ public Map searchShop(SearchCriteria searchCriteria) throws Exce List> menusMapList = new ArrayList<>(); for (Menu menu : menus) { Map menuMap = domainToMap(menu); - if (menuMap.get("price_type") != null && con.isArrayObjectParse(menu.getPrice_type())) { - menuMap.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); + if (menuMap.get("price_type") != null && con.isJsonArrayWithOnlyObject(menu.getPrice_type())) { + menuMap.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); } menusMapList.add(menuMap); } diff --git a/src/main/java/koreatech/in/service/ShopServiceImpl.java b/src/main/java/koreatech/in/service/ShopServiceImpl.java index 94fbec95..eb7a3ea3 100644 --- a/src/main/java/koreatech/in/service/ShopServiceImpl.java +++ b/src/main/java/koreatech/in/service/ShopServiceImpl.java @@ -1,7 +1,6 @@ package koreatech.in.service; import koreatech.in.domain.Criteria.Criteria; -import koreatech.in.domain.Criteria.SearchCriteria; import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Event.EventArticle; import koreatech.in.domain.Shop.Menu; @@ -10,11 +9,11 @@ import koreatech.in.domain.User.User; import koreatech.in.exception.*; import koreatech.in.repository.ShopMapper; -import koreatech.in.repository.UserMapper; import koreatech.in.util.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -28,9 +27,13 @@ public class ShopServiceImpl implements ShopService { @Resource(name="shopMapper") private ShopMapper shopMapper; + @Autowired JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; + @Transactional @Override public Shop createShopForAdmin(Shop shop) throws Exception { @@ -41,12 +44,9 @@ public Shop createShopForAdmin(Shop shop) throws Exception { throw new PreconditionFailedException(new ErrorMessage("No such Category", 2)); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - if(!con.isArrayStringParse(shop.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); - } + if(shop.getImage_urls() != null && !con.isJsonArrayWithOnlyString(shop.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); shop.setInternal_name(shop.getName().replace(" ","").toLowerCase()); @@ -81,19 +81,12 @@ public Shop createShopForAdmin(Shop shop) throws Exception { @Override public Map getShopsForAdmin(Criteria criteria) throws Exception { - JsonConstructor con = new JsonConstructor(); List shops = shopMapper.getShopListForAdmin(criteria.getCursor(), criteria.getLimit()); List> convert_shops = new ArrayList<>(); for(Shop shop : shops) { Map map_shop = domainToMap(shop); - //image_urls 변환 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - try { - map_shop.replace("image_urls", con.arrayStringParse(shop.getImage_urls())); - } catch (Exception e) { - } - } + map_shop.replace("image_urls", con.parseJsonArrayWithOnlyString(shop.getImage_urls())); convert_shops.add(map_shop); } @@ -140,15 +133,11 @@ public Map getShopForAdmin(String id) throws Exception { List> convert_menus = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); try { for (Menu menu : menus) { //menu를 map 객체로 바꾼 후 price_type 값을 array_in_convert_price로 교체, 그것을 다시 convert_menus에 추가 Map convert_price_menu = domainToMap(menu); - try { - convert_price_menu.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } + convert_price_menu.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); convert_menus.add(convert_price_menu); } } catch (Exception e) { @@ -156,12 +145,8 @@ public Map getShopForAdmin(String id) throws Exception { map.put("menus", convert_menus); //image_urls 컬럼을 list로 - try { - //변환된 list로 값 교체 - map.replace("image_urls", con.arrayStringParse(map.get("image_urls").toString())); - } catch (Exception e) { - return map; - } + //변환된 list로 값 교체 + map.replace("image_urls", con.parseJsonArrayWithOnlyString(map.get("image_urls").toString())); return map; } @@ -181,12 +166,9 @@ public Shop updateShopForAdmin(Shop shop, int id) throws Exception { throw new PreconditionFailedException(new ErrorMessage("No such Category", 2)); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - if(!con.isArrayStringParse(shop.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); - } + if(shop.getImage_urls() != null && !con.isJsonArrayWithOnlyString(shop.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); if (shop.getName() != null) { shop.setInternal_name(shop.getName().replace(" ", "").toLowerCase()); @@ -215,11 +197,9 @@ public Map deleteShopForAdmin(int id) throws Exception { @Transactional @Override public Menu createMenuForAdmin(Menu menu, int shop_id) throws Exception { - JsonConstructor con = new JsonConstructor(); //price_type 검증 - if (!menu.getPrice_type().isEmpty()) - if (!con.isArrayObjectParse(menu.getPrice_type())) - throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); + if (menu.getPrice_type() != null && !con.isJsonArrayWithOnlyObject(menu.getPrice_type())) + throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); menu.setShop_id(shop_id); if (menu.getIs_deleted() == null) { @@ -241,14 +221,7 @@ public Map getMenuForAdmin(int shop_id, int menu_id) throws Exce throw new NotFoundException(new ErrorMessage("There is no such menu", 0)); Map map = domainToMap(menu); - JsonConstructor con = new JsonConstructor(); - //price_type 컬럼을 list로 - if(!menu.getPrice_type().isEmpty()) { - try { - map.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } - } + map.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); return map; } @@ -260,11 +233,9 @@ public Menu updateMenuForAdmin(Menu menu, int shop_id, int id) throws Exception if (menu_old == null) throw new NotFoundException(new ErrorMessage("There is no such menu", 0)); - JsonConstructor con = new JsonConstructor(); ///price_type 검증 - if (!menu.getPrice_type().isEmpty()) - if (!con.isArrayObjectParse(menu.getPrice_type())) - throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); + if (menu.getPrice_type() != null && !con.isJsonArrayWithOnlyObject(menu.getPrice_type())) + throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); menu_old.update(menu); @@ -294,14 +265,11 @@ public Map getShops() throws Exception { List shops = shopMapper.getShopList(); List> shopsMapList = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (Shop shop : shops) { shop.setPermalink(shop.getInternal_name()); Map shopMap = domainToMap(shop); - if (shopMap.get("image_urls") != null) { - shopMap.replace("image_urls", con.arrayStringParse(shopMap.get("image_urls").toString())); - } + shopMap.replace("image_urls", con.parseJsonArrayWithOnlyString(shopMap.get("image_urls").toString())); List eventArticles = shopMapper.getPendingEventByShopId(shop.getId()); shopMap.put("event_articles", eventArticles); shopsMapList.add(shopMap); @@ -359,15 +327,11 @@ public Map getShop(String id) throws Exception { List> convert_menus = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); try { for (Menu menu : menus) { //menu를 map 객체로 바꾼 후 price_type 값을 array_in_convert_price로 교체, 그것을 다시 convert_menus에 추가 Map convert_price_menu = domainToMap(menu); - try { - convert_price_menu.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } + convert_price_menu.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); convert_menus.add(convert_price_menu); } } catch (Exception e) { @@ -376,12 +340,8 @@ public Map getShop(String id) throws Exception { map.put("event_articles", eventArticles); //image_urls 컬럼을 list로 - try { - //변환된 list로 값 교체 - map.replace("image_urls", con.arrayStringParse(map.get("image_urls").toString())); - } catch (Exception e) { - return map; - } + //변환된 list로 값 교체 + map.replace("image_urls", con.parseJsonArrayWithOnlyString(map.get("image_urls").toString())); return map; } diff --git a/src/main/java/koreatech/in/service/UserServiceImpl.java b/src/main/java/koreatech/in/service/UserServiceImpl.java index 91e78245..7684aa4e 100644 --- a/src/main/java/koreatech/in/service/UserServiceImpl.java +++ b/src/main/java/koreatech/in/service/UserServiceImpl.java @@ -33,6 +33,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.velocity.VelocityEngineUtils; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.inject.Inject; @@ -439,11 +440,11 @@ public Map register(User user, String host) throws Exception { // // mailSender.send(preparator); - Map model = new HashMap(); + Map model = new HashMap<>(); model.put("authToken", authToken); model.put("contextPath", contextPath); - String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mail/register_authenticate.vm", model); + String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mail/register_authenticate.vm", "UTF-8", model); sesMailSender.sendMail("no-reply@bcsdlab.com", toAccount, "코인 이메일 회원가입 인증", text); @@ -531,7 +532,7 @@ public Map changePasswordConfig(User user, String host) { // // mailSender.send(preparator); - Map model = new HashMap(); + Map model = new HashMap<>(); model.put("resetToken", resetToken); model.put("contextPath", contextPath); @@ -693,14 +694,16 @@ public Map updateOwnerInformation(Owner owner) throws Exception { @Override public Map checkUserNickName(String nickname) { - User user = userMapper.getUserByNickName(nickname); + if (StringUtils.isEmpty(nickname) || nickname.length() > 10) + throw new PreconditionFailedException(new ErrorMessage("올바르지 않은 닉네임 형식입니다.", 0)); + User user = userMapper.getUserByNickName(nickname); if (user != null) { - throw new ConflictException(new ErrorMessage("nickname impossible use", 0)); + throw new ConflictException(new ErrorMessage("사용할 수 없는 닉네임입니다.", 0)); } return new HashMap() {{ - put("success", "nickname possible use"); + put("success", "사용 가능한 닉네임입니다."); }}; } diff --git a/src/main/java/koreatech/in/skillresponse/KakaoBotEnum.java b/src/main/java/koreatech/in/skillresponse/KakaoBot.java similarity index 61% rename from src/main/java/koreatech/in/skillresponse/KakaoBotEnum.java rename to src/main/java/koreatech/in/skillresponse/KakaoBot.java index 841662b5..c3efe45e 100644 --- a/src/main/java/koreatech/in/skillresponse/KakaoBotEnum.java +++ b/src/main/java/koreatech/in/skillresponse/KakaoBot.java @@ -1,6 +1,28 @@ package koreatech.in.skillresponse; -public class KakaoBotEnum { +import java.util.HashMap; +import java.util.Map; + +public class KakaoBot { + private static final Map changeWord = new HashMap() {{ + put("아침", "BREAKFAST"); + put("점심", "LUNCH"); + put("저녁", "DINNER"); + put("한기대", "koreatech"); + put("야우리", "terminal"); + put("천안역", "station"); + }}; + + private static final String[] restaurantList = {"한식", "일품식", "특식", "양식", "능수관", "수박여"}; //"2캠퍼스" + + public static String[] getRestaurantList() { + return restaurantList; + } + + public static String getChangedWord(String beforeWord) { + return changeWord.get(beforeWord); + } + public enum TemplateType { SIMPLETEXT("simpleText"), // 간단한 텍스트형 출력 요소 SIMPLEIMAGE("simpleImage"), // 간단한 이미지형 출력 요소 @@ -61,14 +83,42 @@ public String getTypeText() { public enum BusType { SHUTTLE("학교셔틀"), - EXPRESS("고속버스"), - CITY("시내버스") - ; + EXPRESS("대성고속"), + CITY("시내버스"); private String typeText; - BusType(String typeText) { this.typeText = typeText; } + BusType(String typeText) { + this.typeText = typeText; + } + + public String getTypeText() { + return typeText; + } + } + + public enum TermCode { + FIRST_REGULAR_SEMESTER(10), + FIRST_SEASONAL_SEMESTER(11), + FIRST_VACATION(12), + SECOND_REGULAR_SEMESTER(20), + SECOND_SEASONAL_SEMESTER(21), + SECOND_VACATION(22); - public String getTypeText() { return typeText; } + private int termCode; + + TermCode(int termCode) { + this.termCode = termCode; + } + + public static boolean isValidTermCode(String termCode) { + for (TermCode code : TermCode.values()) + if (termCode.equals(String.valueOf(code.getTermCode()))) return true; + return false; + } + + public int getTermCode() { + return termCode; + } } } diff --git a/src/main/java/koreatech/in/skillresponse/SkillResponse.java b/src/main/java/koreatech/in/skillresponse/SkillResponse.java index c90ac5ca..9cb5a9bd 100644 --- a/src/main/java/koreatech/in/skillresponse/SkillResponse.java +++ b/src/main/java/koreatech/in/skillresponse/SkillResponse.java @@ -37,7 +37,7 @@ public void addSimpleText(String text) throws PreconditionFailedException { JsonObject field = new JsonObject(); JsonObject type = new JsonObject(); field.addProperty("text", text); - type.add(KakaoBotEnum.TemplateType.SIMPLETEXT.getTypeText(), field); + type.add(KakaoBot.TemplateType.SIMPLETEXT.getTypeText(), field); outputs.add(type); } @@ -48,7 +48,7 @@ public void addSimpleImage(String imageUrl, String altText) throws PreconditionF JsonObject type = new JsonObject(); field.addProperty("imageUrl", imageUrl); field.addProperty("altText", altText); - type.add(KakaoBotEnum.TemplateType.SIMPLEIMAGE.getTypeText(), field); + type.add(KakaoBot.TemplateType.SIMPLEIMAGE.getTypeText(), field); outputs.add(type); } @@ -96,14 +96,14 @@ public JsonElement build() { if (description != null) field.addProperty("description", description); if (thumbnail != null) field.add("thumbnail", thumbnail); if (buttons.size() != 0) field.add("buttons", buttons); - type.add(KakaoBotEnum.TemplateType.BASICCARD.getTypeText(), field); + type.add(KakaoBot.TemplateType.BASICCARD.getTypeText(), field); return type; } } public void addQujckReplies(String label, String action, String messageText) throws PreconditionFailedException { if (quickReplies.size() >= 10) throw new PreconditionFailedException(new ErrorMessage("quickReplies의 제한은 10개 이하입니다.", 0)); - if (!action.equals(KakaoBotEnum.QuickRepliesActionType.MESSAGE.getTypeText())) + if (!action.equals(KakaoBot.QuickRepliesActionType.MESSAGE.getTypeText())) throw new PreconditionFailedException(new ErrorMessage("quickReplies의 action이 올바르게 설정되지 않았습니다.", 0)); if (label.length() > 8) throw new PreconditionFailedException(new ErrorMessage("quickReplies에서 label은 최대 8자 제한입니다.", 0)); @@ -117,7 +117,7 @@ public void addQujckReplies(String label, String action, String messageText) thr public void addQujckReplies(String label, String action, String messageText, String blockId) throws Exception { if (quickReplies.size() >= 10) throw new PreconditionFailedException(new ErrorMessage("quickReplies의 제한은 10개 이하입니다.", 0)); - if (!action.equals(KakaoBotEnum.QuickRepliesActionType.BLOCK.getTypeText())) + if (!action.equals(KakaoBot.QuickRepliesActionType.BLOCK.getTypeText())) throw new PreconditionFailedException(new ErrorMessage("quickReplies의 action이 올바르게 설정되지 않았습니다.", 0)); if (label.length() > 8) throw new PreconditionFailedException(new ErrorMessage("quickReplies에서 label은 최대 8자 제한입니다.", 0)); @@ -230,23 +230,23 @@ public JsonObject build() throws PreconditionFailedException { JsonObject button = new JsonObject(); button.addProperty("action", action); button.addProperty("label", label); - if (action.equals(KakaoBotEnum.ButtonActionType.WEBLINK.getTypeText())) { + if (action.equals(KakaoBot.ButtonActionType.WEBLINK.getTypeText())) { if (webLinkUrl == null) throw new PreconditionFailedException(new ErrorMessage("Button에서 action이 webLink일 경우, webLinkUrl은 필수 설정 항목입니다.", 0)); button.addProperty("webLinkUrl", webLinkUrl); - } else if (action.equals(KakaoBotEnum.ButtonActionType.OSLINK.getTypeText())) { + } else if (action.equals(KakaoBot.ButtonActionType.OSLINK.getTypeText())) { if (osLink == null) throw new PreconditionFailedException(new ErrorMessage("Button에서 action이 osLink일 경우, osLink는 필수 설정 항목입니다.", 0)); button.addProperty("osLink", osLink); - } else if (action.equals(KakaoBotEnum.ButtonActionType.MESSAGE.getTypeText())) { + } else if (action.equals(KakaoBot.ButtonActionType.MESSAGE.getTypeText())) { if (messageText == null) throw new PreconditionFailedException(new ErrorMessage("Button에서 action이 message일 경우, messageText는 필수 설정 항목입니다.", 0)); button.addProperty("messageText", messageText); - } else if (action.equals(KakaoBotEnum.ButtonActionType.PHONE.getTypeText())) { + } else if (action.equals(KakaoBot.ButtonActionType.PHONE.getTypeText())) { if (phoneNumber == null) throw new PreconditionFailedException(new ErrorMessage("Button에서 action이 phone일 경우, phoneNumber은 필수 설정 항목입니다.", 0)); button.addProperty("phoneNumber", phoneNumber); - } else if (action.equals(KakaoBotEnum.ButtonActionType.BLOCK.getTypeText())) { + } else if (action.equals(KakaoBot.ButtonActionType.BLOCK.getTypeText())) { if (phoneNumber == null) throw new PreconditionFailedException(new ErrorMessage("Button에서 action이 block일 경우, blockId은 필수 설정 항목입니다.", 0)); button.addProperty("blockId", blockId); diff --git a/src/main/webapp/WEB-INF/servlet-context.xml b/src/main/webapp/WEB-INF/servlet-context.xml index d3ac9570..38080072 100644 --- a/src/main/webapp/WEB-INF/servlet-context.xml +++ b/src/main/webapp/WEB-INF/servlet-context.xml @@ -17,12 +17,6 @@ - - - - - - diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index cfa976dd..1d90c9f7 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -12,16 +12,17 @@ contextConfigLocation /WEB-INF/root-context.xml - classpath*:common/application_context_provider.xml - classpath*:common/config.xml - classpath*:common/context-*.xml - classpath*:common/mailSend.xml - classpath*:common/jwt.xml - classpath*:common/redis.xml - classpath*:common/s3.xml - classpath*:common/security.xml - classpath*:common/slack_noti.xml - classpath*:common/search.xml + classpath*:common/*.xml + + + + + + + + + +