--- /dev/null
+import * as Sequelize from 'sequelize'
+import { ACTOR_FOLLOW_SCORE } from '../index'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+ const query = 'UPDATE "actor" SET ' +
+ '"followersCount" = (SELECT COUNT(*) FROM "actorFollow" WHERE "actor"."id" = "actorFollow"."targetActorId"), ' +
+ '"followingCount" = (SELECT COUNT(*) FROM "actorFollow" WHERE "actor"."id" = "actorFollow"."actorId") ' +
+ 'WHERE "actor"."serverId" IS NULL'
+
+ await utils.sequelize.query(query)
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
import { values } from 'lodash'
import * as Sequelize from 'sequelize'
import {
+ AfterCreate, AfterDestroy, AfterUpdate,
AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, IsInt, Max, Model, Table,
UpdatedAt
} from 'sequelize-typescript'
})
ActorFollowing: ActorModel
+ @AfterCreate
+ @AfterUpdate
+ static incrementFollowerAndFollowingCount (instance: ActorFollowModel) {
+ if (instance.state !== 'accepted') return
+
+ 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()
} from '../../utils/index'
import { dateIsValid } from '../../utils/miscs/miscs'
import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort, unfollow } from '../../utils/server/follows'
+import { expectAccountFollows } from '../../utils/users/accounts'
import { userLogin } from '../../utils/users/login'
import { createUser } from '../../utils/users/users'
import {
expect(follows.length).to.equal(0)
})
+ it('Should have the correct following counts', async function () {
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9001', 0, 2)
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9002', 1, 0)
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9003', 1, 0)
+
+ // Server 2 and 3 does not know server 1 follow another server (there was not a refresh)
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9002', 1, 0)
+
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9003', 1, 0)
+ })
+
it('Should unfollow server 3 on server 1', async function () {
this.timeout(5000)
expect(follows.length).to.equal(0)
})
+ it('Should have the correct following counts 2', async function () {
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9002', 1, 0)
+
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9002', 1, 0)
+
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9001', 0, 0)
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9003', 0, 0)
+ })
+
it('Should upload a video on server 2 ans 3 and propagate only the video of server 2', async function () {
this.timeout(10000)
await wait(7000)
})
+ it('Should have the correct following counts 2', async function () {
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9001', 0, 2)
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9002', 1, 0)
+ await expectAccountFollows(servers[0].url, 'peertube@localhost:9003', 1, 0)
+
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[1].url, 'peertube@localhost:9002', 1, 0)
+
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9001', 0, 1)
+ await expectAccountFollows(servers[2].url, 'peertube@localhost:9003', 1, 0)
+ })
+
it('Should propagate videos', async function () {
const res = await getVideosList(servers[ 0 ].url)
expect(res.body.total).to.equal(7)
+import { expect } from 'chai'
+import { Account } from '../../../../shared/models/actors'
import { makeGetRequest } from '../requests/requests'
function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) {
})
}
+async function expectAccountFollows (url: string, nameWithDomain: string, followersCount: number, followingCount: number) {
+ const res = await getAccountsList(url)
+ const account = res.body.data.find((a: Account) => a.name + '@' + a.host === nameWithDomain)
+
+ const message = `${nameWithDomain} on ${url}`
+ expect(account.followersCount).to.equal(followersCount, message)
+ expect(account.followingCount).to.equal(followingCount, message)
+}
+
// ---------------------------------------------------------------------------
export {
getAccount,
+ expectAccountFollows,
getAccountsList
}