From a6818ca09070e30ef280b6e753f2a4b39046b29b Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:28:28 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20User=E3=81=AE=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=94=E3=83=B3=E3=82=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hideout/query/PostQueryServiceImpl.kt | 2 +- .../hideout/query/UserQueryServiceImpl.kt | 24 +++++++++------ .../hideout/repository/PostQueryMapper.kt | 2 +- .../hideout/repository/ResultRowMapper.kt | 2 +- .../hideout/repository/UserQueryMapper.kt | 12 ++++++++ .../hideout/repository/UserRepositoryImpl.kt | 9 +++--- .../hideout/repository/UserResultRowMapper.kt | 29 +++++++++++++++++++ 7 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/dev/usbharu/hideout/repository/UserQueryMapper.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/repository/UserResultRowMapper.kt diff --git a/src/main/kotlin/dev/usbharu/hideout/query/PostQueryServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/query/PostQueryServiceImpl.kt index 718cae24..c6708dae 100644 --- a/src/main/kotlin/dev/usbharu/hideout/query/PostQueryServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/query/PostQueryServiceImpl.kt @@ -19,7 +19,7 @@ class PostQueryServiceImpl( Posts.leftJoin(PostsMedia) .select { Posts.id eq id } .singleOr { FailedToGetResourcesException("id: $id is duplicate or does not exist.", it) } - .let(postResultRowMapper::map)!! + .let(postResultRowMapper::map) override suspend fun findByUrl(url: String): Post = Posts.leftJoin(PostsMedia) diff --git a/src/main/kotlin/dev/usbharu/hideout/query/UserQueryServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/query/UserQueryServiceImpl.kt index 351a8303..3db693e1 100644 --- a/src/main/kotlin/dev/usbharu/hideout/query/UserQueryServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/query/UserQueryServiceImpl.kt @@ -2,8 +2,9 @@ package dev.usbharu.hideout.query import dev.usbharu.hideout.domain.model.hideout.entity.User import dev.usbharu.hideout.exception.FailedToGetResourcesException +import dev.usbharu.hideout.repository.QueryMapper +import dev.usbharu.hideout.repository.ResultRowMapper import dev.usbharu.hideout.repository.Users -import dev.usbharu.hideout.repository.toUser import dev.usbharu.hideout.util.singleOr import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.select @@ -12,17 +13,22 @@ import org.slf4j.LoggerFactory import org.springframework.stereotype.Repository @Repository -class UserQueryServiceImpl : UserQueryService { +class UserQueryServiceImpl( + private val userResultRowMapper: ResultRowMapper, + private val userQueryMapper: QueryMapper +) : UserQueryService { private val logger = LoggerFactory.getLogger(UserQueryServiceImpl::class.java) override suspend fun findAll(limit: Int, offset: Long): List = - Users.selectAll().limit(limit, offset).map { it.toUser() } + Users.selectAll().limit(limit, offset).let(userQueryMapper::map) override suspend fun findById(id: Long): User = Users.select { Users.id eq id } - .singleOr { FailedToGetResourcesException("id: $id is duplicate or does not exist.", it) }.toUser() + .singleOr { FailedToGetResourcesException("id: $id is duplicate or does not exist.", it) } + .let(userResultRowMapper::map) - override suspend fun findByName(name: String): List = Users.select { Users.name eq name }.map { it.toUser() } + override suspend fun findByName(name: String): List = + Users.select { Users.name eq name }.let(userQueryMapper::map) override suspend fun findByNameAndDomain(name: String, domain: String): User = Users @@ -30,17 +36,17 @@ class UserQueryServiceImpl : UserQueryService { .singleOr { FailedToGetResourcesException("name: $name,domain: $domain is duplicate or does not exist.", it) } - .toUser() + .let(userResultRowMapper::map) override suspend fun findByUrl(url: String): User { logger.trace("findByUrl url: $url") return Users.select { Users.url eq url } .singleOr { FailedToGetResourcesException("url: $url is duplicate or does not exist.", it) } - .toUser() + .let(userResultRowMapper::map) } override suspend fun findByIds(ids: List): List = - Users.select { Users.id inList ids }.map { it.toUser() } + Users.select { Users.id inList ids }.let(userQueryMapper::map) override suspend fun existByNameAndDomain(name: String, domain: String): Boolean = Users.select { Users.name eq name and (Users.domain eq domain) }.empty().not() @@ -48,6 +54,6 @@ class UserQueryServiceImpl : UserQueryService { override suspend fun findByKeyId(keyId: String): User { return Users.select { Users.keyId eq keyId } .singleOr { FailedToGetResourcesException("keyId: $keyId is duplicate or does not exist.", it) } - .toUser() + .let(userResultRowMapper::map) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/PostQueryMapper.kt b/src/main/kotlin/dev/usbharu/hideout/repository/PostQueryMapper.kt index 158adb7e..f71d5492 100644 --- a/src/main/kotlin/dev/usbharu/hideout/repository/PostQueryMapper.kt +++ b/src/main/kotlin/dev/usbharu/hideout/repository/PostQueryMapper.kt @@ -10,7 +10,7 @@ class PostQueryMapper(private val postResultRowMapper: ResultRowMapper) : return query.groupBy { it[Posts.id] } .map { it.value } .map { - it.first().let(postResultRowMapper::map)!! + it.first().let(postResultRowMapper::map) .copy(mediaIds = it.mapNotNull { it.getOrNull(PostsMedia.mediaId) }) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/ResultRowMapper.kt b/src/main/kotlin/dev/usbharu/hideout/repository/ResultRowMapper.kt index 2a338e98..e2ea4b3f 100644 --- a/src/main/kotlin/dev/usbharu/hideout/repository/ResultRowMapper.kt +++ b/src/main/kotlin/dev/usbharu/hideout/repository/ResultRowMapper.kt @@ -3,5 +3,5 @@ package dev.usbharu.hideout.repository import org.jetbrains.exposed.sql.ResultRow interface ResultRowMapper { - fun map(resultRow: ResultRow): T? + fun map(resultRow: ResultRow): T } diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/UserQueryMapper.kt b/src/main/kotlin/dev/usbharu/hideout/repository/UserQueryMapper.kt new file mode 100644 index 00000000..62828e72 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/repository/UserQueryMapper.kt @@ -0,0 +1,12 @@ +package dev.usbharu.hideout.repository + +import dev.usbharu.hideout.domain.model.hideout.entity.User +import org.jetbrains.exposed.sql.Query +import org.springframework.stereotype.Component + +@Component +class UserQueryMapper(private val userResultRowMapper: ResultRowMapper) : QueryMapper { + override fun map(query: Query): List { + return query.map(userResultRowMapper::map) + } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt index 85643afe..323c70a7 100644 --- a/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt @@ -9,7 +9,10 @@ import org.springframework.stereotype.Repository import java.time.Instant @Repository -class UserRepositoryImpl(private val idGenerateService: IdGenerateService) : +class UserRepositoryImpl( + private val idGenerateService: IdGenerateService, + private val userResultRowMapper: ResultRowMapper +) : UserRepository { override suspend fun save(user: User): User { @@ -54,9 +57,7 @@ class UserRepositoryImpl(private val idGenerateService: IdGenerateService) : } override suspend fun findById(id: Long): User? { - return Users.select { Users.id eq id }.map { - it.toUser() - }.singleOrNull() + return Users.select { Users.id eq id }.singleOrNull()?.let(userResultRowMapper::map) } override suspend fun deleteFollowRequest(id: Long, follower: Long) { diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/UserResultRowMapper.kt b/src/main/kotlin/dev/usbharu/hideout/repository/UserResultRowMapper.kt new file mode 100644 index 00000000..8470a2f6 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/repository/UserResultRowMapper.kt @@ -0,0 +1,29 @@ +package dev.usbharu.hideout.repository + +import dev.usbharu.hideout.domain.model.hideout.entity.User +import org.jetbrains.exposed.sql.ResultRow +import org.springframework.stereotype.Component +import java.time.Instant + +@Component +class UserResultRowMapper(private val userBuilder: User.UserBuilder) : ResultRowMapper { + override fun map(resultRow: ResultRow): User { + return userBuilder.of( + id = resultRow[Users.id], + name = resultRow[Users.name], + domain = resultRow[Users.domain], + screenName = resultRow[Users.screenName], + description = resultRow[Users.description], + password = resultRow[Users.password], + inbox = resultRow[Users.inbox], + outbox = resultRow[Users.outbox], + url = resultRow[Users.url], + publicKey = resultRow[Users.publicKey], + privateKey = resultRow[Users.privateKey], + createdAt = Instant.ofEpochMilli((resultRow[Users.createdAt])), + keyId = resultRow[Users.keyId], + followers = resultRow[Users.followers], + following = resultRow[Users.following] + ) + } +}