server/routes/idapi.ts (122 lines of code) (raw):
import type { NextFunction, Request, Response } from 'express';
import { Router } from 'express';
import type { ConsentAPIResponse } from '@/client/components/mma/identity/idapi/consents';
import type { NewsletterAPIResponse } from '@/client/components/mma/identity/idapi/newsletters';
import type { NewsletterSubscriptions } from '@/client/components/mma/identity/idapi/newsletterSubscriptions';
import type {
ConsentPatchRequest,
NewsletterPatchRequest,
} from '../idapiProxy';
import { idapiProxyHandler } from '../idapiProxy';
import { withIdentity } from '../middleware/identityMiddleware';
import { csrfValidateMiddleware } from '../util';
const router = Router();
router.use(withIdentity(401));
router.get(
'/user',
idapiProxyHandler({
url: '/user/me',
sendAuthHeader: true,
}),
);
router.put(
'/user',
csrfValidateMiddleware,
idapiProxyHandler({
url: '/user/me',
method: 'POST',
sendAuthHeader: true,
}),
);
router.get(
'/user/newsletters',
csrfValidateMiddleware,
idapiProxyHandler<NewsletterSubscriptions>({
url: '/users/me/newsletters',
sendAuthHeader: true,
}),
);
router.get(
'/newsletters',
csrfValidateMiddleware,
idapiProxyHandler<NewsletterAPIResponse[]>({
url: '/newsletters',
sendAuthHeader: false,
}),
);
router.get(
'/newsletters/restricted',
csrfValidateMiddleware,
idapiProxyHandler<NewsletterAPIResponse[]>({
url: '/newsletters/restricted',
sendAuthHeader: false,
}),
);
router.patch(
'/user/newsletters',
csrfValidateMiddleware,
idapiProxyHandler<NewsletterPatchRequest>({
url: '/users/me/newsletters',
method: 'PATCH',
sendAuthHeader: true,
}),
);
router.get(
'/consents',
csrfValidateMiddleware,
idapiProxyHandler<ConsentAPIResponse[]>({
url: '/consents?filter=all',
sendAuthHeader: false,
}),
);
router.patch(
'/user/consents',
csrfValidateMiddleware,
idapiProxyHandler<ConsentPatchRequest>({
url: '/users/me/consents',
method: 'PATCH',
sendAuthHeader: true,
}),
);
router.delete(
'/user/telephone-number',
csrfValidateMiddleware,
idapiProxyHandler({
url: '/user/me/telephoneNumber',
method: 'DELETE',
sendAuthHeader: true,
}),
);
router.delete(
'/user/consents/all',
csrfValidateMiddleware,
idapiProxyHandler({
url: '/remove/consent/all',
method: 'POST',
sendAuthHeader: true,
}),
);
router.post(
'/user/username',
csrfValidateMiddleware,
idapiProxyHandler({
url: '/user/me/username',
method: 'POST',
sendAuthHeader: true,
}),
);
router.post(
'/user/username',
csrfValidateMiddleware,
idapiProxyHandler({
url: '/user/me/username',
method: 'POST',
}),
);
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- assume we don't know the range of possible types for the err argument?
router.use((err: any, _: Request, res: Response, next: NextFunction) => {
if (err.code && err.code === 'EBADCSRFTOKEN') {
res.sendStatus(403);
}
next(err);
});
export { router };