return { actorFollow: undefined as MActorFollowActors }
}
- const [ actorFollow, created ] = await ActorFollowModel.findOrCreate<MActorFollowActors>({
- where: {
- actorId: byActor.id,
- targetActorId: targetActor.id
- },
- defaults: {
+ // Don't use findOrCreate by sequelize that breaks our actor follow hooks
+ let created = false
+ let actorFollow: MActorFollowActors = await ActorFollowModel.loadByActorAndTarget(byActor.id, targetActor.id, t)
+
+ if (!actorFollow) {
+ created = true
+
+ actorFollow = await ActorFollowModel.create({
actorId: byActor.id,
targetActorId: targetActor.id,
url: activityId,
state: CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL
? 'pending'
: 'accepted'
- },
- transaction: t
- })
+ }, { transaction: t })
+ }
// Set the follow as accepted if the remote actor follows a channel or account
// Or if the instance automatically accepts followers
private pendingBadServer = new Set<number>()
private pendingGoodServer = new Set<number>()
- private badInboxes = new Set<string>()
+ private readonly badInboxes = new Set<string>()
private constructor () {}
UpdatedAt
} from 'sequelize-typescript'
import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc'
+import { afterCommitIfTransaction } from '@server/helpers/database-utils'
import { getServerActor } from '@server/models/application/application'
import {
MActorFollowActorsDefault,
@AfterCreate
@AfterUpdate
static incrementFollowerAndFollowingCount (instance: ActorFollowModel, options: any) {
- if (instance.state !== 'accepted') return undefined
-
- return Promise.all([
- ActorModel.rebuildFollowsCount(instance.actorId, 'following', options.transaction),
- ActorModel.rebuildFollowsCount(instance.targetActorId, 'followers', options.transaction)
- ])
+ return afterCommitIfTransaction(options.transaction, () => {
+ return Promise.all([
+ ActorModel.rebuildFollowsCount(instance.actorId, 'following'),
+ ActorModel.rebuildFollowsCount(instance.targetActorId, 'followers')
+ ])
+ })
}
@AfterDestroy
static decrementFollowerAndFollowingCount (instance: ActorFollowModel, options: any) {
- return Promise.all([
- ActorModel.rebuildFollowsCount(instance.actorId, 'following', options.transaction),
- ActorModel.rebuildFollowsCount(instance.targetActorId, 'followers', options.transaction)
- ])
+ return afterCommitIfTransaction(options.transaction, () => {
+ return Promise.all([
+ ActorModel.rebuildFollowsCount(instance.actorId, 'following'),
+ ActorModel.rebuildFollowsCount(instance.targetActorId, 'followers')
+ ])
+ })
}
static removeFollowsOf (actorId: number, t?: Transaction) {
const body = await following.follows.getFollowers({ start: 0, count: 5, sort: '-createdAt' })
const follow = body.data.find(f => f.follower.host === follower.host && f.state === 'accepted')
- if (exists === true) expect(follow).to.exist
- else expect(follow).to.be.undefined
+ if (exists === true) expect(follow, `Follower ${follower.url} should exist on ${following.url}`).to.exist
+ else expect(follow, `Follower ${follower.url} should not exist on ${following.url}`).to.be.undefined
}
{
const body = await follower.follows.getFollowings({ start: 0, count: 5, sort: '-createdAt' })
const follow = body.data.find(f => f.following.host === following.host && f.state === 'accepted')
- if (exists === true) expect(follow).to.exist
- else expect(follow).to.be.undefined
+ if (exists === true) expect(follow, `Following ${following.url} should exist on ${follower.url}`).to.exist
+ else expect(follow, `Following ${following.url} should not exist on ${follower.url}`).to.be.undefined
}
}
const jobs = body.data
expect(jobs).to.have.length.above(2)
- // We know there are a least 1 delayed job (video views) and 1 completed job (broadcast)
- expect(jobs.find(j => j.state === 'delayed')).to.not.be.undefined
expect(jobs.find(j => j.state === 'completed')).to.not.be.undefined
})