Merge branch 'main' into yoon
All checks were successful
LOCALNET-DEV/pipeline/head This commit looks good
All checks were successful
LOCALNET-DEV/pipeline/head This commit looks good
This commit is contained in:
commit
4fdc97fde5
@ -30,7 +30,7 @@ public class VoteBoardController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 투표목록조회
|
* 투표목록조회
|
||||||
* @param page 페이지번호 , 내가한투표 :0 투표안한것 :1 , 전체:0,투표마감:1,투표중:2
|
* @param page 페이지번호 , myVote 내가한투표 :1 투표안한것 :0 , 전체:0,투표마감:1,투표중:2
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Member
|
@Member
|
||||||
|
|||||||
@ -55,13 +55,17 @@ public class localbordService {
|
|||||||
private final PasswordEncoder passwordEncoder;
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
public List<MapDto> selectNotices(MapDto map) {
|
public List<MapDto> selectNotices(MapDto map) {
|
||||||
|
String keyword = map.getString("searchKeyword");
|
||||||
|
map.put("searchKeyword", null);
|
||||||
|
|
||||||
List<MapDto> posts = boardMapper.selectNotices(map);
|
List<MapDto> posts = boardMapper.selectNotices(map);
|
||||||
enrichPostsWithAdditionalData(posts);
|
enrichPostsWithAdditionalData(posts);
|
||||||
return posts;
|
|
||||||
|
return filterPostsByKeyword(posts, keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public PageInfo<MapDto> selectGeneralPosts(MapDto map) {
|
public PageInfo<MapDto> selectGeneralPosts(MapDto map) {
|
||||||
System.out.println(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;
|
int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10;
|
||||||
|
|
||||||
@ -70,12 +74,27 @@ public class localbordService {
|
|||||||
map.put("orderBy", "date");
|
map.put("orderBy", "date");
|
||||||
}
|
}
|
||||||
|
|
||||||
PageHelper.startPage(page, size);
|
String keyword = map.getString("searchKeyword");
|
||||||
|
map.put("searchKeyword", null); // MyBatis에 전달하지 않음
|
||||||
|
|
||||||
|
// 넉넉히 많이 가져온 후 Java에서 필터링
|
||||||
|
PageHelper.startPage(1, 1000); // 최대 1000개까지만 조회
|
||||||
List<MapDto> result = boardMapper.selectGeneralPosts(map);
|
List<MapDto> result = boardMapper.selectGeneralPosts(map);
|
||||||
|
|
||||||
enrichPostsWithAdditionalData(result);
|
enrichPostsWithAdditionalData(result);
|
||||||
|
|
||||||
return PageUtil.redefineNavigation(new PageInfo<>(result, size));
|
// 키워드 필터링 적용
|
||||||
|
List<MapDto> filtered = filterPostsByKeyword(result, keyword);
|
||||||
|
|
||||||
|
// 원하는 페이지만 잘라서 리턴
|
||||||
|
int fromIndex = (page - 1) * size;
|
||||||
|
int toIndex = Math.min(fromIndex + size, filtered.size());
|
||||||
|
List<MapDto> pageList = fromIndex >= filtered.size() ? new ArrayList<>() : filtered.subList(fromIndex, toIndex);
|
||||||
|
|
||||||
|
PageInfo<MapDto> pageInfo = new PageInfo<>(pageList);
|
||||||
|
pageInfo.setTotal(filtered.size());
|
||||||
|
|
||||||
|
return PageUtil.redefineNavigation(pageInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateIncrementViewCount(Long boardId) {
|
public void updateIncrementViewCount(Long boardId) {
|
||||||
@ -247,21 +266,21 @@ public class localbordService {
|
|||||||
// 대댓글이 없는 경우, 완전 삭제
|
// 대댓글이 없는 경우, 완전 삭제
|
||||||
boardMapper.deleteComment(commentId);
|
boardMapper.deleteComment(commentId);
|
||||||
}
|
}
|
||||||
checkAndDeleteParentComment(map);
|
// checkAndDeleteParentComment(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkAndDeleteParentComment(MapDto map) {
|
// private void checkAndDeleteParentComment(MapDto map) {
|
||||||
Long parentId = (Long) map.get("LOCCMTPNT");
|
// Long parentId = (Long) map.get("LOCCMTPNT");
|
||||||
if (parentId == null) return; // 부모가 없으면 종료
|
// if (parentId == null) return; // 부모가 없으면 종료
|
||||||
|
//
|
||||||
// 부모 댓글의 남아있는 대댓글 개수 확인
|
// // 부모 댓글의 남아있는 대댓글 개수 확인
|
||||||
int remainingReplies = boardMapper.selectReplyCount(parentId);
|
// int remainingReplies = boardMapper.selectReplyCount(parentId);
|
||||||
|
//
|
||||||
if (remainingReplies == 0) {
|
// if (remainingReplies == 0) {
|
||||||
// 남은 대댓글이 없으면 부모 댓글도 삭제
|
// // 남은 대댓글이 없으면 부모 댓글도 삭제
|
||||||
boardMapper.deleteComment(parentId);
|
// boardMapper.deleteComment(parentId);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
public String selectCommentPassword(int commentId) {
|
public String selectCommentPassword(int commentId) {
|
||||||
return boardMapper.selectCommentPassword(commentId);
|
return boardMapper.selectCommentPassword(commentId);
|
||||||
@ -314,15 +333,64 @@ public class localbordService {
|
|||||||
return null; // 이미지가 없는 경우
|
return null; // 이미지가 없는 경우
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean procIsValidJson(String json) {
|
public String extractPlainText(String deltaJson) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final ObjectMapper objectMapper = new ObjectMapper();
|
JsonNode root = mapper.readTree(deltaJson);
|
||||||
objectMapper.readTree(json); // JSON 파싱 시도
|
JsonNode ops = root.get("ops");
|
||||||
return true; // JSON이 유효하면 true 반환
|
|
||||||
} catch (Exception e) {
|
if (ops != null && ops.isArray()) {
|
||||||
return false; // 유효하지 않은 경우 false 반환
|
for (JsonNode op : ops) {
|
||||||
|
JsonNode insertNode = op.get("insert");
|
||||||
|
|
||||||
|
// insert가 문자열일 경우만 추출
|
||||||
|
if (insertNode != null && insertNode.isTextual()) {
|
||||||
|
String text = insertNode.asText();
|
||||||
|
if (!"\n".equals(text.trim())) { // 줄바꿈 제외
|
||||||
|
sb.append(text).append(" ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// insert가 객체면 image일 가능성 → 제외
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace(); // 실제 운영에서는 로깅 처리
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 검색어로 순수 텍스트 기준 게시글 필터링
|
||||||
|
*/
|
||||||
|
private List<MapDto> filterPostsByKeyword(List<MapDto> posts, String keyword) {
|
||||||
|
if (keyword == null || keyword.trim().isEmpty()) return posts;
|
||||||
|
|
||||||
|
keyword = keyword.trim();
|
||||||
|
|
||||||
|
List<MapDto> filtered = new ArrayList<>();
|
||||||
|
|
||||||
|
for (MapDto post : posts) {
|
||||||
|
String title = post.getString("title");
|
||||||
|
String author = post.getString("author");
|
||||||
|
String contentJson = BlobUtil.procBlobToString(post.get("content")); // Blob 처리
|
||||||
|
String plainText = extractPlainText(contentJson);
|
||||||
|
|
||||||
|
// 포함 여부 판단 (title, author, content 순수 텍스트)
|
||||||
|
if ((title != null && title.contains(keyword)) ||
|
||||||
|
(author != null && author.contains(keyword)) ||
|
||||||
|
plainText.contains(keyword)) {
|
||||||
|
|
||||||
|
post.put("content", contentJson); // content는 원래대로 복원
|
||||||
|
filtered.add(post);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void enrichBoardDetail(MapDto boardDetail) {
|
private void enrichBoardDetail(MapDto boardDetail) {
|
||||||
|
|||||||
@ -14,13 +14,6 @@
|
|||||||
FROM localbord b
|
FROM localbord b
|
||||||
LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ
|
LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ
|
||||||
WHERE LOCBRDTYP = '300103'
|
WHERE LOCBRDTYP = '300103'
|
||||||
<if test="searchKeyword != null and searchKeyword != ''">
|
|
||||||
AND (
|
|
||||||
LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
OR LOCBRDCON LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
OR MEMBERNAM LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
)
|
|
||||||
</if>
|
|
||||||
ORDER BY LOCBRDUDT DESC
|
ORDER BY LOCBRDUDT DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
@ -37,13 +30,6 @@
|
|||||||
FROM localbord b
|
FROM localbord b
|
||||||
LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ
|
LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ
|
||||||
WHERE b.LOCBRDTYP IN ('300101', '300102')
|
WHERE b.LOCBRDTYP IN ('300101', '300102')
|
||||||
<if test="searchKeyword != null and searchKeyword != ''">
|
|
||||||
AND (
|
|
||||||
LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
OR LOCBRDCON LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
OR MEMBERNAM LIKE CONCAT('%', #{searchKeyword}, '%')
|
|
||||||
)
|
|
||||||
</if>
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
<choose>
|
<choose>
|
||||||
<when test="orderBy == 'date'"> b.LOCBRDUDT DESC </when>
|
<when test="orderBy == 'date'"> b.LOCBRDUDT DESC </when>
|
||||||
@ -226,18 +212,34 @@
|
|||||||
<select id="selectReaction" resultType="io.company.localhost.common.dto.MapDto">
|
<select id="selectReaction" resultType="io.company.localhost.common.dto.MapDto">
|
||||||
SELECT LOCBRDSEQ, LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD
|
SELECT LOCBRDSEQ, LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD
|
||||||
FROM localgorb
|
FROM localgorb
|
||||||
WHERE (LOCBRDSEQ = #{LOCBRDSEQ} OR (#{LOCBRDSEQ} IS NULL AND LOCBRDSEQ IS NULL))
|
WHERE
|
||||||
AND (LOCCMTSEQ = #{LOCCMTSEQ} OR (#{LOCCMTSEQ} IS NULL AND LOCCMTSEQ IS NULL))
|
<choose>
|
||||||
AND MEMBERSEQ = #{MEMBERSEQ}
|
<when test="LOCCMTSEQ == null">
|
||||||
|
LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ IS NULL
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ = #{LOCCMTSEQ}
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
AND
|
||||||
|
MEMBERSEQ = #{MEMBERSEQ}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 반응 업데이트 -->
|
<!-- 반응 업데이트 -->
|
||||||
<update id="updateReaction">
|
<update id="updateReaction">
|
||||||
UPDATE localgorb
|
UPDATE localgorb
|
||||||
SET LOCGOBGOD = #{LOCGOBGOD}, LOCGOBBAD = #{LOCGOBBAD}
|
SET LOCGOBGOD = #{LOCGOBGOD}, LOCGOBBAD = #{LOCGOBBAD}
|
||||||
WHERE (LOCBRDSEQ = #{LOCBRDSEQ} OR (#{LOCBRDSEQ} IS NULL AND LOCBRDSEQ IS NULL))
|
WHERE
|
||||||
AND (LOCCMTSEQ = #{LOCCMTSEQ} OR (#{LOCCMTSEQ} IS NULL AND LOCCMTSEQ IS NULL))
|
<choose>
|
||||||
AND MEMBERSEQ = #{MEMBERSEQ}
|
<when test="LOCCMTSEQ == null">
|
||||||
|
LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ IS NULL
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ = #{LOCCMTSEQ}
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
AND
|
||||||
|
MEMBERSEQ = #{MEMBERSEQ}
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<update id="updateBoardIndexToFile">
|
<update id="updateBoardIndexToFile">
|
||||||
@ -368,7 +370,7 @@
|
|||||||
COALESCE(SUM(CASE WHEN LOCGOBGOD = 'T' THEN 1 ELSE 0 END), 0) AS likeCount,
|
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
|
COALESCE(SUM(CASE WHEN LOCGOBBAD = 'T' THEN 1 ELSE 0 END), 0) AS dislikeCount
|
||||||
FROM localgorb
|
FROM localgorb
|
||||||
WHERE LOCBRDSEQ = #{boardId};
|
WHERE LOCBRDSEQ = #{boardId} AND LOCCMTSEQ IS NULL;
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@ -76,6 +76,7 @@
|
|||||||
<choose>
|
<choose>
|
||||||
<when test='myVote == "1"' >
|
<when test='myVote == "1"' >
|
||||||
AND myvoted = 'Y'
|
AND myvoted = 'Y'
|
||||||
|
AND LOCVOTDEL IS NULL
|
||||||
</when>
|
</when>
|
||||||
</choose>
|
</choose>
|
||||||
</if>
|
</if>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user