Merge pull request #505 from usbharu/auth

認可システムの改善
This commit is contained in:
usbharu 2024-08-06 00:16:10 +09:00 committed by GitHub
commit 716bf190b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
62 changed files with 202 additions and 226 deletions

View File

@ -17,10 +17,11 @@
package dev.usbharu.hideout.core.application.actor
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.emoji.CustomEmojiRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -33,8 +34,8 @@ class GetUserDetailApplicationService(
transaction: Transaction,
) :
AbstractApplicationService<GetUserDetail, UserDetail>(transaction, Companion.logger) {
override suspend fun internalExecute(command: GetUserDetail, executor: CommandExecutor): UserDetail {
val userDetail = userDetailRepository.findById(command.id)
override suspend fun internalExecute(command: GetUserDetail, principal: Principal): UserDetail {
val userDetail = userDetailRepository.findById(UserDetailId(command.id))
?: throw IllegalArgumentException("actor does not exist")
val actor = actorRepository.findById(userDetail.actorId)!!

View File

@ -17,11 +17,11 @@
package dev.usbharu.hideout.core.application.actor
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.config.ApplicationConfig
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.instance.InstanceRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetail
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
@ -46,7 +46,7 @@ class RegisterLocalActorApplicationService(
private val idGenerateService: IdGenerateService,
) : AbstractApplicationService<RegisterLocalActor, URI>(transaction, Companion.logger) {
override suspend fun internalExecute(command: RegisterLocalActor, executor: CommandExecutor): URI {
override suspend fun internalExecute(command: RegisterLocalActor, principal: Principal): URI {
if (actorDomainService.usernameAlreadyUse(command.name)) {
// todo 適切な例外を考える
throw Exception("Username already exists")

View File

@ -1,7 +1,5 @@
package dev.usbharu.hideout.core.application.domainevent.subscribers
import dev.usbharu.hideout.core.application.shared.DomainEventCommandExecutor
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.application.timeline.AddTimelineRelationship
import dev.usbharu.hideout.core.application.timeline.UserAddTimelineRelationshipApplicationService
import dev.usbharu.hideout.core.domain.event.relationship.RelationshipEvent
@ -38,12 +36,7 @@ class TimelineRelationshipFollowSubscriber(
relationship.targetActorId,
Visible.FOLLOWERS
)
), DomainEventCommandExecutor("", object : UserDetailGettableCommandExecutor {
override val userDetailId: Long
get() = userDetail.id.id
override val executor: String
get() = userDetail.id.id.toString()
})
), it.body.principal
)

View File

@ -18,10 +18,12 @@ package dev.usbharu.hideout.core.application.filter
import dev.usbharu.hideout.core.domain.model.filter.FilterAction
import dev.usbharu.hideout.core.domain.model.filter.FilterContext
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class RegisterFilter(
val filterName: String,
val filterContext: Set<FilterContext>,
val filterAction: FilterAction,
val filterKeywords: Set<RegisterFilterKeyword>,
val userDetailId: UserDetailId
)

View File

@ -17,10 +17,10 @@
package dev.usbharu.hideout.core.application.filter
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.filter.FilterId
import dev.usbharu.hideout.core.domain.model.filter.FilterRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -30,7 +30,7 @@ class UserDeleteFilterApplicationService(private val filterRepository: FilterRep
transaction,
logger
) {
override suspend fun internalExecute(command: DeleteFilter, executor: CommandExecutor) {
override suspend fun internalExecute(command: DeleteFilter, principal: Principal) {
val filter = filterRepository.findByFilterId(FilterId(command.filterId)) ?: throw Exception("not found")
filterRepository.delete(filter)
}

View File

@ -17,10 +17,10 @@
package dev.usbharu.hideout.core.application.filter
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.filter.FilterId
import dev.usbharu.hideout.core.domain.model.filter.FilterRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -30,7 +30,7 @@ class UserGetFilterApplicationService(private val filterRepository: FilterReposi
transaction,
logger
) {
override suspend fun internalExecute(command: GetFilter, executor: CommandExecutor): Filter {
override suspend fun internalExecute(command: GetFilter, principal: Principal): Filter {
val filter = filterRepository.findByFilterId(FilterId(command.filterId)) ?: throw Exception("Not Found")
return Filter.of(filter)

View File

@ -17,12 +17,10 @@
package dev.usbharu.hideout.core.application.filter
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.filter.*
import dev.usbharu.hideout.core.domain.model.filter.FilterKeyword
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.shared.id.IdGenerateService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -38,12 +36,11 @@ class UserRegisterFilterApplicationService(
logger
) {
override suspend fun internalExecute(command: RegisterFilter, executor: CommandExecutor): Filter {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: RegisterFilter, principal: Principal): Filter {
val filter = dev.usbharu.hideout.core.domain.model.filter.Filter.create(
id = FilterId(idGenerateService.generateId()),
userDetailId = UserDetailId(executor.userDetailId),
userDetailId = command.userDetailId,
name = FilterName(command.filterName),
filterContext = command.filterContext,
filterAction = command.filterAction,

View File

@ -17,9 +17,9 @@
package dev.usbharu.hideout.core.application.media
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.media.*
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.shared.id.IdGenerateService
import dev.usbharu.hideout.core.external.media.MediaProcessor
import dev.usbharu.hideout.core.external.mediastore.MediaStore
@ -39,7 +39,7 @@ class UploadMediaApplicationService(
transaction,
logger
) {
override suspend fun internalExecute(command: UploadMedia, executor: CommandExecutor): Media {
override suspend fun internalExecute(command: UploadMedia, principal: Principal): Media {
val process = mediaProcessor.process(command.path, command.name, null)
val id = idGenerateService.generateId()
val thumbnailUri = if (process.thumbnailPath != null) {

View File

@ -19,6 +19,7 @@ package dev.usbharu.hideout.core.application.post
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.post.PostId
import dev.usbharu.hideout.core.domain.model.post.PostRepository
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.springframework.stereotype.Service
@ -30,7 +31,7 @@ class DeleteLocalPostApplicationService(
) {
suspend fun delete(postId: Long, userDetailId: Long) {
val findById = postRepository.findById(PostId(postId))!!
val user = userDetailRepository.findById(userDetailId)!!
val user = userDetailRepository.findById(UserDetailId(userDetailId))!!
val actor = actorRepository.findById(user.actorId)!!
findById.delete(actor)
postRepository.save(findById)

View File

@ -17,10 +17,10 @@
package dev.usbharu.hideout.core.application.post
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.post.PostId
import dev.usbharu.hideout.core.domain.model.post.PostRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -28,7 +28,7 @@ import org.springframework.stereotype.Service
class GetPostApplicationService(private val postRepository: PostRepository, transaction: Transaction) :
AbstractApplicationService<GetPost, Post>(transaction, logger) {
override suspend fun internalExecute(command: GetPost, executor: CommandExecutor): Post {
override suspend fun internalExecute(command: GetPost, principal: Principal): Post {
val post = postRepository.findById(PostId(command.postId)) ?: throw Exception("Post not found")
return Post.of(post)

View File

@ -17,13 +17,14 @@
package dev.usbharu.hideout.core.application.post
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.media.MediaId
import dev.usbharu.hideout.core.domain.model.post.PostId
import dev.usbharu.hideout.core.domain.model.post.PostOverview
import dev.usbharu.hideout.core.domain.model.post.PostRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import dev.usbharu.hideout.core.infrastructure.factory.PostFactoryImpl
import org.slf4j.Logger
@ -39,9 +40,9 @@ class RegisterLocalPostApplicationService(
transaction: Transaction,
) : AbstractApplicationService<RegisterLocalPost, Long>(transaction, Companion.logger) {
override suspend fun internalExecute(command: RegisterLocalPost, executor: CommandExecutor): Long {
override suspend fun internalExecute(command: RegisterLocalPost, principal: Principal): Long {
val actorId = (
userDetailRepository.findById(command.userDetailId)
userDetailRepository.findById(UserDetailId(command.userDetailId))
?: throw IllegalStateException("actor not found")
).actorId

View File

@ -16,10 +16,13 @@
package dev.usbharu.hideout.core.application.post
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class UpdateLocalNote(
val postId: Long,
val overview: String?,
val content: String,
val sensitive: Boolean,
val mediaIds: List<Long>,
val userDetailId: UserDetailId
)

View File

@ -17,14 +17,13 @@
package dev.usbharu.hideout.core.application.post
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.media.MediaId
import dev.usbharu.hideout.core.domain.model.post.PostId
import dev.usbharu.hideout.core.domain.model.post.PostOverview
import dev.usbharu.hideout.core.domain.model.post.PostRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import dev.usbharu.hideout.core.infrastructure.factory.PostContentFactoryImpl
import org.slf4j.LoggerFactory
@ -39,10 +38,9 @@ class UpdateLocalNoteApplicationService(
private val actorRepository: ActorRepository,
) : AbstractApplicationService<UpdateLocalNote, Unit>(transaction, logger) {
override suspend fun internalExecute(command: UpdateLocalNote, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: UpdateLocalNote, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val post = postRepository.findById(PostId(command.postId))!!

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.acceptfollowrequest
data class AcceptFollowRequest(val sourceActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class AcceptFollowRequest(val sourceActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,12 +18,11 @@ package dev.usbharu.hideout.core.application.relationship.acceptfollowrequest
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -36,10 +35,9 @@ class UserAcceptFollowRequestApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<AcceptFollowRequest, Unit>(transaction, logger) {
override suspend fun internalExecute(command: AcceptFollowRequest, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: AcceptFollowRequest, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.sourceActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.block
data class Block(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class Block(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -17,13 +17,12 @@
package dev.usbharu.hideout.core.application.relationship.block
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import dev.usbharu.hideout.core.domain.service.relationship.RelationshipDomainService
import org.slf4j.LoggerFactory
@ -38,10 +37,9 @@ class UserBlockApplicationService(
private val relationshipDomainService: RelationshipDomainService,
) :
AbstractApplicationService<Block, Unit>(transaction, logger) {
override suspend fun internalExecute(command: Block, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: Block, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.followrequest
data class FollowRequest(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class FollowRequest(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -17,13 +17,12 @@
package dev.usbharu.hideout.core.application.relationship.followrequest
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -39,10 +38,9 @@ class UserFollowRequestApplicationService(
logger
) {
override suspend fun internalExecute(command: FollowRequest, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: FollowRequest, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.get
data class GetRelationship(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class GetRelationship(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -17,14 +17,13 @@
package dev.usbharu.hideout.core.application.relationship.get
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.actorinstancerelationship.ActorInstanceRelationship
import dev.usbharu.hideout.core.domain.model.actorinstancerelationship.ActorInstanceRelationshipRepository
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -41,9 +40,8 @@ class GetRelationshipApplicationService(
transaction,
logger
) {
override suspend fun internalExecute(command: GetRelationship, executor: CommandExecutor): Relationship {
require(executor is UserDetailGettableCommandExecutor)
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
override suspend fun internalExecute(command: GetRelationship, principal: Principal): Relationship {
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)
val target = actorRepository.findById(targetId)!!

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.mute
data class Mute(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class Mute(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,13 +18,12 @@ package dev.usbharu.hideout.core.application.relationship.mute
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -37,10 +36,9 @@ class UserMuteApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<Mute, Unit>(transaction, logger) {
override suspend fun internalExecute(command: Mute, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: Mute, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.rejectfollowrequest
data class RejectFollowRequest(val sourceActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class RejectFollowRequest(val sourceActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,12 +18,11 @@ package dev.usbharu.hideout.core.application.relationship.rejectfollowrequest
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -36,10 +35,9 @@ class UserRejectFollowRequestApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<RejectFollowRequest, Unit>(transaction, logger) {
override suspend fun internalExecute(command: RejectFollowRequest, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: RejectFollowRequest, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.sourceActorId)

View File

@ -16,4 +16,4 @@
package dev.usbharu.hideout.core.application.relationship.removefromfollowers
data class RemoveFromFollowers(val targetActorId: Long)
data class RemoveFromFollowers(val targetActorId: Long, val userDetailId: Long)

View File

@ -18,13 +18,13 @@ package dev.usbharu.hideout.core.application.relationship.removefromfollowers
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -37,10 +37,9 @@ class UserRemoveFromFollowersApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<RemoveFromFollowers, Unit>(transaction, logger) {
override suspend fun internalExecute(command: RemoveFromFollowers, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: RemoveFromFollowers, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(UserDetailId(command.userDetailId))!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.unblock
data class Unblock(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class Unblock(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,13 +18,12 @@ package dev.usbharu.hideout.core.application.relationship.unblock
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -37,10 +36,9 @@ class UserUnblockApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<Unblock, Unit>(transaction, logger) {
override suspend fun internalExecute(command: Unblock, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: Unblock, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.unfollow
data class Unfollow(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class Unfollow(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,13 +18,12 @@ package dev.usbharu.hideout.core.application.relationship.unfollow
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -37,10 +36,9 @@ class UserUnfollowApplicationService(
private val userDetailRepository: UserDetailRepository,
) :
AbstractApplicationService<Unfollow, Unit>(transaction, logger) {
override suspend fun internalExecute(command: Unfollow, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: Unfollow, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,4 +16,6 @@
package dev.usbharu.hideout.core.application.relationship.unmute
data class Unmute(val targetActorId: Long)
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
data class Unmute(val targetActorId: Long, val userDetailId: UserDetailId)

View File

@ -18,13 +18,12 @@ package dev.usbharu.hideout.core.application.relationship.unmute
import dev.usbharu.hideout.core.application.relationship.block.UserBlockApplicationService
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.application.shared.UserDetailGettableCommandExecutor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.relationship.RelationshipRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -41,10 +40,9 @@ class UserUnmuteApplicationService(
private val logger = LoggerFactory.getLogger(UserBlockApplicationService::class.java)
}
override suspend fun internalExecute(command: Unmute, executor: CommandExecutor) {
require(executor is UserDetailGettableCommandExecutor)
override suspend fun internalExecute(command: Unmute, principal: Principal) {
val userDetail = userDetailRepository.findById(executor.userDetailId)!!
val userDetail = userDetailRepository.findById(command.userDetailId)!!
val actor = actorRepository.findById(userDetail.actorId)!!
val targetId = ActorId(command.targetActorId)

View File

@ -16,6 +16,7 @@
package dev.usbharu.hideout.core.application.shared
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import kotlinx.coroutines.CancellationException
import org.slf4j.Logger
@ -23,13 +24,13 @@ abstract class AbstractApplicationService<T : Any, R>(
protected val transaction: Transaction,
protected val logger: Logger,
) : ApplicationService<T, R> {
override suspend fun execute(command: T, executor: CommandExecutor): R {
override suspend fun execute(command: T, principal: Principal): R {
return try {
logger.debug("START {} by {}", command::class.simpleName, executor)
logger.debug("START {}", command::class.simpleName)
val response = transaction.transaction<R> {
internalExecute(command, executor)
internalExecute(command, principal)
}
logger.info("SUCCESS ${command::class.simpleName} by ${executor.executor}")
logger.info("SUCCESS ${command::class.simpleName}")
response
} catch (e: CancellationException) {
logger.debug("Coroutine canceled", e)
@ -40,5 +41,5 @@ abstract class AbstractApplicationService<T : Any, R>(
}
}
protected abstract suspend fun internalExecute(command: T, executor: CommandExecutor): R
protected abstract suspend fun internalExecute(command: T, principal: Principal): R
}

View File

@ -16,6 +16,8 @@
package dev.usbharu.hideout.core.application.shared
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
interface ApplicationService<T : Any, R> {
suspend fun execute(command: T, executor: CommandExecutor): R
suspend fun execute(command: T, principal: Principal): R
}

View File

@ -0,0 +1,15 @@
package dev.usbharu.hideout.core.application.shared
import dev.usbharu.hideout.core.domain.model.support.principal.FromApi
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.Logger
abstract class LocalUserAbstractApplicationService<T : Any, R>(transaction: Transaction, logger: Logger) :
AbstractApplicationService<T, R>(transaction, logger) {
override suspend fun internalExecute(command: T, principal: Principal): R {
require(principal is FromApi)
return internalExecute(command, principal)
}
abstract suspend fun internalExecute(command: T, principal: FromApi): R
}

View File

@ -1,8 +1,8 @@
package dev.usbharu.hideout.core.application.timeline
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.model.timelinerelationship.TimelineRelationshipRepository
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -15,7 +15,7 @@ class UserAddTimelineRelationshipApplicationService(
AbstractApplicationService<AddTimelineRelationship, Unit>(
transaction, logger
) {
override suspend fun internalExecute(command: AddTimelineRelationship, executor: CommandExecutor) {
override suspend fun internalExecute(command: AddTimelineRelationship, principal: Principal) {
timelineRelationshipRepository.save(command.timelineRelationship)
}

View File

@ -33,7 +33,7 @@ class ActorDomainEventFactory(private val actor: Actor) {
class ActorEventBody(actor: Actor) : DomainEventBody(
mapOf(
"actor" to actor
)
),
)
enum class ActorEvent(val eventName: String, val collectable: Boolean = true) {

View File

@ -39,7 +39,7 @@ class ActorInstanceRelationshipEventBody(actorInstanceRelationship: ActorInstanc
"muting" to actorInstanceRelationship.muting,
"blocking" to actorInstanceRelationship.blocking,
"doNotSendPrivate" to actorInstanceRelationship.doNotSendPrivate,
)
),
)
enum class ActorInstanceRelationshipEvent(val eventName: String) {

View File

@ -17,15 +17,20 @@
package dev.usbharu.hideout.core.domain.event.relationship
import dev.usbharu.hideout.core.domain.model.relationship.Relationship
import dev.usbharu.hideout.core.domain.model.support.principal.Anonymous
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEvent
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventBody
class RelationshipEventFactory(private val relationship: Relationship) {
class RelationshipEventFactory(private val relationship: Relationship, private val principal: Principal = Anonymous) {
fun createEvent(relationshipEvent: RelationshipEvent): DomainEvent<RelationshipEventBody> =
DomainEvent.create(relationshipEvent.eventName, RelationshipEventBody(relationship))
DomainEvent.create(relationshipEvent.eventName, RelationshipEventBody(relationship, principal))
}
class RelationshipEventBody(relationship: Relationship) : DomainEventBody(mapOf("relationship" to relationship)) {
class RelationshipEventBody(
relationship: Relationship,
override val principal: Principal
) : DomainEventBody(mapOf("relationship" to relationship), principal) {
fun getRelationship(): Relationship {
return toMap()["relationship"] as Relationship
}

View File

@ -54,7 +54,6 @@ class Actor(
moveTo: ActorId? = null,
emojiIds: Set<EmojiId>,
deleted: Boolean,
roles: Set<Role>,
icon: MediaId?,
banner: MediaId?,
) : DomainEventStorable() {
@ -62,7 +61,7 @@ class Actor(
var banner = banner
private set
fun setBannerUrl(banner: MediaId?, actor: Actor) {
fun setBannerUrl(banner: MediaId?) {
addDomainEvent(ActorDomainEventFactory(this).createEvent(UPDATE))
this.banner = banner
}
@ -70,20 +69,11 @@ class Actor(
var icon = icon
private set
fun setIconUrl(icon: MediaId?, actor: Actor) {
fun setIconUrl(icon: MediaId?) {
addDomainEvent(ActorDomainEventFactory(this).createEvent(UPDATE))
this.icon = icon
}
var roles = roles
private set
fun setRole(roles: Set<Role>, actor: Actor) {
require(actor.roles.contains(Role.ADMINISTRATOR))
this.roles = roles
}
var suspend = suspend
set(value) {
if (field != value && value) {

View File

@ -20,11 +20,9 @@ import dev.usbharu.hideout.core.domain.event.post.PostDomainEventFactory
import dev.usbharu.hideout.core.domain.event.post.PostEvent
import dev.usbharu.hideout.core.domain.model.actor.Actor
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.Role
import dev.usbharu.hideout.core.domain.model.emoji.EmojiId
import dev.usbharu.hideout.core.domain.model.instance.InstanceId
import dev.usbharu.hideout.core.domain.model.media.MediaId
import dev.usbharu.hideout.core.domain.model.post.Post.Companion.Action.*
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventStorable
import java.net.URI
import java.time.Instant
@ -62,7 +60,6 @@ class Post(
private set
fun setVisibility(visibility: Visibility, actor: Actor) {
require(isAllow(actor, UPDATE, this))
require(this.visibility != Visibility.DIRECT)
require(visibility != Visibility.DIRECT)
require(this.visibility.ordinal >= visibility.ordinal)
@ -79,7 +76,6 @@ class Post(
private set
fun setVisibleActors(visibleActors: Set<ActorId>, actor: Actor) {
require(isAllow(actor, UPDATE, this))
require(deleted.not())
if (visibility == Visibility.DIRECT) {
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.UPDATE))
@ -97,7 +93,6 @@ class Post(
private set
fun setContent(content: PostContent, actor: Actor) {
require(isAllow(actor, UPDATE, this))
require(deleted.not())
if (this.content != content) {
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.UPDATE))
@ -115,7 +110,6 @@ class Post(
private set
fun setOverview(overview: PostOverview?, actor: Actor) {
require(isAllow(actor, UPDATE, this))
require(deleted.not())
if (this.overview != overview) {
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.UPDATE))
@ -127,7 +121,6 @@ class Post(
private set
fun setSensitive(sensitive: Boolean, actor: Actor) {
isAllow(actor, UPDATE, this)
require(deleted.not())
if (this.sensitive != sensitive) {
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.UPDATE))
@ -161,7 +154,6 @@ class Post(
private set
fun addMediaIds(mediaIds: List<MediaId>, actor: Actor) {
require(isAllow(actor, UPDATE, this))
require(deleted.not())
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.UPDATE))
this.mediaIds = this.mediaIds.plus(mediaIds).distinct()
@ -171,7 +163,6 @@ class Post(
private set
fun delete(actor: Actor) {
isAllow(actor, DELETE, this)
if (deleted.not()) {
addDomainEvent(PostDomainEventFactory(this, actor).createEvent(PostEvent.DELETE))
content = PostContent.empty
@ -209,7 +200,6 @@ class Post(
private set
fun moveTo(moveTo: PostId, actor: Actor) {
require(isAllow(actor, MOVE, this))
require(this.moveTo == null)
this.moveTo = moveTo
}
@ -324,26 +314,5 @@ class Post(
return post
}
fun isAllow(actor: Actor, action: Action, resource: Post): Boolean {
return when (action) {
UPDATE -> {
resource.actorId == actor.id || actor.roles.contains(Role.ADMINISTRATOR) || actor.roles.contains(
Role.MODERATOR
)
}
MOVE -> resource.actorId == actor.id && actor.deleted.not()
DELETE ->
resource.actorId == actor.id ||
actor.roles.contains(Role.ADMINISTRATOR) ||
actor.roles.contains(Role.MODERATOR)
}
}
enum class Action {
UPDATE,
MOVE,
DELETE,
}
}
}

View File

@ -0,0 +1,10 @@
package dev.usbharu.hideout.core.domain.model.support.acct
data class Acct(
val userpart: String,
val host: String
) {
override fun toString(): String {
return "acct:$userpart@$host"
}
}

View File

@ -0,0 +1,5 @@
package dev.usbharu.hideout.core.domain.model.support.principal
import dev.usbharu.hideout.core.domain.model.actor.ActorId
data object Anonymous : Principal(ActorId.ghost, null, null)

View File

@ -0,0 +1,10 @@
package dev.usbharu.hideout.core.domain.model.support.principal
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.support.acct.Acct
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
class FromApi(actorId: ActorId, override val userDetailId: UserDetailId, override val acct: Acct) : Principal(
actorId, userDetailId,
acct
)

View File

@ -0,0 +1,7 @@
package dev.usbharu.hideout.core.domain.model.support.principal
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.support.acct.Acct
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
sealed class Principal(open val actorId: ActorId, open val userDetailId: UserDetailId?, open val acct: Acct?)

View File

@ -20,6 +20,6 @@ interface UserDetailRepository {
suspend fun save(userDetail: UserDetail): UserDetail
suspend fun delete(userDetail: UserDetail)
suspend fun findByActorId(actorId: Long): UserDetail?
suspend fun findById(id: Long): UserDetail?
suspend fun findById(userDetailId: UserDetailId): UserDetail?
suspend fun findAllById(idList: List<UserDetailId>): List<UserDetail>
}

View File

@ -16,7 +16,9 @@
package dev.usbharu.hideout.core.domain.shared.domainevent
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
@Suppress("UnnecessaryAbstractClass")
abstract class DomainEventBody(private val map: Map<String, Any?>) {
abstract class DomainEventBody(private val map: Map<String, Any?>, open val principal: Principal? = null) {
fun toMap(): Map<String, Any?> = map
}

View File

@ -60,7 +60,6 @@ class ActorResultRowMapper : ResultRowMapper<Actor> {
.map { EmojiId(it.toLong()) }
.toSet(),
deleted = resultRow[Actors.deleted],
roles = emptySet(),
icon = resultRow[Actors.icon]?.let { MediaId(it) },
banner = resultRow[Actors.banner]?.let { MediaId(it) }
)

View File

@ -69,9 +69,9 @@ class UserDetailRepositoryImpl : UserDetailRepository, AbstractRepository() {
}
}
override suspend fun findById(id: Long): UserDetail? = query {
override suspend fun findById(id: UserDetailId): UserDetail? = query {
UserDetails
.selectAll().where { UserDetails.id eq id }
.selectAll().where { UserDetails.id eq id.id }
.singleOrNull()
?.let {
userDetail(it)

View File

@ -61,7 +61,6 @@ class ActorFactoryImpl(
suspend = false,
emojiIds = emptySet(),
deleted = false,
roles = emptySet(),
banner = null,
icon = null
)

View File

@ -18,6 +18,7 @@ package dev.usbharu.hideout.core.interfaces.api.auth
import dev.usbharu.hideout.core.application.actor.RegisterLocalActor
import dev.usbharu.hideout.core.application.actor.RegisterLocalActorApplicationService
import dev.usbharu.hideout.core.domain.model.support.principal.Anonymous
import dev.usbharu.hideout.core.infrastructure.springframework.SpringMvcCommandExecutorFactory
import jakarta.servlet.http.HttpServletRequest
import org.springframework.stereotype.Controller
@ -39,8 +40,7 @@ class AuthController(
suspend fun signUp(@Validated @ModelAttribute signUpForm: SignUpForm, request: HttpServletRequest): String {
val registerLocalActor = RegisterLocalActor(signUpForm.username, signUpForm.password)
val uri = registerLocalActorApplicationService.execute(
registerLocalActor,
springMvcCommandExecutorFactory.getCommandExecutor()
registerLocalActor, Anonymous
)
request.login(signUpForm.username, signUpForm.password)
return "redirect:$uri"

View File

@ -3,7 +3,6 @@ package dev.usbharu.hideout.core.domain.model.actor
import dev.usbharu.hideout.core.domain.event.actor.ActorEvent
import dev.usbharu.hideout.core.domain.model.media.MediaId
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
import org.junit.jupiter.api.assertThrows
import utils.AssertDomainEvent.assertContainsEvent
import utils.AssertDomainEvent.assertEmpty
@ -134,7 +133,7 @@ class ActorsTest {
fun bannerが設定されたらupdateイベントが発生する() {
val actor = TestActorFactory.create(publicKey = ActorPublicKey(""))
actor.setBannerUrl(MediaId(1), actor)
actor.setBannerUrl(MediaId(1))
assertContainsEvent(actor, ActorEvent.UPDATE.eventName)
}
@ -143,30 +142,8 @@ class ActorsTest {
fun iconが設定されたらupdateイベントが発生する() {
val actor = TestActorFactory.create(publicKey = ActorPublicKey(""))
actor.setIconUrl(MediaId(1), actor)
actor.setIconUrl(MediaId(1))
assertContainsEvent(actor, ActorEvent.UPDATE.eventName)
}
@Test
fun administratorロールを持っている人はroleを設定できる() {
val admin = TestActorFactory.create(roles = setOf(Role.ADMINISTRATOR))
val actor = TestActorFactory.create()
assertDoesNotThrow {
actor.setRole(setOf(Role.MODERATOR), admin)
}
}
@Test
fun administratorロールを持ってないとはroleを設定できない() {
val admin = TestActorFactory.create(roles = setOf(Role.MODERATOR))
val actor = TestActorFactory.create()
assertThrows<IllegalArgumentException> {
actor.setRole(setOf(Role.MODERATOR), admin)
}
}
}

View File

@ -66,7 +66,6 @@ object TestActorFactory {
moveTo = moveTo?.let { ActorId(it) },
emojiIds = emojiIds,
deleted = deleted,
roles = roles,
icon = null,
banner = null,

View File

@ -17,8 +17,8 @@
package dev.usbharu.hideout.mastodon.application.accounts
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.mastodon.interfaces.api.generated.model.Account
import dev.usbharu.hideout.mastodon.query.AccountQueryService
import org.slf4j.LoggerFactory
@ -30,7 +30,7 @@ class GetAccountApplicationService(private val accountQueryService: AccountQuery
transaction,
logger
) {
override suspend fun internalExecute(command: GetAccount, executor: CommandExecutor): Account {
override suspend fun internalExecute(command: GetAccount, principal: Principal): Account {
return accountQueryService.findById(command.accountId.toLong()) ?: throw Exception("Account not found")
}

View File

@ -17,10 +17,10 @@
package dev.usbharu.hideout.mastodon.application.filter
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.filter.FilterKeywordId
import dev.usbharu.hideout.core.domain.model.filter.FilterRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@ -33,7 +33,7 @@ class DeleteFilterV1ApplicationService(private val filterRepository: FilterRepos
private val logger = LoggerFactory.getLogger(DeleteFilterV1ApplicationService::class.java)
}
override suspend fun internalExecute(command: DeleteFilterV1, executor: CommandExecutor) {
override suspend fun internalExecute(command: DeleteFilterV1, principal: Principal) {
val filter = filterRepository.findByFilterKeywordId(FilterKeywordId(command.filterKeywordId))
?: throw Exception("Not Found")
filterRepository.delete(filter)

View File

@ -17,12 +17,12 @@
package dev.usbharu.hideout.mastodon.application.filter
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.filter.FilterContext.*
import dev.usbharu.hideout.core.domain.model.filter.FilterKeywordId
import dev.usbharu.hideout.core.domain.model.filter.FilterMode
import dev.usbharu.hideout.core.domain.model.filter.FilterRepository
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.mastodon.interfaces.api.generated.model.V1Filter
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Repository
@ -32,7 +32,7 @@ class GetFilterV1ApplicationService(private val filterRepository: FilterReposito
AbstractApplicationService<GetFilterV1, V1Filter>(
transaction, logger
) {
override suspend fun internalExecute(command: GetFilterV1, executor: CommandExecutor): V1Filter {
override suspend fun internalExecute(command: GetFilterV1, principal: Principal): V1Filter {
val filter = filterRepository.findByFilterKeywordId(FilterKeywordId(command.filterKeywordId))
?: throw Exception("Not Found")

View File

@ -17,8 +17,8 @@
package dev.usbharu.hideout.mastodon.application.status
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.CommandExecutor
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import dev.usbharu.hideout.mastodon.interfaces.api.generated.model.Status
import dev.usbharu.hideout.mastodon.query.StatusQueryService
import org.slf4j.LoggerFactory
@ -36,7 +36,7 @@ class GetStatusApplicationService(
val logger = LoggerFactory.getLogger(GetStatusApplicationService::class.java)!!
}
override suspend fun internalExecute(command: GetStatus, executor: CommandExecutor): Status {
override suspend fun internalExecute(command: GetStatus, principal: Principal): Status {
return statusQueryService.findByPostId(command.id.toLong()) ?: throw Exception("Not fount")
}
}

View File

@ -67,7 +67,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdBlockPost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userBlockApplicationService.execute(Block(id.toLong()), executor)
userBlockApplicationService.execute(Block(id.toLong()))
return fetchRelationship(id, executor)
}
@ -77,7 +77,7 @@ class SpringAccountApi(
): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userFollowRequestApplicationService.execute(
FollowRequest(id.toLong()), executor
FollowRequest(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -86,7 +86,7 @@ class SpringAccountApi(
id: String,
executor: Oauth2CommandExecutor,
): ResponseEntity<Relationship> {
val relationship = getRelationshipApplicationService.execute(GetRelationship(id.toLong()), executor)
val relationship = getRelationshipApplicationService.execute(GetRelationship(id.toLong()))
return ResponseEntity.ok(
Relationship(
id = relationship.targetId.toString(),
@ -109,8 +109,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdGet(id: String): ResponseEntity<Account> {
return ResponseEntity.ok(
getAccountApplicationService.execute(
GetAccount(id),
oauth2CommandExecutorFactory.getCommandExecutor()
GetAccount(id)
)
)
}
@ -118,7 +117,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdMutePost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userMuteApplicationService.execute(
Mute(id.toLong()), executor
Mute(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -126,7 +125,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdRemoveFromFollowersPost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userRemoveFromFollowersApplicationService.execute(
RemoveFromFollowers(id.toLong()), executor
RemoveFromFollowers(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -134,7 +133,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdUnblockPost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userUnblockApplicationService.execute(
Unblock(id.toLong()), executor
Unblock(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -142,7 +141,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdUnfollowPost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userUnfollowApplicationService.execute(
Unfollow(id.toLong()), executor
Unfollow(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -150,7 +149,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsIdUnmutePost(id: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userUnmuteApplicationService.execute(
Unmute(id.toLong()), executor
Unmute(id.toLong())
)
return fetchRelationship(id, executor)
}
@ -166,7 +165,7 @@ class SpringAccountApi(
override suspend fun apiV1AccountsVerifyCredentialsGet(): ResponseEntity<CredentialAccount> {
val commandExecutor = oauth2CommandExecutorFactory.getCommandExecutor()
val localActor =
getUserDetailApplicationService.execute(GetUserDetail(commandExecutor.userDetailId), commandExecutor)
getUserDetailApplicationService.execute(GetUserDetail(commandExecutor.userDetailId))
return ResponseEntity.ok(
CredentialAccount(
@ -218,7 +217,7 @@ class SpringAccountApi(
override suspend fun apiV1FollowRequestsAccountIdAuthorizePost(accountId: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userAcceptFollowRequestApplicationService.execute(
AcceptFollowRequest(accountId.toLong()), executor
AcceptFollowRequest(accountId.toLong())
)
return fetchRelationship(accountId, executor)
}
@ -226,7 +225,7 @@ class SpringAccountApi(
override suspend fun apiV1FollowRequestsAccountIdRejectPost(accountId: String): ResponseEntity<Relationship> {
val executor = oauth2CommandExecutorFactory.getCommandExecutor()
userRejectFollowRequestApplicationService.execute(
RejectFollowRequest(accountId.toLong()), executor
RejectFollowRequest(accountId.toLong())
)
return fetchRelationship(accountId, executor)
}

View File

@ -47,8 +47,7 @@ class SpringFilterApi(
override suspend fun apiV1FiltersIdDelete(id: String): ResponseEntity<Any> {
return ResponseEntity.ok(
deleteFilterV1ApplicationService.execute(
DeleteFilterV1(id.toLong()),
oauth2CommandExecutorFactory.getCommandExecutor()
DeleteFilterV1(id.toLong())
)
)
}
@ -56,8 +55,7 @@ class SpringFilterApi(
override suspend fun apiV1FiltersIdGet(id: String): ResponseEntity<V1Filter> {
return ResponseEntity.ok(
getFilterV1ApplicationService.execute(
GetFilterV1(id.toLong()),
oauth2CommandExecutorFactory.getCommandExecutor()
GetFilterV1(id.toLong())
)
)
}
@ -93,12 +91,11 @@ class SpringFilterApi(
RegisterFilter(
v1FilterPostRequest.phrase, filterContext, FilterAction.WARN,
setOf(RegisterFilterKeyword(v1FilterPostRequest.phrase, filterMode))
), executor
)
)
return ResponseEntity.ok(
getFilterV1ApplicationService.execute(
GetFilterV1(filter.filterKeywords.first().id),
executor
GetFilterV1(filter.filterKeywords.first().id)
)
)
}
@ -119,16 +116,14 @@ class SpringFilterApi(
override suspend fun apiV2FiltersIdDelete(id: String): ResponseEntity<Any> {
userDeleteFilterApplicationService.execute(
DeleteFilter(id.toLong()),
oauth2CommandExecutorFactory.getCommandExecutor()
DeleteFilter(id.toLong())
)
return ResponseEntity.ok(Unit)
}
override suspend fun apiV2FiltersIdGet(id: String): ResponseEntity<Filter> {
val filter = userGetFilterApplicationService.execute(
GetFilter(id.toLong()),
oauth2CommandExecutorFactory.getCommandExecutor()
GetFilter(id.toLong())
)
return ResponseEntity.ok(
filter(filter)
@ -221,7 +216,7 @@ class SpringFilterApi(
}
)
}.toSet()
), executor
)
)
return ResponseEntity.ok(filter(filter))
}

View File

@ -52,8 +52,7 @@ class SpringMediaApi(
file.originalFilename ?: file.name,
null,
description
),
oauth2CommandExecutorFactory.getCommandExecutor()
)
)
return ResponseEntity.ok(

View File

@ -48,8 +48,7 @@ class SpringStatusApi(
return ResponseEntity.ok(
getStatusApplicationService.execute(
GetStatus(id),
delegateCommandExecutorFactory.getCommandExecutor()
GetStatus(id)
)
)
}
@ -72,12 +71,11 @@ class SpringStatusApi(
replyId = statusesRequest.inReplyToId?.toLong(),
sensitive = statusesRequest.sensitive == true,
mediaIds = statusesRequest.mediaIds.orEmpty().map { it.toLong() }
),
executor
)
)
val status = getStatusApplicationService.execute(GetStatus(execute.toString()), executor)
val status = getStatusApplicationService.execute(GetStatus(execute.toString()))
return ResponseEntity.ok(
status
)