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