diff --git a/src/main/java/io/company/localhost/common/dto/ApiResponse.java b/src/main/java/io/company/localhost/common/dto/ApiResponse.java index 920e105..8919aa2 100644 --- a/src/main/java/io/company/localhost/common/dto/ApiResponse.java +++ b/src/main/java/io/company/localhost/common/dto/ApiResponse.java @@ -47,4 +47,7 @@ public class ApiResponse { public static ApiResponse error(HttpStatus status, String message) { return new ApiResponse<>(status, message, null); } + public static ApiResponse okMessage(String message) { + return new ApiResponse<>(HttpStatus.OK, message, null); + } } \ No newline at end of file diff --git a/src/main/java/io/company/localhost/common/dto/MapDto.java b/src/main/java/io/company/localhost/common/dto/MapDto.java index ec17348..2b6e6d5 100644 --- a/src/main/java/io/company/localhost/common/dto/MapDto.java +++ b/src/main/java/io/company/localhost/common/dto/MapDto.java @@ -20,7 +20,11 @@ import org.springframework.util.ObjectUtils; import java.io.Serial; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class MapDto extends ListOrderedMap { @@ -74,6 +78,32 @@ public class MapDto extends ListOrderedMap { } return null; } - + + public List getList(String key, Class clazz) { + Object value = this.get(key); + if (value == null) { + return Collections.emptyList(); + } + if (!(value instanceof List)) { + throw new IllegalArgumentException("Value for key " + key + " is not a List"); + } + List list = (List) value; + List result = new ArrayList<>(); + for (Object item : list) { + if (item == null) { + continue; // null인 항목은 건너뜁니다. + } + if (clazz.isInstance(item)) { + result.add(clazz.cast(item)); + } else if (clazz.equals(Long.class) && item instanceof Integer) { + result.add(clazz.cast(Long.valueOf((Integer) item))); + } else if (item instanceof Map && clazz.equals(MapDto.class)) { + result.add(clazz.cast(new MapDto((Map) item))); + } else { + throw new ClassCastException("Cannot cast " + item.getClass() + " to " + clazz); + } + } + return result; + } } diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index a631ae9..7b6bbf1 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -165,17 +165,35 @@ public class BoardController { } /** - * 댓글/대댓글 조회 + * 댓글 조회 * @ReqMap map 수정 데이터 (LOCBRDSEQ) - * @return 댓글과 대댓글의 계층 구조 데이터 + * @return 댓글 */ @Member @ParameterCheck @GetMapping("/{boardId}/comments") - public ApiResponse> getComments(@ReqMap MapDto map) { - return ApiResponse.ok(boardService.selectComments(map)); - } + public ApiResponse> selectComments(@ReqMap MapDto map) { + // 댓글조회 + PageInfo comments = boardService.selectComments(map); + + return ApiResponse.ok(comments); + } + + /** + * 대댓글 조회 + * @ReqMap map 수정 데이터 (LOCBRDSEQ) + * @return 대댓글 + */ + @Member + @ParameterCheck + @GetMapping("/{boardId}/reply") + public ApiResponse> getComments(@ReqMap MapDto map) { + List replies = boardService.selectReply(map); + + return ApiResponse.ok(replies); + } + /** * 댓글/대댓글 작성 * @param boardId 게시물 ID diff --git a/src/main/java/io/company/localhost/controller/api/VacationController.java b/src/main/java/io/company/localhost/controller/api/VacationController.java index ef61e70..041cf3f 100644 --- a/src/main/java/io/company/localhost/controller/api/VacationController.java +++ b/src/main/java/io/company/localhost/controller/api/VacationController.java @@ -33,24 +33,52 @@ public class VacationController { @Member @ParameterCheck @PostMapping - public ApiResponse saveVacations(@RequestBody List map) { - Long user = AuthUtil.getUser().getId(); - for (MapDto request : map) { - String date = request.getString("date"); - String type = request.getString("type"); - Object receiverId = request.get("receiverId"); - - if ( date == null || type == null) { - throw new IllegalArgumentException("요청 데이터에 누락된 값이 있습니다: " + request); + public ApiResponse saveVacations(@RequestBody List list) { + Long user = AuthUtil.getUser().getId(); + for (MapDto request : list) { + String date = request.getString("date"); + String type = request.getString("type"); + Object receiverId = request.get("receiverId"); + request.put("employeeId", user); + + if (date == null || type == null) { + throw new IllegalArgumentException("요청 데이터에 누락된 값이 있습니다: " + request); + } + + // count 필드가 있으면, 해당 값만큼 반복해서 insert + Integer count = request.getInt("count"); + if (count == null || count < 1) { + count = 1; + } + for (int i = 0; i < count; i++) { + localVacaService.insertVacation(request); + } } - request.put("employeeId", user); - // 데이터 저장 - localVacaService.insertVacation(request); + return ApiResponse.ok("모든 휴가가 성공적으로 저장되었습니다."); } - return ApiResponse.ok("모든 휴가가 성공적으로 저장되었습니다."); + @Member + @ParameterCheck + @PostMapping("/batchUpdate") + public ApiResponse batchUpdateVacations(@ReqMap MapDto map) { + Long user = AuthUtil.getUser().getId(); + List addRequests = map.getList("add", MapDto.class); + List deleteIds = map.getList("delete", Long.class); + + if (addRequests != null) { + for (MapDto addRequest : addRequests) { + addRequest.put("employeeId", user); + localVacaService.insertVacation(addRequest); + } + } + if (deleteIds != null) { + for (Long deleteId : deleteIds) { + localVacaService.deleteVacation(deleteId); + } + } + return ApiResponse.ok("휴가 변경이 성공적으로 처리되었습니다."); } - + /** * 특정 연월에 대한 휴가 데이터 조회 */ diff --git a/src/main/java/io/company/localhost/controller/api/VoteBoardController.java b/src/main/java/io/company/localhost/controller/api/VoteBoardController.java index 13cfbb0..f33a200 100644 --- a/src/main/java/io/company/localhost/controller/api/VoteBoardController.java +++ b/src/main/java/io/company/localhost/controller/api/VoteBoardController.java @@ -2,6 +2,7 @@ package io.company.localhost.controller.api; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -76,5 +77,19 @@ public class VoteBoardController { return ApiResponse.ok(localvoteservice.insertCheckedNums(map)); } + /** + * 투표 종료 + * @param endVoteId 투표번호 + * @return + */ + @Member + @PatchMapping("updateEndData") + public ApiResponse updateEndData(@AuthenticationPrincipal MemberVo memberVo,@ReqMap MapDto map) { + + Long userId = AuthUtil.getUser().getId(); + map.put("userId", userId); + return ApiResponse.ok(localvoteservice.updateEndData(map)); + } + } diff --git a/src/main/java/io/company/localhost/controller/api/worddictController.java b/src/main/java/io/company/localhost/controller/api/worddictController.java index 764588d..606710d 100644 --- a/src/main/java/io/company/localhost/controller/api/worddictController.java +++ b/src/main/java/io/company/localhost/controller/api/worddictController.java @@ -14,6 +14,7 @@ *************************************************************/ package io.company.localhost.controller.api; +//import java.util.Arrays; import java.util.List; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -96,6 +97,9 @@ public class worddictController { @PostMapping("insertCategory") public ApiResponse insertCategory(@ReqMap MapDto map) { Long result = commoncodservice.insertCategory(map); + if(result == -1) { + return ApiResponse.okMessage("이미 존재하는 카테고리명입니다."); + } return ApiResponse.ok(result); } /** @@ -135,4 +139,16 @@ public class worddictController { return ApiResponse.ok(result); } + /** + * 용어 삭제 + * @param idList 게시판 아이디 리스트 + * @return + */ + @Member + @PatchMapping("deleteword") + public ApiResponse updateword(@AuthenticationPrincipal MemberVo memberVo,@ReqMap MapDto map) { + return ApiResponse.ok(worddictyservice.updateword(map)); + } + + } diff --git a/src/main/java/io/company/localhost/mapper/commoncodMapper.java b/src/main/java/io/company/localhost/mapper/commoncodMapper.java index 9f255cc..00184da 100644 --- a/src/main/java/io/company/localhost/mapper/commoncodMapper.java +++ b/src/main/java/io/company/localhost/mapper/commoncodMapper.java @@ -40,4 +40,6 @@ public interface commoncodMapper { List selectYearCategories(); List selectCategories(); + + Long selectcheckCategoryExists(MapDto map); } diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index 6a31b84..9b0e346 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -5,6 +5,7 @@ import java.util.Map; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.ResultType; import io.company.localhost.common.dto.MapDto; @@ -43,8 +44,11 @@ public interface localbordMapper { // 기존 반응 업데이트 void updateReaction(MapDto map); - // 댓글/대댓글 조회 + // 댓글 조회 List selectComments(MapDto map); + + //대댓글 조회 + List selectReply(MapDto map); // 댓글/대댓글 작성 void insertCommentOrReply(MapDto map); @@ -86,7 +90,7 @@ public interface localbordMapper { MapDto selectCountBoardReactions(Long boardId); // 댓글 좋아요/싫어요 개수 - List selectCountCommentReactions(Long boardId); + MapDto selectCountCommentReactions(Long commentId); // 첨부파일 가져오기 List selectAttachments(Long boardId); @@ -94,5 +98,6 @@ public interface localbordMapper { //댓글id 확인 MapDto selectCommentById(int commentId); + } diff --git a/src/main/java/io/company/localhost/mapper/localvacaMapper.java b/src/main/java/io/company/localhost/mapper/localvacaMapper.java index 6b4779e..00b8fb1 100644 --- a/src/main/java/io/company/localhost/mapper/localvacaMapper.java +++ b/src/main/java/io/company/localhost/mapper/localvacaMapper.java @@ -12,6 +12,8 @@ import io.company.localhost.common.dto.MapDto; public interface localvacaMapper { void insertVacation(MapDto map); + void deleteVacation(Long vacationId); + List findVacations(@Param("year") int year, @Param("month") int month); List getUsedVacations(@Param("userId") Long userId); diff --git a/src/main/java/io/company/localhost/mapper/localvoteMapper.java b/src/main/java/io/company/localhost/mapper/localvoteMapper.java index dadea29..2d93447 100644 --- a/src/main/java/io/company/localhost/mapper/localvoteMapper.java +++ b/src/main/java/io/company/localhost/mapper/localvoteMapper.java @@ -15,5 +15,7 @@ public interface localvoteMapper { List getVoteList(MapDto map); + Long updateEndData(MapDto map); + } diff --git a/src/main/java/io/company/localhost/mapper/worddictyMapper.java b/src/main/java/io/company/localhost/mapper/worddictyMapper.java index 369be30..4360921 100644 --- a/src/main/java/io/company/localhost/mapper/worddictyMapper.java +++ b/src/main/java/io/company/localhost/mapper/worddictyMapper.java @@ -33,6 +33,8 @@ public interface worddictyMapper { int getTotal(MapDto map); + Long updateword(MapDto map); + diff --git a/src/main/java/io/company/localhost/service/commoncodService.java b/src/main/java/io/company/localhost/service/commoncodService.java index edf2cbb..06711ab 100644 --- a/src/main/java/io/company/localhost/service/commoncodService.java +++ b/src/main/java/io/company/localhost/service/commoncodService.java @@ -19,6 +19,7 @@ import java.util.List; import org.springframework.stereotype.Service; import io.company.localhost.common.dto.MapDto; +import io.company.localhost.common.exception.NotFoundHandler; import io.company.localhost.mapper.commoncodMapper; import lombok.RequiredArgsConstructor; @@ -33,6 +34,10 @@ public class commoncodService { } public Long insertCategory(MapDto map) { + Long count = commoncodmapper.selectcheckCategoryExists(map); + if(count > 0) { + return -1L; + } return commoncodmapper.insertCategory(map); } diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 29a552a..298d3ba 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -111,14 +111,19 @@ public class localbordService { } public PageInfo selectComments(MapDto map) { - int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; + int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; PageHelper.startPage(page, size); List result = boardMapper.selectComments(map); - + enrichCommentsWithAdditionalData(result); // 댓글 데이터 보강 return PageUtil.redefineNavigation(new PageInfo<>(result, size)); } + + public List selectReply(MapDto map) { + + return boardMapper.selectReply(map); + } public void insertCommentOrReply(MapDto map) { if (map.get("LOCCMTPNT") == null) { @@ -172,7 +177,7 @@ public class localbordService { return boardMapper.selectCountBoardReactions(boardId); } - public List selectCountCommentReactions(Long boardId) { + public MapDto selectCountCommentReactions(Long boardId) { return boardMapper.selectCountCommentReactions(boardId); } @@ -301,4 +306,20 @@ public class localbordService { } } + private void enrichCommentsWithAdditionalData(List comments) { + for (MapDto comment : comments) { + Object idObject = comment.get("LOCCMTSEQ"); + if (idObject instanceof Number) { + long commentId = ((Number) idObject).longValue(); + + MapDto reactions = boardMapper.selectCountCommentReactions(commentId); + comment.put("likeCount", reactions != null ? reactions.getOrDefault("likeCount", 0) : 0); + comment.put("dislikeCount", reactions != null ? reactions.getOrDefault("dislikeCount", 0) : 0); + + Object content = comment.get("content"); + comment.put("content", content); + } + } + } + } \ No newline at end of file diff --git a/src/main/java/io/company/localhost/service/localvacaService.java b/src/main/java/io/company/localhost/service/localvacaService.java index 39ebedd..bdc2350 100644 --- a/src/main/java/io/company/localhost/service/localvacaService.java +++ b/src/main/java/io/company/localhost/service/localvacaService.java @@ -34,8 +34,13 @@ public class localvacaService { @Value("${api.public-holiday.key}") private String serviceKey; - public void insertVacation(MapDto map) { - localvacaMapper.insertVacation(map); + public void insertVacation(MapDto vacation) { + // 필요한 경우 데이터 검증/전처리 후 매퍼 호출 + localvacaMapper.insertVacation(vacation); + } + + public void deleteVacation(Long vacationId) { + localvacaMapper.deleteVacation(vacationId); } public List getVacationList(int year, int month) { diff --git a/src/main/java/io/company/localhost/service/localvoteService.java b/src/main/java/io/company/localhost/service/localvoteService.java index cdf3ddb..e4ccbc5 100644 --- a/src/main/java/io/company/localhost/service/localvoteService.java +++ b/src/main/java/io/company/localhost/service/localvoteService.java @@ -31,7 +31,10 @@ public class localvoteService { Long result = 0L; - int voteIdInt = (int) map.get("voteId"); + int voteIdInt = 0 ; + if(map.get("voteId") != null) { + voteIdInt = (int) map.get("voteId"); + } if(voteIdInt != 0) { result = votdetailmapper.insertdetail(map); }else { @@ -87,5 +90,9 @@ public class localvoteService { return result; } + public Long updateEndData(MapDto map) { + return localvotemapper.updateEndData(map); + } + } diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index 56b131e..c19987a 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -58,8 +58,6 @@ public class worddictyService { return processedList; } - - public Long insertWord(MapDto map) { return worddictymapper.insertWord(map); } @@ -77,6 +75,11 @@ public class worddictyService { } + public Long updateword(MapDto map) { + return worddictymapper.updateword(map); + } + + diff --git a/src/main/resources/mapper/VotMemberMapper.xml b/src/main/resources/mapper/VotMemberMapper.xml index c1985a2..ef68c2f 100644 --- a/src/main/resources/mapper/VotMemberMapper.xml +++ b/src/main/resources/mapper/VotMemberMapper.xml @@ -12,11 +12,30 @@ diff --git a/src/main/resources/mapper/VotRecordMapper.xml b/src/main/resources/mapper/VotRecordMapper.xml index c18361c..8e00221 100644 --- a/src/main/resources/mapper/VotRecordMapper.xml +++ b/src/main/resources/mapper/VotRecordMapper.xml @@ -23,20 +23,5 @@ ,#{userId} ,now() ) - - - - diff --git a/src/main/resources/mapper/commoncodMapper.xml b/src/main/resources/mapper/commoncodMapper.xml index e29188f..2b11e3f 100644 --- a/src/main/resources/mapper/commoncodMapper.xml +++ b/src/main/resources/mapper/commoncodMapper.xml @@ -112,5 +112,12 @@ AND CMNCODODR != 0 - + diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 9c986f8..2bc1946 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -132,7 +132,7 @@ VALUES (#{LOCBRDSEQ}, #{LOCCMTSEQ}, #{MEMBERSEQ}, #{LOCGOBGOD}, #{LOCGOBBAD}) - + + + + @@ -240,14 +252,15 @@ - SELECT LOCCMTSEQ, COALESCE(SUM(CASE WHEN LOCGOBGOD = 'T' THEN 1 ELSE 0 END), 0) AS likeCount, COALESCE(SUM(CASE WHEN LOCGOBBAD = 'T' THEN 1 ELSE 0 END), 0) AS dislikeCount FROM localgorb - WHERE LOCBRDSEQ = #{boardId} - GROUP BY LOCCMTSEQ + WHERE LOCCMTSEQ = #{commentId} + LIMIT 1 + diff --git a/src/main/resources/mapper/localvacaMapper.xml b/src/main/resources/mapper/localvacaMapper.xml index 2aceeee..88a948d 100644 --- a/src/main/resources/mapper/localvacaMapper.xml +++ b/src/main/resources/mapper/localvacaMapper.xml @@ -8,36 +8,45 @@ VALUES (#{employeeId}, #{date}, #{type}, NOW(), #{receiverId}) + + + DELETE FROM localvaca + WHERE LOCVACSEQ = #{vacationId} + + - + + + + - - diff --git a/src/main/resources/mapper/localvoteMapper.xml b/src/main/resources/mapper/localvoteMapper.xml index 0ae28f4..ad4af19 100644 --- a/src/main/resources/mapper/localvoteMapper.xml +++ b/src/main/resources/mapper/localvoteMapper.xml @@ -28,11 +28,25 @@ ,DATE_FORMAT(a.LOCVOTRDT, '%Y-%m-%d %H:%i') AS formatted_LOCVOTRDT ,DATE_FORMAT(a.LOCVOTEDT, '%Y-%m-%d %H:%i') AS formatted_LOCVOTEDT ,b.* + ,c.CMNCODNAM usercolor from localvote a LEFT JOIN netmember b on a.LOCVOTREG = b.MEMBERSEQ + left join + commoncod c + on + b.MEMBERCOL = c.CMNCODVAL + order by + a.LOCVOTRDT desc + + UPDATE + localvote + SET + LOCVOTDDT = now() + WHERE LOCVOTSEQ = #{endVoteId} + diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index 91bbda7..8dcd672 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -178,6 +178,7 @@ m2.MEMBERCOL = cu.CMNCODVAL -- 수정자 색상 where 1=1 + and w.WRDDICEDT IS NULL order by w.WRDDICRDT desc @@ -236,4 +237,14 @@ where WRDDICSEQ = #{WRDDICSEQ} + + UPDATE + worddicty + SET + WRDDICEDT = now() + WHERE WRDDICSEQ IN + + #{id} + +