From 91172654e4b715198099146d4c442e0787df0785 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 13 Feb 2021 15:33:38 +0900 Subject: refactor: resolve #7139 --- src/remote/activitypub/db-resolver.ts | 3 +-- src/remote/activitypub/models/image.ts | 3 +-- src/remote/activitypub/models/note.ts | 3 +-- src/remote/activitypub/models/person.ts | 3 +-- src/remote/activitypub/renderer/follow-user.ts | 3 +-- src/remote/activitypub/renderer/index.ts | 5 ++--- src/remote/activitypub/renderer/note.ts | 3 +-- src/remote/activitypub/renderer/person.ts | 5 ++--- src/remote/activitypub/request.ts | 9 ++++----- 9 files changed, 14 insertions(+), 23 deletions(-) (limited to 'src/remote') diff --git a/src/remote/activitypub/db-resolver.ts b/src/remote/activitypub/db-resolver.ts index cad2212b70..26162b6b23 100644 --- a/src/remote/activitypub/db-resolver.ts +++ b/src/remote/activitypub/db-resolver.ts @@ -6,7 +6,6 @@ import { MessagingMessage } from '../../models/entities/messaging-message'; import { Notes, Users, UserPublickeys, MessagingMessages } from '../../models'; import { IObject, getApId } from './type'; import { resolvePerson } from './models/person'; -import { ensure } from '../../prelude/ensure'; import escapeRegexp = require('escape-regexp'); export default class DbResolver { @@ -99,7 +98,7 @@ export default class DbResolver { if (user == null) return null; - const key = await UserPublickeys.findOne(user.id).then(ensure); + const key = await UserPublickeys.findOneOrFail(user.id); return { user, diff --git a/src/remote/activitypub/models/image.ts b/src/remote/activitypub/models/image.ts index 84a1040b2e..dd8086cbeb 100644 --- a/src/remote/activitypub/models/image.ts +++ b/src/remote/activitypub/models/image.ts @@ -5,7 +5,6 @@ import { fetchMeta } from '../../../misc/fetch-meta'; import { apLogger } from '../logger'; import { DriveFile } from '../../../models/entities/drive-file'; import { DriveFiles } from '../../../models'; -import { ensure } from '../../../prelude/ensure'; const logger = apLogger; @@ -40,7 +39,7 @@ export async function createImage(actor: IRemoteUser, value: any): Promise => { if (poll.expiresAt && Date.now() > new Date(poll.expiresAt).getTime()) { diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 73a2ebc023..5840d67020 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -24,7 +24,6 @@ import { toPuny } from '../../../misc/convert-host'; import { UserProfile } from '../../../models/entities/user-profile'; import { validActor } from '../../../remote/activitypub/type'; import { getConnection } from 'typeorm'; -import { ensure } from '../../../prelude/ensure'; import { toArray } from '../../../prelude/array'; import { fetchInstanceMetadata } from '../../../services/fetch-instance-metadata'; import { normalizeForSearch } from '../../../misc/normalize-for-search'; @@ -457,7 +456,7 @@ export function analyzeAttachments(attachments: IObject | IObject[] | undefined) } export async function updateFeatured(userId: User['id']) { - const user = await Users.findOne(userId).then(ensure); + const user = await Users.findOneOrFail(userId); if (!Users.isRemoteUser(user)) return; if (!user.featured) return; diff --git a/src/remote/activitypub/renderer/follow-user.ts b/src/remote/activitypub/renderer/follow-user.ts index 6d354803e5..bfc91bb4cb 100644 --- a/src/remote/activitypub/renderer/follow-user.ts +++ b/src/remote/activitypub/renderer/follow-user.ts @@ -1,13 +1,12 @@ import config from '../../../config'; import { Users } from '../../../models'; import { User } from '../../../models/entities/user'; -import { ensure } from '../../../prelude/ensure'; /** * Convert (local|remote)(Follower|Followee)ID to URL * @param id Follower|Followee ID */ export default async function renderFollowUser(id: User['id']): Promise { - const user = await Users.findOne(id).then(ensure); + const user = await Users.findOneOrFail(id); return Users.isLocalUser(user) ? `${config.url}/users/${user.id}` : user.uri; } diff --git a/src/remote/activitypub/renderer/index.ts b/src/remote/activitypub/renderer/index.ts index a34febff2f..e74affdadf 100644 --- a/src/remote/activitypub/renderer/index.ts +++ b/src/remote/activitypub/renderer/index.ts @@ -4,7 +4,6 @@ import { IActivity } from '../type'; import { LdSignature } from '../misc/ld-signature'; import { ILocalUser } from '../../../models/entities/user'; import { UserKeypairs } from '../../../models'; -import { ensure } from '../../../prelude/ensure'; export const renderActivity = (x: any): IActivity | null => { if (x == null) return null; @@ -24,9 +23,9 @@ export const renderActivity = (x: any): IActivity | null => { export const attachLdSignature = async (activity: any, user: ILocalUser): Promise => { if (activity == null) return null; - const keypair = await UserKeypairs.findOne({ + const keypair = await UserKeypairs.findOneOrFail({ userId: user.id - }).then(ensure); + }); const obj = { // as non-standards diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 6878a402b8..8e3e0e9ba1 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -10,7 +10,6 @@ import { DriveFiles, Notes, Users, Emojis, Polls } from '../../../models'; import { In } from 'typeorm'; import { Emoji } from '../../../models/entities/emoji'; import { Poll } from '../../../models/entities/poll'; -import { ensure } from '../../../prelude/ensure'; export default async function renderNote(note: Note, dive = true, isTalk = false): Promise { const getPromisedFiles = async (ids: string[]) => { @@ -54,7 +53,7 @@ export default async function renderNote(note: Note, dive = true, isTalk = false } } - const user = await Users.findOne(note.userId).then(ensure); + const user = await Users.findOneOrFail(note.userId); const attributedTo = `${config.url}/users/${user.id}`; diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts index 4462f88315..4907e3bc6f 100644 --- a/src/remote/activitypub/renderer/person.ts +++ b/src/remote/activitypub/renderer/person.ts @@ -9,7 +9,6 @@ import renderEmoji from './emoji'; import { IIdentifier } from '../models/identifier'; import renderHashtag from './hashtag'; import { DriveFiles, UserProfiles, UserKeypairs } from '../../../models'; -import { ensure } from '../../../prelude/ensure'; export async function renderPerson(user: ILocalUser) { const id = `${config.url}/users/${user.id}`; @@ -18,7 +17,7 @@ export async function renderPerson(user: ILocalUser) { const [avatar, banner, profile] = await Promise.all([ user.avatarId ? DriveFiles.findOne(user.avatarId) : Promise.resolve(undefined), user.bannerId ? DriveFiles.findOne(user.bannerId) : Promise.resolve(undefined), - UserProfiles.findOne(user.id).then(ensure) + UserProfiles.findOneOrFail(user.id) ]); const attachment: { @@ -50,7 +49,7 @@ export async function renderPerson(user: ILocalUser) { ...hashtagTags, ]; - const keypair = await UserKeypairs.findOne(user.id).then(ensure); + const keypair = await UserKeypairs.findOneOrFail(user.id); const person = { type: isSystem ? 'Application' : user.isBot ? 'Service' : 'Person', diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index 0edfcee1e3..2f07351635 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -6,7 +6,6 @@ import * as crypto from 'crypto'; import config from '../../config'; import { ILocalUser } from '../../models/entities/user'; import { UserKeypairs } from '../../models'; -import { ensure } from '../../prelude/ensure'; import { getAgentByUrl } from '../../misc/fetch'; import { URL } from 'url'; import got from 'got'; @@ -23,9 +22,9 @@ export default async (user: ILocalUser, url: string, object: any) => { sha256.update(data); const hash = sha256.digest('base64'); - const keypair = await UserKeypairs.findOne({ + const keypair = await UserKeypairs.findOneOrFail({ userId: user.id - }).then(ensure); + }); await new Promise((resolve, reject) => { const req = https.request({ @@ -75,9 +74,9 @@ export default async (user: ILocalUser, url: string, object: any) => { export async function signedGet(url: string, user: ILocalUser) { const timeout = 10 * 1000; - const keypair = await UserKeypairs.findOne({ + const keypair = await UserKeypairs.findOneOrFail({ userId: user.id - }).then(ensure); + }); const req = got.get(url, { headers: { -- cgit v1.2.3-freya From 9bc0110b86ff1fd2014e1958a8512422408594a3 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 17 Feb 2021 21:34:51 +0900 Subject: Fix #7212 (#7215) --- src/remote/activitypub/models/person.ts | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'src/remote') diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 5840d67020..93e95df0a4 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -12,7 +12,7 @@ import { extractApHashtags } from './tag'; import { apLogger } from '../logger'; import { Note } from '../../../models/entities/note'; import { updateUsertags } from '../../../services/update-hashtag'; -import { Users, UserNotePinings, Instances, DriveFiles, Followings, UserProfiles, UserPublickeys } from '../../../models'; +import { Users, Instances, DriveFiles, Followings, UserProfiles, UserPublickeys } from '../../../models'; import { User, IRemoteUser } from '../../../models/entities/user'; import { Emoji } from '../../../models/entities/emoji'; import { UserNotePining } from '../../../models/entities/user-note-pining'; @@ -479,18 +479,19 @@ export async function updateFeatured(userId: User['id']) { .slice(0, 5) .map(item => limit(() => resolveNote(item, resolver)))); - // delete - await UserNotePinings.delete({ userId: user.id }); - - // とりあえずidを別の時間で生成して順番を維持 - let td = 0; - for (const note of featuredNotes.filter(note => note != null)) { - td -= 1000; - UserNotePinings.save({ - id: genId(new Date(Date.now() + td)), - createdAt: new Date(), - userId: user.id, - noteId: note!.id - } as UserNotePining); - } + await getConnection().transaction(async transactionalEntityManager => { + await transactionalEntityManager.delete(UserNotePining, { userId: user.id }); + + // とりあえずidを別の時間で生成して順番を維持 + let td = 0; + for (const note of featuredNotes.filter(note => note != null)) { + td -= 1000; + transactionalEntityManager.insert(UserNotePining, { + id: genId(new Date(Date.now() + td)), + createdAt: new Date(), + userId: user.id, + noteId: note!.id + }); + } + }); } -- cgit v1.2.3-freya