diff --git a/packages/api/src/routers/integration_router.ts b/packages/api/src/routers/integration_router.ts new file mode 100644 index 000000000..7e6d4079b --- /dev/null +++ b/packages/api/src/routers/integration_router.ts @@ -0,0 +1,54 @@ +import cors from 'cors' +import express from 'express' +import { corsConfig } from '../utils/corsConfig' +import { env } from '../env' +import axios from 'axios' +import { buildLogger } from '../utils/logger' +import { getClaimsByToken } from '../utils/auth' + +const logger = buildLogger('app.dispatch') + +export function integrationRouter() { + const router = express.Router() + // request token from pocket + router.post( + '/pocket/request-token', + cors(corsConfig), + async (req: express.Request, res: express.Response) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + const token = (req.cookies.auth as string) || req.headers.authorization + const claims = await getClaimsByToken(token) + if (!claims) { + return res.status(401).send('UNAUTHORIZED') + } + + const consumerKey = env.pocket.consumerKey + const redirectUri = `${env.client.url}/settings/integrations:pocketAuthorizationFinished` + try { + // make a POST request to Pocket to get a request token + const response = await axios.post<{ code: string }>( + 'https://getpocket.com/v3/oauth/request', + { + consumer_key: consumerKey, + redirect_uri: redirectUri, + } + ) + const { code } = response.data + // store the request token in a cookie + res.cookie('pocketRequestToken', code, { + maxAge: 1000 * 60 * 60, + }) + // redirect the user to Pocket to authorize the request token + res.redirect( + `https://getpocket.com/auth/authorize?request_token=${code}&redirect_uri=${redirectUri}` + ) + } catch (e) { + logger.info('pocket/request-token exception:', e) + res.redirect( + `${env.client.url}/settings/integrations?errorCodes=UNKNOWN` + ) + } + } + ) + return router +} diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 506046777..deccfade0 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -49,6 +49,7 @@ import { textToSpeechRouter } from './routers/text_to_speech' import * as httpContext from 'express-http-context' import { notificationRouter } from './routers/notification_router' import { userRouter } from './routers/user_router' +import { integrationRouter } from './routers/integration_router' const PORT = process.env.PORT || 4000 @@ -135,6 +136,7 @@ export const createApp = (): { app.use('/api/mobile-auth', mobileAuthRouter()) app.use('/api/text-to-speech', textToSpeechRouter()) app.use('/api/notification', notificationRouter()) + app.use('/api/integration', integrationRouter()) app.use('/svc/pubsub/content', contentServiceRouter()) app.use('/svc/pubsub/links', linkServiceRouter()) app.use('/svc/pubsub/newsletters', newsletterServiceRouter())