-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImmersiveVoteController.java
More file actions
79 lines (71 loc) · 4.33 KB
/
Copy pathImmersiveVoteController.java
File metadata and controls
79 lines (71 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.ject.vs.vote.adapter.web;
import com.ject.vs.config.AnonymousId;
import com.ject.vs.vote.adapter.web.dto.ImmersiveFeedResponse;
import com.ject.vs.vote.adapter.web.dto.ImmersiveLiveResponse;
import com.ject.vs.vote.adapter.web.dto.ImmersiveNextRequest;
import com.ject.vs.vote.adapter.web.dto.ImmersiveNextResponse;
import com.ject.vs.vote.adapter.web.dto.ImmersiveParticipateResponse;
import com.ject.vs.vote.adapter.web.dto.ParticipateRequest;
import com.ject.vs.vote.adapter.web.dto.ShareLinkResponse;
import com.ject.vs.vote.domain.VoteSortType;
import com.ject.vs.vote.port.in.ImmersiveVoteCommandUseCase;
import com.ject.vs.vote.port.in.ImmersiveVoteQueryUseCase;
import com.ject.vs.vote.port.in.VoteResultQueryUseCase;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
@Tag(name = "몰입형 투표", description = "몰입형 투표 피드 관련 API")
@RestController
@RequestMapping("/api/immersive-votes")
@RequiredArgsConstructor
public class ImmersiveVoteController {
private final ImmersiveVoteCommandUseCase immersiveVoteCommandUseCase;
private final ImmersiveVoteQueryUseCase immersiveVoteQueryUseCase;
private final VoteResultQueryUseCase voteResultQueryUseCase;
@Operation(summary = "몰입형 투표 피드 조회", description = "스와이프 형식의 몰입형 투표 피드를 조회합니다. 커서 기반 페이지네이션을 지원합니다. startVoteId를 지정하면 해당 투표부터 피드가 시작됩니다.")
@GetMapping
public ImmersiveFeedResponse getFeed(
@RequestParam(required = false) Long cursor,
@RequestParam(required = false) Long startVoteId,
@RequestParam(defaultValue = "10") int size,
@AuthenticationPrincipal Long userId,
@Parameter(hidden = true) @AnonymousId String anonymousId) {
return ImmersiveFeedResponse.from(immersiveVoteQueryUseCase.getFeed(cursor, startVoteId, size, userId, anonymousId));
}
@Operation(summary = "투표 참여/취소", description = "투표에 참여하거나 같은 옵션 재클릭 시 취소합니다. 비회원은 5회까지 무료 투표 가능합니다.")
@PostMapping("/{voteId}/participate")
public ImmersiveParticipateResponse participateOrCancel(
@PathVariable Long voteId,
@AuthenticationPrincipal Long userId,
@Parameter(hidden = true) @AnonymousId String anonymousId,
@RequestBody @Valid ParticipateRequest request) {
ImmersiveVoteCommandUseCase.ImmersiveParticipateResult result =
immersiveVoteCommandUseCase.participateOrCancel(voteId, userId, anonymousId, request.optionId());
return ImmersiveParticipateResponse.from(result);
}
@Operation(summary = "실시간 투표 현황 조회", description = "투표 후 실시간 비율 갱신을 위한 폴링 API입니다.")
@GetMapping("/{voteId}/live")
public ImmersiveLiveResponse getLive(@PathVariable Long voteId) {
return ImmersiveLiveResponse.from(immersiveVoteQueryUseCase.getLive(voteId));
}
@Operation(summary = "공유 링크 생성", description = "투표 공유를 위한 링크를 생성합니다.")
@GetMapping("/{voteId}/share")
public ShareLinkResponse getShareLink(@PathVariable Long voteId) {
return ShareLinkResponse.from(voteResultQueryUseCase.getShareLink(voteId));
}
@Operation(summary = "랜덤 다음 투표 조회", description = "excludeIds를 제외한 진행 중인 투표를 랜덤으로 조회합니다. 모든 투표 소진 시 빈 배열 반환 → 클라이언트에서 excludeIds 초기화 후 재요청 (무한 순환)")
@PostMapping("/next")
public ImmersiveNextResponse getNextRandom(
@RequestBody @Valid ImmersiveNextRequest request,
@AuthenticationPrincipal Long userId,
@Parameter(hidden = true) @AnonymousId String anonymousId) {
return ImmersiveNextResponse.from(
immersiveVoteQueryUseCase.getNextRandom(request.excludeIds(), request.size(), userId, anonymousId)
);
}
}