mirror of https://github.com/usbharu/Hideout.git
style: スタイルを修正
This commit is contained in:
parent
0eb60669f5
commit
e34ef3b6f8
|
@ -108,12 +108,12 @@ fun Application.parent() {
|
|||
inject<JwkProvider>().value,
|
||||
)
|
||||
configureRouting(
|
||||
httpSignatureVerifyService = inject<HttpSignatureVerifyService>().value,
|
||||
activityPubService = inject<ActivityPubService>().value,
|
||||
userService = inject<IUserService>().value,
|
||||
activityPubUserService = inject<ActivityPubUserService>().value,
|
||||
postService = inject<IPostApiService>().value,
|
||||
userApiService = inject<IUserApiService>().value,
|
||||
httpSignatureVerifyService = inject<HttpSignatureVerifyService>().value,
|
||||
activityPubService = inject<ActivityPubService>().value,
|
||||
userService = inject<IUserService>().value,
|
||||
activityPubUserService = inject<ActivityPubUserService>().value,
|
||||
postService = inject<IPostApiService>().value,
|
||||
userApiService = inject<IUserApiService>().value,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -5,16 +5,19 @@ open class Emoji : Object {
|
|||
var icon: Image? = null
|
||||
|
||||
protected constructor() : super()
|
||||
constructor(type: List<String>,
|
||||
name: String?,
|
||||
actor: String?,
|
||||
id: String?,
|
||||
updated: String?,
|
||||
icon: Image?) : super(
|
||||
type = add(type, "Emoji"),
|
||||
name = name,
|
||||
actor = actor,
|
||||
id = id) {
|
||||
constructor(
|
||||
type: List<String>,
|
||||
name: String?,
|
||||
actor: String?,
|
||||
id: String?,
|
||||
updated: String?,
|
||||
icon: Image?
|
||||
) : super(
|
||||
type = add(type, "Emoji"),
|
||||
name = name,
|
||||
actor = actor,
|
||||
id = id
|
||||
) {
|
||||
this.updated = updated
|
||||
this.icon = icon
|
||||
}
|
||||
|
@ -36,6 +39,4 @@ open class Emoji : Object {
|
|||
}
|
||||
|
||||
override fun toString(): String = "Emoji(updated=$updated, icon=$icon) ${super.toString()}"
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -10,18 +10,20 @@ open class Like : Object {
|
|||
var tag: List<Object> = emptyList()
|
||||
|
||||
protected constructor() : super()
|
||||
constructor(type: List<String>,
|
||||
name: String?,
|
||||
actor: String?,
|
||||
id: String?,
|
||||
`object`: String?,
|
||||
content: String?,
|
||||
tag: List<Object>
|
||||
constructor(
|
||||
type: List<String>,
|
||||
name: String?,
|
||||
actor: String?,
|
||||
id: String?,
|
||||
`object`: String?,
|
||||
content: String?,
|
||||
tag: List<Object>
|
||||
) : super(
|
||||
type = add(type, "Like"),
|
||||
name = name,
|
||||
actor = actor,
|
||||
id = id) {
|
||||
type = add(type, "Like"),
|
||||
name = name,
|
||||
actor = actor,
|
||||
id = id
|
||||
) {
|
||||
this.`object` = `object`
|
||||
this.content = content
|
||||
this.tag = tag
|
||||
|
@ -46,6 +48,4 @@ open class Like : Object {
|
|||
}
|
||||
|
||||
override fun toString(): String = "Like(`object`=$`object`, content=$content, tag=$tag) ${super.toString()}"
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -18,12 +18,12 @@ import io.ktor.server.routing.*
|
|||
|
||||
@Suppress("LongParameterList")
|
||||
fun Application.configureRouting(
|
||||
httpSignatureVerifyService: HttpSignatureVerifyService,
|
||||
activityPubService: ActivityPubService,
|
||||
userService: IUserService,
|
||||
activityPubUserService: ActivityPubUserService,
|
||||
postService: IPostApiService,
|
||||
userApiService: IUserApiService
|
||||
httpSignatureVerifyService: HttpSignatureVerifyService,
|
||||
activityPubService: ActivityPubService,
|
||||
userService: IUserService,
|
||||
activityPubUserService: ActivityPubUserService,
|
||||
postService: IPostApiService,
|
||||
userApiService: IUserApiService
|
||||
) {
|
||||
install(AutoHeadResponse)
|
||||
routing {
|
||||
|
|
|
@ -11,33 +11,33 @@ interface IPostRepository {
|
|||
suspend fun findByUrl(url: String): Post?
|
||||
suspend fun delete(id: Long)
|
||||
suspend fun findAll(
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post>
|
||||
|
||||
suspend fun findByUserNameAndDomain(
|
||||
username: String,
|
||||
s: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
username: String,
|
||||
s: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post>
|
||||
|
||||
suspend fun findByUserId(
|
||||
idOrNull: Long,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
idOrNull: Long,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post>
|
||||
|
||||
suspend fun findByApId(id: String): Post?
|
||||
|
|
|
@ -81,37 +81,37 @@ class PostRepositoryImpl(database: Database, private val idGenerateService: IdGe
|
|||
}
|
||||
|
||||
override suspend fun findAll(
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post> {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override suspend fun findByUserNameAndDomain(
|
||||
username: String,
|
||||
s: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
username: String,
|
||||
s: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post> {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override suspend fun findByUserId(
|
||||
idOrNull: Long,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
idOrNull: Long,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post> {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
@ -140,16 +140,16 @@ object Posts : Table() {
|
|||
|
||||
fun ResultRow.toPost(): Post {
|
||||
return Post(
|
||||
id = this[Posts.id],
|
||||
userId = this[Posts.userId],
|
||||
overview = this[Posts.overview],
|
||||
text = this[Posts.text],
|
||||
createdAt = this[Posts.createdAt],
|
||||
visibility = Visibility.values().first { visibility -> visibility.ordinal == this[Posts.visibility] },
|
||||
url = this[Posts.url],
|
||||
repostId = this[Posts.repostId],
|
||||
replyId = this[Posts.replyId],
|
||||
sensitive = this[Posts.sensitive],
|
||||
apId = this[Posts.apId]
|
||||
id = this[Posts.id],
|
||||
userId = this[Posts.userId],
|
||||
overview = this[Posts.overview],
|
||||
text = this[Posts.text],
|
||||
createdAt = this[Posts.createdAt],
|
||||
visibility = Visibility.values().first { visibility -> visibility.ordinal == this[Posts.visibility] },
|
||||
url = this[Posts.url],
|
||||
repostId = this[Posts.repostId],
|
||||
replyId = this[Posts.replyId],
|
||||
sensitive = this[Posts.sensitive],
|
||||
apId = this[Posts.apId]
|
||||
)
|
||||
}
|
||||
|
|
|
@ -10,7 +10,10 @@ import org.jetbrains.exposed.sql.transactions.transaction
|
|||
import org.koin.core.annotation.Single
|
||||
|
||||
@Single
|
||||
class ReactionRepositoryImpl(private val database: Database, private val idGenerateService: IdGenerateService) : ReactionRepository {
|
||||
class ReactionRepositoryImpl(
|
||||
private val database: Database,
|
||||
private val idGenerateService: IdGenerateService
|
||||
) : ReactionRepository {
|
||||
|
||||
init {
|
||||
transaction(database) {
|
||||
|
@ -19,10 +22,9 @@ class ReactionRepositoryImpl(private val database: Database, private val idGener
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@Suppress("InjectDispatcher")
|
||||
suspend fun <T> query(block: suspend () -> T): T =
|
||||
newSuspendedTransaction(Dispatchers.IO) { block() }
|
||||
newSuspendedTransaction(Dispatchers.IO) { block() }
|
||||
|
||||
override suspend fun generateId(): Long = idGenerateService.generateId()
|
||||
|
||||
|
@ -40,7 +42,6 @@ class ReactionRepositoryImpl(private val database: Database, private val idGener
|
|||
it[emojiId] = reaction.emojiId
|
||||
it[postId] = reaction.postId
|
||||
it[userId] = reaction.userId
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,17 +50,21 @@ class ReactionRepositoryImpl(private val database: Database, private val idGener
|
|||
|
||||
override suspend fun reactionAlreadyExist(postId: Long, userId: Long, emojiId: Long): Boolean {
|
||||
return query {
|
||||
Reactions.select { Reactions.postId.eq(postId).and(Reactions.userId.eq(userId)).and(Reactions.emojiId.eq(emojiId)) }.empty().not()
|
||||
Reactions.select {
|
||||
Reactions.postId.eq(postId).and(Reactions.userId.eq(userId)).and(
|
||||
Reactions.emojiId.eq(emojiId)
|
||||
)
|
||||
}.empty().not()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun ResultRow.toReaction(): Reaction {
|
||||
return Reaction(
|
||||
this[Reactions.id].value,
|
||||
this[Reactions.emojiId],
|
||||
this[Reactions.postId],
|
||||
this[Reactions.userId]
|
||||
this[Reactions.id].value,
|
||||
this[Reactions.emojiId],
|
||||
this[Reactions.postId],
|
||||
this[Reactions.userId]
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -51,14 +51,14 @@ fun Route.posts(postApiService: IPostApiService) {
|
|||
get {
|
||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
||||
val targetUserName = call.parameters["name"]
|
||||
?: throw ParameterNotExistException("Parameter(name='userName@domain') does not exist.")
|
||||
?: throw ParameterNotExistException("Parameter(name='userName@domain') does not exist.")
|
||||
val posts = postApiService.getByUser(targetUserName, userId = userId)
|
||||
call.respond(posts)
|
||||
}
|
||||
get("/{id}") {
|
||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
||||
val id = call.parameters["id"]?.toLong()
|
||||
?: throw ParameterNotExistException("Parameter(name='postsId' does not exist.")
|
||||
?: throw ParameterNotExistException("Parameter(name='postsId' does not exist.")
|
||||
val post = postApiService.getById(id, userId)
|
||||
call.respond(post)
|
||||
}
|
||||
|
|
|
@ -43,9 +43,9 @@ fun Route.users(userService: IUserService, userApiService: IUserApiService) {
|
|||
get {
|
||||
val userParameter = (
|
||||
call.parameters["name"]
|
||||
?: throw ParameterNotExistException(
|
||||
"Parameter(name='userName@domain') does not exist."
|
||||
)
|
||||
?: throw ParameterNotExistException(
|
||||
"Parameter(name='userName@domain') does not exist."
|
||||
)
|
||||
)
|
||||
if (userParameter.toLongOrNull() != null) {
|
||||
return@get call.respond(userApiService.findById(userParameter.toLong()))
|
||||
|
@ -93,9 +93,9 @@ fun Route.users(userService: IUserService, userApiService: IUserApiService) {
|
|||
get {
|
||||
val userParameter = (
|
||||
call.parameters["name"]
|
||||
?: throw ParameterNotExistException(
|
||||
"Parameter(name='userName@domain') does not exist."
|
||||
)
|
||||
?: throw ParameterNotExistException(
|
||||
"Parameter(name='userName@domain') does not exist."
|
||||
)
|
||||
)
|
||||
if (userParameter.toLongOrNull() != null) {
|
||||
return@get call.respond(userApiService.findFollowings(userParameter.toLong()))
|
||||
|
|
|
@ -11,13 +11,14 @@ import dev.usbharu.hideout.service.user.IUserService
|
|||
import io.ktor.http.*
|
||||
import org.koin.core.annotation.Single
|
||||
|
||||
|
||||
@Single
|
||||
class ActivityPubLikeServiceImpl(private val reactionService: IReactionService,
|
||||
private val activityPubUserService: ActivityPubUserService,
|
||||
private val userService: IUserService,
|
||||
private val postService: IPostRepository,
|
||||
private val activityPubNoteService: ActivityPubNoteService) : ActivityPubLikeService {
|
||||
class ActivityPubLikeServiceImpl(
|
||||
private val reactionService: IReactionService,
|
||||
private val activityPubUserService: ActivityPubUserService,
|
||||
private val userService: IUserService,
|
||||
private val postService: IPostRepository,
|
||||
private val activityPubNoteService: ActivityPubNoteService
|
||||
) : ActivityPubLikeService {
|
||||
override suspend fun receiveLike(like: Like): ActivityPubResponse {
|
||||
val actor = like.actor ?: throw IllegalActivityPubObjectException("actor is null")
|
||||
val content = like.content ?: throw IllegalActivityPubObjectException("content is null")
|
||||
|
@ -25,11 +26,13 @@ class ActivityPubLikeServiceImpl(private val reactionService: IReactionService,
|
|||
val person = activityPubUserService.fetchPerson(actor)
|
||||
activityPubNoteService.fetchNote(like.`object`!!)
|
||||
|
||||
val user = userService.findByUrl(person.url
|
||||
?: throw IllegalActivityPubObjectException("actor is not found"))
|
||||
val user = userService.findByUrl(
|
||||
person.url
|
||||
?: throw IllegalActivityPubObjectException("actor is not found")
|
||||
)
|
||||
|
||||
val post = postService.findByUrl(like.`object`!!)
|
||||
?: throw PostNotFoundException("${like.`object`} was not found")
|
||||
?: throw PostNotFoundException("${like.`object`} was not found")
|
||||
|
||||
reactionService.receiveReaction(content, actor.substringAfter("://").substringBefore("/"), user.id, post.id)
|
||||
return ActivityPubStringResponse(HttpStatusCode.OK, "")
|
||||
|
|
|
@ -22,11 +22,11 @@ import java.time.Instant
|
|||
|
||||
@Single
|
||||
class ActivityPubNoteServiceImpl(
|
||||
private val httpClient: HttpClient,
|
||||
private val jobQueueParentService: JobQueueParentService,
|
||||
private val userService: IUserService,
|
||||
private val postRepository: IPostRepository,
|
||||
private val activityPubUserService: ActivityPubUserService
|
||||
private val httpClient: HttpClient,
|
||||
private val jobQueueParentService: JobQueueParentService,
|
||||
private val userService: IUserService,
|
||||
private val postRepository: IPostRepository,
|
||||
private val activityPubUserService: ActivityPubUserService
|
||||
) : ActivityPubNoteService {
|
||||
|
||||
private val logger = LoggerFactory.getLogger(this::class.java)
|
||||
|
@ -48,24 +48,24 @@ class ActivityPubNoteServiceImpl(
|
|||
val actor = props[DeliverPostJob.actor]
|
||||
val postEntity = Config.configData.objectMapper.readValue<Post>(props[DeliverPostJob.post])
|
||||
val note = Note(
|
||||
name = "Note",
|
||||
id = postEntity.url,
|
||||
attributedTo = actor,
|
||||
content = postEntity.text,
|
||||
published = Instant.ofEpochMilli(postEntity.createdAt).toString(),
|
||||
to = listOf(public, actor + "/follower")
|
||||
name = "Note",
|
||||
id = postEntity.url,
|
||||
attributedTo = actor,
|
||||
content = postEntity.text,
|
||||
published = Instant.ofEpochMilli(postEntity.createdAt).toString(),
|
||||
to = listOf(public, actor + "/follower")
|
||||
)
|
||||
val inbox = props[DeliverPostJob.inbox]
|
||||
logger.debug("createNoteJob: actor={}, note={}, inbox={}", actor, postEntity, inbox)
|
||||
httpClient.postAp(
|
||||
urlString = inbox,
|
||||
username = "$actor#pubkey",
|
||||
jsonLd = Create(
|
||||
name = "Create Note",
|
||||
`object` = note,
|
||||
actor = note.attributedTo,
|
||||
id = "${Config.configData.url}/create/note/${postEntity.id}"
|
||||
)
|
||||
urlString = inbox,
|
||||
username = "$actor#pubkey",
|
||||
jsonLd = Create(
|
||||
name = "Create Note",
|
||||
`object` = note,
|
||||
actor = note.attributedTo,
|
||||
id = "${Config.configData.url}/create/note/${postEntity.id}"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -75,7 +75,8 @@ class ActivityPubNoteServiceImpl(
|
|||
return postToNote(post)
|
||||
}
|
||||
val response = httpClient.getAp(
|
||||
url, targetActor?.let { "$targetActor#pubkey" }
|
||||
url,
|
||||
targetActor?.let { "$targetActor#pubkey" }
|
||||
)
|
||||
val note = Config.configData.objectMapper.readValue<Note>(response.bodyAsText())
|
||||
return note(note, targetActor, url)
|
||||
|
@ -85,44 +86,44 @@ class ActivityPubNoteServiceImpl(
|
|||
val user = userService.findById(post.userId)
|
||||
val reply = post.replyId?.let { postRepository.findOneById(it) }
|
||||
return Note(
|
||||
name = "Post",
|
||||
id = post.apId,
|
||||
attributedTo = user.url,
|
||||
content = post.text,
|
||||
published = Instant.ofEpochMilli(post.createdAt).toString(),
|
||||
to = listOf(public, user.url + "/follower"),
|
||||
sensitive = post.sensitive,
|
||||
cc = listOf(public, user.url + "/follower"),
|
||||
inReplyTo = reply?.url
|
||||
name = "Post",
|
||||
id = post.apId,
|
||||
attributedTo = user.url,
|
||||
content = post.text,
|
||||
published = Instant.ofEpochMilli(post.createdAt).toString(),
|
||||
to = listOf(public, user.url + "/follower"),
|
||||
sensitive = post.sensitive,
|
||||
cc = listOf(public, user.url + "/follower"),
|
||||
inReplyTo = reply?.url
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun ActivityPubNoteServiceImpl.note(
|
||||
note: Note,
|
||||
targetActor: String?,
|
||||
url: String
|
||||
note: Note,
|
||||
targetActor: String?,
|
||||
url: String
|
||||
): Note {
|
||||
val findByApId = postRepository.findByApId(url)
|
||||
if (findByApId != null) {
|
||||
return postToNote(findByApId)
|
||||
}
|
||||
val person = activityPubUserService.fetchPerson(
|
||||
note.attributedTo ?: throw IllegalActivityPubObjectException("note.attributedTo is null"),
|
||||
targetActor
|
||||
note.attributedTo ?: throw IllegalActivityPubObjectException("note.attributedTo is null"),
|
||||
targetActor
|
||||
)
|
||||
val user =
|
||||
userService.findByUrl(person.url ?: throw IllegalActivityPubObjectException("person.url is null"))
|
||||
userService.findByUrl(person.url ?: throw IllegalActivityPubObjectException("person.url is null"))
|
||||
|
||||
val visibility =
|
||||
if (note.to.contains(public) && note.cc.contains(public)) {
|
||||
Visibility.PUBLIC
|
||||
} else if (note.to.find { it.endsWith("/followers") } != null && note.cc.contains(public)) {
|
||||
Visibility.UNLISTED
|
||||
} else if (note.to.find { it.endsWith("/followers") } != null) {
|
||||
Visibility.FOLLOWERS
|
||||
} else {
|
||||
Visibility.DIRECT
|
||||
}
|
||||
if (note.to.contains(public) && note.cc.contains(public)) {
|
||||
Visibility.PUBLIC
|
||||
} else if (note.to.find { it.endsWith("/followers") } != null && note.cc.contains(public)) {
|
||||
Visibility.UNLISTED
|
||||
} else if (note.to.find { it.endsWith("/followers") } != null) {
|
||||
Visibility.FOLLOWERS
|
||||
} else {
|
||||
Visibility.DIRECT
|
||||
}
|
||||
|
||||
val reply = note.inReplyTo?.let {
|
||||
fetchNote(it, targetActor)
|
||||
|
@ -130,25 +131,25 @@ class ActivityPubNoteServiceImpl(
|
|||
}
|
||||
|
||||
postRepository.save(
|
||||
Post(
|
||||
id = postRepository.generateId(),
|
||||
userId = user.id,
|
||||
overview = null,
|
||||
text = note.content.orEmpty(),
|
||||
createdAt = Instant.parse(note.published).toEpochMilli(),
|
||||
visibility = visibility,
|
||||
url = note.id ?: url,
|
||||
repostId = null,
|
||||
replyId = reply?.id,
|
||||
sensitive = note.sensitive,
|
||||
apId = note.id ?: url,
|
||||
)
|
||||
Post(
|
||||
id = postRepository.generateId(),
|
||||
userId = user.id,
|
||||
overview = null,
|
||||
text = note.content.orEmpty(),
|
||||
createdAt = Instant.parse(note.published).toEpochMilli(),
|
||||
visibility = visibility,
|
||||
url = note.id ?: url,
|
||||
repostId = null,
|
||||
replyId = reply?.id,
|
||||
sensitive = note.sensitive,
|
||||
apId = note.id ?: url,
|
||||
)
|
||||
)
|
||||
return note
|
||||
}
|
||||
|
||||
override suspend fun fetchNote(note: Note, targetActor: String?): Note =
|
||||
note(note, targetActor, note.id ?: throw IllegalArgumentException("note.id is null"))
|
||||
note(note, targetActor, note.id ?: throw IllegalArgumentException("note.id is null"))
|
||||
|
||||
companion object {
|
||||
const val public: String = "https://www.w3.org/ns/activitystreams#Public"
|
||||
|
|
|
@ -17,12 +17,12 @@ import org.slf4j.LoggerFactory
|
|||
|
||||
@Single
|
||||
class ActivityPubServiceImpl(
|
||||
private val activityPubReceiveFollowService: ActivityPubReceiveFollowService,
|
||||
private val activityPubNoteService: ActivityPubNoteService,
|
||||
private val activityPubUndoService: ActivityPubUndoService,
|
||||
private val activityPubAcceptService: ActivityPubAcceptService,
|
||||
private val activityPubCreateService: ActivityPubCreateService,
|
||||
private val activityPubLikeService: ActivityPubLikeService
|
||||
private val activityPubReceiveFollowService: ActivityPubReceiveFollowService,
|
||||
private val activityPubNoteService: ActivityPubNoteService,
|
||||
private val activityPubUndoService: ActivityPubUndoService,
|
||||
private val activityPubAcceptService: ActivityPubAcceptService,
|
||||
private val activityPubCreateService: ActivityPubCreateService,
|
||||
private val activityPubLikeService: ActivityPubLikeService
|
||||
) : ActivityPubService {
|
||||
|
||||
val logger: Logger = LoggerFactory.getLogger(this::class.java)
|
||||
|
|
|
@ -3,25 +3,26 @@ package dev.usbharu.hideout.service.api
|
|||
import dev.usbharu.hideout.domain.model.hideout.entity.Post
|
||||
import java.time.Instant
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
interface IPostApiService {
|
||||
suspend fun createPost(postForm: dev.usbharu.hideout.domain.model.hideout.form.Post, userId: Long): Post
|
||||
suspend fun getById(id: Long, userId: Long?): Post
|
||||
suspend fun getAll(
|
||||
since: Instant? = null,
|
||||
until: Instant? = null,
|
||||
minId: Long? = null,
|
||||
maxId: Long? = null,
|
||||
limit: Int? = null,
|
||||
userId: Long? = null
|
||||
since: Instant? = null,
|
||||
until: Instant? = null,
|
||||
minId: Long? = null,
|
||||
maxId: Long? = null,
|
||||
limit: Int? = null,
|
||||
userId: Long? = null
|
||||
): List<Post>
|
||||
|
||||
suspend fun getByUser(
|
||||
nameOrId: String,
|
||||
since: Instant? = null,
|
||||
until: Instant? = null,
|
||||
minId: Long? = null,
|
||||
maxId: Long? = null,
|
||||
limit: Int? = null,
|
||||
userId: Long? = null
|
||||
nameOrId: String,
|
||||
since: Instant? = null,
|
||||
until: Instant? = null,
|
||||
minId: Long? = null,
|
||||
maxId: Long? = null,
|
||||
limit: Int? = null,
|
||||
userId: Long? = null
|
||||
): List<Post>
|
||||
}
|
||||
|
|
|
@ -13,58 +13,58 @@ import dev.usbharu.hideout.domain.model.hideout.form.Post as FormPost
|
|||
|
||||
@Single
|
||||
class PostApiServiceImpl(
|
||||
private val postService: IPostService,
|
||||
private val postRepository: IPostRepository
|
||||
private val postService: IPostService,
|
||||
private val postRepository: IPostRepository
|
||||
) : IPostApiService {
|
||||
override suspend fun createPost(postForm: FormPost, userId: Long): Post {
|
||||
return postService.createLocal(
|
||||
PostCreateDto(
|
||||
text = postForm.text,
|
||||
overview = postForm.overview,
|
||||
visibility = postForm.visibility,
|
||||
repostId = postForm.repostId,
|
||||
repolyId = postForm.replyId,
|
||||
userId = userId
|
||||
)
|
||||
PostCreateDto(
|
||||
text = postForm.text,
|
||||
overview = postForm.overview,
|
||||
visibility = postForm.visibility,
|
||||
repostId = postForm.repostId,
|
||||
repolyId = postForm.replyId,
|
||||
userId = userId
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun getById(id: Long, userId: Long?): Post {
|
||||
return postRepository.findOneById(id, userId)
|
||||
?: throw PostNotFoundException("$id was not found or is not authorized.")
|
||||
?: throw PostNotFoundException("$id was not found or is not authorized.")
|
||||
}
|
||||
|
||||
override suspend fun getAll(
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post> = postRepository.findAll(since, until, minId, maxId, limit, userId)
|
||||
|
||||
override suspend fun getByUser(
|
||||
nameOrId: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
nameOrId: String,
|
||||
since: Instant?,
|
||||
until: Instant?,
|
||||
minId: Long?,
|
||||
maxId: Long?,
|
||||
limit: Int?,
|
||||
userId: Long?
|
||||
): List<Post> {
|
||||
val idOrNull = nameOrId.toLongOrNull()
|
||||
return if (idOrNull == null) {
|
||||
val acct = AcctUtil.parse(nameOrId)
|
||||
postRepository.findByUserNameAndDomain(
|
||||
acct.username,
|
||||
acct.domain
|
||||
?: Config.configData.domain,
|
||||
since,
|
||||
until,
|
||||
minId,
|
||||
maxId,
|
||||
limit,
|
||||
userId
|
||||
username = acct.username,
|
||||
s = acct.domain
|
||||
?: Config.configData.domain,
|
||||
since = since,
|
||||
until = until,
|
||||
minId = minId,
|
||||
maxId = maxId,
|
||||
limit = limit,
|
||||
userId = userId
|
||||
)
|
||||
} else {
|
||||
postRepository.findByUserId(idOrNull, since, until, minId, maxId, limit, userId)
|
||||
|
|
|
@ -11,23 +11,23 @@ import java.time.Instant
|
|||
|
||||
@Single
|
||||
class PostServiceImpl(
|
||||
private val postRepository: IPostRepository,
|
||||
private val userRepository: IUserRepository,
|
||||
private val activityPubNoteService: ActivityPubNoteService
|
||||
private val postRepository: IPostRepository,
|
||||
private val userRepository: IUserRepository,
|
||||
private val activityPubNoteService: ActivityPubNoteService
|
||||
) : IPostService {
|
||||
override suspend fun createLocal(post: PostCreateDto): Post {
|
||||
val user = userRepository.findById(post.userId) ?: throw UserNotFoundException("${post.userId} was not found")
|
||||
val id = postRepository.generateId()
|
||||
val createPost = Post(
|
||||
id = id,
|
||||
userId = post.userId,
|
||||
overview = post.overview,
|
||||
text = post.text,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
visibility = post.visibility,
|
||||
url = "${user.url}/posts/$id",
|
||||
repostId = null,
|
||||
replyId = null
|
||||
id = id,
|
||||
userId = post.userId,
|
||||
overview = post.overview,
|
||||
text = post.text,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
visibility = post.visibility,
|
||||
url = "${user.url}/posts/$id",
|
||||
repostId = null,
|
||||
replyId = null
|
||||
)
|
||||
activityPubNoteService.createNote(createPost)
|
||||
return internalCreate(createPost)
|
||||
|
|
|
@ -9,7 +9,7 @@ class ReactionServiceImpl(private val reactionRepository: ReactionRepository) :
|
|||
override suspend fun receiveReaction(name: String, domain: String, userId: Long, postId: Long) {
|
||||
if (reactionRepository.reactionAlreadyExist(postId, userId, 0).not()) {
|
||||
reactionRepository.save(
|
||||
Reaction(reactionRepository.generateId(), 0, postId, userId)
|
||||
Reaction(reactionRepository.generateId(), 0, postId, userId)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,24 +41,24 @@ class PostsTest {
|
|||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
),
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 4322,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 4322,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getAll(
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = isNull()
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = isNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -120,12 +120,12 @@ class PostsTest {
|
|||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getAll(
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = isNotNull()
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = isNotNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -157,12 +157,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
12345,
|
||||
1234,
|
||||
text = "aaa",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
12345,
|
||||
1234,
|
||||
text = "aaa",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(any(), anyOrNull()) } doReturn post
|
||||
|
@ -188,12 +188,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
12345,
|
||||
1234,
|
||||
text = "aaa",
|
||||
visibility = Visibility.FOLLOWERS,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
12345,
|
||||
1234,
|
||||
text = "aaa",
|
||||
visibility = Visibility.FOLLOWERS,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(any(), isNotNull()) } doReturn post
|
||||
|
@ -243,13 +243,13 @@ class PostsTest {
|
|||
val argument = it.getArgument<dev.usbharu.hideout.domain.model.hideout.form.Post>(0)
|
||||
val userId = it.getArgument<Long>(1)
|
||||
Post(
|
||||
123L,
|
||||
userId,
|
||||
null,
|
||||
argument.text,
|
||||
Instant.now().toEpochMilli(),
|
||||
Visibility.PUBLIC,
|
||||
"https://example.com"
|
||||
123L,
|
||||
userId,
|
||||
null,
|
||||
argument.text,
|
||||
Instant.now().toEpochMilli(),
|
||||
Visibility.PUBLIC,
|
||||
"https://example.com"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -299,25 +299,25 @@ class PostsTest {
|
|||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
),
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getByUser(
|
||||
nameOrId = any(),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
nameOrId = any(),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -351,25 +351,25 @@ class PostsTest {
|
|||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
),
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getByUser(
|
||||
nameOrId = eq("test1"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
nameOrId = eq("test1"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -403,25 +403,25 @@ class PostsTest {
|
|||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
),
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getByUser(
|
||||
nameOrId = eq("test1@example.com"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
nameOrId = eq("test1@example.com"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -455,25 +455,25 @@ class PostsTest {
|
|||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/1"
|
||||
),
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking {
|
||||
getByUser(
|
||||
nameOrId = eq("@test1@example.com"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
nameOrId = eq("@test1@example.com"),
|
||||
since = anyOrNull(),
|
||||
until = anyOrNull(),
|
||||
minId = anyOrNull(),
|
||||
maxId = anyOrNull(),
|
||||
limit = anyOrNull(),
|
||||
userId = anyOrNull()
|
||||
)
|
||||
} doReturn posts
|
||||
}
|
||||
|
@ -499,12 +499,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
|
||||
|
@ -531,12 +531,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
|
||||
|
@ -563,12 +563,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
|
||||
|
@ -595,12 +595,12 @@ class PostsTest {
|
|||
config = ApplicationConfig("empty.conf")
|
||||
}
|
||||
val post = Post(
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
id = 123456,
|
||||
userId = 1,
|
||||
text = "test2",
|
||||
visibility = Visibility.PUBLIC,
|
||||
createdAt = Instant.now().toEpochMilli(),
|
||||
url = "https://example.com/posts/2"
|
||||
)
|
||||
val postService = mock<IPostApiService> {
|
||||
onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
|
||||
|
|
Loading…
Reference in New Issue