mirror of https://github.com/usbharu/Hideout.git
feat: Followを送れるように
This commit is contained in:
parent
acd305d289
commit
194a648862
|
@ -0,0 +1,5 @@
|
||||||
|
package dev.usbharu.hideout.domain.model.hideout.dto
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.entity.User
|
||||||
|
|
||||||
|
data class SendFollowDto(val userId: User, val followTargetUserId: User)
|
|
@ -0,0 +1,7 @@
|
||||||
|
package dev.usbharu.hideout.service.activitypub
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
|
||||||
|
|
||||||
|
interface ActivityPubSendFollowService {
|
||||||
|
suspend fun sendFollow(sendFollowDto: SendFollowDto)
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package dev.usbharu.hideout.service.activitypub
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.domain.model.ap.Follow
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
|
||||||
|
import dev.usbharu.hideout.plugins.postAp
|
||||||
|
import io.ktor.client.*
|
||||||
|
import org.koin.core.annotation.Single
|
||||||
|
|
||||||
|
@Single
|
||||||
|
class ActivityPubSendFollowServiceImpl(private val httpClient: HttpClient) : ActivityPubSendFollowService {
|
||||||
|
override suspend fun sendFollow(sendFollowDto: SendFollowDto) {
|
||||||
|
val follow = Follow(
|
||||||
|
name = "Follow",
|
||||||
|
`object` = sendFollowDto.followTargetUserId.url,
|
||||||
|
actor = sendFollowDto.userId.url
|
||||||
|
)
|
||||||
|
httpClient.postAp(
|
||||||
|
urlString = sendFollowDto.followTargetUserId.inbox,
|
||||||
|
username = sendFollowDto.userId.url,
|
||||||
|
jsonLd = follow
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,17 +2,23 @@ package dev.usbharu.hideout.service.impl
|
||||||
|
|
||||||
import dev.usbharu.hideout.config.Config
|
import dev.usbharu.hideout.config.Config
|
||||||
import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
|
import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
|
||||||
|
import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
|
||||||
import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
|
import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
|
||||||
import dev.usbharu.hideout.domain.model.hideout.entity.User
|
import dev.usbharu.hideout.domain.model.hideout.entity.User
|
||||||
import dev.usbharu.hideout.exception.UserNotFoundException
|
import dev.usbharu.hideout.exception.UserNotFoundException
|
||||||
import dev.usbharu.hideout.repository.IUserRepository
|
import dev.usbharu.hideout.repository.IUserRepository
|
||||||
import dev.usbharu.hideout.service.IUserAuthService
|
import dev.usbharu.hideout.service.IUserAuthService
|
||||||
|
import dev.usbharu.hideout.service.activitypub.ActivityPubSendFollowService
|
||||||
import org.koin.core.annotation.Single
|
import org.koin.core.annotation.Single
|
||||||
import java.lang.Integer.min
|
import java.lang.Integer.min
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|
||||||
@Single
|
@Single
|
||||||
class UserService(private val userRepository: IUserRepository, private val userAuthService: IUserAuthService) :
|
class UserService(
|
||||||
|
private val userRepository: IUserRepository,
|
||||||
|
private val userAuthService: IUserAuthService,
|
||||||
|
private val activityPubSendFollowService: ActivityPubSendFollowService
|
||||||
|
) :
|
||||||
IUserService {
|
IUserService {
|
||||||
|
|
||||||
private val maxLimit = 100
|
private val maxLimit = 100
|
||||||
|
@ -105,9 +111,19 @@ class UserService(private val userRepository: IUserRepository, private val userA
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO APのフォロー処理を作る
|
// TODO APのフォロー処理を作る
|
||||||
override suspend fun follow(id: Long, follower: Long): Boolean {
|
override suspend fun follow(id: Long, followerId: Long): Boolean {
|
||||||
userRepository.createFollower(id, follower)
|
val user = userRepository.findById(id) ?: throw UserNotFoundException("$id was not found.")
|
||||||
return false
|
val follower = userRepository.findById(followerId) ?: throw UserNotFoundException("$followerId was not found.")
|
||||||
|
if (follower.domain != Config.configData.domain) {
|
||||||
|
throw IllegalArgumentException("follower is not local user.")
|
||||||
|
}
|
||||||
|
return if (user.domain == Config.configData.domain) {
|
||||||
|
userRepository.createFollower(id, followerId)
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
activityPubSendFollowService.sendFollow(SendFollowDto(follower, user))
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun unfollow(id: Long, follower: Long): Boolean {
|
override suspend fun unfollow(id: Long, follower: Long): Boolean {
|
||||||
|
|
|
@ -29,7 +29,7 @@ class UserServiceTest {
|
||||||
onBlocking { hash(anyString()) } doReturn "hashedPassword"
|
onBlocking { hash(anyString()) } doReturn "hashedPassword"
|
||||||
onBlocking { generateKeyPair() } doReturn generateKeyPair
|
onBlocking { generateKeyPair() } doReturn generateKeyPair
|
||||||
}
|
}
|
||||||
val userService = UserService(userRepository, userAuthService)
|
val userService = UserService(userRepository, userAuthService, mock())
|
||||||
userService.createLocalUser(UserCreateDto("test", "testUser", "XXXXXXXXXXXXX", "test"))
|
userService.createLocalUser(UserCreateDto("test", "testUser", "XXXXXXXXXXXXX", "test"))
|
||||||
verify(userRepository, times(1)).save(any())
|
verify(userRepository, times(1)).save(any())
|
||||||
argumentCaptor<dev.usbharu.hideout.domain.model.hideout.entity.User> {
|
argumentCaptor<dev.usbharu.hideout.domain.model.hideout.entity.User> {
|
||||||
|
@ -55,7 +55,7 @@ class UserServiceTest {
|
||||||
val userRepository = mock<IUserRepository> {
|
val userRepository = mock<IUserRepository> {
|
||||||
onBlocking { nextId() } doReturn 113345L
|
onBlocking { nextId() } doReturn 113345L
|
||||||
}
|
}
|
||||||
val userService = UserService(userRepository, mock())
|
val userService = UserService(userRepository, mock(), mock())
|
||||||
val user = RemoteUserCreateDto(
|
val user = RemoteUserCreateDto(
|
||||||
"test",
|
"test",
|
||||||
"example.com",
|
"example.com",
|
||||||
|
|
Loading…
Reference in New Issue