refactoring
https: //github.com/misskey-dev/misskey/pull/7901 Co-Authored-By: MeiMei <30769358+mei23@users.noreply.github.com>
This commit is contained in:
parent
22464c434e
commit
e617ced1d3
4 changed files with 110 additions and 50 deletions
|
@ -1,8 +1,9 @@
|
||||||
import { IRemoteUser } from '@/models/entities/user';
|
import { IRemoteUser } from '@/models/entities/user';
|
||||||
import reject from '@/services/following/requests/reject';
|
import { remoteReject } from '@/services/following/reject';
|
||||||
import { IFollow } from '../../type';
|
import { IFollow } from '../../type';
|
||||||
import DbResolver from '../../db-resolver';
|
import DbResolver from '../../db-resolver';
|
||||||
import { relayRejected } from '@/services/relay';
|
import { relayRejected } from '@/services/relay';
|
||||||
|
import { Users } from '@/models';
|
||||||
|
|
||||||
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
|
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
|
||||||
// ※ activityはこっちから投げたフォローリクエストなので、activity.actorは存在するローカルユーザーである必要がある
|
// ※ activityはこっちから投げたフォローリクエストなので、activity.actorは存在するローカルユーザーである必要がある
|
||||||
|
@ -14,7 +15,7 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<string> =>
|
||||||
return `skip: follower not found`;
|
return `skip: follower not found`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (follower.host != null) {
|
if (!Users.isLocalUser(follower)) {
|
||||||
return `skip: follower is not a local user`;
|
return `skip: follower is not a local user`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +25,6 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<string> =>
|
||||||
return await relayRejected(match[1]);
|
return await relayRejected(match[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
await reject(actor, follower);
|
await remoteReject(actor, follower);
|
||||||
return `ok`;
|
return `ok`;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import $ from 'cafy';
|
import $ from 'cafy';
|
||||||
import { ID } from '@/misc/cafy-id';
|
import { ID } from '@/misc/cafy-id';
|
||||||
import rejectFollowRequest from '@/services/following/requests/reject';
|
import { rejectFollowRequest } from '@/services/following/reject';
|
||||||
import define from '../../../define';
|
import define from '../../../define';
|
||||||
import { ApiError } from '../../../error';
|
import { ApiError } from '../../../error';
|
||||||
import { getUser } from '../../../common/getters';
|
import { getUser } from '../../../common/getters';
|
||||||
|
|
105
packages/backend/src/services/following/reject.ts
Normal file
105
packages/backend/src/services/following/reject.ts
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
import { renderActivity } from '@/remote/activitypub/renderer/index';
|
||||||
|
import renderFollow from '@/remote/activitypub/renderer/follow';
|
||||||
|
import renderReject from '@/remote/activitypub/renderer/reject';
|
||||||
|
import { deliver } from '@/queue/index';
|
||||||
|
import { publishMainStream, publishUserEvent } from '@/services/stream';
|
||||||
|
import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
|
||||||
|
import { Users, FollowRequests, Followings } from '@/models/index';
|
||||||
|
import { decrementFollowing } from './delete';
|
||||||
|
|
||||||
|
type Local = ILocalUser | { id: User['id']; host: User['host']; uri: User['host'] };
|
||||||
|
type Remote = IRemoteUser;
|
||||||
|
type Both = Local | Remote;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API following/request/reject
|
||||||
|
*/
|
||||||
|
export async function rejectFollowRequest(user: Local, follower: Both) {
|
||||||
|
if (Users.isRemoteUser(follower)) {
|
||||||
|
deliverReject(user, follower);
|
||||||
|
}
|
||||||
|
|
||||||
|
await removeFollowRequest(user, follower);
|
||||||
|
|
||||||
|
if (Users.isLocalUser(follower)) {
|
||||||
|
publishUnfollow(user, follower);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API following/reject
|
||||||
|
*/
|
||||||
|
export async function rejectFollow(user: Local, follower: Both) {
|
||||||
|
if (Users.isRemoteUser(follower)) {
|
||||||
|
deliverReject(user, follower);
|
||||||
|
}
|
||||||
|
|
||||||
|
await removeFollow(user, follower);
|
||||||
|
|
||||||
|
if (Users.isLocalUser(follower)) {
|
||||||
|
publishUnfollow(user, follower);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AP Reject/Follow
|
||||||
|
*/
|
||||||
|
export async function remoteReject(actor: Remote, follower: Local) {
|
||||||
|
await removeFollowRequest(actor, follower);
|
||||||
|
await removeFollow(actor, follower);
|
||||||
|
publishUnfollow(actor, follower);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove follow request record
|
||||||
|
*/
|
||||||
|
async function removeFollowRequest(followee: Both, follower: Both) {
|
||||||
|
const request = await FollowRequests.findOne({
|
||||||
|
followeeId: followee.id,
|
||||||
|
followerId: follower.id
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!request) return;
|
||||||
|
|
||||||
|
await FollowRequests.delete(request.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove follow record
|
||||||
|
*/
|
||||||
|
async function removeFollow(followee: Both, follower: Both) {
|
||||||
|
const following = await Followings.findOne({
|
||||||
|
followeeId: followee.id,
|
||||||
|
followerId: follower.id
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!following) return;
|
||||||
|
|
||||||
|
await Followings.delete(following.id);
|
||||||
|
decrementFollowing(follower, followee);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deliver Reject to remote
|
||||||
|
*/
|
||||||
|
async function deliverReject(followee: Local, follower: Remote) {
|
||||||
|
const request = await FollowRequests.findOne({
|
||||||
|
followeeId: followee.id,
|
||||||
|
followerId: follower.id
|
||||||
|
});
|
||||||
|
|
||||||
|
const content = renderActivity(renderReject(renderFollow(follower, followee, request?.requestId || undefined), followee));
|
||||||
|
deliver(followee, content, follower.inbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publish unfollow to local
|
||||||
|
*/
|
||||||
|
async function publishUnfollow(followee: Both, follower: Local) {
|
||||||
|
const packedFollowee = await Users.pack(followee.id, follower, {
|
||||||
|
detail: true
|
||||||
|
});
|
||||||
|
|
||||||
|
publishUserEvent(follower.id, 'unfollow', packedFollowee);
|
||||||
|
publishMainStream(follower.id, 'unfollow', packedFollowee);
|
||||||
|
}
|
|
@ -1,46 +0,0 @@
|
||||||
import { renderActivity } from '@/remote/activitypub/renderer/index';
|
|
||||||
import renderFollow from '@/remote/activitypub/renderer/follow';
|
|
||||||
import renderReject from '@/remote/activitypub/renderer/reject';
|
|
||||||
import { deliver } from '@/queue/index';
|
|
||||||
import { publishMainStream, publishUserEvent } from '@/services/stream';
|
|
||||||
import { User, ILocalUser } from '@/models/entities/user';
|
|
||||||
import { Users, FollowRequests, Followings } from '@/models/index';
|
|
||||||
import { decrementFollowing } from '../delete';
|
|
||||||
|
|
||||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host'] }, follower: User) {
|
|
||||||
if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
|
|
||||||
const request = await FollowRequests.findOne({
|
|
||||||
followeeId: followee.id,
|
|
||||||
followerId: follower.id
|
|
||||||
});
|
|
||||||
|
|
||||||
const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee));
|
|
||||||
deliver(followee, content, follower.inbox);
|
|
||||||
}
|
|
||||||
|
|
||||||
const request = await FollowRequests.findOne({
|
|
||||||
followeeId: followee.id,
|
|
||||||
followerId: follower.id
|
|
||||||
});
|
|
||||||
|
|
||||||
if (request) {
|
|
||||||
await FollowRequests.delete(request.id);
|
|
||||||
} else {
|
|
||||||
const following = await Followings.findOne({
|
|
||||||
followeeId: followee.id,
|
|
||||||
followerId: follower.id
|
|
||||||
});
|
|
||||||
|
|
||||||
if (following) {
|
|
||||||
await Followings.delete(following.id);
|
|
||||||
decrementFollowing(follower, followee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Users.pack(followee.id, follower, {
|
|
||||||
detail: true
|
|
||||||
}).then(packed => {
|
|
||||||
publishUserEvent(follower.id, 'unfollow', packed);
|
|
||||||
publishMainStream(follower.id, 'unfollow', packed);
|
|
||||||
});
|
|
||||||
}
|
|
Loading…
Reference in a new issue