import express from 'express'
import { body, param, query } from 'express-validator'
import { arrayify } from '@shared/core-utils'
+import { FollowState } from '@shared/models'
import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
import { areValidActorHandles, isValidActorHandle } from '../../helpers/custom-validators/activitypub/actor'
import { WEBSERVER } from '../../initializers/constants'
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
if (areValidationErrors(req, res)) return
+ if (!await doesSubscriptionExist({ uri: req.params.uri, res, state: 'accepted' })) return
- let [ name, host ] = req.params.uri.split('@')
- if (host === WEBSERVER.HOST) host = null
+ return next()
+ }
+]
- const user = res.locals.oauth.token.User
- const subscription = await ActorFollowModel.loadByActorAndTargetNameAndHostForAPI({
- actorId: user.Account.Actor.id,
- targetName: name,
- targetHost: host,
- state: 'accepted'
- })
+const userSubscriptionDeleteValidator = [
+ param('uri')
+ .custom(isValidActorHandle),
- if (!subscription?.ActorFollowing.VideoChannel) {
- return res.fail({
- status: HttpStatusCode.NOT_FOUND_404,
- message: `Subscription ${req.params.uri} not found.`
- })
- }
+ async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+ if (areValidationErrors(req, res)) return
+ if (!await doesSubscriptionExist({ uri: req.params.uri, res })) return
- res.locals.subscription = subscription
return next()
}
]
areSubscriptionsExistValidator,
userSubscriptionListValidator,
userSubscriptionAddValidator,
- userSubscriptionGetValidator
+ userSubscriptionGetValidator,
+ userSubscriptionDeleteValidator
+}
+
+// ---------------------------------------------------------------------------
+
+async function doesSubscriptionExist (options: {
+ uri: string
+ res: express.Response
+ state?: FollowState
+}) {
+ const { uri, res, state } = options
+
+ let [ name, host ] = uri.split('@')
+ if (host === WEBSERVER.HOST) host = null
+
+ const user = res.locals.oauth.token.User
+ const subscription = await ActorFollowModel.loadByActorAndTargetNameAndHostForAPI({
+ actorId: user.Account.Actor.id,
+ targetName: name,
+ targetHost: host,
+ state
+ })
+
+ if (!subscription?.ActorFollowing.VideoChannel) {
+ res.fail({
+ status: HttpStatusCode.NOT_FOUND_404,
+ message: `Subscription ${uri} not found.`
+ })
+ return false
+ }
+
+ res.locals.subscription = subscription
+
+ return true
}