+const getFollowerValidator = [
+ param('nameWithHost')
+ .custom(isValidActorHandle),
+
+ async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+ if (areValidationErrors(req, res)) return
+
+ let follow: MActorFollowActorsDefault
+ try {
+ const actorUrl = await loadActorUrlOrGetFromWebfinger(req.params.nameWithHost)
+ const actor = await ActorModel.loadByUrl(actorUrl)
+
+ const serverActor = await getServerActor()
+ follow = await ActorFollowModel.loadByActorAndTarget(actor.id, serverActor.id)
+ } catch (err) {
+ logger.warn('Cannot get actor from handle.', { handle: req.params.nameWithHost, err })
+ }
+
+ if (!follow) {
+ return res.fail({
+ status: HttpStatusCode.NOT_FOUND_404,
+ message: `Follower ${req.params.nameWithHost} not found.`
+ })
+ }
+
+ res.locals.follow = follow
+ return next()
+ }
+]
+
+const acceptFollowerValidator = [
+ (req: express.Request, res: express.Response, next: express.NextFunction) => {
+ const follow = res.locals.follow
+ if (follow.state !== 'pending' && follow.state !== 'rejected') {
+ return res.fail({ message: 'Follow is not in pending/rejected state.' })
+ }
+
+ return next()
+ }
+]
+
+const rejectFollowerValidator = [
+ (req: express.Request, res: express.Response, next: express.NextFunction) => {
+ const follow = res.locals.follow
+ if (follow.state !== 'pending' && follow.state !== 'accepted') {
+ return res.fail({ message: 'Follow is not in pending/accepted state.' })
+ }
+
+ return next()
+ }
+]
+