🎨 [reactive-app] domain mapper 클래스 추가
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
package me.jiniworld.demohx.application.notice.domain
|
||||
|
||||
data class Notice(
|
||||
val summary: Summary,
|
||||
val content: String,
|
||||
) {
|
||||
data class Summary(
|
||||
val id: String,
|
||||
val title: String,
|
||||
val createdAt: String,
|
||||
)
|
||||
|
||||
data class Detail(
|
||||
val id: String,
|
||||
val title: String,
|
||||
val content: String,
|
||||
val createdAt: String,
|
||||
)
|
||||
|
||||
fun detail(): Detail {
|
||||
return Detail(id = summary.id, title = summary.title, content = content, createdAt = summary.createdAt)
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package me.jiniworld.demohx.application.notice.domain
|
||||
|
||||
data class NoticeDetail(
|
||||
val id: String,
|
||||
val title: String,
|
||||
val content: String,
|
||||
val createdAt: String,
|
||||
)
|
||||
@@ -1,7 +0,0 @@
|
||||
package me.jiniworld.demohx.application.notice.domain
|
||||
|
||||
data class NoticeSimple(
|
||||
val id: String,
|
||||
val title: String,
|
||||
val createdOn: String,
|
||||
)
|
||||
@@ -1,10 +1,9 @@
|
||||
package me.jiniworld.demohx.application.notice.port.input
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
|
||||
interface GetNoticeQuery {
|
||||
fun getNoticeSimples(command: GetNoticesCommand): Flow<NoticeSimple>
|
||||
suspend fun getNoticeDetail(id: String): NoticeDetail?
|
||||
fun getNoticeSummaries(command: GetNoticesCommand): Flow<Notice.Summary>
|
||||
suspend fun getNotice(id: String): Notice.Detail?
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
package me.jiniworld.demohx.application.notice.port.output
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
import org.springframework.data.domain.Pageable
|
||||
|
||||
interface LoadNoticePort {
|
||||
fun loadNotices(pageable: Pageable): Flow<NoticeSimple>
|
||||
suspend fun loadNotice(id: String): NoticeDetail?
|
||||
fun loadNotices(pageable: Pageable): Flow<Notice>
|
||||
suspend fun loadNotice(id: String): Notice?
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
package me.jiniworld.demohx.application.notice.service
|
||||
|
||||
import kotlinx.coroutines.flow.map
|
||||
import me.jiniworld.demohx.annotation.UseCase
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
import me.jiniworld.demohx.application.notice.port.input.GetNoticeQuery
|
||||
import me.jiniworld.demohx.application.notice.port.input.GetNoticesCommand
|
||||
import me.jiniworld.demohx.application.notice.port.output.LoadNoticePort
|
||||
@@ -15,10 +16,10 @@ internal class GetNoticeService(
|
||||
private val loadNoticePort: LoadNoticePort,
|
||||
) : GetNoticeQuery {
|
||||
|
||||
override fun getNoticeSimples(command: GetNoticesCommand) =
|
||||
override fun getNoticeSummaries(command: GetNoticesCommand) =
|
||||
loadNoticePort.loadNotices(PageRequest.of(command.page, command.size, Sort.by(
|
||||
Sort.Order.desc("id"))))
|
||||
Sort.Order.desc("id")))).map { it.summary }
|
||||
|
||||
override suspend fun getNoticeDetail(id: String): NoticeDetail? =
|
||||
loadNoticePort.loadNotice(id)
|
||||
override suspend fun getNotice(id: String): Notice.Detail? =
|
||||
loadNoticePort.loadNotice(id)?.detail()
|
||||
}
|
||||
@@ -1,8 +1,5 @@
|
||||
package me.jiniworld.demohx.persistence.notice
|
||||
|
||||
import me.jiniworld.demohx.DateTimeUtils
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import org.springframework.data.annotation.CreatedDate
|
||||
import org.springframework.data.annotation.Id
|
||||
import org.springframework.data.annotation.LastModifiedDate
|
||||
@@ -10,7 +7,7 @@ import org.springframework.data.relational.core.mapping.Table
|
||||
import java.time.LocalDateTime
|
||||
|
||||
@Table("notice")
|
||||
internal class NoticeDocument {
|
||||
internal class NoticeEntity {
|
||||
@Id
|
||||
var id: String = ""
|
||||
|
||||
@@ -24,9 +21,4 @@ internal class NoticeDocument {
|
||||
@LastModifiedDate
|
||||
var updatedAt: LocalDateTime? = null
|
||||
|
||||
fun mapToNoticeSimple() =
|
||||
NoticeSimple(id = id, title = title, createdOn = DateTimeUtils.toDateString(createdAt))
|
||||
|
||||
fun mapToNoticeDetail() =
|
||||
NoticeDetail(id = id, title = title, content = content, createdAt = DateTimeUtils.toString(createdAt))
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package me.jiniworld.demohx.persistence.notice
|
||||
|
||||
import me.jiniworld.demohx.DateTimeUtils
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
|
||||
internal object NoticeMapper {
|
||||
|
||||
fun mapToNotice(entity: NoticeEntity) =
|
||||
Notice(summary = Notice.Summary(id = entity.id, title = entity.title,
|
||||
createdAt = DateTimeUtils.toString(entity.createdAt)), content = entity.content)
|
||||
|
||||
}
|
||||
@@ -3,8 +3,7 @@ package me.jiniworld.demohx.persistence.notice
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import me.jiniworld.demohx.annotation.PersistenceAdapter
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
import me.jiniworld.demohx.application.notice.port.output.LoadNoticePort
|
||||
import org.springframework.data.domain.Pageable
|
||||
|
||||
@@ -12,11 +11,11 @@ import org.springframework.data.domain.Pageable
|
||||
internal class NoticePersistenceAdapter(
|
||||
private val noticeRepository: NoticeRepository,
|
||||
) : LoadNoticePort {
|
||||
override fun loadNotices(pageable: Pageable): Flow<NoticeSimple> {
|
||||
return noticeRepository.findAllBy(pageable).map { it.mapToNoticeSimple() }
|
||||
override fun loadNotices(pageable: Pageable): Flow<Notice> {
|
||||
return noticeRepository.findAllBy(pageable).map { NoticeMapper.mapToNotice(it) }
|
||||
}
|
||||
|
||||
override suspend fun loadNotice(id: String): NoticeDetail? {
|
||||
return noticeRepository.findById(id)?.mapToNoticeDetail()
|
||||
override suspend fun loadNotice(id: String): Notice? {
|
||||
return noticeRepository.findById(id)?.let { NoticeMapper.mapToNotice(it) }
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,6 @@ import org.springframework.data.repository.kotlin.CoroutineCrudRepository
|
||||
import org.springframework.stereotype.Repository
|
||||
|
||||
@Repository
|
||||
internal interface NoticeRepository: CoroutineCrudRepository<NoticeDocument, String> {
|
||||
fun findAllBy(pageable: Pageable): Flow<NoticeDocument>
|
||||
internal interface NoticeRepository: CoroutineCrudRepository<NoticeEntity, String> {
|
||||
fun findAllBy(pageable: Pageable): Flow<NoticeEntity>
|
||||
}
|
||||
@@ -1,8 +1,5 @@
|
||||
package me.jiniworld.demohx.persistence.notice
|
||||
|
||||
import me.jiniworld.demohx.DateTimeUtils
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import org.springframework.data.annotation.CreatedDate
|
||||
import org.springframework.data.annotation.Id
|
||||
import org.springframework.data.annotation.LastModifiedDate
|
||||
@@ -24,10 +21,4 @@ internal class NoticeDocument {
|
||||
@LastModifiedDate
|
||||
var updatedAt: LocalDateTime? = null
|
||||
|
||||
fun mapToNoticeSimple() =
|
||||
NoticeSimple(id = id, title = title, createdOn = DateTimeUtils.toDateString(createdAt))
|
||||
|
||||
fun mapToNoticeDetail() =
|
||||
NoticeDetail(id = id, title = title, content = content, createdAt = DateTimeUtils.toString(createdAt))
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package me.jiniworld.demohx.persistence.notice
|
||||
|
||||
import me.jiniworld.demohx.DateTimeUtils
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
|
||||
internal object NoticeMapper {
|
||||
|
||||
fun mapToNotice(doc: NoticeDocument) =
|
||||
Notice(summary = Notice.Summary(id = doc.id, title = doc.title,
|
||||
createdAt = DateTimeUtils.toString(doc.createdAt)), content = doc.content)
|
||||
|
||||
}
|
||||
@@ -3,8 +3,7 @@ package me.jiniworld.demohx.persistence.notice
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import me.jiniworld.demohx.annotation.PersistenceAdapter
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeDetail
|
||||
import me.jiniworld.demohx.application.notice.domain.NoticeSimple
|
||||
import me.jiniworld.demohx.application.notice.domain.Notice
|
||||
import me.jiniworld.demohx.application.notice.port.output.LoadNoticePort
|
||||
import org.springframework.data.domain.Pageable
|
||||
|
||||
@@ -12,11 +11,11 @@ import org.springframework.data.domain.Pageable
|
||||
internal class NoticePersistenceAdapter(
|
||||
private val noticeRepository: NoticeRepository,
|
||||
) : LoadNoticePort {
|
||||
override fun loadNotices(pageable: Pageable): Flow<NoticeSimple> {
|
||||
return noticeRepository.findAllBy(pageable).map { it.mapToNoticeSimple() }
|
||||
override fun loadNotices(pageable: Pageable): Flow<Notice> {
|
||||
return noticeRepository.findAllBy(pageable).map { NoticeMapper.mapToNotice(it) }
|
||||
}
|
||||
|
||||
override suspend fun loadNotice(id: String): NoticeDetail? {
|
||||
return noticeRepository.findById(id)?.mapToNoticeDetail()
|
||||
override suspend fun loadNotice(id: String): Notice? {
|
||||
return noticeRepository.findById(id)?.let { NoticeMapper.mapToNotice(it) }
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController
|
||||
internal class GetItemController(
|
||||
private val getItemQuery: GetItemQuery,
|
||||
) {
|
||||
@Operation(summary = "삼품 목록")
|
||||
@Operation(summary = "상품 목록")
|
||||
@GetMapping("")
|
||||
fun getItems(
|
||||
@RequestParam(value = "page", required = false, defaultValue = "0") page: Int,
|
||||
|
||||
@@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.tags.Tag
|
||||
import me.jiniworld.demohx.annotation.WebAdapter
|
||||
import me.jiniworld.demohx.application.notice.port.input.GetNoticeQuery
|
||||
import me.jiniworld.demohx.application.notice.port.input.GetNoticesCommand
|
||||
import me.jiniworld.demohx.model.DataResponse
|
||||
import me.jiniworld.demohx.model.NotFoundException
|
||||
import org.springframework.web.bind.annotation.*
|
||||
|
||||
@@ -22,13 +21,12 @@ internal class GetNoticeController(
|
||||
fun getNotices(
|
||||
@RequestParam(value = "page", required = false, defaultValue = "0") page: Int,
|
||||
@RequestParam(value = "size", required = false, defaultValue = "10") size: Int,
|
||||
) = getNoticeQuery.getNoticeSimples(GetNoticesCommand(page = page, size = size))
|
||||
) = getNoticeQuery.getNoticeSummaries(GetNoticesCommand(page = page, size = size))
|
||||
|
||||
@Operation(summary = "공지사항 상세조회")
|
||||
@GetMapping("/{notice_id}")
|
||||
suspend fun getNotice(@PathVariable("notice_id") noticeId: String,
|
||||
) = getNoticeQuery.getNoticeDetail(noticeId)
|
||||
?.let { DataResponse(data = it) }
|
||||
) = getNoticeQuery.getNotice(noticeId)
|
||||
?: throw NotFoundException("조회되는 공지사항이 없습니다.")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user