+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
+}
+
+async function fetchActorTotalItems (url: string) {
+ const options = {
+ uri: url,
+ method: 'GET',
+ json: true,
+ activityPub: true
+ }
+
+ try {
+ const { body } = await doRequest(options)
+ return body.totalItems ? body.totalItems : 0
+ } catch (err) {
+ logger.warn('Cannot fetch remote actor count %s.', url, { err })
+ return 0
+ }
+}
+
+async function fetchAvatarIfExists (actorJSON: ActivityPubActor) {
+ if (
+ actorJSON.icon && actorJSON.icon.type === 'Image' && IMAGE_MIMETYPE_EXT[actorJSON.icon.mediaType] !== undefined &&
+ isActivityPubUrlValid(actorJSON.icon.url)
+ ) {
+ const extension = IMAGE_MIMETYPE_EXT[actorJSON.icon.mediaType]
+
+ const avatarName = uuidv4() + extension
+ const destPath = join(CONFIG.STORAGE.AVATARS_DIR, avatarName)
+
+ await doRequestAndSaveToFile({
+ method: 'GET',
+ uri: actorJSON.icon.url
+ }, destPath)
+
+ return avatarName
+ }
+
+ return undefined
+}
+
+async function addFetchOutboxJob (actor: ActorModel) {
+ // Don't fetch ourselves
+ const serverActor = await getServerActor()
+ if (serverActor.id === actor.id) {
+ logger.error('Cannot fetch our own outbox!')
+ return undefined
+ }
+
+ const payload = {
+ uris: [ actor.outboxUrl ]
+ }
+
+ return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
+}
+
+export {
+ getOrCreateActorAndServerAndModel,
+ buildActorInstance,
+ setAsyncActorKeys,
+ fetchActorTotalItems,
+ fetchAvatarIfExists,
+ updateActorInstance,
+ updateActorAvatarInstance,
+ addFetchOutboxJob
+}
+
+// ---------------------------------------------------------------------------
+