import { values } from 'lodash'
import * as Sequelize from 'sequelize'
import {
- AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, IsInt, Max, Model, Table,
- UpdatedAt
+ AfterCreate, AfterDestroy, AfterUpdate, AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, IsInt, Max, Model,
+ Table, UpdatedAt
} from 'sequelize-typescript'
import { FollowState } from '../../../shared/models/actors'
import { AccountFollow } from '../../../shared/models/actors/follow.model'
})
ActorFollowing: ActorModel
+ @AfterCreate
+ @AfterUpdate
+ static incrementFollowerAndFollowingCount (instance: ActorFollowModel) {
+ if (instance.state !== 'accepted') return undefined
+
+ return Promise.all([
+ ActorModel.incrementFollows(instance.actorId, 'followingCount', 1),
+ ActorModel.incrementFollows(instance.targetActorId, 'followersCount', 1)
+ ])
+ }
+
+ @AfterDestroy
+ static decrementFollowerAndFollowingCount (instance: ActorFollowModel) {
+ return Promise.all([
+ ActorModel.incrementFollows(instance.actorId, 'followingCount',-1),
+ ActorModel.incrementFollows(instance.targetActorId, 'followersCount', -1)
+ ])
+ }
+
// Remove actor follows with a score of 0 (too many requests where they were unreachable)
static async removeBadActorFollows () {
const actorFollows = await ActorFollowModel.listBadActorFollows()
return ActorFollowModel.findOne(query)
}
+ static loadByFollowerInbox (url: string, t?: Sequelize.Transaction) {
+ const query = {
+ where: {
+ state: 'accepted'
+ },
+ include: [
+ {
+ model: ActorModel,
+ required: true,
+ as: 'ActorFollower',
+ where: {
+ [Sequelize.Op.or]: [
+ {
+ inboxUrl: url
+ },
+ {
+ sharedInboxUrl: url
+ }
+ ]
+ }
+ }
+ ],
+ transaction: t
+ } as any // FIXME: typings does not work
+
+ return ActorFollowModel.findOne(query)
+ }
+
static listFollowingForApi (id: number, start: number, count: number, sort: string) {
const query = {
distinct: true,
offset: start,
limit: count,
- order: [ getSort(sort) ],
+ order: getSort(sort),
include: [
{
model: ActorModel,
distinct: true,
offset: start,
limit: count,
- order: [ getSort(sort) ],
+ order: getSort(sort),
include: [
{
model: ActorModel,
private static incrementScores (inboxUrls: string[], value: number, t: Sequelize.Transaction) {
const inboxUrlsString = inboxUrls.map(url => `'${url}'`).join(',')
- const query = 'UPDATE "actorFollow" SET "score" = "score" +' + value + ' ' +
+ const query = `UPDATE "actorFollow" SET "score" = LEAST("score" + ${value}, ${ACTOR_FOLLOW_SCORE.MAX}) ` +
'WHERE id IN (' +
'SELECT "actorFollow"."id" FROM "actorFollow" ' +
'INNER JOIN "actor" ON "actor"."id" = "actorFollow"."actorId" ' +
score: {
[Sequelize.Op.lte]: 0
}
- }
+ },
+ logging: false
}
return ActorFollowModel.findAll(query)