🎨 [reactive-app] domain mapper 클래스 추가

This commit is contained in:
jini
2023-03-30 19:56:46 +09:00
parent 4e2cc2ea10
commit 36c34a77c4
15 changed files with 75 additions and 65 deletions

View File

@@ -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)
}
}

View File

@@ -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,
)

View File

@@ -1,7 +0,0 @@
package me.jiniworld.demohx.application.notice.domain
data class NoticeSimple(
val id: String,
val title: String,
val createdOn: String,
)

View File

@@ -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?
}

View File

@@ -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?
}

View File

@@ -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()
}

View File

@@ -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))
}

View File

@@ -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)
}

View File

@@ -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) }
}
}

View File

@@ -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>
}

View File

@@ -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))
}

View File

@@ -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)
}

View File

@@ -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) }
}
}

View File

@@ -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,

View File

@@ -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("조회되는 공지사항이 없습니다.")
}