From 6234315086e120fa76a529058748cae8b6e55ca8 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Thu, 20 Apr 2023 22:30:36 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8A=95=E7=A8=BF=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/usbharu/hideout/domain/model/Posts.kt | 51 +++++++++++++++ .../hideout/repository/IPostRepository.kt | 10 +++ .../hideout/repository/PostRepositoryImpl.kt | 64 +++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt diff --git a/src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt new file mode 100644 index 00000000..69d202a9 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt @@ -0,0 +1,51 @@ +package dev.usbharu.hideout.domain.model + +import org.jetbrains.exposed.sql.ResultRow +import org.jetbrains.exposed.sql.Table + +object Posts : Table() { + val id = long("id") + val userId = long("userId").references(Users.id) + val overview = varchar("overview", 100).nullable() + val text = varchar("text", 3000) + val createdAt = long("createdAt") + val visibility = integer("visibility").default(0) + val url = varchar("url", 500) + val repostId = long("repostId").references(id).nullable() + val replyId = long("replyId").references(id).nullable() +} + +data class Post( + val userId: Long, + val overview: String? = null, + val text: String, + val createdAt: Long, + val visibility: Int, + val url: String, + val repostId: Long? = null, + val replyId: Long? = null +) + +data class PostEntity( + val id: Long, + val overview: String? = null, + val text: String, + val createdAt: Long, + val visibility: Int, + val url: String, + val repostId: Long? = null, + val replyId: Long? = null +) + +fun ResultRow.toPost():PostEntity{ + return PostEntity( + id = this[Posts.id], + overview = this[Posts.overview], + text = this[Posts.text], + createdAt = this[Posts.createdAt], + visibility = this[Posts.visibility], + url = this[Posts.url], + repostId = this[Posts.repostId], + replyId = this[Posts.replyId] + ) +} diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt new file mode 100644 index 00000000..d7f523db --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt @@ -0,0 +1,10 @@ +package dev.usbharu.hideout.repository + +import dev.usbharu.hideout.domain.model.Post +import dev.usbharu.hideout.domain.model.PostEntity + +interface IPostRepository { + suspend fun insert(post:Post):PostEntity + suspend fun findOneById(id:Long):PostEntity + suspend fun delete(id:Long) +} diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt new file mode 100644 index 00000000..7ec43b22 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt @@ -0,0 +1,64 @@ +package dev.usbharu.hideout.repository + +import dev.usbharu.hideout.domain.model.Post +import dev.usbharu.hideout.domain.model.PostEntity +import dev.usbharu.hideout.domain.model.Posts +import dev.usbharu.hideout.domain.model.toPost +import dev.usbharu.hideout.service.IdGenerateService +import kotlinx.coroutines.Dispatchers +import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.jetbrains.exposed.sql.transactions.transaction + +class PostRepositoryImpl(database: Database, private val idGenerateService: IdGenerateService) : IPostRepository { + + init { + transaction(database) { + SchemaUtils.create(Posts) + } + } + + suspend fun query(block: suspend () -> T): T = + newSuspendedTransaction(Dispatchers.IO) { block() } + + override suspend fun insert(post: Post): PostEntity { + return query { + + val generateId = idGenerateService.generateId() + Posts.insert { + it[id] = generateId + it[userId] = post.userId + it[overview] = post.overview + it[text] = post.text + it[createdAt] = post.createdAt + it[visibility] = post.visibility + it[url] = post.url + it[repostId] = post.repostId + it[replyId] = post.replyId + } + return@query PostEntity( + generateId, + post.overview, + post.text, + post.createdAt, + post.visibility, + post.url, + post.repostId, + post.replyId + ) + } + } + + override suspend fun findOneById(id: Long): PostEntity { + return query { + Posts.select { Posts.id eq id }.single().toPost() + } + } + + override suspend fun delete(id: Long) { + return query { + Posts.deleteWhere { Posts.id eq id } + } + } +}