aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2018-01-18 15:22:36 +0100
committerChocobozzz <me@florianbigard.com>2018-01-18 16:43:26 +0100
commit2c897999fe877c52c8f7458d8bbff6c9367b6587 (patch)
tree3f66304fcea68a608bfd0f800e991731d910cc3d /server/lib
parent54e740594bc2eacd8026b5d2d6cfdfc06416a65b (diff)
downloadPeerTube-2c897999fe877c52c8f7458d8bbff6c9367b6587.tar.gz
PeerTube-2c897999fe877c52c8f7458d8bbff6c9367b6587.tar.zst
PeerTube-2c897999fe877c52c8f7458d8bbff6c9367b6587.zip
Optimize SQL query that fetch actor outbox
Diffstat (limited to 'server/lib')
-rw-r--r--server/lib/activitypub/actor.ts42
1 files changed, 30 insertions, 12 deletions
diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts
index a39b4e137..7494aadbb 100644
--- a/server/lib/activitypub/actor.ts
+++ b/server/lib/activitypub/actor.ts
@@ -212,7 +212,13 @@ function saveActorAndServerAndModelIfNotExist (
212 212
213 // Force the actor creation, sometimes Sequelize skips the save() when it thinks the instance already exists 213 // Force the actor creation, sometimes Sequelize skips the save() when it thinks the instance already exists
214 // (which could be false in a retried query) 214 // (which could be false in a retried query)
215 const actorCreated = await ActorModel.create(actor.toJSON(), { transaction: t }) 215 const [ actorCreated ] = await ActorModel.findOrCreate({
216 defaults: actor.toJSON(),
217 where: {
218 url: actor.url
219 },
220 transaction: t
221 })
216 222
217 if (actorCreated.type === 'Person' || actorCreated.type === 'Application') { 223 if (actorCreated.type === 'Person' || actorCreated.type === 'Application') {
218 const account = await saveAccount(actorCreated, result, t) 224 const account = await saveAccount(actorCreated, result, t)
@@ -284,24 +290,36 @@ async function fetchRemoteActor (actorUrl: string): Promise<FetchRemoteActorResu
284 } 290 }
285} 291}
286 292
287function saveAccount (actor: ActorModel, result: FetchRemoteActorResult, t: Transaction) { 293async function saveAccount (actor: ActorModel, result: FetchRemoteActorResult, t: Transaction) {
288 const account = new AccountModel({ 294 const [ accountCreated ] = await AccountModel.findOrCreate({
289 name: result.name, 295 defaults: {
290 actorId: actor.id 296 name: result.name,
297 actorId: actor.id
298 },
299 where: {
300 actorId: actor.id
301 },
302 transaction: t
291 }) 303 })
292 304
293 return account.save({ transaction: t }) 305 return accountCreated
294} 306}
295 307
296async function saveVideoChannel (actor: ActorModel, result: FetchRemoteActorResult, ownerActor: ActorModel, t: Transaction) { 308async function saveVideoChannel (actor: ActorModel, result: FetchRemoteActorResult, ownerActor: ActorModel, t: Transaction) {
297 const videoChannel = new VideoChannelModel({ 309 const [ videoChannelCreated ] = await VideoChannelModel.findOrCreate({
298 name: result.name, 310 defaults: {
299 description: result.summary, 311 name: result.name,
300 actorId: actor.id, 312 description: result.summary,
301 accountId: ownerActor.Account.id 313 actorId: actor.id,
314 accountId: ownerActor.Account.id
315 },
316 where: {
317 actorId: actor.id
318 },
319 transaction: t
302 }) 320 })
303 321
304 return videoChannel.save({ transaction: t }) 322 return videoChannelCreated
305} 323}
306 324
307async function refreshActorIfNeeded (actor: ActorModel) { 325async function refreshActorIfNeeded (actor: ActorModel) {