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
Expand Up @@ -2,10 +2,10 @@

import com.ai.lawyer.domain.poll.dto.PollCreateDto;
import com.ai.lawyer.domain.poll.dto.PollDto;
import com.ai.lawyer.domain.poll.dto.PollStaticsResponseDto;
import com.ai.lawyer.domain.poll.dto.PollVoteDto;
import com.ai.lawyer.domain.poll.entity.PollVote;
import com.ai.lawyer.domain.poll.entity.PollOptions;
import com.ai.lawyer.domain.poll.entity.PollStatics;
import com.ai.lawyer.domain.poll.service.PollService;
import com.ai.lawyer.domain.post.dto.PostDetailDto;
import com.ai.lawyer.domain.post.service.PostService;
Expand Down Expand Up @@ -54,10 +54,10 @@ public ResponseEntity<ApiResponse<PollVoteDto>> vote(@PathVariable Long pollId,
return ResponseEntity.ok(new ApiResponse<>(200, "투표가 성공적으로 완료되었습니다.", result));
}

@Operation(summary = "투표 통계 조회")
@Operation(summary = "투표 통계 조회 (항목별 나이/성별 카운트)")
@GetMapping("/{pollId}/statics")
public ResponseEntity<ApiResponse<List<PollStatics>>> getPollStatics(@PathVariable Long pollId) {
List<PollStatics> statics = pollService.getPollStatics(pollId);
public ResponseEntity<ApiResponse<PollStaticsResponseDto>> getPollStatics(@PathVariable Long pollId) {
PollStaticsResponseDto statics = pollService.getPollStatics(pollId);
return ResponseEntity.ok(new ApiResponse<>(200, "투표 통계 조회 성공", statics));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ai.lawyer.domain.poll.dto;
import lombok.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PollAgeStaticsDto {
private Long pollItemsId;
private Integer pollOptionIndex;
private java.util.List<AgeGroupCountDto> ageGroupCounts;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class AgeGroupCountDto {
private String option;
private String ageGroup;
private Long voteCount;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.ai.lawyer.domain.poll.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PollForPostDto {
@Schema(description = "투표 제목", example = "당신의 선택은?")
private String voteTitle;
@Schema(description = "투표 항목(2개 필수)", example = "[{\"content\": \"항목1 내용\"}, {\"content\": \"항목2 내용\"}]")
private List<PollOptionCreateDto> pollOptions;
private LocalDateTime reservedCloseAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ai.lawyer.domain.poll.dto;
import lombok.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PollGenderStaticsDto {
private Long pollItemsId;
private Integer pollOptionIndex;
private java.util.List<GenderCountDto> genderCounts;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class GenderCountDto {
private String option;
private String gender;
private Long voteCount;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ai.lawyer.domain.poll.dto;

import lombok.*;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PollStaticsResponseDto {
private Long postId;
private Long pollId;
private List<PollAgeStaticsDto> optionAgeStatics;
private List<PollGenderStaticsDto> optionGenderStatics;
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@
public interface PollStaticsRepository extends JpaRepository<PollStatics, Long> {
List<PollStatics> findByPoll_PollId(Long pollId);
}

Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,29 @@ public interface PollVoteRepository extends JpaRepository<PollVote, Long> {
java.util.List<Object[]> countStaticsByPollOptionIds(@Param("pollOptionIds") java.util.List<Long> pollOptionIds);

boolean existsByPoll_PollIdAndMember_MemberId(Long pollId, Long memberId);

@Query(value = "SELECT po.option, m.gender, COUNT(*) FROM poll_vote pv JOIN poll_options po ON pv.poll_items_id = po.poll_items_id JOIN member m ON pv.member_id = m.member_id WHERE po.poll_id = :pollId GROUP BY po.option, m.gender", nativeQuery = true)
List<Object[]> getGenderOptionStatics(@Param("pollId") Long pollId);

@Query(value = "SELECT CASE WHEN m.age < 20 THEN '10대' WHEN m.age < 30 THEN '20대' " +
"WHEN m.age < 40 THEN '30대' WHEN m.age < 50 THEN '40대' WHEN m.age < 60 THEN '50대' " +
"WHEN m.age < 70 THEN '60대' WHEN m.age < 80 THEN '70대' ELSE '80대 이상' " +
"END AS ageGroup, m.gender, COUNT(*) FROM poll_vote pv JOIN member m ON pv.member_id = m.member_id JOIN poll_options po ON pv.poll_items_id = po.poll_items_id WHERE po.poll_id = :pollId GROUP BY ageGroup, m.gender", nativeQuery = true)
List<Object[]> getAgeGenderStatics(@Param("pollId") Long pollId);

@Query("SELECT o.option, " +
"CASE WHEN m.age < 20 THEN '10대' WHEN m.age < 30 THEN '20대' " +
"WHEN m.age < 40 THEN '30대' WHEN m.age < 50 THEN '40대' WHEN m.age < 60 THEN '50대' " +
"WHEN m.age < 70 THEN '60대' WHEN m.age < 80 THEN '70대' ELSE '80대 이상' END, " +
"COUNT(v) " +
"FROM PollVote v JOIN v.pollOptions o JOIN v.member m " +
"WHERE o.poll.pollId = :pollId " +
"GROUP BY o.option, " +
"CASE WHEN m.age < 20 THEN '10대' WHEN m.age < 30 THEN '20대' " +
"WHEN m.age < 40 THEN '30대' WHEN m.age < 50 THEN '40대' WHEN m.age < 60 THEN '50대' " +
"WHEN m.age < 70 THEN '60대' WHEN m.age < 80 THEN '70대' ELSE '80대 이상' END")
List<Object[]> getOptionAgeStatics(@Param("pollId") Long pollId);

@Query("SELECT o.option, m.gender, COUNT(v) FROM PollVote v JOIN v.pollOptions o JOIN v.member m WHERE o.poll.pollId = :pollId GROUP BY o.option, m.gender")
List<Object[]> getOptionGenderStatics(@Param("pollId") Long pollId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,36 @@
import com.ai.lawyer.domain.poll.entity.PollVote;
import com.ai.lawyer.domain.poll.entity.PollStatics;
import com.ai.lawyer.domain.poll.entity.PollOptions;
import com.ai.lawyer.domain.poll.dto.PollForPostDto;
import com.ai.lawyer.domain.poll.dto.PollStaticsResponseDto;

import java.util.List;

public interface PollService {
// ===== 조회 관련 =====
PollDto getPoll(Long pollId);
PollDto getPollWithStatistics(Long pollId);
List<PollOptions> getPollOptions(Long pollId);
PollVoteDto vote(Long pollId, Long pollItemsId, Long memberId);
List<PollStatics> getPollStatics(Long pollId);
void closePoll(Long pollId);
void deletePoll(Long pollId);
List<PollDto> getPollsByStatus(PollDto.PollStatus status);
PollDto getTopPollByStatus(PollDto.PollStatus status);
List<PollDto> getTopNPollsByStatus(PollDto.PollStatus status, int n);

// ===== 통계 관련 =====
PollStaticsResponseDto getPollStatics(Long pollId);
Long getVoteCountByPollId(Long pollId);
Long getVoteCountByPostId(Long postId);
PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto);
PollDto getPollWithStatistics(Long pollId);

// ===== 투표 관련 =====
PollVoteDto vote(Long pollId, Long pollItemsId, Long memberId);

// ===== 생성/수정/삭제 관련 =====
PollDto createPoll(PollCreateDto request, Long memberId);
PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto);
void patchUpdatePoll(Long pollId, PollUpdateDto pollUpdateDto);
List<PollDto> getPollsByStatus(PollDto.PollStatus status);
List<PollDto> getTopNPollsByStatus(PollDto.PollStatus status, int n);
void closePoll(Long pollId);
void deletePoll(Long pollId);

// ===== 검증 관련 =====
void validatePollCreate(PollCreateDto dto);
void validatePollCreate(PollForPostDto dto);
}
Loading