From 51255bb4467d7f797686639d785edf0eede846ec Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 31 May 2018 22:56:02 +0900 Subject: wip --- src/server/api/endpoints/i/update.ts | 47 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 23 deletions(-) (limited to 'src/server/api/endpoints/i/update.ts') diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 6e0c5b8515..5ca54d013c 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -12,50 +12,57 @@ import DriveFile from '../../../../models/drive-file'; module.exports = async (params, user, app) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; + const updates = {} as any; + // Get 'name' parameter const [name, nameErr] = $.str.optional().nullable().pipe(isValidName).get(params.name); if (nameErr) return rej('invalid name param'); - if (name) user.name = name; + if (name) updates.name = name; // Get 'description' parameter const [description, descriptionErr] = $.str.optional().nullable().pipe(isValidDescription).get(params.description); if (descriptionErr) return rej('invalid description param'); - if (description !== undefined) user.description = description; + if (description !== undefined) updates.description = description; // Get 'location' parameter const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location); if (locationErr) return rej('invalid location param'); - if (location !== undefined) user.profile.location = location; + if (location !== undefined) updates.profile.location = location; // Get 'birthday' parameter const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday); if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) user.profile.birthday = birthday; + if (birthday !== undefined) updates.profile.birthday = birthday; // Get 'avatarId' parameter const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId); if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId) user.avatarId = avatarId; + if (avatarId) updates.avatarId = avatarId; // Get 'bannerId' parameter const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId); if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId) user.bannerId = bannerId; + if (bannerId) updates.bannerId = bannerId; + + // Get 'isLocked' parameter + const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); + if (isLockedErr) return rej('invalid isLocked param'); + if (isLocked != null) updates.isLocked = isLocked; // Get 'isBot' parameter const [isBot, isBotErr] = $.bool.optional().get(params.isBot); if (isBotErr) return rej('invalid isBot param'); - if (isBot != null) user.isBot = isBot; + if (isBot != null) updates.isBot = isBot; // Get 'isCat' parameter const [isCat, isCatErr] = $.bool.optional().get(params.isCat); if (isCatErr) return rej('invalid isCat param'); - if (isCat != null) user.isCat = isCat; + if (isCat != null) updates.isCat = isCat; // Get 'autoWatch' parameter const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) user.settings.autoWatch = autoWatch; + if (autoWatch != null) updates.settings.autoWatch = autoWatch; if (avatarId) { const avatar = await DriveFile.findOne({ @@ -63,7 +70,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (avatar != null && avatar.metadata.properties.avgColor) { - user.avatarColor = avatar.metadata.properties.avgColor; + updates.avatarColor = avatar.metadata.properties.avgColor; } } @@ -73,23 +80,12 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (banner != null && banner.metadata.properties.avgColor) { - user.bannerColor = banner.metadata.properties.avgColor; + updates.bannerColor = banner.metadata.properties.avgColor; } } await User.update(user._id, { - $set: { - name: user.name, - description: user.description, - avatarId: user.avatarId, - avatarColor: user.avatarColor, - bannerId: user.bannerId, - bannerColor: user.bannerColor, - profile: user.profile, - isBot: user.isBot, - isCat: user.isCat, - settings: user.settings - } + $set: updates }); // Serialize @@ -103,4 +99,9 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Publish i updated event event(user._id, 'i_updated', iObj); + + // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 + if (user.isLocked && isLocked === false) { + acceptAllFollowRequests(user); + } }); -- cgit v1.2.3-freya From bae44b47086d8a0f0c8f96254b9453a29490a508 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 1 Jun 2018 01:12:02 +0900 Subject: wip --- src/models/user.ts | 5 +++++ src/server/api/endpoints/i/update.ts | 1 + src/services/following/create.ts | 6 ++++++ src/services/user/accept-all-follow-requests.ts | 6 ++++++ src/services/user/reject-follow-request.ts | 8 +++++++- 5 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src/server/api/endpoints/i/update.ts') diff --git a/src/models/user.ts b/src/models/user.ts index 4186241a59..0e06512dae 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -62,6 +62,11 @@ type IUserBase = { */ isLocked: boolean; + /** + * このアカウントに届いているフォローリクエストの数 + */ + pendingReceivedFollowRequestsCount: number; + host: string; }; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 5ca54d013c..103cd3ac36 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,6 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; +import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests'; /** * Update myself diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 03a8f399e8..39cecfddfb 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -28,6 +28,12 @@ export default async function(follower: IUser, followee: IUser) { } }); + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: 1 + } + }); + // Publish reciveRequest event if (isLocalUser(followee)) { packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts index fbb221e772..397a0d7ec2 100644 --- a/src/services/user/accept-all-follow-requests.ts +++ b/src/services/user/accept-all-follow-requests.ts @@ -15,4 +15,10 @@ export default async function(user: IUser) { const follower = await User.findOne({ _id: request.followerId }); accept(user, follower); }); + + User.update({ _id: user._id }, { + $set: { + pendingReceivedFollowRequestsCount: 0 + } + }); } diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts index 32965a1556..c6388f53e1 100644 --- a/src/services/user/reject-follow-request.ts +++ b/src/services/user/reject-follow-request.ts @@ -11,8 +11,14 @@ export default async function(followee: IUser, follower: IUser) { deliver(followee as ILocalUser, content, follower.inbox); } - FollowRequest.remove({ + await FollowRequest.remove({ followeeId: followee._id, followerId: follower._id }); + + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: -1 + } + }); } -- cgit v1.2.3-freya From 484d17f53f26ff3e8961d86f03ef94f62f8f62ed Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 2 Jun 2018 00:15:17 +0900 Subject: wip --- .../app/mobile/views/components/follow-button.vue | 49 +++++++++++------ src/client/app/mobile/views/pages/user.vue | 1 - src/remote/activitypub/kernel/accept/follow.ts | 2 +- src/remote/activitypub/kernel/follow.ts | 2 +- src/remote/activitypub/kernel/reject/follow.ts | 2 +- src/remote/activitypub/kernel/undo/follow.ts | 2 +- src/server/activitypub.ts | 19 +++++-- src/server/api/endpoints.ts | 4 +- .../api/endpoints/following/request/accept.ts | 26 --------- .../api/endpoints/following/request/reject.ts | 26 --------- .../api/endpoints/following/requests/accept.ts | 26 +++++++++ .../api/endpoints/following/requests/reject.ts | 26 +++++++++ src/server/api/endpoints/i/update.ts | 2 +- src/services/following/requests/accept-all.ts | 24 ++++++++ src/services/following/requests/accept.ts | 64 ++++++++++++++++++++++ src/services/following/requests/reject.ts | 24 ++++++++ src/services/user/accept-all-follow-requests.ts | 24 -------- src/services/user/accept-follow-request.ts | 64 ---------------------- src/services/user/reject-follow-request.ts | 24 -------- 19 files changed, 217 insertions(+), 194 deletions(-) delete mode 100644 src/server/api/endpoints/following/request/accept.ts delete mode 100644 src/server/api/endpoints/following/request/reject.ts create mode 100644 src/server/api/endpoints/following/requests/accept.ts create mode 100644 src/server/api/endpoints/following/requests/reject.ts create mode 100644 src/services/following/requests/accept-all.ts create mode 100644 src/services/following/requests/accept.ts create mode 100644 src/services/following/requests/reject.ts delete mode 100644 src/services/user/accept-all-follow-requests.ts delete mode 100644 src/services/user/accept-follow-request.ts delete mode 100644 src/services/user/reject-follow-request.ts (limited to 'src/server/api/endpoints/i/update.ts') diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index a6b5cf0556..9c363d7164 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -1,13 +1,16 @@ @@ -66,15 +69,27 @@ export default Vue.extend({ this.wait = false; }); } else { - (this as any).api('following/create', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = true; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); + if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) { + (this as any).api('following/requests/cancel', { + userId: this.user.id + }).then(() => { + this.user.hasPendingFollowRequestFromYou = false; + }).catch(err => { + console.error(err); + }).then(() => { + this.wait = false; + }); + } else { + (this as any).api('following/create', { + userId: this.user.id + }).then(() => { + this.user.isFollowing = true; + }).catch(err => { + console.error(err); + }).then(() => { + this.wait = false; + }); + } } } } @@ -90,11 +105,11 @@ export default Vue.extend({ cursor pointer padding 0 16px margin 0 - height inherit - font-size 16px + line-height 36px + font-size 14px outline none border solid 1px $theme-color - border-radius 4px + border-radius 36px * pointer-events none diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index b3b820650c..3d37015906 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -184,7 +184,6 @@ root(isDark) > .mk-follow-button float right - height 40px > .title margin 8px 0 diff --git a/src/remote/activitypub/kernel/accept/follow.ts b/src/remote/activitypub/kernel/accept/follow.ts index 9d425419ab..0f414ba321 100644 --- a/src/remote/activitypub/kernel/accept/follow.ts +++ b/src/remote/activitypub/kernel/accept/follow.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import User, { IRemoteUser } from '../../../../models/user'; import config from '../../../../config'; -import accept from '../../../../services/user/accept-follow-request'; +import accept from '../../../../services/following/requests/accept'; import { IFollow } from '../../type'; export default async (actor: IRemoteUser, activity: IFollow): Promise => { diff --git a/src/remote/activitypub/kernel/follow.ts b/src/remote/activitypub/kernel/follow.ts index 7e31eb32ea..464f8582b7 100644 --- a/src/remote/activitypub/kernel/follow.ts +++ b/src/remote/activitypub/kernel/follow.ts @@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise => { throw new Error('フォローしようとしているユーザーはローカルユーザーではありません'); } - await follow(actor, followee, activity); + await follow(actor, followee); }; diff --git a/src/remote/activitypub/kernel/reject/follow.ts b/src/remote/activitypub/kernel/reject/follow.ts index 862f3def3b..c139865d0e 100644 --- a/src/remote/activitypub/kernel/reject/follow.ts +++ b/src/remote/activitypub/kernel/reject/follow.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import User, { IRemoteUser } from '../../../../models/user'; import config from '../../../../config'; -import reject from '../../../../services/user/reject-follow-request'; +import reject from '../../../../services/following/requests/reject'; import { IFollow } from '../../type'; export default async (actor: IRemoteUser, activity: IFollow): Promise => { diff --git a/src/remote/activitypub/kernel/undo/follow.ts b/src/remote/activitypub/kernel/undo/follow.ts index c0b10c1898..763d5723c4 100644 --- a/src/remote/activitypub/kernel/undo/follow.ts +++ b/src/remote/activitypub/kernel/undo/follow.ts @@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise => { throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません'); } - await unfollow(actor, followee, activity); + await unfollow(actor, followee); }; diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 3c07a3e2f2..c846e28c07 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -7,7 +7,7 @@ const httpSignature = require('http-signature'); import { createHttp } from '../queue'; import pack from '../remote/activitypub/renderer'; import Note from '../models/note'; -import User, { isLocalUser } from '../models/user'; +import User, { isLocalUser, ILocalUser } from '../models/user'; import renderNote from '../remote/activitypub/renderer/note'; import renderKey from '../remote/activitypub/renderer/key'; import renderPerson from '../remote/activitypub/renderer/person'; @@ -69,7 +69,10 @@ router.get('/notes/:note', async (ctx, next) => { router.get('/users/:user/outbox', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -91,7 +94,10 @@ router.get('/users/:user/outbox', async ctx => { router.get('/users/:user/publickey', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -109,14 +115,17 @@ router.get('/users/:user/publickey', async ctx => { router.get('/users/:user', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; return; } - ctx.body = pack(renderPerson(user)); + ctx.body = pack(renderPerson(user as ILocalUser)); }); // follow form diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index bd8f30b38f..ad51a249bf 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -449,12 +449,12 @@ const endpoints: Endpoint[] = [ kind: 'following-write' }, { - name: 'following/request/accept', + name: 'following/requests/accept', withCredential: true, kind: 'following-write' }, { - name: 'following/request/reject', + name: 'following/requests/reject', withCredential: true, kind: 'following-write' }, diff --git a/src/server/api/endpoints/following/request/accept.ts b/src/server/api/endpoints/following/request/accept.ts deleted file mode 100644 index bf0aff4b77..0000000000 --- a/src/server/api/endpoints/following/request/accept.ts +++ /dev/null @@ -1,26 +0,0 @@ -import $ from 'cafy'; import ID from '../../../../../cafy-id'; -import acceptFollowRequest from '../../../../../services/user/accept-follow-request'; -import User from '../../../../../models/user'; - -/** - * Accept a follow request - */ -module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'followerId' parameter - const [followerId, followerIdErr] = $.type(ID).get(params.followerId); - if (followerIdErr) return rej('invalid followerId param'); - - // Fetch follower - const follower = await User.findOne({ - _id: followerId - }); - - if (follower === null) { - return rej('follower not found'); - } - - await acceptFollowRequest(user, follower); - - // Send response - res(); -}); diff --git a/src/server/api/endpoints/following/request/reject.ts b/src/server/api/endpoints/following/request/reject.ts deleted file mode 100644 index 5a995e1962..0000000000 --- a/src/server/api/endpoints/following/request/reject.ts +++ /dev/null @@ -1,26 +0,0 @@ -import $ from 'cafy'; import ID from '../../../../../cafy-id'; -import rejectFollowRequest from '../../../../../services/user/reject-follow-request'; -import User from '../../../../../models/user'; - -/** - * Reject a follow request - */ -module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'followerId' parameter - const [followerId, followerIdErr] = $.type(ID).get(params.followerId); - if (followerIdErr) return rej('invalid followerId param'); - - // Fetch follower - const follower = await User.findOne({ - _id: followerId - }); - - if (follower === null) { - return rej('follower not found'); - } - - await rejectFollowRequest(user, follower); - - // Send response - res(); -}); diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts new file mode 100644 index 0000000000..f8df3b7850 --- /dev/null +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import acceptFollowRequest from '../../../../../services/following/requests/accept'; +import User from '../../../../../models/user'; + +/** + * Accept a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'followerId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.followerId); + if (followerIdErr) return rej('invalid followerId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await acceptFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts new file mode 100644 index 0000000000..4900127a57 --- /dev/null +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import rejectFollowRequest from '../../../../../services/following/requests/reject'; +import User from '../../../../../models/user'; + +/** + * Reject a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'followerId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.followerId); + if (followerIdErr) return rej('invalid followerId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await rejectFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 103cd3ac36..8ee3c84861 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,7 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; -import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests'; +import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; /** * Update myself diff --git a/src/services/following/requests/accept-all.ts b/src/services/following/requests/accept-all.ts new file mode 100644 index 0000000000..9708d9e658 --- /dev/null +++ b/src/services/following/requests/accept-all.ts @@ -0,0 +1,24 @@ +import User, { IUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import accept from './accept'; + +/** + * 指定したユーザー宛てのフォローリクエストをすべて承認 + * @param user ユーザー + */ +export default async function(user: IUser) { + const requests = await FollowRequest.find({ + followeeId: user._id + }); + + requests.forEach(async request => { + const follower = await User.findOne({ _id: request.followerId }); + accept(user, follower); + }); + + User.update({ _id: user._id }, { + $set: { + pendingReceivedFollowRequestsCount: 0 + } + }); +} diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts new file mode 100644 index 0000000000..2dff9b01fe --- /dev/null +++ b/src/services/following/requests/accept.ts @@ -0,0 +1,64 @@ +import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import renderAccept from '../../../remote/activitypub/renderer/accept'; +import { deliver } from '../../../queue'; +import Following from "../../../models/following"; +import FollowingLog from "../../../models/following-log"; +import FollowedLog from "../../../models/followed-log"; + +export default async function(followee: IUser, follower: IUser) { + const following = await Following.insert({ + createdAt: new Date(), + followerId: follower._id, + followeeId: followee._id, + + // 非正規化 + _follower: { + host: follower.host, + inbox: isRemoteUser(follower) ? follower.inbox : undefined + }, + _followee: { + host: followee.host, + inbox: isRemoteUser(followee) ? followee.inbox : undefined + } + }); + + if (isRemoteUser(follower)) { + const content = pack(renderAccept(renderFollow(follower, followee))); + deliver(followee as ILocalUser, content, follower.inbox); + } + + FollowRequest.remove({ + followeeId: followee._id, + followerId: follower._id + }); + + //#region Increment following count + User.update({ _id: follower._id }, { + $inc: { + followingCount: 1 + } + }); + + FollowingLog.insert({ + createdAt: following.createdAt, + userId: follower._id, + count: follower.followingCount + 1 + }); + //#endregion + + //#region Increment followers count + User.update({ _id: followee._id }, { + $inc: { + followersCount: 1 + } + }); + FollowedLog.insert({ + createdAt: following.createdAt, + userId: followee._id, + count: followee.followersCount + 1 + }); + //#endregion +} diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts new file mode 100644 index 0000000000..acd419d0ee --- /dev/null +++ b/src/services/following/requests/reject.ts @@ -0,0 +1,24 @@ +import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import renderReject from '../../../remote/activitypub/renderer/reject'; +import { deliver } from '../../../queue'; + +export default async function(followee: IUser, follower: IUser) { + if (isRemoteUser(follower)) { + const content = pack(renderReject(renderFollow(follower, followee))); + deliver(followee as ILocalUser, content, follower.inbox); + } + + await FollowRequest.remove({ + followeeId: followee._id, + followerId: follower._id + }); + + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: -1 + } + }); +} diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts deleted file mode 100644 index 397a0d7ec2..0000000000 --- a/src/services/user/accept-all-follow-requests.ts +++ /dev/null @@ -1,24 +0,0 @@ -import User, { IUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import accept from './accept-follow-request'; - -/** - * 指定したユーザー宛てのフォローリクエストをすべて承認 - * @param user ユーザー - */ -export default async function(user: IUser) { - const requests = await FollowRequest.find({ - followeeId: user._id - }); - - requests.forEach(async request => { - const follower = await User.findOne({ _id: request.followerId }); - accept(user, follower); - }); - - User.update({ _id: user._id }, { - $set: { - pendingReceivedFollowRequestsCount: 0 - } - }); -} diff --git a/src/services/user/accept-follow-request.ts b/src/services/user/accept-follow-request.ts deleted file mode 100644 index 8b5c82c84e..0000000000 --- a/src/services/user/accept-follow-request.ts +++ /dev/null @@ -1,64 +0,0 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import pack from '../../remote/activitypub/renderer'; -import renderFollow from '../../remote/activitypub/renderer/follow'; -import renderAccept from '../../remote/activitypub/renderer/accept'; -import { deliver } from '../../queue'; -import Following from "../../models/following"; -import FollowingLog from "../../models/following-log"; -import FollowedLog from "../../models/followed-log"; - -export default async function(followee: IUser, follower: IUser) { - const following = await Following.insert({ - createdAt: new Date(), - followerId: follower._id, - followeeId: followee._id, - - // 非正規化 - _follower: { - host: follower.host, - inbox: isRemoteUser(follower) ? follower.inbox : undefined - }, - _followee: { - host: followee.host, - inbox: isRemoteUser(followee) ? followee.inbox : undefined - } - }); - - if (isRemoteUser(follower)) { - const content = pack(renderAccept(renderFollow(follower, followee))); - deliver(followee as ILocalUser, content, follower.inbox); - } - - FollowRequest.remove({ - followeeId: followee._id, - followerId: follower._id - }); - - //#region Increment following count - User.update({ _id: follower._id }, { - $inc: { - followingCount: 1 - } - }); - - FollowingLog.insert({ - createdAt: following.createdAt, - userId: follower._id, - count: follower.followingCount + 1 - }); - //#endregion - - //#region Increment followers count - User.update({ _id: followee._id }, { - $inc: { - followersCount: 1 - } - }); - FollowedLog.insert({ - createdAt: following.createdAt, - userId: followee._id, - count: followee.followersCount + 1 - }); - //#endregion -} diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts deleted file mode 100644 index c6388f53e1..0000000000 --- a/src/services/user/reject-follow-request.ts +++ /dev/null @@ -1,24 +0,0 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import pack from '../../remote/activitypub/renderer'; -import renderFollow from '../../remote/activitypub/renderer/follow'; -import renderReject from '../../remote/activitypub/renderer/reject'; -import { deliver } from '../../queue'; - -export default async function(followee: IUser, follower: IUser) { - if (isRemoteUser(follower)) { - const content = pack(renderReject(renderFollow(follower, followee))); - deliver(followee as ILocalUser, content, follower.inbox); - } - - await FollowRequest.remove({ - followeeId: followee._id, - followerId: follower._id - }); - - User.update({ _id: followee._id }, { - $inc: { - pendingReceivedFollowRequestsCount: -1 - } - }); -} -- cgit v1.2.3-freya From 4feff8835cfa80529c14fcbb7a138eeb0a951650 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 2 Jun 2018 16:01:32 +0900 Subject: wip --- src/client/app/common/scripts/streaming/home.ts | 8 +------- src/server/api/endpoints/i/update.ts | 2 +- src/server/api/service/twitter.ts | 4 ++-- src/services/following/requests/accept.ts | 14 ++++++++++---- src/services/following/requests/cancel.ts | 9 +++++++-- src/services/following/requests/create.ts | 8 ++++++-- 6 files changed, 27 insertions(+), 18 deletions(-) (limited to 'src/server/api/endpoints/i/update.ts') diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index c5189ddc7a..f07d0289f6 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -20,7 +20,7 @@ export class HomeStream extends Stream { }, 1000 * 60); // 自分の情報が更新されたとき - this.on('i_updated', i => { + this.on('meUpdated', i => { if (os.debug) { console.log('I updated:', i); } @@ -28,12 +28,6 @@ export class HomeStream extends Stream { os.store.dispatch('mergeMe', i); }); - this.on('reciveFollowRequest', () => { - os.store.dispatch('mergeMe', { - pendingReceivedFollowRequestsCount: (os.store.state.i.pendingReceivedFollowRequestsCount || 0) + 1 - }); - }); - this.on('read_all_notifications', () => { os.store.dispatch('mergeMe', { hasUnreadNotification: false diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 8ee3c84861..5aff6da103 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -99,7 +99,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { res(iObj); // Publish i updated event - event(user._id, 'i_updated', iObj); + event(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 if (user.isLocked && isLocked === false) { diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index 284ae7ee22..8c35509cce 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => { ctx.body = `Twitterの連携を解除しました :v:`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); @@ -174,7 +174,7 @@ if (config.twitter == null) { ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index 2dff9b01fe..1b89cdb981 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -1,4 +1,4 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import FollowRequest from "../../../models/follow-request"; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; @@ -7,6 +7,7 @@ import { deliver } from '../../../queue'; import Following from "../../../models/following"; import FollowingLog from "../../../models/following-log"; import FollowedLog from "../../../models/followed-log"; +import event from '../../../publishers/stream'; export default async function(followee: IUser, follower: IUser) { const following = await Following.insert({ @@ -30,13 +31,13 @@ export default async function(followee: IUser, follower: IUser) { deliver(followee as ILocalUser, content, follower.inbox); } - FollowRequest.remove({ + await FollowRequest.remove({ followeeId: followee._id, followerId: follower._id }); //#region Increment following count - User.update({ _id: follower._id }, { + await User.update({ _id: follower._id }, { $inc: { followingCount: 1 } @@ -50,15 +51,20 @@ export default async function(followee: IUser, follower: IUser) { //#endregion //#region Increment followers count - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { followersCount: 1 } }); + FollowedLog.insert({ createdAt: following.createdAt, userId: followee._id, count: followee.followersCount + 1 }); //#endregion + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); } diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts index 840f70264c..50c95de0eb 100644 --- a/src/services/following/requests/cancel.ts +++ b/src/services/following/requests/cancel.ts @@ -1,9 +1,10 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import FollowRequest from "../../../models/follow-request"; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { deliver } from '../../../queue'; +import event from '../../../publishers/stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(followee)) { @@ -16,9 +17,13 @@ export default async function(followee: IUser, follower: IUser) { followerId: follower._id }); - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { pendingReceivedFollowRequestsCount: -1 } }); + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); } diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index b69eb5acb0..836d85090d 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -25,7 +25,7 @@ export default async function(follower: IUser, followee: IUser) { } }); - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { pendingReceivedFollowRequestsCount: 1 } @@ -33,7 +33,11 @@ export default async function(follower: IUser, followee: IUser) { // Publish reciveRequest event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)), + packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)); + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); // 通知を作成 notify(followee._id, follower._id, 'reciveFollowRequest'); -- cgit v1.2.3-freya From 60a7f7f1463135939440dce7f5fd03467d3e2183 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 2 Jun 2018 16:27:24 +0900 Subject: wip --- src/server/api/endpoints/i/update.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/server/api/endpoints/i/update.ts') diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 5aff6da103..b94f073d2c 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -28,22 +28,22 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Get 'location' parameter const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location); if (locationErr) return rej('invalid location param'); - if (location !== undefined) updates.profile.location = location; + if (location !== undefined) updates['profile.location'] = location; // Get 'birthday' parameter const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday); if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) updates.profile.birthday = birthday; + if (birthday !== undefined) updates['profile.birthday'] = birthday; // Get 'avatarId' parameter - const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId); + const [avatarId, avatarIdErr] = $.type(ID).optional().nullable().get(params.avatarId); if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId) updates.avatarId = avatarId; + if (avatarId !== undefined) updates.avatarId = avatarId; // Get 'bannerId' parameter - const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId); + const [bannerId, bannerIdErr] = $.type(ID).optional().nullable().get(params.bannerId); if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId) updates.bannerId = bannerId; + if (bannerId !== undefined) updates.bannerId = bannerId; // Get 'isLocked' parameter const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); @@ -63,7 +63,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Get 'autoWatch' parameter const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) updates.settings.autoWatch = autoWatch; + if (autoWatch != null) updates['settings.autoWatch'] = autoWatch; if (avatarId) { const avatar = await DriveFile.findOne({ @@ -90,7 +90,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); // Serialize - const iObj = await pack(user, user, { + const iObj = await pack(user._id, user, { detail: true, includeSecrets: isSecure }); @@ -98,7 +98,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Send response res(iObj); - // Publish i updated event + // Publish meUpdated event event(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 -- cgit v1.2.3-freya