Skip to content

Commit

Permalink
[diary] tags in diray preivew
Browse files Browse the repository at this point in the history
  • Loading branch information
Noverish committed May 19, 2024
1 parent 3d2cad3 commit 63de2ac
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,23 @@ package kim.hyunsub.diary.bo
import kim.hyunsub.common.fs.client.FriendServiceClient
import kim.hyunsub.common.model.ApiPageResult
import kim.hyunsub.diary.model.api.ApiDiaryPreview
import kim.hyunsub.diary.model.api.toApiPreview
import kim.hyunsub.diary.model.api.ApiDiaryTag
import kim.hyunsub.diary.model.dto.DiarySearchParams
import kim.hyunsub.diary.repository.condition.DiaryCondition
import kim.hyunsub.diary.repository.condition.DiaryTagMappingDetailCondition
import kim.hyunsub.diary.repository.entity.Diary
import kim.hyunsub.diary.repository.entity.DiaryTagMappingDetail
import kim.hyunsub.diary.repository.mapper.DiaryMapper
import kim.hyunsub.diary.repository.mapper.DiaryTagMappingDetailMapper
import kim.hyunsub.friend.model.api.ApiMeetFriendSearchParams
import kim.hyunsub.friend.model.api.ApiMeetFriendSearchResult
import org.springframework.data.domain.PageRequest
import org.springframework.stereotype.Service

@Service
class DiarySearchBo(
private val diaryMapper: DiaryMapper,
private val diaryTagMappingDetailMapper: DiaryTagMappingDetailMapper,
private val friendServiceClient: FriendServiceClient,
) {
fun search(userId: String, token: String, params: DiarySearchParams): ApiPageResult<ApiDiaryPreview> {
Expand All @@ -28,17 +34,39 @@ class DiarySearchBo(
val total = diaryMapper.count(condition)
val data = diaryMapper.select(condition)

val resultDates = data.map { it.date }
val dateFriendsMap = friendServiceClient.searchMeetFriends(token, ApiMeetFriendSearchParams(resultDates))
.associate { it.date to it.friends }
val dates = data.map { it.date }
val meets = friendServiceClient.searchMeetFriends(token, ApiMeetFriendSearchParams(dates = dates))
val tags = diaryTagMappingDetailMapper.select(DiaryTagMappingDetailCondition(userId = userId, dates = dates))

return ApiPageResult(
total = total,
page = page.pageNumber,
pageSize = page.pageSize,
data = data.map {
it.toApiPreview(dateFriendsMap[it.date] ?: emptyList())
},
data = combine(data, meets, tags),
)
}

private fun combine(
diaries: List<Diary>,
meets: List<ApiMeetFriendSearchResult>,
tags: List<DiaryTagMappingDetail>,
): List<ApiDiaryPreview> {
val meetMap = meets.associate { it.date to it.friends }
val tagMap = tags.groupBy { it.date }

return diaries.map { diary ->
ApiDiaryPreview(
date = diary.date,
summary = diary.summary,
content = diary.content,
friends = meetMap[diary.date] ?: emptyList(),
tags = (tagMap[diary.date] ?: emptyList()).map {
ApiDiaryTag(
id = it.id,
name = it.name,
)
},
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package kim.hyunsub.diary.model.api

import kim.hyunsub.diary.repository.entity.Diary
import kim.hyunsub.friend.model.api.ApiFriendPreview
import java.time.LocalDate

Expand All @@ -9,11 +8,5 @@ data class ApiDiaryPreview(
val summary: String,
val content: String,
val friends: List<ApiFriendPreview>,
)

fun Diary.toApiPreview(friends: List<ApiFriendPreview>) = ApiDiaryPreview(
date = date,
summary = summary,
content = content,
friends = friends,
val tags: List<ApiDiaryTag>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ data class DiaryTagCondition(
val names: List<String>? = null,
val query: String? = null,
val date: LocalDate? = null,
val dates: List<LocalDate>? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package kim.hyunsub.diary.repository.condition

import java.time.LocalDate

data class DiaryTagMappingDetailCondition(
val userId: String,
val dates: List<LocalDate>? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kim.hyunsub.diary.repository.entity

import java.time.LocalDate

data class DiaryTagMappingDetail(
val id: String,
val date: LocalDate,
val userId: String,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kim.hyunsub.diary.repository.mapper

import kim.hyunsub.diary.repository.condition.DiaryTagMappingDetailCondition
import kim.hyunsub.diary.repository.entity.DiaryTagMappingDetail
import org.apache.ibatis.annotations.Mapper

@Mapper
interface DiaryTagMappingDetailMapper {
fun select(condition: DiaryTagMappingDetailCondition): List<DiaryTagMappingDetail>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="kim.hyunsub.diary.repository.mapper.DiaryTagMappingDetailMapper">
<sql id="DiaryTagMappingDetailColumns">
dtm.user_id,
dtm.date,
dtm.tag_id,
dt.name
</sql>

<sql id="DiaryTagMappingDetailCondition">
<where>
<if test="userId != null">AND dtm.user_id = #{userId}</if>
<if test="dates != null">
<if test="!dates.isEmpty()">AND dtm.date IN (<foreach collection="dates" item="v" separator=",">#{v}</foreach>)</if>
<if test="dates.isEmpty()">AND FALSE</if>
</if>
</where>
</sql>

<select id="select">
SELECT <include refid="DiaryTagMappingDetailColumns" />
FROM diary_tag_mapping dtm
INNER JOIN diary_tag dt ON dtm.tag_id = dt.id
<include refid="DiaryTagMappingDetailCondition" />
</select>
</mapper>

0 comments on commit 63de2ac

Please sign in to comment.