[API] Implement users/relation
This commit is contained in:
parent
c15148b23c
commit
649177985d
2 changed files with 81 additions and 48 deletions
|
@ -155,6 +155,50 @@ export function isValidBirthday(birthday: string): boolean {
|
||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
export async function getRelation(me: mongo.ObjectId, target: mongo.ObjectId) {
|
||||||
|
const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([
|
||||||
|
Following.findOne({
|
||||||
|
followerId: me,
|
||||||
|
followeeId: target
|
||||||
|
}),
|
||||||
|
Following.findOne({
|
||||||
|
followerId: target,
|
||||||
|
followeeId: me
|
||||||
|
}),
|
||||||
|
FollowRequest.findOne({
|
||||||
|
followerId: me,
|
||||||
|
followeeId: target
|
||||||
|
}),
|
||||||
|
FollowRequest.findOne({
|
||||||
|
followerId: target,
|
||||||
|
followeeId: me
|
||||||
|
}),
|
||||||
|
Blocking.findOne({
|
||||||
|
blockerId: me,
|
||||||
|
blockeeId: target
|
||||||
|
}),
|
||||||
|
Blocking.findOne({
|
||||||
|
blockerId: target,
|
||||||
|
blockeeId: me
|
||||||
|
}),
|
||||||
|
Mute.findOne({
|
||||||
|
muterId: me,
|
||||||
|
muteeId: target
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
isFollowing: following1 !== null,
|
||||||
|
isStalking: following1 && following1.stalk,
|
||||||
|
hasPendingFollowRequestFromYou: followReq1 !== null,
|
||||||
|
hasPendingFollowRequestToYou: followReq2 !== null,
|
||||||
|
isFollowed: following2 !== null,
|
||||||
|
isBlocking: toBlocking !== null,
|
||||||
|
isBlocked: fromBlocked !== null,
|
||||||
|
isMuted: mute !== null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pack a user for API response
|
* Pack a user for API response
|
||||||
*
|
*
|
||||||
|
@ -271,55 +315,16 @@ export const pack = (
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meId && !meId.equals(_user.id) && opts.detail) {
|
if (meId && !meId.equals(_user.id) && opts.detail) {
|
||||||
const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([
|
const relation = await getRelation(meId, _user.id);
|
||||||
Following.findOne({
|
|
||||||
followerId: meId,
|
|
||||||
followeeId: _user.id
|
|
||||||
}),
|
|
||||||
Following.findOne({
|
|
||||||
followerId: _user.id,
|
|
||||||
followeeId: meId
|
|
||||||
}),
|
|
||||||
FollowRequest.findOne({
|
|
||||||
followerId: meId,
|
|
||||||
followeeId: _user.id
|
|
||||||
}),
|
|
||||||
FollowRequest.findOne({
|
|
||||||
followerId: _user.id,
|
|
||||||
followeeId: meId
|
|
||||||
}),
|
|
||||||
Blocking.findOne({
|
|
||||||
blockerId: meId,
|
|
||||||
blockeeId: _user.id
|
|
||||||
}),
|
|
||||||
Blocking.findOne({
|
|
||||||
blockerId: _user.id,
|
|
||||||
blockeeId: meId
|
|
||||||
}),
|
|
||||||
Mute.findOne({
|
|
||||||
muterId: meId,
|
|
||||||
muteeId: _user.id
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Whether the user is following
|
_user.isFollowing = relation.isFollowing;
|
||||||
_user.isFollowing = following1 !== null;
|
_user.isFollowed = relation.isFollowed;
|
||||||
_user.isStalking = following1 && following1.stalk;
|
_user.isStalking = relation.isStalking;
|
||||||
|
_user.hasPendingFollowRequestFromYou = relation.hasPendingFollowRequestFromYou;
|
||||||
_user.hasPendingFollowRequestFromYou = followReq1 !== null;
|
_user.hasPendingFollowRequestToYou = relation.hasPendingFollowRequestToYou;
|
||||||
_user.hasPendingFollowRequestToYou = followReq2 !== null;
|
_user.isBlocking = relation.isBlocking;
|
||||||
|
_user.isBlocked = relation.isBlocked;
|
||||||
// Whether the user is followed
|
_user.isMuted = relation.isMuted;
|
||||||
_user.isFollowed = following2 !== null;
|
|
||||||
|
|
||||||
// Whether the user is blocking
|
|
||||||
_user.isBlocking = toBlocking !== null;
|
|
||||||
|
|
||||||
// Whether the user is blocked
|
|
||||||
_user.isBlocked = fromBlocked !== null;
|
|
||||||
|
|
||||||
// Whether the user is muted
|
|
||||||
_user.isMuted = mute !== null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts.detail) {
|
if (opts.detail) {
|
||||||
|
|
28
src/server/api/endpoints/users/relation.ts
Normal file
28
src/server/api/endpoints/users/relation.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||||
|
import { ILocalUser, getRelation } from '../../../../models/user';
|
||||||
|
import getParams from '../../get-params';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'ユーザー間のリレーションを取得します。'
|
||||||
|
},
|
||||||
|
|
||||||
|
params: {
|
||||||
|
userId: $.or($.type(ID), $.arr($.type(ID)).unique()).note({
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'ユーザーID (配列でも可)'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||||
|
const [ps, psErr] = getParams(meta, params);
|
||||||
|
if (psErr) return rej(psErr);
|
||||||
|
|
||||||
|
const ids = Array.isArray(ps.userId) ? ps.userId : [ps.userId];
|
||||||
|
|
||||||
|
const relations = await Promise.all(ids.map(id => getRelation(me._id, id)));
|
||||||
|
|
||||||
|
res(Array.isArray(ps.userId) ? relations : relations[0]);
|
||||||
|
});
|
Loading…
Reference in a new issue