검증게시판 기능 추가

This commit is contained in:
Macbook
2026-05-27 15:41:19 +09:00
parent 7a0af36b9b
commit 63693d47c0
57 changed files with 4480 additions and 14 deletions
@@ -0,0 +1,98 @@
package com.goldenchart.service;
import com.goldenchart.dto.VerificationIssueCommentDto;
import com.goldenchart.entity.GcVerificationIssueComment;
import com.goldenchart.repository.GcVerificationIssueCommentRepository;
import com.goldenchart.repository.GcVerificationIssueRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class VerificationIssueCommentService {
private final GcVerificationIssueCommentRepository commentRepository;
private final GcVerificationIssueRepository issueRepository;
public List<VerificationIssueCommentDto> listByIssue(Long issueId) {
return commentRepository.findByIssueIdOrderByCreatedAtAsc(issueId).stream()
.map(this::toDto)
.toList();
}
@Transactional
public VerificationIssueCommentDto create(
Long issueId,
VerificationIssueCommentDto dto,
Long userId,
String deviceId) {
if (!issueRepository.existsById(issueId)) {
throw new IllegalArgumentException("issue not found: " + issueId);
}
GcVerificationIssueComment entity = GcVerificationIssueComment.builder()
.issueId(issueId)
.content(requireContent(dto.getContent()))
.authorName(trimAuthor(dto.getAuthorName()))
.userId(userId)
.deviceId(deviceId)
.build();
return toDto(commentRepository.save(entity));
}
@Transactional
public Optional<VerificationIssueCommentDto> update(Long issueId, Long commentId, VerificationIssueCommentDto dto) {
return commentRepository.findById(commentId)
.filter(c -> issueId.equals(c.getIssueId()))
.map(c -> {
c.setContent(requireContent(dto.getContent()));
if (dto.getAuthorName() != null) {
c.setAuthorName(trimAuthor(dto.getAuthorName()));
}
return toDto(commentRepository.save(c));
});
}
@Transactional
public boolean delete(Long issueId, Long commentId) {
return commentRepository.findById(commentId)
.filter(c -> issueId.equals(c.getIssueId()))
.map(c -> {
commentRepository.delete(c);
return true;
})
.orElse(false);
}
private VerificationIssueCommentDto toDto(GcVerificationIssueComment e) {
return VerificationIssueCommentDto.builder()
.id(e.getId())
.issueId(e.getIssueId())
.content(e.getContent())
.authorName(e.getAuthorName())
.createdAt(e.getCreatedAt())
.updatedAt(e.getUpdatedAt())
.build();
}
private String trimContent(String content) {
if (content == null) return "";
return content.trim();
}
private String requireContent(String content) {
String trimmed = trimContent(content);
if (trimmed.isEmpty()) {
throw new IllegalArgumentException("comment content required");
}
return trimmed;
}
private String trimAuthor(String name) {
if (name == null || name.isBlank()) return null;
return name.trim();
}
}