diff --git a/packages/api/src/resolvers/integrations/index.ts b/packages/api/src/resolvers/integrations/index.ts index 14a049d2d..0618bf3ec 100644 --- a/packages/api/src/resolvers/integrations/index.ts +++ b/packages/api/src/resolvers/integrations/index.ts @@ -67,12 +67,14 @@ export const setIntegrationResolver = authorized< } else { // Create const integrationService = getIntegrationService(input.name) - // validate token - if (!(await integrationService.validateToken(input.token))) { + // authorize and get access token + const token = await integrationService.accessToken(input.token) + if (!token) { return { errorCodes: [SetIntegrationErrorCode.InvalidToken], } } + integrationToSave.token = token } // save integration diff --git a/packages/api/src/services/integrations/integration.ts b/packages/api/src/services/integrations/integration.ts index 1581a0842..045869111 100644 --- a/packages/api/src/services/integrations/integration.ts +++ b/packages/api/src/services/integrations/integration.ts @@ -4,8 +4,8 @@ import { Page } from '../../elastic/types' export abstract class IntegrationService { abstract name: string - validateToken = async (token: string): Promise => { - return Promise.resolve(true) + accessToken = async (token: string): Promise => { + return Promise.resolve('') } export = async ( integration: Integration, diff --git a/packages/api/src/services/integrations/pocket.ts b/packages/api/src/services/integrations/pocket.ts index 6370ad986..e7cb53286 100644 --- a/packages/api/src/services/integrations/pocket.ts +++ b/packages/api/src/services/integrations/pocket.ts @@ -21,6 +21,20 @@ export class PocketIntegration extends IntegrationService { name = 'POCKET' POCKET_API_URL = 'https://getpocket.com/v3' + accessToken = async (token: string): Promise => { + const url = `${this.POCKET_API_URL}/oauth/authorize` + try { + const response = await axios.post<{ access_token: string }>(url, { + consumer_key: env.pocket.consumerKey, + code: token, + }) + return response.data.access_token + } catch (error) { + console.log('error validating pocket token', error) + return null + } + } + retrievePocketData = async ( accessToken: string, since: number diff --git a/packages/api/src/services/integrations/readwise.ts b/packages/api/src/services/integrations/readwise.ts index ab069c119..9c680cf0e 100644 --- a/packages/api/src/services/integrations/readwise.ts +++ b/packages/api/src/services/integrations/readwise.ts @@ -38,7 +38,7 @@ export const READWISE_API_URL = 'https://readwise.io/api/v2' export class ReadwiseIntegration extends IntegrationService { name = 'READWISE' - validateToken = async (token: string): Promise => { + accessToken = async (token: string): Promise => { const authUrl = `${env.readwise.apiUrl || READWISE_API_URL}/auth` try { const response = await axios.get(authUrl, { @@ -46,10 +46,10 @@ export class ReadwiseIntegration extends IntegrationService { Authorization: `Token ${token}`, }, }) - return response.status === 204 + return response.status === 204 ? token : null } catch (error) { console.log('error validating readwise token', error) - return false + return null } } export = async (