feat: Mastodon APIからフォロー解除・ブロック解除ができるように

This commit is contained in:
usbharu 2023-12-11 11:28:43 +09:00
parent c57ba6d434
commit 539c65ada2
5 changed files with 82 additions and 3 deletions

View File

@ -197,7 +197,9 @@ class SecurityConfig {
authorize(GET, "/api/v1/accounts/*", permitAll) authorize(GET, "/api/v1/accounts/*", permitAll)
authorize(GET, "/api/v1/accounts/*/statuses", permitAll) authorize(GET, "/api/v1/accounts/*/statuses", permitAll)
authorize(POST, "/api/v1/accounts/*/follow", hasAnyScope("write", "write:follows")) authorize(POST, "/api/v1/accounts/*/follow", hasAnyScope("write", "write:follows"))
authorize(POST, "/api/v1/accounts/*/unfollow", hasAnyScope("write", "write:follows"))
authorize(POST, "/api/v1/accounts/*/block", hasAnyScope("write", "write:blocks")) authorize(POST, "/api/v1/accounts/*/block", hasAnyScope("write", "write:blocks"))
authorize(POST, "/api/v1/accounts/*/unblock", hasAnyScope("write", "write:blocks"))
authorize(POST, "/api/v1/media", hasAnyScope("write", "write:media")) authorize(POST, "/api/v1/media", hasAnyScope("write", "write:media"))
authorize(POST, "/api/v1/statuses", hasAnyScope("write", "write:statuses")) authorize(POST, "/api/v1/statuses", hasAnyScope("write", "write:statuses"))

View File

@ -167,7 +167,7 @@ class RelationshipServiceImpl(
return return
} }
if (relationship.followRequest.not()) { if (relationship.followRequest.not() && relationship.following.not()) {
logger.warn("FAILED Follow Request Not Found. (Follow Request) userId: {} targetId: {}", userId, targetId) logger.warn("FAILED Follow Request Not Found. (Follow Request) userId: {} targetId: {}", userId, targetId)
return return
} }

View File

@ -113,4 +113,24 @@ class MastodonAccountApiController(
return ResponseEntity.ok(block) return ResponseEntity.ok(block)
} }
override suspend fun apiV1AccountsIdUnblockPost(id: String): ResponseEntity<Relationship> {
val principal = SecurityContextHolder.getContext().getAuthentication().principal as Jwt
val userid = principal.getClaim<String>("uid").toLong()
val unblock = accountApiService.unblock(userid, id.toLong())
return ResponseEntity.ok(unblock)
}
override suspend fun apiV1AccountsIdUnfollowPost(id: String): ResponseEntity<Relationship> {
val principal = SecurityContextHolder.getContext().getAuthentication().principal as Jwt
val userid = principal.getClaim<String>("uid").toLong()
val unfollow = accountApiService.unfollow(userid, id.toLong())
return ResponseEntity.ok(unfollow)
}
} }

View File

@ -42,6 +42,8 @@ interface AccountApiService {
* @return ブロック後のブロック対象ユーザーとの[Relationship] * @return ブロック後のブロック対象ユーザーとの[Relationship]
*/ */
suspend fun block(userid: Long, target: Long): Relationship suspend fun block(userid: Long, target: Long): Relationship
suspend fun unblock(userid: Long, target: Long): Relationship
suspend fun unfollow(userid: Long, target: Long): Relationship
} }
@Service @Service
@ -101,10 +103,10 @@ class AccountApiServiceImpl(
userService.createLocalUser(UserCreateDto(userCreateDto.name, userCreateDto.name, "", userCreateDto.password)) userService.createLocalUser(UserCreateDto(userCreateDto.name, userCreateDto.name, "", userCreateDto.password))
} }
override suspend fun follow(loginUser: Long, followTargetUserId: Long): Relationship { override suspend fun follow(loginUser: Long, followTargetUserId: Long): Relationship = transaction.transaction {
relationshipService.followRequest(loginUser, followTargetUserId) relationshipService.followRequest(loginUser, followTargetUserId)
return fetchRelationship(loginUser, followTargetUserId) return@transaction fetchRelationship(loginUser, followTargetUserId)
} }
override suspend fun account(id: Long): Account = transaction.transaction { override suspend fun account(id: Long): Account = transaction.transaction {
@ -132,6 +134,18 @@ class AccountApiServiceImpl(
fetchRelationship(userid, target) fetchRelationship(userid, target)
} }
override suspend fun unblock(userid: Long, target: Long): Relationship = transaction.transaction {
relationshipService.unblock(userid, target)
return@transaction fetchRelationship(userid, target)
}
override suspend fun unfollow(userid: Long, target: Long): Relationship = transaction.transaction {
relationshipService.unfollow(userid, target)
return@transaction fetchRelationship(userid, target)
}
private fun from(account: Account): CredentialAccount { private fun from(account: Account): CredentialAccount {
return CredentialAccount( return CredentialAccount(
id = account.id, id = account.id,

View File

@ -308,6 +308,49 @@ paths:
schema: schema:
$ref: "#/components/schemas/Relationship" $ref: "#/components/schemas/Relationship"
/api/v1/accounts/{id}/unfollow:
post:
tags:
- account
security:
- OAuth2:
- "write:follows"
parameters:
- in: path
name: id
required: true
schema:
type: string
responses:
200:
description: 成功
content:
application/json:
schema:
$ref: "#/components/schemas/Relationship"
/api/v1/accounts/{id}/unblock:
post:
tags:
- account
security:
- OAuth2:
- "write:blocks"
parameters:
- in: path
name: id
required: true
schema:
type: string
responses:
200:
description: 成功
content:
application/json:
schema:
$ref: "#/components/schemas/Relationship"
/api/v1/accounts/{id}/statuses: /api/v1/accounts/{id}/statuses:
get: get:
tags: tags: