diff options
Diffstat (limited to 'server/lib')
-rw-r--r-- | server/lib/activitypub/actor.ts | 72 | ||||
-rw-r--r-- | server/lib/activitypub/process/process-update.ts | 9 | ||||
-rw-r--r-- | server/lib/actor-image.ts | 3 |
3 files changed, 36 insertions, 48 deletions
diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index fe4796a3d..917fed6ec 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts | |||
@@ -34,6 +34,7 @@ import { | |||
34 | MActorFull, | 34 | MActorFull, |
35 | MActorFullActor, | 35 | MActorFullActor, |
36 | MActorId, | 36 | MActorId, |
37 | MActorImage, | ||
37 | MActorImages, | 38 | MActorImages, |
38 | MChannel | 39 | MChannel |
39 | } from '../../types/models' | 40 | } from '../../types/models' |
@@ -169,38 +170,34 @@ async function updateActorInstance (actorInstance: ActorModel, attributes: Activ | |||
169 | } | 170 | } |
170 | } | 171 | } |
171 | 172 | ||
172 | type AvatarInfo = { name: string, onDisk: boolean, fileUrl: string, type: ActorImageType } | 173 | type ImageInfo = { name: string, onDisk?: boolean, fileUrl: string } |
173 | async function updateActorImageInstance (actor: MActorImages, info: AvatarInfo, t: Transaction) { | 174 | async function updateActorImageInstance (actor: MActorImages, type: ActorImageType, imageInfo: ImageInfo | null, t: Transaction) { |
174 | if (!info.name) return actor | 175 | const oldImageModel = type === ActorImageType.AVATAR |
175 | |||
176 | const oldImageModel = info.type === ActorImageType.AVATAR | ||
177 | ? actor.Avatar | 176 | ? actor.Avatar |
178 | : actor.Banner | 177 | : actor.Banner |
179 | 178 | ||
180 | if (oldImageModel) { | 179 | if (oldImageModel) { |
181 | // Don't update the avatar if the file URL did not change | 180 | // Don't update the avatar if the file URL did not change |
182 | if (info.fileUrl && oldImageModel.fileUrl === info.fileUrl) return actor | 181 | if (imageInfo?.fileUrl && oldImageModel.fileUrl === imageInfo.fileUrl) return actor |
183 | 182 | ||
184 | try { | 183 | try { |
185 | await oldImageModel.destroy({ transaction: t }) | 184 | await oldImageModel.destroy({ transaction: t }) |
185 | |||
186 | setActorImage(actor, type, null) | ||
186 | } catch (err) { | 187 | } catch (err) { |
187 | logger.error('Cannot remove old actor image of actor %s.', actor.url, { err }) | 188 | logger.error('Cannot remove old actor image of actor %s.', actor.url, { err }) |
188 | } | 189 | } |
189 | } | 190 | } |
190 | 191 | ||
191 | const imageModel = await ActorImageModel.create({ | 192 | if (imageInfo) { |
192 | filename: info.name, | 193 | const imageModel = await ActorImageModel.create({ |
193 | onDisk: info.onDisk, | 194 | filename: imageInfo.name, |
194 | fileUrl: info.fileUrl, | 195 | onDisk: imageInfo.onDisk ?? false, |
195 | type: info.type | 196 | fileUrl: imageInfo.fileUrl, |
196 | }, { transaction: t }) | 197 | type: type |
198 | }, { transaction: t }) | ||
197 | 199 | ||
198 | if (info.type === ActorImageType.AVATAR) { | 200 | setActorImage(actor, type, imageModel) |
199 | actor.avatarId = imageModel.id | ||
200 | actor.Avatar = imageModel | ||
201 | } else { | ||
202 | actor.bannerId = imageModel.id | ||
203 | actor.Banner = imageModel | ||
204 | } | 201 | } |
205 | 202 | ||
206 | return actor | 203 | return actor |
@@ -310,27 +307,8 @@ async function refreshActorIfNeeded <T extends MActorFull | MActorAccountChannel | |||
310 | return sequelizeTypescript.transaction(async t => { | 307 | return sequelizeTypescript.transaction(async t => { |
311 | updateInstanceWithAnother(actor, result.actor) | 308 | updateInstanceWithAnother(actor, result.actor) |
312 | 309 | ||
313 | if (result.avatar !== undefined) { | 310 | await updateActorImageInstance(actor, ActorImageType.AVATAR, result.avatar, t) |
314 | const avatarInfo = { | 311 | await updateActorImageInstance(actor, ActorImageType.BANNER, result.banner, t) |
315 | name: result.avatar.name, | ||
316 | fileUrl: result.avatar.fileUrl, | ||
317 | onDisk: false, | ||
318 | type: ActorImageType.AVATAR | ||
319 | } | ||
320 | |||
321 | await updateActorImageInstance(actor, avatarInfo, t) | ||
322 | } | ||
323 | |||
324 | if (result.banner !== undefined) { | ||
325 | const bannerInfo = { | ||
326 | name: result.banner.name, | ||
327 | fileUrl: result.banner.fileUrl, | ||
328 | onDisk: false, | ||
329 | type: ActorImageType.BANNER | ||
330 | } | ||
331 | |||
332 | await updateActorImageInstance(actor, bannerInfo, t) | ||
333 | } | ||
334 | 312 | ||
335 | // Force update | 313 | // Force update |
336 | actor.setDataValue('updatedAt', new Date()) | 314 | actor.setDataValue('updatedAt', new Date()) |
@@ -381,6 +359,22 @@ export { | |||
381 | 359 | ||
382 | // --------------------------------------------------------------------------- | 360 | // --------------------------------------------------------------------------- |
383 | 361 | ||
362 | function setActorImage (actorModel: MActorImages, type: ActorImageType, imageModel: MActorImage) { | ||
363 | const id = imageModel | ||
364 | ? imageModel.id | ||
365 | : null | ||
366 | |||
367 | if (type === ActorImageType.AVATAR) { | ||
368 | actorModel.avatarId = id | ||
369 | actorModel.Avatar = imageModel | ||
370 | } else { | ||
371 | actorModel.bannerId = id | ||
372 | actorModel.Banner = imageModel | ||
373 | } | ||
374 | |||
375 | return actorModel | ||
376 | } | ||
377 | |||
384 | function saveActorAndServerAndModelIfNotExist ( | 378 | function saveActorAndServerAndModelIfNotExist ( |
385 | result: FetchRemoteActorResult, | 379 | result: FetchRemoteActorResult, |
386 | ownerActor?: MActorFullActor, | 380 | ownerActor?: MActorFullActor, |
diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts index ad3bb392d..6df9b93b2 100644 --- a/server/lib/activitypub/process/process-update.ts +++ b/server/lib/activitypub/process/process-update.ts | |||
@@ -134,13 +134,8 @@ async function processUpdateActor (actor: ActorModel, activity: ActivityUpdate) | |||
134 | 134 | ||
135 | await updateActorInstance(actor, actorAttributesToUpdate) | 135 | await updateActorInstance(actor, actorAttributesToUpdate) |
136 | 136 | ||
137 | for (const imageInfo of [ avatarInfo, bannerInfo ]) { | 137 | await updateActorImageInstance(actor, ActorImageType.AVATAR, avatarInfo, t) |
138 | if (!imageInfo) continue | 138 | await updateActorImageInstance(actor, ActorImageType.BANNER, bannerInfo, t) |
139 | |||
140 | const imageOptions = Object.assign({}, imageInfo, { onDisk: false }) | ||
141 | |||
142 | await updateActorImageInstance(actor, imageOptions, t) | ||
143 | } | ||
144 | 139 | ||
145 | await actor.save({ transaction: t }) | 140 | await actor.save({ transaction: t }) |
146 | 141 | ||
diff --git a/server/lib/actor-image.ts b/server/lib/actor-image.ts index 59afa93bd..fa1a2a18a 100644 --- a/server/lib/actor-image.ts +++ b/server/lib/actor-image.ts | |||
@@ -34,11 +34,10 @@ async function updateLocalActorImageFile ( | |||
34 | const actorImageInfo = { | 34 | const actorImageInfo = { |
35 | name: imageName, | 35 | name: imageName, |
36 | fileUrl: null, | 36 | fileUrl: null, |
37 | type, | ||
38 | onDisk: true | 37 | onDisk: true |
39 | } | 38 | } |
40 | 39 | ||
41 | const updatedActor = await updateActorImageInstance(accountOrChannel.Actor, actorImageInfo, t) | 40 | const updatedActor = await updateActorImageInstance(accountOrChannel.Actor, type, actorImageInfo, t) |
42 | await updatedActor.save({ transaction: t }) | 41 | await updatedActor.save({ transaction: t }) |
43 | 42 | ||
44 | await sendUpdateActor(accountOrChannel, t) | 43 | await sendUpdateActor(accountOrChannel, t) |