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 @@ -123,7 +123,7 @@ data class ArticleDetailResponse(
val files: List<String>?,

@Schema(description = "해당 게시글에 작성된 댓글 목록 (계층형)")
val comments: List<CommentResponse> = emptyList(),
val comments: List<CommentResponseWithIsMine> = emptyList(),

@Schema(description = "좋아요를 누른 게시글인지?", example = "true")
val isLiked: Boolean = false,
Expand All @@ -140,7 +140,7 @@ data class ArticleDetailResponse(
isLiked: Boolean = false,
isVerified: Boolean,
files: List<FileEntity>? = emptyList(),
comments: List<CommentResponse> = emptyList()
comments: List<CommentResponseWithIsMine> = emptyList()
): ArticleDetailResponse {
return ArticleDetailResponse(
id = article.id!!,
Expand Down Expand Up @@ -237,3 +237,47 @@ data class ArticleLikeResponse(
}
}
}

data class CommentResponseWithIsMine(
@Schema(description = "댓글 아이디(PK)")
val id: Long,
@Schema(description = "댓글 본문")
val body: String,
@Schema(description = "작성자 정보")
val author: AuthorResponse? = null,
@Schema(description = "좋아요 개수")
val likeCount: Int = 0,
@Schema(description = "부모 댓글 Id")
val parentCommentId: Long? = null,
@Schema(description = "생성일시", example = "2024-12-02T21:48:14.929554")
val createdAt: LocalDateTime? = null,
@Schema(description = "수정일시", example = "2024-12-02T21:48:14.929554")
val lastModifiedAt: LocalDateTime? = null,
@Schema(description = "해당 댓글에 자식으로 포함된 댓글들")
var children: MutableList<CommentResponse> = mutableListOf(),
@Schema(description = "좋아요를 누른 댓글인지??", example = "true")
var isLiked: Boolean = false,
@Schema(description = "내 댓글 여부", example = "true")
val isMine: Boolean,
) {
companion object {
fun of(
comment: CommentResponse,
isMine: Boolean
): CommentResponseWithIsMine {
return CommentResponseWithIsMine(
id = comment.id,
body = comment.body,
author = comment.author,
likeCount = comment.likeCount,
parentCommentId = comment.parentCommentId,
createdAt = comment.createdAt,
lastModifiedAt = comment.lastModifiedAt,
children = comment.children,
isLiked = comment.isLiked,
isMine = isMine
)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.numberone.daepiro.domain.community.dto.response.ArticleLikeResponse
import com.numberone.daepiro.domain.community.dto.response.ArticleListResponse
import com.numberone.daepiro.domain.community.dto.response.ArticleSimpleResponse
import com.numberone.daepiro.domain.community.dto.response.CommentResponse
import com.numberone.daepiro.domain.community.dto.response.CommentResponseWithIsMine
import com.numberone.daepiro.domain.community.entity.Article
import com.numberone.daepiro.domain.community.entity.ReportedDocument
import com.numberone.daepiro.domain.community.event.ArticleAddressMappingEvent
Expand Down Expand Up @@ -184,11 +185,15 @@ class ArticleService(
return@let authorVerifiedAddressIds.contains(article.address?.id)
} ?: false



return ArticleDetailResponse.of(
article = article,
isLiked = isLikedArticle,
files = files,
comments = roots,
comments = roots.map {
CommentResponseWithIsMine.of(it, it.author?.userId == userId)
},
isVerified = isVerifiedAuthor,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.numberone.daepiro.domain.disasterSituation.dto.response

import com.numberone.daepiro.domain.community.entity.Comment
import com.numberone.daepiro.domain.user.entity.UserEntity
import com.numberone.daepiro.global.utils.SecurityContextUtils
import io.swagger.v3.oas.annotations.media.Schema
import org.springframework.data.annotation.LastModifiedDate
import java.time.LocalDateTime
Expand Down Expand Up @@ -50,8 +51,11 @@ data class SituationCommentResponse(
" }\n" +
" ]"
)
val childComments: List<SituationCommentResponse>
val childComments: List<SituationCommentResponse>,
) {
@Schema(description = "내 좋아요 여부", example = "true")
var isLiked: Boolean = false

companion object {
fun of(
comment: Comment,
Expand Down Expand Up @@ -80,7 +84,7 @@ data class SituationCommentResponse(
listOf(),
mapOf()
)
},
}
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ import com.numberone.daepiro.domain.disaster.entity.Disaster
import com.numberone.daepiro.domain.disasterSituation.dto.request.CreateSituationCommentRequest
import com.numberone.daepiro.domain.disasterSituation.dto.response.DisasterSituationResponse
import com.numberone.daepiro.domain.disasterSituation.dto.response.SituationCommentResponse
import com.numberone.daepiro.domain.user.repository.UserLikeRepository
import com.numberone.daepiro.domain.user.repository.UserRepository
import com.numberone.daepiro.domain.user.repository.findAllLikedCommentId
import com.numberone.daepiro.domain.user.repository.findByIdOrThrow
import com.numberone.daepiro.global.dto.ApiResult
import org.springframework.stereotype.Service
Expand All @@ -28,7 +30,8 @@ class DisasterSituationService(
private val addressRepository: AddressRepository,
private val userRepository: UserRepository,
private val commentRepository: CommentRepository,
private val userAddressVerifiedService: UserAddressVerifiedService
private val userAddressVerifiedService: UserAddressVerifiedService,
private val userLikeRepository: UserLikeRepository
) {
@Transactional
fun createDisasterSituation(disasters: List<Disaster>) {
Expand Down Expand Up @@ -66,7 +69,7 @@ class DisasterSituationService(
return ApiResult.ok(articles.map {
val commentEntities = commentRepository.findPopularComments(it.id!!)
val comments = commentEntities.map { comment ->
Pair(comment, listOf<Comment>())//todo 의미없이 pair를 썼음. 고쳐야함.
Pair(comment, listOf<Comment>())//todo 의미없이 pair를 썼음. 고쳐야함. 쩔수 없나.
}

DisasterSituationResponse.of(
Expand All @@ -92,19 +95,29 @@ class DisasterSituationService(
.map { Pair(it, commentRepository.findChildComments(it.id!!)) }
val article = articleRepository.findByIdOrThrow(situationId)

return ApiResult.ok(comments.map {
SituationCommentResponse.of(
it.first,
user,
userAddressVerifiedService.getVerifiedOne(user.id!!, article.address!!.id!!),
it.second,
it.second.associate {
it.id!! to userAddressVerifiedService.getVerifiedOne(
it.authUser!!.id!!,
article.address!!.id!!
)
}
)
})
val result = comments
.filter { !it.first.isDeleted() || it.second.isNotEmpty() }
.map {
SituationCommentResponse.of(
it.first,
user,
userAddressVerifiedService.getVerifiedOne(user.id!!, article.address!!.id!!),
it.second,
it.second.associate {
it.id!! to userAddressVerifiedService.getVerifiedOne(
it.authUser!!.id!!,
article.address!!.id!!
)
}
)
}
val likedCommentIdSet = userLikeRepository.findAllLikedCommentId(userId)
result.forEach {
it.isLiked = likedCommentIdSet.contains(it.id)
it.childComments.forEach { childComment ->
childComment.isLiked = likedCommentIdSet.contains(childComment.id)
}
}
return ApiResult.ok(result)
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/com/numberone/daepiro/domain/user/api/UserApiV1.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.numberone.daepiro.domain.user.api

import com.numberone.daepiro.domain.user.dto.request.OnboardingRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateFcmTokenRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateGpsRequest
import com.numberone.daepiro.domain.user.dto.response.CheckNicknameResponse
import com.numberone.daepiro.domain.user.dto.response.DisasterWithRegionResponse
Expand Down Expand Up @@ -59,4 +60,14 @@ interface UserApiV1 {
@DeleteMapping
@Operation(summary = "회원 탈퇴", description = "회원 탈퇴를 진행합니다.")
fun deleteUser(): ApiResult<Unit>

@PutMapping("/fcm")
@Operation(summary = "FCM 토큰 설정", description = "사용자의 FCM 토큰을 설정합니다.")
fun updateFcmToken(
@RequestBody @Valid request: UpdateFcmTokenRequest
): ApiResult<Unit>

@PutMapping("/logout")
@Operation(summary = "로그아웃", description = "로그아웃을 진행합니다.(FCM 토큰 삭제)")
fun logout(): ApiResult<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.numberone.daepiro.domain.user.controller

import com.numberone.daepiro.domain.user.api.UserApiV1
import com.numberone.daepiro.domain.user.dto.request.OnboardingRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateFcmTokenRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateGpsRequest
import com.numberone.daepiro.domain.user.dto.response.CheckNicknameResponse
import com.numberone.daepiro.domain.user.dto.response.DisasterWithRegionResponse
Expand Down Expand Up @@ -56,4 +57,19 @@ class UserController(
userService.deleteUser(SecurityContextUtils.getUserId())
return ApiResult.ok()
}

override fun updateFcmToken(request: UpdateFcmTokenRequest): ApiResult<Unit> {
userService.updateFcmToken(
request,
SecurityContextUtils.getUserId()
)
return ApiResult.ok()
}

override fun logout(): ApiResult<Unit> {
userService.logout(SecurityContextUtils.getUserId())
return ApiResult.ok()
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ data class OnboardingRequest(
)
val disasterTypes: List<String>,

@Schema(description = "FCM 토큰", example = "cT9YaTTeTEeGeohmih6qWf:APA91bGoybhRF2sB6JC7mPNaqJi3XjPhwbTyy91iexup7QDB_AXxI5lug_l-4o0y9T4uYKoysdf12Wde5X01fv-dqWck1kk33d4O5TN3oz_4nzuUVa2ffE3S9ELAcZm2a308W7NGD3Sc")
val fcmToken: String
@Schema(
description = "FCM 토큰(온보딩 시 설정 안 한다면 null 가능)",
example = "cT9YaTTeTEeGeohmih6qWf:APA91bGoybhRF2sB6JC7mPNaqJi3XjPhwbTyy91iexup7QDB_AXxI5lug_l-4o0y9T4uYKoysdf12Wde5X01fv-dqWck1kk33d4O5TN3oz_4nzuUVa2ffE3S9ELAcZm2a308W7NGD3Sc"
)
val fcmToken: String?
)

data class AddressRequest(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.numberone.daepiro.domain.user.dto.request

import io.swagger.v3.oas.annotations.media.Schema

data class UpdateFcmTokenRequest(
@Schema(description = "FCM 토큰", example = "cT9YaTTeTEeGeohmih6qWf:APA91bGoybhRF2sB6JC7mPNaqJi3XjPhwbTyy91iexup7QDB_AXxI5lug_l-4o0y9T4uYKoysdf12Wde5X01fv-dqWck1kk33d4O5TN3oz_4nzuUVa2ffE3S9ELAcZm2a308W7NGD3Sc")
val fcmToken: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class UserEntity(
val userDisasterTypes: List<UserDisasterType> = emptyList(),

@OneToMany(mappedBy = "user", cascade = [CascadeType.ALL])
val cheeringList : List<Cheering> = emptyList(),
val cheeringList: List<Cheering> = emptyList(),

var fcmToken: String? = null,
) : PrimaryKeyEntity() {
Expand All @@ -82,7 +82,7 @@ class UserEntity(
this.nickname = nickname
}

fun initFcmToken(fcmToken: String) {
fun initFcmToken(fcmToken: String?) {
this.fcmToken = fcmToken
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.numberone.daepiro.domain.disaster.repository.findByTypeOrThrow
import com.numberone.daepiro.domain.disaster.service.DisasterService
import com.numberone.daepiro.domain.user.dto.request.AddressRequest
import com.numberone.daepiro.domain.user.dto.request.OnboardingRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateFcmTokenRequest
import com.numberone.daepiro.domain.user.dto.request.UpdateGpsRequest
import com.numberone.daepiro.domain.user.dto.response.CheckNicknameResponse
import com.numberone.daepiro.domain.user.dto.response.DisasterWithRegionResponse
Expand Down Expand Up @@ -151,4 +152,14 @@ class UserService(
val user = userRepository.findByIdOrThrow(userId)
user.delete()
}

fun updateFcmToken(request: UpdateFcmTokenRequest, userId: Long) {
val user = userRepository.findByIdOrThrow(userId)
user.initFcmToken(request.fcmToken)
}

fun logout(userId: Long) {
val user = userRepository.findByIdOrThrow(userId)
user.initFcmToken(null)
}
}
Loading