mirror of https://github.com/usbharu/Hideout.git
feat: FollowのQueryServiceを追加
This commit is contained in:
parent
dc25dda7fe
commit
22bb8a910b
|
@ -0,0 +1,12 @@
|
||||||
|
package dev.usbharu.hideout.query
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.entity.User
|
||||||
|
|
||||||
|
interface FollowerQueryService {
|
||||||
|
suspend fun findFollowersById(id: Long): List<User>
|
||||||
|
suspend fun findFollowersByNameAndDomain(name: String, domain: String): List<User>
|
||||||
|
suspend fun findFollowingById(id: Long): List<User>
|
||||||
|
suspend fun findFollowingByNameAndDomain(name: String, domain: String): List<User>
|
||||||
|
suspend fun appendFollower(user: Long, follower: Long)
|
||||||
|
suspend fun removeFollower(user: Long, follower: Long)
|
||||||
|
}
|
|
@ -0,0 +1,201 @@
|
||||||
|
package dev.usbharu.hideout.query
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.entity.User
|
||||||
|
import dev.usbharu.hideout.repository.Users
|
||||||
|
import dev.usbharu.hideout.repository.UsersFollowers
|
||||||
|
import org.jetbrains.exposed.sql.*
|
||||||
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
class FollowerQueryServiceImpl : FollowerQueryService {
|
||||||
|
override suspend fun findFollowersById(id: Long): List<User> {
|
||||||
|
val followers = Users.alias("FOLLOWERS")
|
||||||
|
return Users.innerJoin(
|
||||||
|
otherTable = UsersFollowers,
|
||||||
|
onColumn = { Users.id },
|
||||||
|
otherColumn = { userId }
|
||||||
|
)
|
||||||
|
.innerJoin(
|
||||||
|
otherTable = followers,
|
||||||
|
onColumn = { UsersFollowers.followerId },
|
||||||
|
otherColumn = { followers[Users.id] }
|
||||||
|
)
|
||||||
|
.slice(
|
||||||
|
followers[Users.id],
|
||||||
|
followers[Users.name],
|
||||||
|
followers[Users.domain],
|
||||||
|
followers[Users.screenName],
|
||||||
|
followers[Users.description],
|
||||||
|
followers[Users.password],
|
||||||
|
followers[Users.inbox],
|
||||||
|
followers[Users.outbox],
|
||||||
|
followers[Users.url],
|
||||||
|
followers[Users.publicKey],
|
||||||
|
followers[Users.privateKey],
|
||||||
|
followers[Users.createdAt]
|
||||||
|
)
|
||||||
|
.select { Users.id eq id }
|
||||||
|
.map {
|
||||||
|
User(
|
||||||
|
id = it[followers[Users.id]],
|
||||||
|
name = it[followers[Users.name]],
|
||||||
|
domain = it[followers[Users.domain]],
|
||||||
|
screenName = it[followers[Users.screenName]],
|
||||||
|
description = it[followers[Users.description]],
|
||||||
|
password = it[followers[Users.password]],
|
||||||
|
inbox = it[followers[Users.inbox]],
|
||||||
|
outbox = it[followers[Users.outbox]],
|
||||||
|
url = it[followers[Users.url]],
|
||||||
|
publicKey = it[followers[Users.publicKey]],
|
||||||
|
privateKey = it[followers[Users.privateKey]],
|
||||||
|
createdAt = Instant.ofEpochMilli(it[followers[Users.createdAt]])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findFollowersByNameAndDomain(name: String, domain: String): List<User> {
|
||||||
|
val followers = Users.alias("FOLLOWERS")
|
||||||
|
return Users.innerJoin(
|
||||||
|
otherTable = UsersFollowers,
|
||||||
|
onColumn = { Users.id },
|
||||||
|
otherColumn = { userId }
|
||||||
|
)
|
||||||
|
.innerJoin(
|
||||||
|
otherTable = followers,
|
||||||
|
onColumn = { UsersFollowers.followerId },
|
||||||
|
otherColumn = { followers[Users.id] }
|
||||||
|
)
|
||||||
|
.slice(
|
||||||
|
followers[Users.id],
|
||||||
|
followers[Users.name],
|
||||||
|
followers[Users.domain],
|
||||||
|
followers[Users.screenName],
|
||||||
|
followers[Users.description],
|
||||||
|
followers[Users.password],
|
||||||
|
followers[Users.inbox],
|
||||||
|
followers[Users.outbox],
|
||||||
|
followers[Users.url],
|
||||||
|
followers[Users.publicKey],
|
||||||
|
followers[Users.privateKey],
|
||||||
|
followers[Users.createdAt]
|
||||||
|
)
|
||||||
|
.select { Users.name eq name and (Users.domain eq domain) }
|
||||||
|
.map {
|
||||||
|
User(
|
||||||
|
id = it[followers[Users.id]],
|
||||||
|
name = it[followers[Users.name]],
|
||||||
|
domain = it[followers[Users.domain]],
|
||||||
|
screenName = it[followers[Users.screenName]],
|
||||||
|
description = it[followers[Users.description]],
|
||||||
|
password = it[followers[Users.password]],
|
||||||
|
inbox = it[followers[Users.inbox]],
|
||||||
|
outbox = it[followers[Users.outbox]],
|
||||||
|
url = it[followers[Users.url]],
|
||||||
|
publicKey = it[followers[Users.publicKey]],
|
||||||
|
privateKey = it[followers[Users.privateKey]],
|
||||||
|
createdAt = Instant.ofEpochMilli(it[followers[Users.createdAt]])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findFollowingById(id: Long): List<User> {
|
||||||
|
val followers = Users.alias("FOLLOWERS")
|
||||||
|
return Users.innerJoin(
|
||||||
|
otherTable = UsersFollowers,
|
||||||
|
onColumn = { Users.id },
|
||||||
|
otherColumn = { userId }
|
||||||
|
)
|
||||||
|
.innerJoin(
|
||||||
|
otherTable = followers,
|
||||||
|
onColumn = { UsersFollowers.followerId },
|
||||||
|
otherColumn = { followers[Users.id] }
|
||||||
|
)
|
||||||
|
.slice(
|
||||||
|
followers[Users.id],
|
||||||
|
followers[Users.name],
|
||||||
|
followers[Users.domain],
|
||||||
|
followers[Users.screenName],
|
||||||
|
followers[Users.description],
|
||||||
|
followers[Users.password],
|
||||||
|
followers[Users.inbox],
|
||||||
|
followers[Users.outbox],
|
||||||
|
followers[Users.url],
|
||||||
|
followers[Users.publicKey],
|
||||||
|
followers[Users.privateKey],
|
||||||
|
followers[Users.createdAt]
|
||||||
|
)
|
||||||
|
.select { followers[Users.id] eq id }
|
||||||
|
.map {
|
||||||
|
User(
|
||||||
|
id = it[followers[Users.id]],
|
||||||
|
name = it[followers[Users.name]],
|
||||||
|
domain = it[followers[Users.domain]],
|
||||||
|
screenName = it[followers[Users.screenName]],
|
||||||
|
description = it[followers[Users.description]],
|
||||||
|
password = it[followers[Users.password]],
|
||||||
|
inbox = it[followers[Users.inbox]],
|
||||||
|
outbox = it[followers[Users.outbox]],
|
||||||
|
url = it[followers[Users.url]],
|
||||||
|
publicKey = it[followers[Users.publicKey]],
|
||||||
|
privateKey = it[followers[Users.privateKey]],
|
||||||
|
createdAt = Instant.ofEpochMilli(it[followers[Users.createdAt]])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findFollowingByNameAndDomain(name: String, domain: String): List<User> {
|
||||||
|
val followers = Users.alias("FOLLOWERS")
|
||||||
|
return Users.innerJoin(
|
||||||
|
otherTable = UsersFollowers,
|
||||||
|
onColumn = { Users.id },
|
||||||
|
otherColumn = { userId }
|
||||||
|
)
|
||||||
|
.innerJoin(
|
||||||
|
otherTable = followers,
|
||||||
|
onColumn = { UsersFollowers.followerId },
|
||||||
|
otherColumn = { followers[Users.id] }
|
||||||
|
)
|
||||||
|
.slice(
|
||||||
|
followers[Users.id],
|
||||||
|
followers[Users.name],
|
||||||
|
followers[Users.domain],
|
||||||
|
followers[Users.screenName],
|
||||||
|
followers[Users.description],
|
||||||
|
followers[Users.password],
|
||||||
|
followers[Users.inbox],
|
||||||
|
followers[Users.outbox],
|
||||||
|
followers[Users.url],
|
||||||
|
followers[Users.publicKey],
|
||||||
|
followers[Users.privateKey],
|
||||||
|
followers[Users.createdAt]
|
||||||
|
)
|
||||||
|
.select { followers[Users.name] eq name and (followers[Users.domain] eq domain) }
|
||||||
|
.map {
|
||||||
|
User(
|
||||||
|
id = it[followers[Users.id]],
|
||||||
|
name = it[followers[Users.name]],
|
||||||
|
domain = it[followers[Users.domain]],
|
||||||
|
screenName = it[followers[Users.screenName]],
|
||||||
|
description = it[followers[Users.description]],
|
||||||
|
password = it[followers[Users.password]],
|
||||||
|
inbox = it[followers[Users.inbox]],
|
||||||
|
outbox = it[followers[Users.outbox]],
|
||||||
|
url = it[followers[Users.url]],
|
||||||
|
publicKey = it[followers[Users.publicKey]],
|
||||||
|
privateKey = it[followers[Users.privateKey]],
|
||||||
|
createdAt = Instant.ofEpochMilli(it[followers[Users.createdAt]])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun appendFollower(user: Long, follower: Long) {
|
||||||
|
UsersFollowers.insert {
|
||||||
|
it[userId] = user
|
||||||
|
it[followerId] = follower
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun removeFollower(user: Long, follower: Long) {
|
||||||
|
UsersFollowers.deleteWhere { Users.id eq user and (followerId eq follower) }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue