diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt index 41303839..440eba4e 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt @@ -12,19 +12,19 @@ import dev.usbharu.hideout.domain.model.job.DeliverPostJob import dev.usbharu.hideout.exception.FailedToGetResourcesException import dev.usbharu.hideout.exception.ap.FailedToGetActivityPubResourceException import dev.usbharu.hideout.exception.ap.IllegalActivityPubObjectException -import dev.usbharu.hideout.plugins.getAp import dev.usbharu.hideout.plugins.postAp import dev.usbharu.hideout.query.FollowerQueryService import dev.usbharu.hideout.query.MediaQueryService import dev.usbharu.hideout.query.PostQueryService import dev.usbharu.hideout.query.UserQueryService import dev.usbharu.hideout.repository.PostRepository +import dev.usbharu.hideout.service.ap.resource.APResourceResolveService +import dev.usbharu.hideout.service.ap.resource.resolve import dev.usbharu.hideout.service.job.JobQueueParentService import dev.usbharu.hideout.service.post.PostCreateInterceptor import dev.usbharu.hideout.service.post.PostService import io.ktor.client.* import io.ktor.client.plugins.* -import io.ktor.client.statement.* import kjob.core.job.JobProps import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred @@ -68,7 +68,8 @@ class APNoteServiceImpl( private val mediaQueryService: MediaQueryService, @Qualifier("activitypub") private val objectMapper: ObjectMapper, private val applicationConfig: ApplicationConfig, - private val postService: PostService + private val postService: PostService, + private val apResourceResolveService: APResourceResolveService ) : APNoteService, PostCreateInterceptor { @@ -143,11 +144,8 @@ class APNoteServiceImpl( } logger.info("AP GET url: {}", url) - val response = try { - httpClient.getAp( - url, - targetActor?.let { "$targetActor#pubkey" } - ) + val note = try { + apResourceResolveService.resolve(url, null as Long?) } catch (e: ClientRequestException) { logger.warn( "FAILED Failed to retrieve ActivityPub resource. HTTP Status Code: {} url: {}", @@ -156,7 +154,6 @@ class APNoteServiceImpl( ) throw FailedToGetActivityPubResourceException("Could not retrieve $url.", e) } - val note = objectMapper.readValue(response.bodyAsText()) val savedNote = saveIfMissing(note, targetActor, url) logger.debug("SUCCESS Fetch Note url: {}", url) return savedNote diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt index 49056e21..06fcf9d3 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt @@ -1,7 +1,6 @@ package dev.usbharu.hideout.service.ap import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue import dev.usbharu.hideout.config.ApplicationConfig import dev.usbharu.hideout.domain.model.ap.Image import dev.usbharu.hideout.domain.model.ap.Key @@ -10,15 +9,12 @@ import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto import dev.usbharu.hideout.domain.model.hideout.entity.User import dev.usbharu.hideout.exception.FailedToGetResourcesException import dev.usbharu.hideout.exception.ap.IllegalActivityPubObjectException -import dev.usbharu.hideout.plugins.getAp import dev.usbharu.hideout.query.UserQueryService +import dev.usbharu.hideout.service.ap.resource.APResourceResolveService +import dev.usbharu.hideout.service.ap.resource.resolve import dev.usbharu.hideout.service.core.Transaction import dev.usbharu.hideout.service.user.UserService -import dev.usbharu.hideout.util.HttpUtil.Activity import io.ktor.client.* -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.http.* import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Service @@ -44,6 +40,7 @@ class APUserServiceImpl( private val userQueryService: UserQueryService, private val transaction: Transaction, private val applicationConfig: ApplicationConfig, + private val apResourceResolveService: APResourceResolveService, @Qualifier("activitypub") private val objectMapper: ObjectMapper ) : APUserService { @@ -111,14 +108,8 @@ class APUserServiceImpl( endpoints = mapOf("sharedInbox" to "${applicationConfig.url}/inbox") ) to userEntity } catch (ignore: FailedToGetResourcesException) { - val httpResponse = if (targetActor != null) { - httpClient.getAp(url, "$targetActor#pubkey") - } else { - httpClient.get(url) { - accept(ContentType.Application.Activity) - } - } - val person = objectMapper.readValue(httpResponse.bodyAsText()) + + val person = apResourceResolveService.resolve(url, null as Long?) person to userService.createRemoteUser( RemoteUserCreateDto( diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/resource/APResourceResolveServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/resource/APResourceResolveServiceImpl.kt index acf5e822..12c6b4d5 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ap/resource/APResourceResolveServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/resource/APResourceResolveServiceImpl.kt @@ -4,9 +4,11 @@ import com.fasterxml.jackson.databind.ObjectMapper import dev.usbharu.hideout.domain.model.ap.Object import dev.usbharu.hideout.domain.model.hideout.entity.User import dev.usbharu.hideout.repository.UserRepository +import dev.usbharu.hideout.util.HttpUtil.Activity import io.ktor.client.* import io.ktor.client.request.* import io.ktor.client.statement.* +import io.ktor.http.* import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Service @@ -46,7 +48,9 @@ class APResourceResolveServiceImpl( } private suspend fun runResolve(url: String, singer: User?, clazz: Class): Object { - val bodyAsText = httpClient.get(url).bodyAsText() + val bodyAsText = httpClient.get(url) { + header("Accept", ContentType.Application.Activity) + }.bodyAsText() return objectMapper.readValue(bodyAsText, clazz) } diff --git a/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt index 4a1e06bc..78f8c6f3 100644 --- a/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt +++ b/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt @@ -96,7 +96,8 @@ class APNoteServiceImplTest { objectMapper = objectMapper, applicationConfig = testApplicationConfig, postService = mock(), - mediaQueryService = mediaQueryService + mediaQueryService = mediaQueryService, + apResourceResolveService = mock() ) val postEntity = Post.of( 1L, @@ -136,7 +137,8 @@ class APNoteServiceImplTest { objectMapper = objectMapper, applicationConfig = testApplicationConfig, postService = mock(), - mediaQueryService = mediaQueryService + mediaQueryService = mediaQueryService, + apResourceResolveService = mock() ) activityPubNoteService.createNoteJob( JobProps(