Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ public class Poll {
@Column(name = "created_at", nullable = false)
private LocalDateTime createdAt;

@Column(name = "updated_at")
private LocalDateTime updatedAt;

@Column(name = "closed_at")
private LocalDateTime closedAt;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ public PollDto createPoll(PollCreateDto request, Long memberId) {
.voteTitle(request.getVoteTitle())
.status(Poll.PollStatus.ONGOING)
.createdAt(now)
.updatedAt(now)
.reservedCloseAt(request.getReservedCloseAt())
.build();
Poll savedPoll = pollRepository.save(poll);
Expand Down Expand Up @@ -371,10 +372,10 @@ public PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto, Long memberI
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 최대 7일 이내여야 합니다.");
}
poll.setReservedCloseAt(reservedCloseAt);
System.out.println("poll에 저장된 reservedCloseAt 값: " + poll.getReservedCloseAt());
}
Poll updated = pollRepository.save(poll);
return convertToDto(updated, null, false);
poll.setUpdatedAt(now); // 투표(Poll) 수정 시 updatedAt 갱신
pollRepository.save(poll);
return getPoll(pollId, memberId);
}

@Override
Expand Down Expand Up @@ -429,7 +430,6 @@ public void patchUpdatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 최대 7일 이내여야 합니다.");
}
poll.setReservedCloseAt(reservedCloseAt);
System.out.println("poll에 저장된 reservedCloseAt 값: " + poll.getReservedCloseAt());
}
pollRepository.save(poll);
}
Expand Down Expand Up @@ -485,7 +485,6 @@ private PollDto convertToDto(Poll poll, Long memberId, boolean withStatistics) {
.createdAt(poll.getCreatedAt())
.closedAt(poll.getClosedAt())
.expectedCloseAt(expectedCloseAt)
.pollOptions(optionDtos)
.totalVoteCount(totalVoteCount)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.ai.lawyer.domain.post.controller;

import com.ai.lawyer.domain.poll.dto.PollDto;
import com.ai.lawyer.domain.poll.dto.PollDto.PollStatus;
import com.ai.lawyer.domain.post.dto.*;
import com.ai.lawyer.domain.post.service.PostService;
import com.ai.lawyer.domain.poll.dto.PollDto;
import com.ai.lawyer.domain.member.repositories.MemberRepository;
import com.ai.lawyer.global.jwt.TokenProvider;
import com.ai.lawyer.global.response.ApiResponse;
Expand All @@ -23,6 +23,9 @@

import java.util.List;

import static com.ai.lawyer.domain.poll.entity.Poll.PollStatus.CLOSED;
import static com.ai.lawyer.domain.poll.entity.Poll.PollStatus.ONGOING;

@Tag(name = "Post API", description = "게시글 관련 API")
@RestController
@RequestMapping("/api/posts")
Expand Down Expand Up @@ -126,13 +129,17 @@ public ResponseEntity<ApiResponse<PostDto>> getMyPostById(@PathVariable Long pos
return ResponseEntity.ok(new ApiResponse<>(200, "본인 게시글 단일 조회 성공", postDto));
}

@Operation(summary = "본인 게시글 전체 조회")
@GetMapping("/my")
public ResponseEntity<ApiResponse<List<PostDto>>> getMyPosts() {
Long memberId = AuthUtil.getAuthenticatedMemberId();
List<PostDto> posts = postService.getMyPosts(memberId);
return ResponseEntity.ok(new ApiResponse<>(200, "본인 게시글 전체 조회 성공", posts));
}
@Operation(summary = "본인 게시글 전체 조회")
@GetMapping("/my")
public ResponseEntity<ApiResponse<Page<PostDto>>> getMyPosts(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, org.springframework.data.domain.Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getAuthenticatedMemberId();
Page<PostDto> response = postService.getMyPosts(pageable, memberId);
return ResponseEntity.ok(new ApiResponse<>(200, "본인 게시글 전체 조회 성공", response));
}

@Operation(summary = "게시글+투표 동시 등록")
@PostMapping("/createPost")
Expand All @@ -148,13 +155,10 @@ public ResponseEntity<ApiResponse<PostPageDto>> getPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getCurrentMemberId();
Page<PostDto> posts = postService.getPostsPaged(pageable, memberId);
if (posts == null) {
posts = new org.springframework.data.domain.PageImpl<>(java.util.Collections.emptyList(), pageable, 0);
}
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "페이징 게시글 조회 성공", response));
}

Expand All @@ -164,13 +168,10 @@ public ResponseEntity<ApiResponse<PostPageDto>> getOngoingPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getCurrentMemberId();
Page<PostDto> posts = postService.getOngoingPostsPaged(pageable, memberId);
if (posts == null) {
posts = new org.springframework.data.domain.PageImpl<>(java.util.Collections.emptyList(), pageable, 0);
}
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getOngoingPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "진행중 투표 게시글 페이징 조회 성공", response));
}

Expand All @@ -180,21 +181,19 @@ public ResponseEntity<ApiResponse<PostPageDto>> getClosedPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getCurrentMemberId();
Page<PostDto> posts = postService.getClosedPostsPaged(pageable, memberId);
if (posts == null) {
posts = new org.springframework.data.domain.PageImpl<>(java.util.Collections.emptyList(), pageable, 0);
}
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getClosedPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "마감된 투표 게시글 페이징 조회 성공", response));
}

@Operation(summary = "진행중인 투표 Top N 조회")
@GetMapping("/top/ongoingList")
public ResponseEntity<ApiResponse<List<PostDto>>> getTopNOngoingPolls(@RequestParam(defaultValue = "3") int size) {
Long memberId = AuthUtil.getCurrentMemberId();
List<PostDto> posts = postService.getTopNPollsByStatus(PollDto.PollStatus.ONGOING, size, memberId);
List<PostDto> posts = postService.getTopNPollsByStatus(
PollStatus.valueOf(ONGOING.name()), size, memberId);
String message = String.format("진행중인 투표 Top %d 조회 성공", size);
return ResponseEntity.ok(new ApiResponse<>(200, message, posts));
}
Expand All @@ -203,7 +202,8 @@ public ResponseEntity<ApiResponse<List<PostDto>>> getTopNOngoingPolls(@RequestPa
@GetMapping("/top/closedList")
public ResponseEntity<ApiResponse<List<PostDto>>> getTopNClosedPolls(@RequestParam(defaultValue = "3") int size) {
Long memberId = AuthUtil.getCurrentMemberId();
List<PostDto> posts = postService.getTopNPollsByStatus(PollDto.PollStatus.CLOSED, size, memberId);
List<PostDto> posts = postService.getTopNPollsByStatus(
PollStatus.valueOf(CLOSED.name()), size, memberId);
String message = String.format("종료된 투표 Top %d 조회 성공", size);
return ResponseEntity.ok(new ApiResponse<>(200, message, posts));
}
Expand All @@ -212,15 +212,17 @@ public ResponseEntity<ApiResponse<List<PostDto>>> getTopNClosedPolls(@RequestPar
@GetMapping("/top/ongoing")
public ResponseEntity<ApiResponse<PostDto>> getTopOngoingPoll() {
Long memberId = AuthUtil.getCurrentMemberId();
PostDto post = postService.getTopPollByStatus(PollDto.PollStatus.ONGOING, memberId);
PostDto post = postService.getTopPollByStatus(
PollStatus.valueOf(ONGOING.name()), memberId);
return ResponseEntity.ok(new ApiResponse<>(200, "진행중인 투표 Top 1 조회 성공", post));
}

@Operation(summary = "마감된 투표 Top 1 조회")
@GetMapping("/top/closed")
public ResponseEntity<ApiResponse<PostDto>> getTopClosedPoll() {
Long memberId = AuthUtil.getCurrentMemberId();
PostDto post = postService.getTopPollByStatus(PollDto.PollStatus.CLOSED, memberId);
PostDto post = postService.getTopPollByStatus(
PollStatus.valueOf(CLOSED.name()), memberId);
return ResponseEntity.ok(new ApiResponse<>(200, "마감된 투표 Top 1 조회 성공", post));
}

Expand All @@ -230,10 +232,10 @@ public ResponseEntity<ApiResponse<PostPageDto>> getMyOngoingPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getAuthenticatedMemberId();
Page<PostDto> posts = postService.getMyOngoingPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getMyOngoingPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "내가 참여한 진행중 투표 게시글 페이징 조회 성공", response));
}

Expand All @@ -243,10 +245,10 @@ public ResponseEntity<ApiResponse<PostPageDto>> getMyClosedPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getAuthenticatedMemberId();
Page<PostDto> posts = postService.getMyClosedPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getMyClosedPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "내가 참여한 마감 투표 게시글 페이징 조회 성공", response));
}

Expand All @@ -256,10 +258,10 @@ public ResponseEntity<ApiResponse<PostPageDto>> getMyVotedPostsPaged(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
Pageable pageable = PageRequest.of(page, size, Sort.by("updatedAt").descending());
Long memberId = AuthUtil.getAuthenticatedMemberId();
Page<PostDto> posts = postService.getMyVotedPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(posts);
Page<PostDto> pageResult = postService.getMyVotedPostsPaged(pageable, memberId);
PostPageDto response = new PostPageDto(pageResult);
return ResponseEntity.ok(new ApiResponse<>(200, "내가 참여한 모든 투표 게시글 페이징 조회 성공", response));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ public class PostDto {
private String postContent;
private String category;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private PollDto poll;
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public class Post {
@Column(name = "created_at")
private LocalDateTime createdAt;

@Column(name = "updated_at")
private LocalDateTime updatedAt;

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "poll_id", foreignKey = @ForeignKey(name = "FK_POST_POLL"))
private Poll poll;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import com.ai.lawyer.domain.member.entity.Member;
import com.ai.lawyer.domain.post.entity.Post;
import com.ai.lawyer.domain.poll.entity.Poll.PollStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -21,4 +24,9 @@ public interface PostRepository extends JpaRepository<Post, Long> {
@Modifying
@Query("DELETE FROM Post p WHERE p.member.memberId = :memberId")
void deleteByMemberIdValue(@Param("memberId") Long memberId);

Page<Post> findByMember(Member member, Pageable pageable);
Page<Post> findByPoll_Status(PollStatus status, Pageable pageable);
Page<Post> findByPoll_StatusAndPoll_PollIdIn(PollStatus status, List<Long> pollIds, Pageable pageable);
Page<Post> findByPoll_PollIdIn(List<Long> pollIds, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.ai.lawyer.domain.post.dto.PostUpdateDto;
import com.ai.lawyer.domain.post.dto.PostWithPollCreateDto;
import com.ai.lawyer.domain.post.dto.PostSimpleDto;
import com.ai.lawyer.domain.poll.dto.PollDto;
import com.ai.lawyer.domain.poll.dto.PollDto.PollStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

Expand All @@ -30,7 +30,7 @@ public interface PostService {

// ===== 본인 게시글 관련 =====
PostDto getMyPostById(Long postId, Long requesterMemberId);
List<PostDto> getMyPosts(Long requesterMemberId);
Page<PostDto> getMyPosts(Pageable pageable, Long requesterMemberId);

// ===== 페이징 관련 =====
Page<PostDto> getPostsPaged(Pageable pageable, Long memberId);
Expand All @@ -41,6 +41,6 @@ public interface PostService {
Page<PostDto> getMyVotedPostsPaged(Pageable pageable, Long memberId);

// ===== 투표 Top 관련 =====
List<PostDto> getTopNPollsByStatus(PollDto.PollStatus status, int n, Long memberId);
PostDto getTopPollByStatus(PollDto.PollStatus status, Long memberId);
PostDto getTopPollByStatus(PollStatus status, Long memberId);
List<PostDto> getTopNPollsByStatus(PollStatus status, int n, Long memberId);
}
Loading