From 05ceab0379e29b457a7f09807357c6e1d03e72da Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Fri, 5 May 2023 16:04:48 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20Post=E3=82=92=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/usbharu/hideout/domain/model/Posts.kt | 54 ----------------- .../model/api/{ => mastodon}/StatusForPost.kt | 2 +- .../domain/model/hideout/dto/PostCreateDto.kt | 3 + .../domain/model/hideout/entity/Post.kt | 13 ++++ .../hideout/domain/model/hideout/form/Post.kt | 3 + .../dev/usbharu/hideout/plugins/Routing.kt | 2 +- .../hideout/repository/IPostRepository.kt | 8 +-- .../hideout/repository/PostRepositoryImpl.kt | 60 ++++++++++++------- .../hideout/routing/api/internal/v1/Posts.kt | 25 ++++++++ .../routing/api/mastodon/v1/Statuses.kt | 20 +++++++ .../hideout/routing/api/v1/Statuses.kt | 25 -------- .../usbharu/hideout/service/IPostService.kt | 4 +- .../activitypub/ActivityPubNoteService.kt | 4 +- .../activitypub/ActivityPubNoteServiceImpl.kt | 6 +- .../hideout/service/impl/PostService.kt | 20 ++++++- .../ActivityPubNoteServiceImplTest.kt | 4 +- 16 files changed, 134 insertions(+), 119 deletions(-) delete mode 100644 src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt rename src/main/kotlin/dev/usbharu/hideout/domain/model/api/{ => mastodon}/StatusForPost.kt (57%) create mode 100644 src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/dto/PostCreateDto.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/entity/Post.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/form/Post.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/routing/api/mastodon/v1/Statuses.kt delete mode 100644 src/main/kotlin/dev/usbharu/hideout/routing/api/v1/Statuses.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 deleted file mode 100644 index 56ae54a3..00000000 --- a/src/main/kotlin/dev/usbharu/hideout/domain/model/Posts.kt +++ /dev/null @@ -1,54 +0,0 @@ -package dev.usbharu.hideout.domain.model - -import dev.usbharu.hideout.repository.Users -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() - override val primaryKey: PrimaryKey = PrimaryKey(id) -} - -data class Post( - val userId: Long, - val overview: String? = null, - val text: String, - val createdAt: Long, - val visibility: Int, - val repostId: Long? = null, - val replyId: Long? = null -) - -data class PostEntity( - val id: Long, - 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 -) - -fun ResultRow.toPost(): PostEntity { - return PostEntity( - id = this[Posts.id], - userId = this[Posts.userId], - 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/domain/model/api/StatusForPost.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/api/mastodon/StatusForPost.kt similarity index 57% rename from src/main/kotlin/dev/usbharu/hideout/domain/model/api/StatusForPost.kt rename to src/main/kotlin/dev/usbharu/hideout/domain/model/api/mastodon/StatusForPost.kt index b89a0516..bc1f7dfc 100644 --- a/src/main/kotlin/dev/usbharu/hideout/domain/model/api/StatusForPost.kt +++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/api/mastodon/StatusForPost.kt @@ -1,4 +1,4 @@ -package dev.usbharu.hideout.domain.model.api +package dev.usbharu.hideout.domain.model.api.mastodon data class StatusForPost( val status: String, diff --git a/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/dto/PostCreateDto.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/dto/PostCreateDto.kt new file mode 100644 index 00000000..f23c1dc8 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/dto/PostCreateDto.kt @@ -0,0 +1,3 @@ +package dev.usbharu.hideout.domain.model.hideout.dto + +data class PostCreateDto(val text:String,val username:String) diff --git a/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/entity/Post.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/entity/Post.kt new file mode 100644 index 00000000..3b997549 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/entity/Post.kt @@ -0,0 +1,13 @@ +package dev.usbharu.hideout.domain.model.hideout.entity + +data class Post( + val id:Long, + 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 +) diff --git a/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/form/Post.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/form/Post.kt new file mode 100644 index 00000000..99014e88 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/hideout/form/Post.kt @@ -0,0 +1,3 @@ +package dev.usbharu.hideout.domain.model.hideout.form + +data class Post(val text:String) diff --git a/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt b/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt index fed45736..24f94a6a 100644 --- a/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt +++ b/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt @@ -3,7 +3,7 @@ package dev.usbharu.hideout.plugins import dev.usbharu.hideout.routing.activitypub.inbox import dev.usbharu.hideout.routing.activitypub.outbox import dev.usbharu.hideout.routing.activitypub.usersAP -import dev.usbharu.hideout.routing.api.v1.statuses +import dev.usbharu.hideout.routing.api.mastodon.v1.statuses import dev.usbharu.hideout.routing.wellknown.webfinger import dev.usbharu.hideout.service.IPostService import dev.usbharu.hideout.service.activitypub.ActivityPubService diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt index 9fee2d02..38223a97 100644 --- a/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt +++ b/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt @@ -1,10 +1,10 @@ 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.hideout.entity.Post interface IPostRepository { - suspend fun insert(post: Post): PostEntity - suspend fun findOneById(id: Long): PostEntity + suspend fun generateId(): Long + suspend fun save(post: Post): Post + suspend fun findOneById(id: Long): Post 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 index 9a57f4e7..86d01ad5 100644 --- a/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt @@ -1,10 +1,7 @@ package dev.usbharu.hideout.repository -import dev.usbharu.hideout.config.Config -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.domain.model.hideout.entity.Post +import dev.usbharu.hideout.repository.toPost import dev.usbharu.hideout.service.IdGenerateService import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.sql.* @@ -22,41 +19,31 @@ class PostRepositoryImpl(database: Database, private val idGenerateService: IdGe } } + override suspend fun generateId(): Long = idGenerateService.generateId() + @Suppress("InjectDispatcher") suspend fun query(block: suspend () -> T): T = newSuspendedTransaction(Dispatchers.IO) { block() } - override suspend fun insert(post: Post): PostEntity { + + override suspend fun save(post: Post): Post { return query { - val generateId = idGenerateService.generateId() - val name = Users.select { Users.id eq post.userId }.single().toUser().name - val postUrl = Config.configData.url + "/users/$name/posts/$generateId" Posts.insert { - it[id] = generateId + it[id] = post.id it[userId] = post.userId it[overview] = post.overview it[text] = post.text it[createdAt] = post.createdAt it[visibility] = post.visibility - it[url] = postUrl + it[url] = post.url it[repostId] = post.repostId it[replyId] = post.replyId } - return@query PostEntity( - id = generateId, - userId = post.userId, - overview = post.overview, - text = post.text, - createdAt = post.createdAt, - visibility = post.visibility, - url = postUrl, - repostId = post.repostId, - replyId = post.replyId - ) + return@query post } } - override suspend fun findOneById(id: Long): PostEntity { + override suspend fun findOneById(id: Long): Post { return query { Posts.select { Posts.id eq id }.single().toPost() } @@ -68,3 +55,30 @@ class PostRepositoryImpl(database: Database, private val idGenerateService: IdGe } } } + +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() + override val primaryKey: PrimaryKey = PrimaryKey(id) +} + +fun ResultRow.toPost(): Post { + return Post( + id = this[Posts.id], + userId = this[Posts.userId], + 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/routing/api/internal/v1/Posts.kt b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt new file mode 100644 index 00000000..357eb131 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt @@ -0,0 +1,25 @@ +package dev.usbharu.hideout.routing.api.internal.v1 + +import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto +import dev.usbharu.hideout.domain.model.hideout.form.Post +import dev.usbharu.hideout.service.IPostService +import io.ktor.server.application.* +import io.ktor.server.auth.* +import io.ktor.server.auth.jwt.* +import io.ktor.server.request.* +import io.ktor.server.routing.* + +fun Route.posts(postService: IPostService){ + route("/posts"){ + authenticate(){ + post{ + val principal = call.principal() ?: throw RuntimeException("no principal") + val username = principal.payload.getClaim("username").asString() + + val receive = call.receive() + val postCreateDto = PostCreateDto(receive.text,username) + postService.create(postCreateDto) + } + } + } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/api/mastodon/v1/Statuses.kt b/src/main/kotlin/dev/usbharu/hideout/routing/api/mastodon/v1/Statuses.kt new file mode 100644 index 00000000..9b5c5fa8 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/routing/api/mastodon/v1/Statuses.kt @@ -0,0 +1,20 @@ +package dev.usbharu.hideout.routing.api.mastodon.v1 + +import dev.usbharu.hideout.service.IPostService +import io.ktor.server.routing.* + +fun Route.statuses(postService: IPostService) { +// route("/statuses") { +// post { +// val status: StatusForPost = call.receive() +// val post = dev.usbharu.hideout.domain.model.hideout.form.Post( +// userId = status.userId, +// createdAt = System.currentTimeMillis(), +// text = status.status, +// visibility = 1 +// ) +// postService.create(post) +// call.respond(status) +// } +// } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/api/v1/Statuses.kt b/src/main/kotlin/dev/usbharu/hideout/routing/api/v1/Statuses.kt deleted file mode 100644 index e6c08942..00000000 --- a/src/main/kotlin/dev/usbharu/hideout/routing/api/v1/Statuses.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.usbharu.hideout.routing.api.v1 - -import dev.usbharu.hideout.domain.model.Post -import dev.usbharu.hideout.domain.model.api.StatusForPost -import dev.usbharu.hideout.service.IPostService -import io.ktor.server.application.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* - -fun Route.statuses(postService: IPostService) { - route("/statuses") { - post { - val status: StatusForPost = call.receive() - val post = Post( - userId = status.userId, - createdAt = System.currentTimeMillis(), - text = status.status, - visibility = 1 - ) - postService.create(post) - call.respond(status) - } - } -} diff --git a/src/main/kotlin/dev/usbharu/hideout/service/IPostService.kt b/src/main/kotlin/dev/usbharu/hideout/service/IPostService.kt index b523cb1e..2e16bdae 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/IPostService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/IPostService.kt @@ -1,7 +1,9 @@ package dev.usbharu.hideout.service -import dev.usbharu.hideout.domain.model.Post +import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto +import dev.usbharu.hideout.domain.model.hideout.entity.Post interface IPostService { suspend fun create(post: Post) + suspend fun create(post: PostCreateDto) } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt index 33ba42cc..5c6ccf96 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt @@ -1,11 +1,11 @@ package dev.usbharu.hideout.service.activitypub -import dev.usbharu.hideout.domain.model.PostEntity +import dev.usbharu.hideout.domain.model.hideout.entity.Post import dev.usbharu.hideout.domain.model.job.DeliverPostJob import kjob.core.job.JobProps interface ActivityPubNoteService { - suspend fun createNote(post: PostEntity) + suspend fun createNote(post: Post) suspend fun createNoteJob(props: JobProps) } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt index 401367d7..42f0df20 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt @@ -2,9 +2,9 @@ package dev.usbharu.hideout.service.activitypub import com.fasterxml.jackson.module.kotlin.readValue import dev.usbharu.hideout.config.Config -import dev.usbharu.hideout.domain.model.PostEntity import dev.usbharu.hideout.domain.model.ap.Create import dev.usbharu.hideout.domain.model.ap.Note +import dev.usbharu.hideout.domain.model.hideout.entity.Post import dev.usbharu.hideout.domain.model.job.DeliverPostJob import dev.usbharu.hideout.plugins.postAp import dev.usbharu.hideout.service.impl.IUserService @@ -24,7 +24,7 @@ class ActivityPubNoteServiceImpl( private val logger = LoggerFactory.getLogger(this::class.java) - override suspend fun createNote(post: PostEntity) { + override suspend fun createNote(post: Post) { val followers = userService.findFollowersById(post.userId) val userEntity = userService.findById(post.userId) val note = Config.configData.objectMapper.writeValueAsString(post) @@ -39,7 +39,7 @@ class ActivityPubNoteServiceImpl( override suspend fun createNoteJob(props: JobProps) { val actor = props[DeliverPostJob.actor] - val postEntity = Config.configData.objectMapper.readValue(props[DeliverPostJob.post]) + val postEntity = Config.configData.objectMapper.readValue(props[DeliverPostJob.post]) val note = Note( name = "Note", id = postEntity.url, diff --git a/src/main/kotlin/dev/usbharu/hideout/service/impl/PostService.kt b/src/main/kotlin/dev/usbharu/hideout/service/impl/PostService.kt index 71dd6be3..fdb10359 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/impl/PostService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/impl/PostService.kt @@ -1,23 +1,37 @@ package dev.usbharu.hideout.service.impl -import dev.usbharu.hideout.domain.model.Post +import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto +import dev.usbharu.hideout.domain.model.hideout.entity.Post import dev.usbharu.hideout.repository.IPostRepository import dev.usbharu.hideout.service.IPostService import dev.usbharu.hideout.service.activitypub.ActivityPubNoteService import org.koin.core.annotation.Single import org.slf4j.LoggerFactory +import java.time.Instant @Single class PostService( private val postRepository: IPostRepository, - private val activityPubNoteService: ActivityPubNoteService + private val activityPubNoteService: ActivityPubNoteService, + private val userService: IUserService ) : IPostService { private val logger = LoggerFactory.getLogger(this::class.java) override suspend fun create(post: Post) { logger.debug("create post={}", post) - val postEntity = postRepository.insert(post) + val postEntity = postRepository.save(post) activityPubNoteService.createNote(postEntity) } + + override suspend fun create(post: PostCreateDto) { + logger.debug("create post={}", post) + val user = userService.findByNameLocalUser(post.username) + val id = postRepository.generateId() + val postEntity = Post( + id, user.id, null, post.text, + Instant.now().toEpochMilli(), 0, "${user.url}/posts/$id", null, null + ) + postRepository.save(postEntity) + } } diff --git a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt index af5274de..9fad103e 100644 --- a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt +++ b/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt @@ -5,7 +5,7 @@ package dev.usbharu.hideout.service.activitypub import dev.usbharu.hideout.config.Config import dev.usbharu.hideout.config.ConfigData -import dev.usbharu.hideout.domain.model.PostEntity +import dev.usbharu.hideout.domain.model.hideout.entity.Post import dev.usbharu.hideout.domain.model.hideout.entity.User import dev.usbharu.hideout.domain.model.job.DeliverPostJob import dev.usbharu.hideout.service.impl.IUserService @@ -72,7 +72,7 @@ class ActivityPubNoteServiceImplTest { } val jobQueueParentService = mock() val activityPubNoteService = ActivityPubNoteServiceImpl(mock(), jobQueueParentService, userService) - val postEntity = PostEntity( + val postEntity = Post( 1L, 1L, null,