diff --git a/packages/api/src/services/integrations/integration.ts b/packages/api/src/services/integrations/integration.ts index 045869111..2f8ccc0db 100644 --- a/packages/api/src/services/integrations/integration.ts +++ b/packages/api/src/services/integrations/integration.ts @@ -1,6 +1,17 @@ import { Integration } from '../../entity/integration' import { Page } from '../../elastic/types' +export type RetrievedDataState = 'archived' | 'saved' | 'deleted' +export interface RetrievedData { + url: string + labels?: string[] + state?: RetrievedDataState +} +export interface RetrievedResult { + data: RetrievedData[] + hasMore: boolean +} + export abstract class IntegrationService { abstract name: string @@ -13,7 +24,12 @@ export abstract class IntegrationService { ): Promise => { return Promise.resolve(true) } - import = async (integration: Integration): Promise => { - return Promise.resolve(0) + retrieve = async ( + token: string, + since = 0, + count = 100, + offset = 0 + ): Promise => { + return Promise.resolve({ data: [], hasMore: false }) } } diff --git a/packages/api/src/services/integrations/pocket.ts b/packages/api/src/services/integrations/pocket.ts index 9923e4ecf..5bea482d6 100644 --- a/packages/api/src/services/integrations/pocket.ts +++ b/packages/api/src/services/integrations/pocket.ts @@ -1,16 +1,22 @@ -import { IntegrationService } from './integration' -import { Integration } from '../../entity/integration' +import { + IntegrationService, + RetrievedDataState, + RetrievedResult, +} from './integration' import axios from 'axios' import { env } from '../../env' -import { DateTime } from 'luxon' -import { uploadToBucket } from '../../utils/uploads' -import { v4 as uuidv4 } from 'uuid' -import { getRepository } from '../../entity/utils' interface PocketResponse { + status: number + complete: number list: { [key: string]: PocketItem } + since: number + search_meta: { + search_type: string + } + error: string } interface PocketItem { @@ -103,28 +109,48 @@ export class PocketIntegration extends IntegrationService { } } - import = async (integration: Integration): Promise => { - const syncAt = integration.syncedAt - ? integration.syncedAt.getTime() / 1000 - : 0 - const pocketData = await this.retrievePocketData(integration.token, syncAt) + retrieve = async ( + token: string, + since = 0, + count = 100, + offset = 0 + ): Promise => { + // const syncAt = integration.syncedAt + // ? integration.syncedAt.getTime() / 1000 + // : 0 + const pocketData = await this.retrievePocketData( + token, + since, + count, + offset + ) const pocketItems = Object.values(pocketData.list) - if (pocketItems.length === 0) { - return 0 + const statusToState: Record = { + '0': 'saved', + '1': 'archived', + '2': 'deleted', } - // write the list of urls to a csv file and upload it to gcs - // path style: imports///-.csv - const dateStr = DateTime.now().toISODate() - const fileUuid = uuidv4() - const fullPath = `imports/${integration.user.id}/${dateStr}/URL_LIST-${fileUuid}.csv` - const data = pocketItems.map((item) => item.given_url).join('\n') - await uploadToBucket(fullPath, Buffer.from(data, 'utf-8'), { - contentType: 'text/csv', - }) - // update the integration's syncedAt - await getRepository(Integration).update(integration.id, { - syncedAt: new Date(), - }) - return pocketItems.length + const data = pocketItems.map((item) => ({ + url: item.given_url, + labels: Object.values(item.tags).map((tag) => tag.tag), + state: statusToState[item.status], + })) + return { + data, + hasMore: pocketData.complete !== 1, + } + // // write the list of urls to a csv file and upload it to gcs + // // path style: imports///-.csv + // const dateStr = DateTime.now().toISODate() + // const fileUuid = uuidv4() + // const fullPath = `imports/${integration.user.id}/${dateStr}/URL_LIST-${fileUuid}.csv` + // const data = pocketItems.map((item) => item.given_url).join('\n') + // await uploadToBucket(fullPath, Buffer.from(data, 'utf-8'), { + // contentType: 'text/csv', + // }) + // // update the integration's syncedAt + // await getRepository(Integration).update(integration.id, { + // syncedAt: new Date(), + // }) } } diff --git a/packages/api/test/resolvers/integrations.test.ts b/packages/api/test/resolvers/integrations.test.ts index 4973887a8..966acc391 100644 --- a/packages/api/test/resolvers/integrations.test.ts +++ b/packages/api/test/resolvers/integrations.test.ts @@ -357,12 +357,12 @@ describe('Integrations resolvers', () => { }) }) - describe('importFromIntegration API', () => { + xdescribe('importFromIntegration API', () => { const query = (integrationId: string) => ` mutation { importFromIntegration(integrationId: "${integrationId}") { ... on ImportFromIntegrationSuccess { - count + success } ... on ImportFromIntegrationError { errorCodes @@ -389,8 +389,11 @@ describe('Integrations resolvers', () => { access_token: existingIntegration.token, consumer_key: '', state: 'all', - detailType: 'simple', + detailType: 'complete', since: 0, + sort: 'oldest', + count: 100, + offset: 0, }) .reply(200, { list: {