mirror of https://github.com/usbharu/Hideout.git
feat: RelationshipRepositoryとRelationshipQueryServiceの実装を追加
This commit is contained in:
parent
a011d22587
commit
d2faa7f204
|
@ -0,0 +1,85 @@
|
||||||
|
package dev.usbharu.hideout.core.domain.model.relationship
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.core.infrastructure.exposedrepository.Users
|
||||||
|
import org.jetbrains.exposed.dao.id.LongIdTable
|
||||||
|
import org.jetbrains.exposed.sql.*
|
||||||
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class RelationshipRepositoryImpl : RelationshipRepository {
|
||||||
|
override suspend fun save(relationship: Relationship): Relationship {
|
||||||
|
val singleOrNull =
|
||||||
|
Relationships
|
||||||
|
.select {
|
||||||
|
(Relationships.userId eq relationship.userId)
|
||||||
|
.and(Relationships.targetUserId eq relationship.targetUserId)
|
||||||
|
}
|
||||||
|
.singleOrNull()
|
||||||
|
|
||||||
|
if (singleOrNull == null) {
|
||||||
|
Relationships.insert {
|
||||||
|
it[userId] = relationship.userId
|
||||||
|
it[targetUserId] = relationship.targetUserId
|
||||||
|
it[following] = relationship.following
|
||||||
|
it[blocking] = relationship.blocking
|
||||||
|
it[muting] = relationship.blocking
|
||||||
|
it[followRequest] = relationship.followRequest
|
||||||
|
it[ignoreFollowRequestFromTarget] = relationship.ignoreFollowRequestFromTarget
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Relationships
|
||||||
|
.update({
|
||||||
|
(Relationships.userId eq relationship.userId)
|
||||||
|
.and(Relationships.targetUserId eq relationship.targetUserId)
|
||||||
|
}) {
|
||||||
|
it[following] = relationship.following
|
||||||
|
it[blocking] = relationship.blocking
|
||||||
|
it[muting] = relationship.blocking
|
||||||
|
it[followRequest] = relationship.followRequest
|
||||||
|
it[ignoreFollowRequestFromTarget] = relationship.ignoreFollowRequestFromTarget
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return relationship
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun delete(relationship: Relationship) {
|
||||||
|
Relationships.deleteWhere {
|
||||||
|
(Relationships.userId eq relationship.userId)
|
||||||
|
.and(Relationships.targetUserId eq relationship.targetUserId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findByUserIdAndTargetUserId(userId: Long, targetUserId: Long): Relationship? {
|
||||||
|
return Relationships.select {
|
||||||
|
(Relationships.userId eq userId)
|
||||||
|
.and(Relationships.targetUserId eq targetUserId)
|
||||||
|
}.singleOrNull()
|
||||||
|
?.toRelationships()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ResultRow.toRelationships(): Relationship = Relationship(
|
||||||
|
this[Relationships.userId],
|
||||||
|
this[Relationships.targetUserId],
|
||||||
|
this[Relationships.following],
|
||||||
|
this[Relationships.blocking],
|
||||||
|
this[Relationships.muting],
|
||||||
|
this[Relationships.followRequest],
|
||||||
|
this[Relationships.ignoreFollowRequestFromTarget]
|
||||||
|
)
|
||||||
|
|
||||||
|
object Relationships : LongIdTable("relationships") {
|
||||||
|
val userId = long("user_id").references(Users.id)
|
||||||
|
val targetUserId = long("target_user_id").references(Users.id)
|
||||||
|
val following = bool("following")
|
||||||
|
val blocking = bool("blocking")
|
||||||
|
val muting = bool("muting")
|
||||||
|
val followRequest = bool("follow_request")
|
||||||
|
val ignoreFollowRequestFromTarget = bool("ignore_follow_request")
|
||||||
|
|
||||||
|
init {
|
||||||
|
uniqueIndex(userId, targetUserId)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package dev.usbharu.hideout.core.infrastructure.exposedquery
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
|
||||||
|
import dev.usbharu.hideout.core.domain.model.relationship.Relationships
|
||||||
|
import dev.usbharu.hideout.core.domain.model.relationship.toRelationships
|
||||||
|
import dev.usbharu.hideout.core.query.RelationshipQueryService
|
||||||
|
import org.jetbrains.exposed.sql.and
|
||||||
|
import org.jetbrains.exposed.sql.select
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class RelationshipQueryServiceImpl : RelationshipQueryService {
|
||||||
|
override suspend fun findByTargetIdAndFollowing(targetId: Long, following: Boolean): List<Relationship> =
|
||||||
|
Relationships.select { Relationships.targetUserId eq targetId and (Relationships.following eq following) }
|
||||||
|
.map { it.toRelationships() }
|
||||||
|
}
|
Loading…
Reference in New Issue