Fix actor followers/following counts
This commit is contained in:
parent
304016c52b
commit
7006bc6378
|
@ -10,6 +10,7 @@ import { asyncMiddleware, executeIfActivityPub, localAccountValidator } from '..
|
||||||
import { videoChannelsGetValidator, videosGetValidator, videosShareValidator } from '../../middlewares/validators'
|
import { videoChannelsGetValidator, videosGetValidator, videosShareValidator } from '../../middlewares/validators'
|
||||||
import { videoCommentGetValidator } from '../../middlewares/validators/video-comments'
|
import { videoCommentGetValidator } from '../../middlewares/validators/video-comments'
|
||||||
import { AccountModel } from '../../models/account/account'
|
import { AccountModel } from '../../models/account/account'
|
||||||
|
import { ActorModel } from '../../models/activitypub/actor'
|
||||||
import { ActorFollowModel } from '../../models/activitypub/actor-follow'
|
import { ActorFollowModel } from '../../models/activitypub/actor-follow'
|
||||||
import { VideoModel } from '../../models/video/video'
|
import { VideoModel } from '../../models/video/video'
|
||||||
import { VideoChannelModel } from '../../models/video/video-channel'
|
import { VideoChannelModel } from '../../models/video/video-channel'
|
||||||
|
@ -22,13 +23,11 @@ activityPubClientRouter.get('/accounts?/:name',
|
||||||
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
||||||
executeIfActivityPub(accountController)
|
executeIfActivityPub(accountController)
|
||||||
)
|
)
|
||||||
|
activityPubClientRouter.get('/accounts?/:name/followers',
|
||||||
activityPubClientRouter.get('/accounts/:name/followers',
|
|
||||||
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(accountFollowersController))
|
executeIfActivityPub(asyncMiddleware(accountFollowersController))
|
||||||
)
|
)
|
||||||
|
activityPubClientRouter.get('/accounts?/:name/following',
|
||||||
activityPubClientRouter.get('/accounts/:name/following',
|
|
||||||
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
executeIfActivityPub(asyncMiddleware(localAccountValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(accountFollowingController))
|
executeIfActivityPub(asyncMiddleware(accountFollowingController))
|
||||||
)
|
)
|
||||||
|
@ -37,12 +36,10 @@ activityPubClientRouter.get('/videos/watch/:id',
|
||||||
executeIfActivityPub(asyncMiddleware(videosGetValidator)),
|
executeIfActivityPub(asyncMiddleware(videosGetValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(videoController))
|
executeIfActivityPub(asyncMiddleware(videoController))
|
||||||
)
|
)
|
||||||
|
|
||||||
activityPubClientRouter.get('/videos/watch/:id/announces/:accountId',
|
activityPubClientRouter.get('/videos/watch/:id/announces/:accountId',
|
||||||
executeIfActivityPub(asyncMiddleware(videosShareValidator)),
|
executeIfActivityPub(asyncMiddleware(videosShareValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(videoAnnounceController))
|
executeIfActivityPub(asyncMiddleware(videoAnnounceController))
|
||||||
)
|
)
|
||||||
|
|
||||||
activityPubClientRouter.get('/videos/watch/:videoId/comments/:commentId',
|
activityPubClientRouter.get('/videos/watch/:videoId/comments/:commentId',
|
||||||
executeIfActivityPub(asyncMiddleware(videoCommentGetValidator)),
|
executeIfActivityPub(asyncMiddleware(videoCommentGetValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(videoCommentController))
|
executeIfActivityPub(asyncMiddleware(videoCommentController))
|
||||||
|
@ -52,6 +49,14 @@ activityPubClientRouter.get('/video-channels/:id',
|
||||||
executeIfActivityPub(asyncMiddleware(videoChannelsGetValidator)),
|
executeIfActivityPub(asyncMiddleware(videoChannelsGetValidator)),
|
||||||
executeIfActivityPub(asyncMiddleware(videoChannelController))
|
executeIfActivityPub(asyncMiddleware(videoChannelController))
|
||||||
)
|
)
|
||||||
|
activityPubClientRouter.get('/video-channels/:id/followers',
|
||||||
|
executeIfActivityPub(asyncMiddleware(videoChannelsGetValidator)),
|
||||||
|
executeIfActivityPub(asyncMiddleware(videoChannelFollowersController))
|
||||||
|
)
|
||||||
|
activityPubClientRouter.get('/video-channels/:id/following',
|
||||||
|
executeIfActivityPub(asyncMiddleware(videoChannelsGetValidator)),
|
||||||
|
executeIfActivityPub(asyncMiddleware(videoChannelFollowingController))
|
||||||
|
)
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -70,24 +75,14 @@ function accountController (req: express.Request, res: express.Response, next: e
|
||||||
|
|
||||||
async function accountFollowersController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
async function accountFollowersController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
const account: AccountModel = res.locals.account
|
const account: AccountModel = res.locals.account
|
||||||
|
const activityPubResult = await actorFollowers(req, account.Actor)
|
||||||
const page = req.query.page || 1
|
|
||||||
const { start, count } = pageToStartAndCount(page, ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE)
|
|
||||||
|
|
||||||
const result = await ActorFollowModel.listAcceptedFollowerUrlsForApi([ account.Actor.id ], undefined, start, count)
|
|
||||||
const activityPubResult = activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, page, result)
|
|
||||||
|
|
||||||
return res.json(activityPubResult)
|
return res.json(activityPubResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function accountFollowingController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
async function accountFollowingController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
const account: AccountModel = res.locals.account
|
const account: AccountModel = res.locals.account
|
||||||
|
const activityPubResult = await actorFollowing(req, account.Actor)
|
||||||
const page = req.query.page || 1
|
|
||||||
const { start, count } = pageToStartAndCount(page, ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE)
|
|
||||||
|
|
||||||
const result = await ActorFollowModel.listAcceptedFollowingUrlsForApi([ account.Actor.id ], undefined, start, count)
|
|
||||||
const activityPubResult = activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, page, result)
|
|
||||||
|
|
||||||
return res.json(activityPubResult)
|
return res.json(activityPubResult)
|
||||||
}
|
}
|
||||||
|
@ -115,9 +110,41 @@ async function videoChannelController (req: express.Request, res: express.Respon
|
||||||
return res.json(videoChannel.toActivityPubObject())
|
return res.json(videoChannel.toActivityPubObject())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function videoChannelFollowersController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
|
const videoChannel: VideoChannelModel = res.locals.videoChannel
|
||||||
|
const activityPubResult = await actorFollowers(req, videoChannel.Actor)
|
||||||
|
|
||||||
|
return res.json(activityPubResult)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function videoChannelFollowingController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
|
const videoChannel: VideoChannelModel = res.locals.videoChannel
|
||||||
|
const activityPubResult = await actorFollowing(req, videoChannel.Actor)
|
||||||
|
|
||||||
|
return res.json(activityPubResult)
|
||||||
|
}
|
||||||
|
|
||||||
async function videoCommentController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
async function videoCommentController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
const videoComment: VideoCommentModel = res.locals.videoComment
|
const videoComment: VideoCommentModel = res.locals.videoComment
|
||||||
|
|
||||||
const threadParentComments = await VideoCommentModel.listThreadParentComments(videoComment, undefined)
|
const threadParentComments = await VideoCommentModel.listThreadParentComments(videoComment, undefined)
|
||||||
return res.json(videoComment.toActivityPubObject(threadParentComments))
|
return res.json(videoComment.toActivityPubObject(threadParentComments))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
async function actorFollowing (req: express.Request, actor: ActorModel) {
|
||||||
|
const page = req.query.page || 1
|
||||||
|
const { start, count } = pageToStartAndCount(page, ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE)
|
||||||
|
|
||||||
|
const result = await ActorFollowModel.listAcceptedFollowingUrlsForApi([ actor.id ], undefined, start, count)
|
||||||
|
return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, page, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function actorFollowers (req: express.Request, actor: ActorModel) {
|
||||||
|
const page = req.query.page || 1
|
||||||
|
const { start, count } = pageToStartAndCount(page, ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE)
|
||||||
|
|
||||||
|
const result = await ActorFollowModel.listAcceptedFollowerUrlsForApi([ actor.id ], undefined, start, count)
|
||||||
|
return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, page, result)
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import * as Promise from 'bluebird'
|
import * as Promise from 'bluebird'
|
||||||
import { createWriteStream } from 'fs'
|
import { createWriteStream } from 'fs'
|
||||||
|
import { RequestResponse } from 'request'
|
||||||
import * as request from 'request'
|
import * as request from 'request'
|
||||||
import { ACTIVITY_PUB } from '../initializers'
|
import { ACTIVITY_PUB } from '../initializers'
|
||||||
|
import Bluebird = require('bluebird')
|
||||||
|
|
||||||
function doRequest (requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean }) {
|
function doRequest (
|
||||||
|
requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean }
|
||||||
|
): Bluebird<{ response: RequestResponse, body: any }> {
|
||||||
if (requestOptions.activityPub === true) {
|
if (requestOptions.activityPub === true) {
|
||||||
if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {}
|
if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {}
|
||||||
requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER
|
requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER
|
||||||
|
|
|
@ -132,15 +132,13 @@ async function fetchActorTotalItems (url: string) {
|
||||||
activityPub: true
|
activityPub: true
|
||||||
}
|
}
|
||||||
|
|
||||||
let requestResult
|
|
||||||
try {
|
try {
|
||||||
requestResult = await doRequest(options)
|
const { body } = await doRequest(options)
|
||||||
|
return body.totalItems ? body.totalItems : 0
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.warn('Cannot fetch remote actor count %s.', url, err)
|
logger.warn('Cannot fetch remote actor count %s.', url, err)
|
||||||
return undefined
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
return requestResult.totalItems ? requestResult.totalItems : 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchAvatarIfExists (actorJSON: ActivityPubActor) {
|
async function fetchAvatarIfExists (actorJSON: ActivityPubActor) {
|
||||||
|
@ -314,7 +312,6 @@ async function refreshActorIfNeeded (actor: ActorModel) {
|
||||||
if (result === undefined) throw new Error('Cannot fetch remote actor in refresh actor.')
|
if (result === undefined) throw new Error('Cannot fetch remote actor in refresh actor.')
|
||||||
|
|
||||||
return sequelizeTypescript.transaction(async t => {
|
return sequelizeTypescript.transaction(async t => {
|
||||||
logger.info('coucou', result.actor.toJSON())
|
|
||||||
updateInstanceWithAnother(actor, result.actor)
|
updateInstanceWithAnother(actor, result.actor)
|
||||||
|
|
||||||
if (result.avatarName !== undefined) {
|
if (result.avatarName !== undefined) {
|
||||||
|
|
|
@ -256,7 +256,7 @@ describe('Test follows', function () {
|
||||||
await expectAccountFollows(servers[1].url, 'peertube@localhost:9001', 0, 1)
|
await expectAccountFollows(servers[1].url, 'peertube@localhost:9001', 0, 1)
|
||||||
await expectAccountFollows(servers[1].url, 'peertube@localhost:9002', 1, 0)
|
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:9001', 0, 2)
|
||||||
await expectAccountFollows(servers[2].url, 'peertube@localhost:9003', 1, 0)
|
await expectAccountFollows(servers[2].url, 'peertube@localhost:9003', 1, 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue