+ const options = {
+ arguments: [ actor ],
+ errorMessage: 'Cannot refresh actor if needed with many retries.'
+ }
+ return retryTransactionWrapper(refreshActorIfNeeded, options)
+}
+
+function buildActorInstance (type: ActivityPubActorType, url: string, preferredUsername: string, uuid?: string) {
+ return new ActorModel({
+ type,
+ url,
+ preferredUsername,
+ uuid,
+ publicKey: null,
+ privateKey: null,
+ followersCount: 0,
+ followingCount: 0,
+ inboxUrl: url + '/inbox',
+ outboxUrl: url + '/outbox',
+ sharedInboxUrl: CONFIG.WEBSERVER.URL + '/inbox',
+ followersUrl: url + '/followers',
+ followingUrl: url + '/following'
+ })
+}
+
+async function updateActorInstance (actorInstance: ActorModel, attributes: ActivityPubActor) {
+ const followersCount = await fetchActorTotalItems(attributes.followers)
+ const followingCount = await fetchActorTotalItems(attributes.following)
+
+ actorInstance.set('type', attributes.type)
+ actorInstance.set('uuid', attributes.uuid)
+ actorInstance.set('preferredUsername', attributes.preferredUsername)
+ actorInstance.set('url', attributes.id)
+ actorInstance.set('publicKey', attributes.publicKey.publicKeyPem)
+ actorInstance.set('followersCount', followersCount)
+ actorInstance.set('followingCount', followingCount)
+ actorInstance.set('inboxUrl', attributes.inbox)
+ actorInstance.set('outboxUrl', attributes.outbox)
+ actorInstance.set('sharedInboxUrl', attributes.endpoints.sharedInbox)
+ actorInstance.set('followersUrl', attributes.followers)
+ actorInstance.set('followingUrl', attributes.following)
+}
+
+async function updateActorAvatarInstance (actorInstance: ActorModel, avatarName: string, t: Transaction) {
+ if (avatarName !== undefined) {
+ if (actorInstance.avatarId) {
+ try {
+ await actorInstance.Avatar.destroy({ transaction: t })
+ } catch (err) {
+ logger.error('Cannot remove old avatar of actor %s.', actorInstance.url, err)
+ }
+ }
+
+ const avatar = await AvatarModel.create({
+ filename: avatarName
+ }, { transaction: t })
+
+ actorInstance.set('avatarId', avatar.id)
+ actorInstance.Avatar = avatar
+ }
+
+ return actorInstance