Skip to content

Commit

Permalink
Merge branch 'main' into feat/socialLogin
Browse files Browse the repository at this point in the history
  • Loading branch information
jafacode authored Jan 22, 2025
2 parents b0217c7 + f65725d commit b42873c
Show file tree
Hide file tree
Showing 17 changed files with 168 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,21 @@ data class ChatRoom(
val article: Article,
val seller: User,
val buyer: User,
val createdAt: Instant,
val chatMessage: String,
val updatedAt: Instant,
) {
companion object {
fun fromEntity(entity: ChatRoomEntity): ChatRoom {
fun fromEntity(
entity: ChatRoomEntity,
chatMessage: String,
): ChatRoom {
return ChatRoom(
id = entity.id!!,
article = Article.fromEntity(entity.article),
seller = User.fromEntity(entity.seller),
buyer = User.fromEntity(entity.buyer),
createdAt = entity.createdAt,
chatMessage = chatMessage,
updatedAt = entity.updatedAt,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import java.time.Instant

@RestController
@RequestMapping("/api")
Expand All @@ -19,23 +21,24 @@ class ChatRoomController(
@GetMapping("/chat")
fun getRooms(
@AuthUser user: User,
@RequestParam("updatedAt") updatedAt: Instant,
): ResponseEntity<List<ChatRoom>> {
val chatRooms = chatRoomService.getChatRooms(user)
val chatRooms: List<ChatRoom> = chatRoomService.getChatRooms(user, updatedAt)
return ResponseEntity.ok(chatRooms)
}

@GetMapping("/chat/{chatRoomId}")
fun getRoom(
@PathVariable chatRoomId: Long,
@AuthUser user: User,
@RequestParam("createdAt") createdAt: Instant,
): ResponseEntity<List<ChatMessage>> {
val chatRoom = chatRoomService.getChatRoom(chatRoomId, user)
val chatRoom = chatRoomService.getChatRoom(chatRoomId, user, createdAt)
return ResponseEntity.ok(chatRoom)
}

@PostMapping("/chat/create")
fun createRoom(
@AuthUser user: User,
@RequestBody request: CreateChatRoomRequest,
): ResponseEntity<ChatRoom> {
val chatRoom = chatRoomService.createChatRoom(request.articleId, request.sellerId, request.buyerId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.toyProject7.karrot.chatRoom.persistence

import org.springframework.data.jpa.repository.JpaRepository
import java.time.Instant

interface ChatMessageRepository : JpaRepository<ChatMessageEntity, Long> {
fun findAllByChatRoomIdOrderByCreatedAtAsc(chatRoomId: Long): List<ChatMessageEntity>
fun findTop10ByChatRoomIdAndCreatedAtBeforeOrderByCreatedAtDesc(
chatRoomId: Long,
createdAt: Instant,
): List<ChatMessageEntity>

fun findTop1ByChatRoomIdOrderByCreatedAtDesc(chatRoomId: Long): ChatMessageEntity?
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ class ChatRoomEntity(
@ManyToOne
@JoinColumn(name = "buyer_id", nullable = false)
var buyer: UserEntity,
@Column(name = "created_at", nullable = false)
var createdAt: Instant = Instant.now(),
@Column(name = "updated_at", nullable = false)
var updatedAt: Instant = Instant.now(),
)
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.toyProject7.karrot.chatRoom.persistence

import org.springframework.data.jpa.repository.JpaRepository
import java.time.Instant

interface ChatRoomRepository : JpaRepository<ChatRoomEntity, Long> {
fun findAllBySellerIdOrBuyerIdOrderByCreatedAtDesc(
fun findTop10BySellerIdOrBuyerIdAndUpdatedAtBeforeOrderByUpdatedAtDesc(
sellerId: String,
buyerId: String,
updatedAt: Instant,
): List<ChatRoomEntity>
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,42 @@ class ChatRoomService(
createdAt = Instant.now(),
)
chatMessageRepository.save(chatMessageEntity)
chatRoomEntity.updatedAt = Instant.now()
return ChatMessage.fromEntity(chatMessageEntity)
}

@Transactional
fun getChatRooms(user: User): List<ChatRoom> {
val chatRoomEntities: List<ChatRoomEntity> = chatRoomRepository.findAllBySellerIdOrBuyerIdOrderByCreatedAtDesc(user.id, user.id)
return chatRoomEntities.map { chatRoomEntity -> ChatRoom.fromEntity(chatRoomEntity) }
fun getChatRooms(
user: User,
updatedAt: Instant,
): List<ChatRoom> {
val chatRoomEntities: List<ChatRoomEntity> =
chatRoomRepository.findTop10BySellerIdOrBuyerIdAndUpdatedAtBeforeOrderByUpdatedAtDesc(
sellerId = user.id,
buyerId = user.id,
updatedAt = updatedAt,
)
return chatRoomEntities.map { chatRoomEntity ->
val latestChatMessage = chatMessageRepository.findTop1ByChatRoomIdOrderByCreatedAtDesc(chatRoomEntity.id!!)?.content ?: ""
ChatRoom.fromEntity(chatRoomEntity, latestChatMessage)
}
}

@Transactional
fun getChatRoom(
chatRoomId: Long,
user: User,
createdAt: Instant,
): List<ChatMessage> {
val chatRoomEntity = chatRoomRepository.findById(chatRoomId).orElseThrow { ChatRoomNotFoundException() }
val chatRoom = ChatRoom.fromEntity(chatRoomEntity)
val chatRoom = ChatRoom.fromEntity(chatRoomEntity, "")
if (chatRoom.buyer != user && chatRoom.seller != user) throw ThisRoomIsNotYoursException()

val chatMessageEntities: List<ChatMessageEntity> = chatMessageRepository.findAllByChatRoomIdOrderByCreatedAtAsc(chatRoomId)
val chatMessageEntities: List<ChatMessageEntity> =
chatMessageRepository.findTop10ByChatRoomIdAndCreatedAtBeforeOrderByCreatedAtDesc(
chatRoomId = chatRoomId,
createdAt = createdAt,
)
return chatMessageEntities.map { chatMessageEntity -> ChatMessage.fromEntity(chatMessageEntity) }
}

Expand All @@ -72,9 +89,9 @@ class ChatRoomService(
article = articleEntity,
seller = sellerEntity,
buyer = buyerEntity,
createdAt = Instant.now(),
updatedAt = Instant.now(),
)
chatRoomRepository.save(chatRoomEntity)
return ChatRoom.fromEntity(chatRoomEntity)
return ChatRoom.fromEntity(chatRoomEntity, "")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ data class Comment(
val commentLikesCount: Int,
val createdAt: Instant,
val updatedAt: Instant,
var isLiked: Boolean = false,
) {
companion object {
fun fromEntity(entity: CommentEntity): Comment {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
package com.toyProject7.karrot.comment.controller

import com.toyProject7.karrot.comment.persistence.CommentRepository
import com.toyProject7.karrot.comment.service.CommentService
import com.toyProject7.karrot.feed.controller.FeedPreview
import com.toyProject7.karrot.feed.persistence.FeedEntity
import com.toyProject7.karrot.user.AuthUser
import com.toyProject7.karrot.user.controller.User
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api")
class CommentController(
private val commentService: CommentService,
private val commentRepository: CommentRepository,
) {
@PostMapping("/comment/post/{feedId}")
fun postComment(
Expand Down Expand Up @@ -63,6 +69,19 @@ class CommentController(
commentService.unlikeComment(commentId, user.id)
return ResponseEntity.ok("Unliked Successfully")
}

@GetMapping("/myfeed/comment")
fun getFeedsByUserComments(
@RequestParam("feedId") feedId: Long,
@AuthUser user: User,
): ResponseEntity<List<FeedPreview>> {
val feeds: List<FeedEntity> = commentService.getFeedsByUserComments(feedId, user.id)
val response =
feeds.map { feed ->
FeedPreview.fromEntity(feed)
}
return ResponseEntity.ok(response)
}
}

data class CommentRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,9 @@ package com.toyProject7.karrot.comment.persistence

import org.springframework.data.jpa.repository.JpaRepository

interface CommentLikesRepository : JpaRepository<CommentLikesEntity, String>
interface CommentLikesRepository : JpaRepository<CommentLikesEntity, String> {
fun existsByUserIdAndCommentId(
userId: String,
commentId: Long,
): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
package com.toyProject7.karrot.comment.persistence

import com.toyProject7.karrot.feed.persistence.FeedEntity
import com.toyProject7.karrot.user.persistence.UserEntity
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param

interface CommentRepository : JpaRepository<CommentEntity, Long>
interface CommentRepository : JpaRepository<CommentEntity, Long> {
@Query(
"""
SELECT DISTINCT c.feed
FROM comments c
WHERE c.user = :user AND c.feed.id < :feedId
ORDER BY c.feed.id DESC
""",
)
fun findFeedsByUserComments(
@Param("user") user: UserEntity,
@Param("feedId") feedId: Long,
): List<FeedEntity>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.toyProject7.karrot.comment.persistence.CommentEntity
import com.toyProject7.karrot.comment.persistence.CommentLikesEntity
import com.toyProject7.karrot.comment.persistence.CommentLikesRepository
import com.toyProject7.karrot.comment.persistence.CommentRepository
import com.toyProject7.karrot.feed.persistence.FeedEntity
import com.toyProject7.karrot.feed.service.FeedService
import com.toyProject7.karrot.user.service.UserService
import org.springframework.data.repository.findByIdOrNull
Expand Down Expand Up @@ -104,8 +105,26 @@ class CommentService(
commentLikesRepository.delete(toBeRemoved)
}

@Transactional
fun getFeedsByUserComments(
feedId: Long,
id: String,
): List<FeedEntity> {
val user = userService.getUserEntityById(id)
val feeds = commentRepository.findFeedsByUserComments(user, feedId)
return feeds
}

@Transactional
fun getCommentEntityById(commentId: Long): CommentEntity {
return commentRepository.findByIdOrNull(commentId) ?: throw CommentNotFoundException()
}

@Transactional
fun userLikesComment(
id: String,
commentId: Long,
): Boolean {
return commentLikesRepository.existsByUserIdAndCommentId(id, commentId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ data class Feed(
val createdAt: Instant,
val updatedAt: Instant,
val viewCount: Int,
var isLiked: Boolean = false,
) {
companion object {
fun fromEntity(entity: FeedEntity): Feed {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ class FeedController(
@GetMapping("/feed/get/{feedId}")
fun getFeed(
@PathVariable feedId: Long,
@AuthUser user: User,
): ResponseEntity<Feed> {
return ResponseEntity.ok(feedService.getFeed(feedId))
return ResponseEntity.ok(feedService.getFeed(feedId, user.id))
}

@GetMapping("/feed")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,23 @@ package com.toyProject7.karrot.feed.persistence

import com.toyProject7.karrot.user.persistence.UserEntity
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param

interface FeedLikesRepository : JpaRepository<FeedLikesEntity, String> {
fun findTop10ByUserAndFeedIdLessThanOrderByFeedIdDesc(
user: UserEntity,
feedId: Long,
): List<FeedLikesEntity>

fun existsByUserIdAndFeedId(
userId: String,
feedId: Long,
): Boolean

@Query("SELECT fe FROM feed_likes fe WHERE fe.user.id = :userId AND fe.feed.id = :feedId")
fun findByUserIdAndFeedId(
@Param("userId") userId: String,
@Param("feedId") feedId: Long,
): FeedLikesEntity?
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package com.toyProject7.karrot.feed.persistence

import com.toyProject7.karrot.user.persistence.UserEntity
import jakarta.persistence.LockModeType
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Lock
import org.springframework.data.jpa.repository.Modifying
import org.springframework.data.jpa.repository.Query

interface FeedRepository : JpaRepository<FeedEntity, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT r FROM feeds r WHERE r.id = :id")
fun findByIdWithWriteLock(id: Long): FeedEntity?

fun findTop10ByIdBeforeOrderByIdDesc(id: Long): List<FeedEntity>

fun findTop10ByAuthorAndIdLessThanOrderByIdDesc(
author: UserEntity,
id: Long,
): List<FeedEntity>

@Modifying
@Query("UPDATE feeds f SET f.viewCount = f.viewCount + 1 WHERE f.id = :id")
fun incrementViewCount(id: Long): Int
}
Loading

0 comments on commit b42873c

Please sign in to comment.