Skip to content

Commit

Permalink
[diary] tag feature
Browse files Browse the repository at this point in the history
  • Loading branch information
Noverish committed May 19, 2024
1 parent f665344 commit 3d2cad3
Show file tree
Hide file tree
Showing 23 changed files with 400 additions and 116 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package kim.hyunsub.diary.bo

import kim.hyunsub.common.fs.client.FriendServiceClient
import kim.hyunsub.common.fs.client.PhotoServiceClient
import kim.hyunsub.common.model.ApiPageResult
import kim.hyunsub.common.model.LocalDateRange
import kim.hyunsub.diary.model.api.ApiDiary
import kim.hyunsub.diary.model.api.toApi
import kim.hyunsub.diary.model.dto.DiaryPhotoSearchParams
import kim.hyunsub.diary.repository.condition.DiaryTagCondition
import kim.hyunsub.diary.repository.mapper.DiaryMapper
import kim.hyunsub.diary.service.ApiDiaryService
import kim.hyunsub.diary.repository.mapper.DiaryTagMapper
import kim.hyunsub.photo.model.api.ApiPhotoPreview
import kim.hyunsub.photo.model.dto.PhotoSearchParams
import org.springframework.stereotype.Service
Expand All @@ -15,14 +18,37 @@ import java.time.LocalDate
@Service
class DiaryDetailBo(
private val diaryMapper: DiaryMapper,
private val diaryTagMapper: DiaryTagMapper,
private val photoServiceClient: PhotoServiceClient,
private val apiDiaryService: ApiDiaryService,
private val friendServiceClient: FriendServiceClient,
) {
fun detail(userId: String, token: String, date: LocalDate): ApiDiary? {
val diary = diaryMapper.selectOne(userId, date)
?: return null

return apiDiaryService.detail(token, diary)
val friends = friendServiceClient.selectMeetFriends(token, date)

val photoParams = PhotoSearchParams(
pageSize = 6,
asc = true,
dateRange = LocalDateRange(
start = date,
end = date,
),
)
val photoResult = photoServiceClient.searchPhoto(token, photoParams)

val tags = diaryTagMapper.select(DiaryTagCondition(userId = userId, date = date))

return ApiDiary(
date = date,
summary = diary.summary,
content = diary.content,
friends = friends,
photoNum = photoResult.total,
photos = photoResult.data,
tags = tags.map { it.toApi() },
)
}

fun photos(token: String, date: LocalDate, params: DiaryPhotoSearchParams): ApiPageResult<ApiPhotoPreview> {
Expand Down
53 changes: 14 additions & 39 deletions hyunsub-diary/src/main/kotlin/kim/hyunsub/diary/bo/DiaryMutateBo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ package kim.hyunsub.diary.bo
import kim.hyunsub.common.fs.client.FriendServiceClient
import kim.hyunsub.common.web.error.ErrorCode
import kim.hyunsub.common.web.error.ErrorCodeException
import kim.hyunsub.diary.model.api.ApiDiary
import kim.hyunsub.diary.model.dto.DiaryCreateParams
import kim.hyunsub.diary.model.dto.DiaryUpdateParams
import kim.hyunsub.common.web.model.SimpleResponse
import kim.hyunsub.diary.model.dto.DiaryUpsertParams
import kim.hyunsub.diary.repository.entity.Diary
import kim.hyunsub.diary.repository.mapper.DiaryMapper
import kim.hyunsub.diary.service.ApiDiaryService
import kim.hyunsub.diary.service.DiaryTagService
import kim.hyunsub.friend.model.dto.MeetFriendBulkUpdateParams
import org.springframework.stereotype.Service
import java.time.LocalDate
Expand All @@ -17,56 +16,32 @@ import java.time.LocalDate
class DiaryMutateBo(
private val diaryMapper: DiaryMapper,
private val friendServiceClient: FriendServiceClient,
private val apiDiaryService: ApiDiaryService,
private val diaryTagService: DiaryTagService,
) {
fun create(userId: String, token: String, params: DiaryCreateParams): ApiDiary {
if (diaryMapper.selectOne(userId, params.date) != null) {
throw ErrorCodeException(ErrorCode.ALREADY_EXIST)
}

fun upsert(userId: String, token: String, date: LocalDate, params: DiaryUpsertParams): SimpleResponse {
val diary = Diary(
userId = userId,
date = params.date,
summary = params.summary.trim(),
content = params.content.trim(),
)

diaryMapper.insert(diary)

val friendIds = params.friendIds
val friends = if (friendIds.isNotEmpty()) {
val meetParams = MeetFriendBulkUpdateParams(friendIds)
friendServiceClient.updateMeetFriendsBulk(token, diary.date, meetParams)
} else {
emptyList()
}

return apiDiaryService.detail(token, diary, friends)
}

fun update(userId: String, token: String, date: LocalDate, params: DiaryUpdateParams): ApiDiary {
val diary = diaryMapper.selectOne(userId, date)
?: throw ErrorCodeException(ErrorCode.NOT_FOUND)

val newDiary = diary.copy(
date = date,
summary = params.summary.trim(),
content = params.content.trim(),
)

diaryMapper.update(newDiary)
diaryMapper.upsert(diary)

val meetParams = MeetFriendBulkUpdateParams(params.friendIds)
val friends = friendServiceClient.updateMeetFriendsBulk(token, date, meetParams)
friendServiceClient.updateMeetFriendsBulk(token, date, meetParams)

diaryTagService.setTags(userId, date, params.tags)

return apiDiaryService.detail(token, newDiary, friends)
return SimpleResponse()
}

fun delete(userId: String, token: String, date: LocalDate): ApiDiary {
val diary = diaryMapper.selectOne(userId, date)
fun delete(userId: String, token: String, date: LocalDate): SimpleResponse {
diaryMapper.selectOne(userId, date)
?: throw ErrorCodeException(ErrorCode.NOT_FOUND)

diaryMapper.deleteOne(userId, date)

return apiDiaryService.detail(token, diary)
return SimpleResponse()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class DiaryServerBo(
log.debug { "[User Init] newDiary=$newDiary" }

if (!params.dryRun) {
diaryMapper.insert(newDiary)
diaryMapper.upsert(newDiary)
}

return SimpleResponse()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package kim.hyunsub.diary.bo

import kim.hyunsub.common.model.ApiPageResult
import kim.hyunsub.diary.model.api.ApiDiaryTag
import kim.hyunsub.diary.model.api.toApi
import kim.hyunsub.diary.model.dto.DiaryTagSearchParams
import kim.hyunsub.diary.repository.condition.DiaryTagCondition
import kim.hyunsub.diary.repository.mapper.DiaryTagMapper
import org.springframework.stereotype.Service

@Service
class DiaryTagSearchBo(
private val diaryTagMapper: DiaryTagMapper,
) {
fun search(userId: String, params: DiaryTagSearchParams): ApiPageResult<ApiDiaryTag> {
val condition = DiaryTagCondition(userId = userId, query = params.query)

val total = diaryTagMapper.count(condition)
val data = diaryTagMapper.select(condition)

return ApiPageResult(
total = total,
page = 0,
pageSize = total,
data = data.map { it.toApi() },
)
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package kim.hyunsub.diary.controller

import kim.hyunsub.common.web.config.WebConstants
import kim.hyunsub.common.web.model.SimpleResponse
import kim.hyunsub.common.web.model.UserAuth
import kim.hyunsub.diary.bo.DiaryMutateBo
import kim.hyunsub.diary.model.api.ApiDiary
import kim.hyunsub.diary.model.dto.DiaryCreateParams
import kim.hyunsub.diary.model.dto.DiaryUpdateParams
import kim.hyunsub.diary.model.dto.DiaryUpsertParams
import org.springframework.web.bind.annotation.CookieValue
import org.springframework.web.bind.annotation.DeleteMapping
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
Expand All @@ -21,31 +19,22 @@ import java.time.LocalDate
class DiaryMutateController(
private val diaryMutateBo: DiaryMutateBo,
) {
@PostMapping("")
fun create(
user: UserAuth,
@RequestBody params: DiaryCreateParams,
@CookieValue(WebConstants.TOKEN_COOKIE_NAME) token: String,
): ApiDiary {
return diaryMutateBo.create(user.idNo, token, params)
}

@PutMapping("/{date}")
fun update(
fun upsert(
user: UserAuth,
@PathVariable date: LocalDate,
@RequestBody params: DiaryUpdateParams,
@RequestBody params: DiaryUpsertParams,
@CookieValue(WebConstants.TOKEN_COOKIE_NAME) token: String,
): ApiDiary {
return diaryMutateBo.update(user.idNo, token, date, params)
): SimpleResponse {
return diaryMutateBo.upsert(user.idNo, token, date, params)
}

@DeleteMapping("/{date}")
fun delete(
user: UserAuth,
@PathVariable date: LocalDate,
@CookieValue(WebConstants.TOKEN_COOKIE_NAME) token: String,
): ApiDiary {
): SimpleResponse {
return diaryMutateBo.delete(user.idNo, token, date)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package kim.hyunsub.diary.controller

import kim.hyunsub.common.model.ApiPageResult
import kim.hyunsub.common.web.model.UserAuth
import kim.hyunsub.diary.bo.DiaryTagSearchBo
import kim.hyunsub.diary.model.api.ApiDiaryTag
import kim.hyunsub.diary.model.dto.DiaryTagSearchParams
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.RestController

@RestController
@RequestMapping("/api/v1/search/tags")
class DiaryTagSearchController(
private val diaryTagSearchBo: DiaryTagSearchBo,
) {
@PostMapping("")
fun search(
user: UserAuth,
@RequestBody params: DiaryTagSearchParams,
): ApiPageResult<ApiDiaryTag> {
return diaryTagSearchBo.search(user.idNo, params)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kim.hyunsub.diary.model.api

import kim.hyunsub.diary.repository.entity.DiaryTag
import kim.hyunsub.friend.model.api.ApiFriendPreview
import kim.hyunsub.photo.model.api.ApiPhotoPreview
import java.time.LocalDate
Expand All @@ -11,4 +12,10 @@ data class ApiDiary(
val friends: List<ApiFriendPreview>,
val photoNum: Int,
val photos: List<ApiPhotoPreview>,
val tags: List<ApiDiaryTag>,
)

fun DiaryTag.toApi() = ApiDiaryTag(
id = id,
name = name,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package kim.hyunsub.diary.model.api

data class ApiDiaryTag(
val id: String,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package kim.hyunsub.diary.model.dto

data class DiaryTagSearchParams(
val query: String? = null,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package kim.hyunsub.diary.model.dto

data class DiaryUpdateParams(
data class DiaryUpsertParams(
val content: String,
val summary: String,
val friendIds: List<String>,
val tags: List<String>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kim.hyunsub.diary.repository.condition

import java.time.LocalDate

data class DiaryTagCondition(
val userId: String,
val names: List<String>? = null,
val query: String? = null,
val date: LocalDate? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kim.hyunsub.diary.repository.condition

import java.time.LocalDate

data class DiaryTagMappingCondition(
val userId: String,
val date: LocalDate? = null,
val tagId: String? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kim.hyunsub.diary.repository.entity

data class DiaryTag(
val id: String,
val userId: String,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kim.hyunsub.diary.repository.entity

import java.time.LocalDate

data class DiaryTagMapping(
val userId: String,
val date: LocalDate,
val tagId: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ interface DiaryMapper {
fun selectStatsLengthMax(userId: String): List<DiaryStatsLengthMax>
fun selectStatsLengthCnt(userId: String, unit: Int): List<DiaryStatsLengthCnt>

fun insert(entity: Diary): Int
fun update(entity: Diary): Int
fun upsert(entity: Diary): Int
fun delete(condition: DiaryCondition): Int
fun deleteOne(userId: String, date: LocalDate): Int
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kim.hyunsub.diary.repository.mapper

import kim.hyunsub.common.database.MapperBase
import kim.hyunsub.common.database.generateId
import kim.hyunsub.diary.repository.condition.DiaryTagCondition
import kim.hyunsub.diary.repository.entity.DiaryTag
import org.apache.ibatis.annotations.Mapper

@Mapper
interface DiaryTagMapper : MapperBase {
override fun countById(id: String): Int

fun select(condition: DiaryTagCondition): List<DiaryTag>
fun count(condition: DiaryTagCondition): Int
fun selectOne(id: String): List<DiaryTag>

fun insertBulk(entities: List<DiaryTag>): Int
fun update(entity: DiaryTag): Int
fun deleteOne(id: String): Int
}

fun DiaryTagMapper.generateId() = generateId(10)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kim.hyunsub.diary.repository.mapper

import kim.hyunsub.diary.repository.condition.DiaryTagMappingCondition
import kim.hyunsub.diary.repository.entity.DiaryTagMapping
import org.apache.ibatis.annotations.Mapper
import java.time.LocalDate

@Mapper
interface DiaryTagMappingMapper {
fun select(condition: DiaryTagMappingCondition): List<DiaryTagMapping>
fun count(condition: DiaryTagMappingCondition): List<DiaryTagMapping>

fun insertBulk(entities: List<DiaryTagMapping>): Int
fun deleteWithTagIds(userId: String, date: LocalDate, tagIds: List<String>): Int
}
Loading

0 comments on commit 3d2cad3

Please sign in to comment.