공지사항 등록

This commit is contained in:
jini
2023-03-31 01:36:23 +09:00
parent 022e344fea
commit 9ff1c6ecec
8 changed files with 78 additions and 5 deletions

View File

@@ -5,16 +5,16 @@ data class Notice(
val content: String,
) {
data class Summary(
val id: String,
val id: String? = null,
val title: String,
val createdAt: String,
val createdAt: String? = null,
)
data class Detail(
val id: String,
val id: String? = null,
val title: String,
val content: String,
val createdAt: String,
val createdAt: String? = null,
)
fun detail(): Detail {

View File

@@ -0,0 +1,6 @@
package me.jiniworld.demohx.application.notice.port.input
data class RegisterNoticeCommand(
val title: String,
val content: String,
)

View File

@@ -0,0 +1,5 @@
package me.jiniworld.demohx.application.notice.port.input
interface RegisterNoticeUseCase {
suspend fun registerNotice(command: RegisterNoticeCommand)
}

View File

@@ -0,0 +1,7 @@
package me.jiniworld.demohx.application.notice.port.output
import me.jiniworld.demohx.application.notice.domain.Notice
interface SaveNoticePort {
suspend fun saveNotice(notice: Notice)
}

View File

@@ -0,0 +1,20 @@
package me.jiniworld.demohx.application.notice.service
import me.jiniworld.demohx.annotation.UseCase
import me.jiniworld.demohx.application.notice.domain.Notice
import me.jiniworld.demohx.application.notice.port.input.RegisterNoticeCommand
import me.jiniworld.demohx.application.notice.port.input.RegisterNoticeUseCase
import me.jiniworld.demohx.application.notice.port.output.SaveNoticePort
import org.springframework.transaction.annotation.Transactional
@Transactional(readOnly = true)
@UseCase
internal class RegisterNoticeService(
private val saveNoticePort: SaveNoticePort,
): RegisterNoticeUseCase {
override suspend fun registerNotice(command: RegisterNoticeCommand) {
saveNoticePort.saveNotice(Notice(Notice.Summary(title = command.title), content = command.content))
}
}

View File

@@ -9,4 +9,7 @@ internal object NoticeMapper {
Notice(summary = Notice.Summary(id = doc.id, title = doc.title,
createdAt = DateTimeUtils.toString(doc.createdAt)), content = doc.content)
fun mapToDocument(notice: Notice) =
NoticeDocument(title = notice.summary.title, content = notice.content)
}

View File

@@ -5,12 +5,13 @@ import kotlinx.coroutines.flow.map
import me.jiniworld.demohx.annotation.PersistenceAdapter
import me.jiniworld.demohx.application.notice.domain.Notice
import me.jiniworld.demohx.application.notice.port.output.LoadNoticePort
import me.jiniworld.demohx.application.notice.port.output.SaveNoticePort
import org.springframework.data.domain.Pageable
@PersistenceAdapter
internal class NoticePersistenceAdapter(
private val noticeRepository: NoticeRepository,
) : LoadNoticePort {
) : LoadNoticePort, SaveNoticePort {
override fun loadNotices(pageable: Pageable): Flow<Notice> {
return noticeRepository.findAllBy(pageable).map { NoticeMapper.mapToNotice(it) }
}
@@ -18,4 +19,8 @@ internal class NoticePersistenceAdapter(
override suspend fun loadNotice(id: String): Notice? {
return noticeRepository.findById(id)?.let { NoticeMapper.mapToNotice(it) }
}
override suspend fun saveNotice(notice: Notice) {
noticeRepository.save(NoticeMapper.mapToDocument(notice))
}
}

View File

@@ -0,0 +1,27 @@
package me.jiniworld.demohx.web.notice
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
import me.jiniworld.demohx.annotation.WebAdapter
import me.jiniworld.demohx.application.notice.port.input.RegisterNoticeCommand
import me.jiniworld.demohx.application.notice.port.input.RegisterNoticeUseCase
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
@WebAdapter
@Tag(name = "setting-system", description = "설정-시스템(공지사항, FAQ, 이용약관, 메타정보 등)")
@RestController
@RequestMapping("/v1/notices")
internal class RegisterNoticeController(
private val registerNoticeUseCase: RegisterNoticeUseCase,
) {
@Operation(summary = "공지사항 등록")
@PostMapping("")
suspend fun getNotices(
@RequestBody command: RegisterNoticeCommand,
) = registerNoticeUseCase.registerNotice(command)
}