diff options
Diffstat (limited to 'server/lib/activitypub/actor.ts')
-rw-r--r-- | server/lib/activitypub/actor.ts | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index c708b38ba..712de7d0d 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts | |||
@@ -64,7 +64,11 @@ async function getOrCreateActorAndServerAndModel (actorUrl: string, recurseIfNee | |||
64 | actor = await retryTransactionWrapper(saveActorAndServerAndModelIfNotExist, options) | 64 | actor = await retryTransactionWrapper(saveActorAndServerAndModelIfNotExist, options) |
65 | } | 65 | } |
66 | 66 | ||
67 | return refreshActorIfNeeded(actor) | 67 | const options = { |
68 | arguments: [ actor ], | ||
69 | errorMessage: 'Cannot refresh actor if needed with many retries.' | ||
70 | } | ||
71 | return retryTransactionWrapper(refreshActorIfNeeded, options) | ||
68 | } | 72 | } |
69 | 73 | ||
70 | function buildActorInstance (type: ActivityPubActorType, url: string, preferredUsername: string, uuid?: string) { | 74 | function buildActorInstance (type: ActivityPubActorType, url: string, preferredUsername: string, uuid?: string) { |
@@ -325,38 +329,43 @@ async function saveVideoChannel (actor: ActorModel, result: FetchRemoteActorResu | |||
325 | async function refreshActorIfNeeded (actor: ActorModel) { | 329 | async function refreshActorIfNeeded (actor: ActorModel) { |
326 | if (!actor.isOutdated()) return actor | 330 | if (!actor.isOutdated()) return actor |
327 | 331 | ||
328 | const actorUrl = await getUrlFromWebfinger(actor.preferredUsername, actor.getHost()) | 332 | try { |
329 | const result = await fetchRemoteActor(actorUrl) | 333 | const actorUrl = await getUrlFromWebfinger(actor.preferredUsername, actor.getHost()) |
330 | if (result === undefined) { | 334 | const result = await fetchRemoteActor(actorUrl) |
331 | logger.warn('Cannot fetch remote actor in refresh actor.') | 335 | if (result === undefined) { |
332 | return actor | 336 | logger.warn('Cannot fetch remote actor in refresh actor.') |
333 | } | 337 | return actor |
334 | |||
335 | return sequelizeTypescript.transaction(async t => { | ||
336 | updateInstanceWithAnother(actor, result.actor) | ||
337 | |||
338 | if (result.avatarName !== undefined) { | ||
339 | await updateActorAvatarInstance(actor, result.avatarName, t) | ||
340 | } | 338 | } |
341 | 339 | ||
342 | // Force update | 340 | return sequelizeTypescript.transaction(async t => { |
343 | actor.setDataValue('updatedAt', new Date()) | 341 | updateInstanceWithAnother(actor, result.actor) |
344 | await actor.save({ transaction: t }) | ||
345 | 342 | ||
346 | if (actor.Account) { | 343 | if (result.avatarName !== undefined) { |
347 | await actor.save({ transaction: t }) | 344 | await updateActorAvatarInstance(actor, result.avatarName, t) |
345 | } | ||
348 | 346 | ||
349 | actor.Account.set('name', result.name) | 347 | // Force update |
350 | await actor.Account.save({ transaction: t }) | 348 | actor.setDataValue('updatedAt', new Date()) |
351 | } else if (actor.VideoChannel) { | ||
352 | await actor.save({ transaction: t }) | 349 | await actor.save({ transaction: t }) |
353 | 350 | ||
354 | actor.VideoChannel.set('name', result.name) | 351 | if (actor.Account) { |
355 | await actor.VideoChannel.save({ transaction: t }) | 352 | await actor.save({ transaction: t }) |
356 | } | 353 | |
354 | actor.Account.set('name', result.name) | ||
355 | await actor.Account.save({ transaction: t }) | ||
356 | } else if (actor.VideoChannel) { | ||
357 | await actor.save({ transaction: t }) | ||
358 | |||
359 | actor.VideoChannel.set('name', result.name) | ||
360 | await actor.VideoChannel.save({ transaction: t }) | ||
361 | } | ||
357 | 362 | ||
363 | return actor | ||
364 | }) | ||
365 | } catch (err) { | ||
366 | logger.warn('Cannot refresh actor.', err) | ||
358 | return actor | 367 | return actor |
359 | }) | 368 | } |
360 | } | 369 | } |
361 | 370 | ||
362 | function normalizeActor (actor: any) { | 371 | function normalizeActor (actor: any) { |