Skip to content

Commit 3a08ec7

Browse files
authored
Merge pull request #124 from soma-baekgu/feature/BG-415-retrieve-reaction-event-comment
[BG-415]: 리액션 이벤트 응답 조회 (3h / 3h)
2 parents f30bc42 + 80c9b0b commit 3a08ec7

File tree

9 files changed

+175
-0
lines changed

9 files changed

+175
-0
lines changed

api/src/main/kotlin/com/backgu/amaker/api/event/controller/EventCommentController.kt

+14
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.backgu.amaker.api.event.controller
33
import com.backgu.amaker.api.event.dto.query.ReplyQueryRequest
44
import com.backgu.amaker.api.event.dto.request.ReactionCommentCreateRequest
55
import com.backgu.amaker.api.event.dto.request.ReplyCommentCreateRequest
6+
import com.backgu.amaker.api.event.dto.response.ReactionOptionWithCommentResponse
67
import com.backgu.amaker.api.event.dto.response.ReplyCommentWithUserResponse
78
import com.backgu.amaker.api.event.dto.response.ReplyCommentsViewResponse
89
import com.backgu.amaker.api.event.service.EventCommentFacadeService
@@ -55,6 +56,19 @@ class EventCommentController(
5556
)
5657
}
5758

59+
@GetMapping("/events/{event-id}/reaction/comments")
60+
override fun findReactionComments(
61+
@AuthenticationPrincipal token: JwtAuthentication,
62+
@PathVariable("event-id") eventId: Long,
63+
): ResponseEntity<ApiResult<List<ReactionOptionWithCommentResponse>>> =
64+
ResponseEntity.ok(
65+
apiHandler.onSuccess(
66+
eventCommentFacadeService
67+
.findReactionComment(token.id, eventId)
68+
.map { ReactionOptionWithCommentResponse.of(it) },
69+
),
70+
)
71+
5872
@PostMapping("/events/{event-id}/reply/comments")
5973
override fun createReplyComment(
6074
@AuthenticationPrincipal token: JwtAuthentication,

api/src/main/kotlin/com/backgu/amaker/api/event/controller/EventCommentSwagger.kt

+17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.backgu.amaker.api.event.controller
33
import com.backgu.amaker.api.event.dto.query.ReplyQueryRequest
44
import com.backgu.amaker.api.event.dto.request.ReactionCommentCreateRequest
55
import com.backgu.amaker.api.event.dto.request.ReplyCommentCreateRequest
6+
import com.backgu.amaker.api.event.dto.response.ReactionOptionWithCommentResponse
67
import com.backgu.amaker.api.event.dto.response.ReplyCommentWithUserResponse
78
import com.backgu.amaker.common.http.response.ApiResult
89
import com.backgu.amaker.common.http.response.PageResponse
@@ -12,6 +13,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse
1213
import io.swagger.v3.oas.annotations.responses.ApiResponses
1314
import io.swagger.v3.oas.annotations.tags.Tag
1415
import org.springframework.http.ResponseEntity
16+
import org.springframework.security.core.annotation.AuthenticationPrincipal
17+
import org.springframework.web.bind.annotation.PathVariable
1518

1619
@Tag(name = "eventComment", description = "이벤트 응답 API")
1720
interface EventCommentSwagger {
@@ -30,6 +33,20 @@ interface EventCommentSwagger {
3033
replyQueryRequest: ReplyQueryRequest,
3134
): ResponseEntity<ApiResult<PageResponse<ReplyCommentWithUserResponse>>>
3235

36+
@Operation(summary = "reaction 이벤트 응답 조회", description = "reaction 이벤트 응답 조회합니다.")
37+
@ApiResponses(
38+
value = [
39+
ApiResponse(
40+
responseCode = "200",
41+
description = "reaction 이벤트 응답 조회 성공",
42+
),
43+
],
44+
)
45+
fun findReactionComments(
46+
@AuthenticationPrincipal token: JwtAuthentication,
47+
@PathVariable("event-id") eventId: Long,
48+
): ResponseEntity<ApiResult<List<ReactionOptionWithCommentResponse>>>
49+
3350
@Operation(summary = "reply 이벤트 응답 생성", description = "reply 이벤트 응답 생성합니다.")
3451
@ApiResponses(
3552
value = [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.backgu.amaker.api.event.dto
2+
3+
import com.backgu.amaker.api.user.dto.UserDto
4+
import com.backgu.amaker.domain.event.ReactionComment
5+
import com.backgu.amaker.domain.user.User
6+
import java.time.LocalDateTime
7+
8+
data class ReactionCommentWithUserDto(
9+
val id: Long,
10+
val eventId: Long,
11+
val createdAt: LocalDateTime = LocalDateTime.now(),
12+
val updatedAt: LocalDateTime = LocalDateTime.now(),
13+
val userDto: UserDto,
14+
) {
15+
companion object {
16+
fun of(
17+
reactionComment: ReactionComment,
18+
user: User,
19+
) = ReactionCommentWithUserDto(
20+
id = reactionComment.id,
21+
eventId = reactionComment.eventId,
22+
createdAt = reactionComment.createdAt,
23+
updatedAt = reactionComment.updatedAt,
24+
userDto = UserDto.of(user),
25+
)
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.backgu.amaker.api.event.dto
2+
3+
import com.backgu.amaker.common.exception.BusinessException
4+
import com.backgu.amaker.common.status.StatusCode
5+
import com.backgu.amaker.domain.event.ReactionComment
6+
import com.backgu.amaker.domain.event.ReactionOption
7+
import com.backgu.amaker.domain.user.User
8+
9+
data class ReactionOptionWithCommentDto(
10+
val id: Long,
11+
val eventId: Long,
12+
val content: String,
13+
val comments: List<ReactionCommentWithUserDto>,
14+
) {
15+
companion object {
16+
fun of(
17+
reactionOption: ReactionOption,
18+
reactionComment: List<ReactionComment>,
19+
userMap: Map<String, User>,
20+
) = ReactionOptionWithCommentDto(
21+
id = reactionOption.id,
22+
eventId = reactionOption.eventId,
23+
content = reactionOption.content,
24+
comments =
25+
reactionComment.map {
26+
ReactionCommentWithUserDto.of(
27+
it,
28+
userMap[it.userId] ?: throw BusinessException(StatusCode.USER_NOT_FOUND),
29+
)
30+
},
31+
)
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.backgu.amaker.api.event.dto.response
2+
3+
import com.backgu.amaker.api.event.dto.ReactionCommentWithUserDto
4+
import com.backgu.amaker.api.user.dto.response.UserResponse
5+
import io.swagger.v3.oas.annotations.media.Schema
6+
import java.time.LocalDateTime
7+
8+
data class ReactionCommentWithUserResponse(
9+
@Schema(description = "리액션 응답 id", example = "1")
10+
val id: Long,
11+
@Schema(description = "생성 시간", example = "2024-07-02T19:56:05.624+09:00")
12+
val createdAt: LocalDateTime = LocalDateTime.now(),
13+
@Schema(description = "수정 시간", example = "2024-07-02T19:56:05.624+09:00")
14+
val updatedAt: LocalDateTime = LocalDateTime.now(),
15+
val userDto: UserResponse,
16+
) {
17+
companion object {
18+
fun of(reactionComment: ReactionCommentWithUserDto) =
19+
ReactionCommentWithUserResponse(
20+
id = reactionComment.id,
21+
createdAt = reactionComment.createdAt,
22+
updatedAt = reactionComment.updatedAt,
23+
userDto = UserResponse.of(reactionComment.userDto),
24+
)
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.backgu.amaker.api.event.dto.response
2+
3+
import com.backgu.amaker.api.event.dto.ReactionOptionWithCommentDto
4+
import io.swagger.v3.oas.annotations.media.Schema
5+
6+
data class ReactionOptionWithCommentResponse(
7+
@Schema(description = "리액션 응답 옵션 id", example = "1")
8+
val id: Long,
9+
@Schema(description = "이벤트 id", example = "2")
10+
val eventId: Long,
11+
@Schema(description = "응답 내용", example = "좋네용!")
12+
val content: String,
13+
val comments: List<ReactionCommentWithUserResponse>,
14+
) {
15+
companion object {
16+
fun of(reactionOptionWithComment: ReactionOptionWithCommentDto) =
17+
ReactionOptionWithCommentResponse(
18+
id = reactionOptionWithComment.id,
19+
eventId = reactionOptionWithComment.eventId,
20+
content = reactionOptionWithComment.content,
21+
comments = reactionOptionWithComment.comments.map { ReactionCommentWithUserResponse.of(it) },
22+
)
23+
}
24+
}

api/src/main/kotlin/com/backgu/amaker/api/event/service/EventCommentFacadeService.kt

+28
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.backgu.amaker.api.event.service
22

33
import com.backgu.amaker.api.event.dto.ReactionCommentCreateDto
44
import com.backgu.amaker.api.event.dto.ReactionCommentDto
5+
import com.backgu.amaker.api.event.dto.ReactionOptionWithCommentDto
56
import com.backgu.amaker.api.event.dto.ReplyCommentCreateDto
67
import com.backgu.amaker.api.event.dto.ReplyCommentDto
78
import com.backgu.amaker.api.event.dto.ReplyCommentWithUserDto
@@ -16,6 +17,8 @@ import com.backgu.amaker.application.user.service.UserService
1617
import com.backgu.amaker.application.workspace.WorkspaceUserService
1718
import com.backgu.amaker.common.exception.BusinessException
1819
import com.backgu.amaker.common.status.StatusCode
20+
import com.backgu.amaker.domain.event.ReactionComment
21+
import com.backgu.amaker.domain.user.User
1922
import org.springframework.context.ApplicationEventPublisher
2023
import org.springframework.data.domain.Page
2124
import org.springframework.data.domain.Pageable
@@ -101,4 +104,29 @@ class EventCommentFacadeService(
101104
)
102105
}
103106
}
107+
108+
fun findReactionComment(
109+
userId: String,
110+
eventId: Long,
111+
): List<ReactionOptionWithCommentDto> {
112+
workspaceUserService.validByUserIdAndChatIdInWorkspace(userId, eventId)
113+
val reactionOptions = reactionOptionService.getAllByEventId(eventId)
114+
val reactionCommentGroupByOption: Map<Long, List<ReactionComment>> =
115+
reactionCommentService.findAllByEventIdGroupByReactionOptions(eventId)
116+
val userMap: Map<String, User> =
117+
userService.findAllByUserIdsToMap(
118+
reactionCommentGroupByOption.flatMap {
119+
it.value.map { it.userId }.toList()
120+
},
121+
)
122+
123+
return reactionOptions.map {
124+
ReactionOptionWithCommentDto.of(
125+
it,
126+
reactionCommentGroupByOption[it.id]
127+
?: emptyList(),
128+
userMap,
129+
)
130+
}
131+
}
104132
}

infra/src/main/kotlin/com/backgu/amaker/application/event/service/ReactionCommentService.kt

+4
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,8 @@ class ReactionCommentService(
2121
event: ReactionEvent,
2222
user: User,
2323
): ReactionComment? = reactionCommentRepository.findByEventIdAndUserId(event.id, user.id)?.toDomain()
24+
25+
fun findAllByEventIdGroupByReactionOptions(eventId: Long): Map<Long, List<ReactionComment>> {
26+
return reactionCommentRepository.findByEventId(eventId).map { it.toDomain() }.groupBy { it.optionId }
27+
}
2428
}

infra/src/main/kotlin/com/backgu/amaker/infra/jpa/event/repository/ReactionCommentRepository.kt

+2
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ interface ReactionCommentRepository : JpaRepository<ReactionCommentEntity, Long>
88
eventId: Long,
99
userId: String,
1010
): ReactionCommentEntity?
11+
12+
fun findByEventId(eventId: Long): List<ReactionCommentEntity>
1113
}

0 commit comments

Comments
 (0)