feat: allow closing posts

This commit is contained in:
Tim
2025-08-19 22:18:53 +08:00
parent 38a49f7414
commit 0fa08e2260
8 changed files with 111 additions and 2 deletions

View File

@@ -62,6 +62,16 @@ public class PostController {
postService.deletePost(id, auth.getName());
}
@PostMapping("/{id}/close")
public PostSummaryDto close(@PathVariable Long id, Authentication auth) {
return postMapper.toSummaryDto(postService.closePost(id, auth.getName()));
}
@PostMapping("/{id}/reopen")
public PostSummaryDto reopen(@PathVariable Long id, Authentication auth) {
return postMapper.toSummaryDto(postService.reopenPost(id, auth.getName()));
}
@GetMapping("/{id}")
public ResponseEntity<PostDetailDto> getPost(@PathVariable Long id, Authentication auth) {
String viewer = auth != null ? auth.getName() : null;

View File

@@ -32,5 +32,6 @@ public class PostSummaryDto {
private PostType type;
private LotteryDto lottery;
private boolean rssExcluded;
private boolean closed;
}

View File

@@ -64,6 +64,7 @@ public class PostMapper {
dto.setStatus(post.getStatus());
dto.setPinnedAt(post.getPinnedAt());
dto.setRssExcluded(post.getRssExcluded() == null || post.getRssExcluded());
dto.setClosed(post.isClosed());
List<ReactionDto> reactions = reactionService.getReactionsForPost(post.getId())
.stream()

View File

@@ -64,6 +64,9 @@ public class Post {
@Column(nullable = false)
private PostType type = PostType.NORMAL;
@Column(nullable = false)
private boolean closed = false;
@Column
private LocalDateTime pinnedAt;

View File

@@ -52,6 +52,9 @@ public class CommentService {
.orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));
Post post = postRepository.findById(postId)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
if (post.isClosed()) {
throw new IllegalStateException("Post closed");
}
Comment comment = new Comment();
comment.setAuthor(author);
comment.setPost(post);
@@ -94,6 +97,9 @@ public class CommentService {
.orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));
Comment parent = commentRepository.findById(parentId)
.orElseThrow(() -> new IllegalArgumentException("Comment not found"));
if (parent.getPost().isClosed()) {
throw new IllegalStateException("Post closed");
}
Comment comment = new Comment();
comment.setAuthor(author);
comment.setPost(parent.getPost());

View File

@@ -512,6 +512,30 @@ public class PostService {
return postRepository.save(post);
}
public Post closePost(Long id, String username) {
Post post = postRepository.findById(id)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));
if (!user.getId().equals(post.getAuthor().getId()) && user.getRole() != Role.ADMIN) {
throw new IllegalArgumentException("Unauthorized");
}
post.setClosed(true);
return postRepository.save(post);
}
public Post reopenPost(Long id, String username) {
Post post = postRepository.findById(id)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));
if (!user.getId().equals(post.getAuthor().getId()) && user.getRole() != Role.ADMIN) {
throw new IllegalArgumentException("Unauthorized");
}
post.setClosed(false);
return postRepository.save(post);
}
@org.springframework.transaction.annotation.Transactional
public Post updatePost(Long id,
String username,