diff --git a/examples/custom-workflow.ts b/examples/custom-workflow.ts index e044a2a..862fb46 100644 --- a/examples/custom-workflow.ts +++ b/examples/custom-workflow.ts @@ -11,7 +11,6 @@ async function customWorkflowExample(): Promise { console.log('šŸš€ Linked API custom workflow example starting...'); const workflowId = await linkedapi.customWorkflow.execute({ actionType: 'st.searchPeople', - term: "John", limit: 3, filter: { locations: ["San Francisco"], @@ -31,7 +30,7 @@ async function customWorkflowExample(): Promise { const result = await linkedapi.customWorkflow.result(workflowId); console.log('āœ… Custom workflow executed successfully'); - console.log('šŸ” Result: ', JSON.stringify(result, null, 2)); + console.log('šŸ” Result: ', JSON.stringify(result.data, null, 2)); } catch (error) { if (error instanceof LinkedApiError) { console.error('🚨 Linked API Error:', error.message); diff --git a/examples/fetch-company.ts b/examples/fetch-company.ts index 5f8102d..f484d4b 100644 --- a/examples/fetch-company.ts +++ b/examples/fetch-company.ts @@ -63,7 +63,7 @@ async function standardExample(linkedapi: LinkedApi): Promise { } async function salesNavigatorExample(linkedapi: LinkedApi): Promise { - const workflowId = await linkedapi.salesNavigatorFetchCompany.execute({ + const workflowId = await linkedapi.nvFetchCompany.execute({ companyHashedUrl: 'https://www.linkedin.com/sales/company/1035', retrieveEmployees: true, retrieveDMs: true, @@ -79,7 +79,7 @@ async function salesNavigatorExample(linkedapi: LinkedApi): Promise { }); console.log('šŸ” Sales Navigator workflow started: ', workflowId); - const nvCompanyData = await linkedapi.salesNavigatorFetchCompany.result(workflowId); + const nvCompanyData = await linkedapi.nvFetchCompany.result(workflowId); if (nvCompanyData.data) { const nvCompany = nvCompanyData.data; console.log('āœ… Sales Navigator company page opened successfully'); diff --git a/examples/fetch-person.ts b/examples/fetch-person.ts index d438047..734c58d 100644 --- a/examples/fetch-person.ts +++ b/examples/fetch-person.ts @@ -64,9 +64,9 @@ async function salesNavigatorExample(linkedapi: LinkedApi): Promise { personHashedUrl: 'https://www.linkedin.com/in/abc123', }; - const workflowId = await linkedapi.salesNavigatorFetchPerson.execute(fetchParams); + const workflowId = await linkedapi.nvFetchPerson.execute(fetchParams); console.log('šŸ” Workflow started: ', workflowId); - const personResult = await linkedapi.salesNavigatorFetchPerson.result(workflowId); + const personResult = await linkedapi.nvFetchPerson.result(workflowId); if (personResult.data) { const person = personResult.data; console.log('āœ… Person page opened successfully'); diff --git a/examples/messaging.ts b/examples/messaging.ts index f2251ee..ac10042 100644 --- a/examples/messaging.ts +++ b/examples/messaging.ts @@ -80,10 +80,10 @@ async function salesNavigatorSendMessage(linkedapi: LinkedApi, personUrl: string subject: 'Let\'s connect!', }; - const workflowId = await linkedapi.salesNavigatorSendMessage.execute(nvMessageParams); + const workflowId = await linkedapi.nvSendMessage.execute(nvMessageParams); console.log('šŸŽÆ Sales Navigator send message workflow started:', workflowId); - const nvMessageResult = await linkedapi.salesNavigatorSendMessage.result(workflowId); + const nvMessageResult = await linkedapi.nvSendMessage.result(workflowId); if (nvMessageResult.errors.length > 0) { console.error('🚨 Errors:', JSON.stringify(nvMessageResult.errors, null, 2)); } else { @@ -100,10 +100,10 @@ async function salesNavigatorSyncConversation(linkedapi: LinkedApi, personUrl: s personUrl: personUrl, }; - const workflowId = await linkedapi.salesNavigatorSyncConversation.execute(nvSyncParams); + const workflowId = await linkedapi.nvSyncConversation.execute(nvSyncParams); console.log('šŸŽÆ Sales Navigator sync conversation workflow started:', workflowId); - const nvSyncResult = await linkedapi.salesNavigatorSyncConversation.result(workflowId); + const nvSyncResult = await linkedapi.nvSyncConversation.result(workflowId); if (nvSyncResult.errors.length > 0) { console.error('🚨 Errors:', JSON.stringify(nvSyncResult.errors, null, 2)); } else { @@ -129,23 +129,20 @@ async function pollConversations(linkedapi: LinkedApi, standardPersonUrl: string }, ]); - if (!pollResponse.success) { - console.error('āŒ Failed to poll conversations:', pollResponse.error?.message); - return; - } - console.log('āœ… Conversations polled successfully'); - console.log(`šŸ“Š Found ${pollResponse.result?.length || 0} conversations`); + console.log(`šŸ“Š Found ${pollResponse.data?.length || 0} conversations`); - pollResponse.result?.forEach((conversation, index) => { - console.log(`\nšŸ’¬ Conversation ${index + 1}:`); - console.log(` šŸ‘¤ Person: ${conversation.personUrl}`); + if (pollResponse.errors.length > 0) { + console.error('🚨 Errors:', JSON.stringify(pollResponse.errors, null, 2)); + } + pollResponse.data?.forEach((conversation) => { + console.log(`\nšŸ’¬ Conversation with ${conversation.personUrl}:`); console.log(` šŸ”— Type: ${conversation.type === 'st' ? 'Standard' : 'Sales Navigator'}`); console.log(` šŸ“¬ Messages: ${conversation.messages.length}`); if (conversation.messages.length > 0) { console.log(' šŸ“ Recent messages:'); - conversation.messages.slice(-3).forEach((message) => { + conversation.messages.slice(0, 5).forEach((message) => { const senderIcon = message.sender === 'us' ? 'šŸ‘¤' : 'šŸ‘‹'; console.log(` ${senderIcon} ${message.sender.toUpperCase()}: "${message.text}"`); console.log(` šŸ• ${message.time}`); diff --git a/examples/search-companies.ts b/examples/search-companies.ts index f49ec38..339ae70 100644 --- a/examples/search-companies.ts +++ b/examples/search-companies.ts @@ -70,9 +70,9 @@ async function salesNavigatorExample(linkedapi: LinkedApi): Promise { }; console.log('\nšŸŽÆ Searching companies with Sales Navigator...'); - const workflowId = await linkedapi.salesNavigatorSearchCompanies.execute(nvSearchParams); + const workflowId = await linkedapi.nvSearchCompanies.execute(nvSearchParams); console.log('šŸ” Sales Navigator workflow started:', workflowId); - const nvResults = await linkedapi.salesNavigatorSearchCompanies.result(workflowId); + const nvResults = await linkedapi.nvSearchCompanies.result(workflowId); if (nvResults.data) { const results = nvResults.data; diff --git a/examples/search-people.ts b/examples/search-people.ts index d89079c..f293f67 100644 --- a/examples/search-people.ts +++ b/examples/search-people.ts @@ -70,9 +70,9 @@ async function salesNavigatorExample(linkedapi: LinkedApi): Promise { }; console.log('\nšŸŽÆ Searching people with Sales Navigator...'); - const workflowId = await linkedapi.salesNavigatorSearchPeople.execute(nvSearchParams); + const workflowId = await linkedapi.nvSearchPeople.execute(nvSearchParams); console.log('šŸ” Sales Navigator workflow started:', workflowId); - const nvResults = await linkedapi.salesNavigatorSearchPeople.result(workflowId); + const nvResults = await linkedapi.nvSearchPeople.result(workflowId); if (nvResults.data) { const results = nvResults.data; diff --git a/examples/statistics.ts b/examples/statistics.ts index 2273c7f..deae424 100644 --- a/examples/statistics.ts +++ b/examples/statistics.ts @@ -64,22 +64,18 @@ async function getRecentUsageStats(linkedapi: LinkedApi): Promise { const endDate = new Date(); const startDate = new Date(endDate.getTime() - 7 * 24 * 60 * 60 * 1000); - const statsResponse = await linkedapi.getApiUsageStats({ + const { data } = await linkedapi.getApiUsage({ start: startDate.toISOString(), end: endDate.toISOString() }); - if (!statsResponse.success) { - console.error('āŒ Failed to retrieve stats:', statsResponse.error?.message); - return; - } + console.log('āœ… API Usage retrieved successfully'); + console.log(`šŸ“ˆ Total actions executed: ${data?.length || 0}`); - console.log('āœ… Usage statistics retrieved successfully'); - console.log(`šŸ“ˆ Total actions executed: ${statsResponse.result?.length || 0}`); - if (statsResponse.result && statsResponse.result.length > 0) { + if (data && data.length > 0) { console.log('\nšŸ“‹ Recent actions:'); - statsResponse.result.slice(-5).forEach((action) => { + data.slice(0, 10).forEach((action) => { const status = action.success ? 'āœ…' : 'āŒ'; const date = new Date(action.time).toLocaleDateString(); const time = new Date(action.time).toLocaleTimeString(); diff --git a/package.json b/package.json index e7cee58..7737e2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkedapi-node", - "version": "1.2.0", + "version": "1.2.1", "description": "Official TypeScript SDK for Linked API", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/core/linked-api-http-client.ts b/src/core/linked-api-http-client.ts index 5d6919b..222c633 100644 --- a/src/core/linked-api-http-client.ts +++ b/src/core/linked-api-http-client.ts @@ -6,21 +6,22 @@ import { TLinkedApiResponse, } from '../types'; -export function buildLinkedApiHttpClient(config: TLinkedApiConfig): HttpClient { - return new LinkedApiHttpClient(config); +export function buildLinkedApiHttpClient(config: TLinkedApiConfig, client: string): HttpClient { + return new LinkedApiHttpClient(config, client); } class LinkedApiHttpClient extends HttpClient { private readonly baseUrl: string; private readonly headers: Record; - constructor(config: TLinkedApiConfig) { + constructor(config: TLinkedApiConfig, client: string) { super(); this.baseUrl = 'https://api.linkedapi.io'; this.headers = { 'Content-Type': 'application/json', 'linked-api-token': config.linkedApiToken, 'identification-token': config.identificationToken, + client: client, }; } diff --git a/src/core/operation.ts b/src/core/operation.ts index 7fc7699..c3faaef 100644 --- a/src/core/operation.ts +++ b/src/core/operation.ts @@ -5,7 +5,6 @@ import { LinkedApiWorkflowTimeoutError, TLinkedApiErrorType, TWorkflowCompletion, - TWorkflowDefinition, TWorkflowResponse, TWorkflowRunningStatus, } from '../types'; @@ -13,30 +12,30 @@ import { import { pollWorkflowResult } from './poll-results'; export const OPERATION_NAME = { - fetchPerson: 'fetchPerson', - fetchCompany: 'fetchCompany', - salesNavigatorFetchCompany: 'salesNavigatorFetchCompany', - salesNavigatorFetchPerson: 'salesNavigatorFetchPerson', - fetchPost: 'fetchPost', - searchCompanies: 'searchCompanies', - salesNavigatorSearchCompanies: 'salesNavigatorSearchCompanies', - searchPeople: 'searchPeople', - salesNavigatorSearchPeople: 'salesNavigatorSearchPeople', + customWorkflow: 'customWorkflow', sendMessage: 'sendMessage', syncConversation: 'syncConversation', - salesNavigatorSendMessage: 'salesNavigatorSendMessage', - salesNavigatorSyncConversation: 'salesNavigatorSyncConversation', - sendConnectionRequest: 'sendConnectionRequest', checkConnectionStatus: 'checkConnectionStatus', + sendConnectionRequest: 'sendConnectionRequest', withdrawConnectionRequest: 'withdrawConnectionRequest', retrievePendingRequests: 'retrievePendingRequests', retrieveConnections: 'retrieveConnections', removeConnection: 'removeConnection', + searchCompanies: 'searchCompanies', + searchPeople: 'searchPeople', + fetchPerson: 'fetchPerson', + fetchCompany: 'fetchCompany', + fetchPost: 'fetchPost', reactToPost: 'reactToPost', commentOnPost: 'commentOnPost', retrieveSSI: 'retrieveSSI', retrievePerformance: 'retrievePerformance', - customWorkflow: 'customWorkflow', + nvSendMessage: 'nvSendMessage', + nvSyncConversation: 'nvSyncConversation', + nvSearchCompanies: 'nvSearchCompanies', + nvSearchPeople: 'nvSearchPeople', + nvFetchCompany: 'nvFetchCompany', + nvFetchPerson: 'nvFetchPerson', } as const; export type TOperationName = (typeof OPERATION_NAME)[keyof typeof OPERATION_NAME]; @@ -45,52 +44,15 @@ export interface WaitForCompletionOptions { timeout?: number; } -export abstract class PredefinedOperation { +export abstract class Operation { protected abstract readonly operationName: TOperationName; protected abstract readonly mapper: BaseMapper; - private readonly operation: CustomWorkflowOperation; - - constructor(httpClient: HttpClient) { - this.operation = new CustomWorkflowOperation(httpClient); - } + constructor(private readonly httpClient: HttpClient) {} public async execute(params: TParams): Promise { const request = this.mapper.mapRequest(params); - return this.operation.execute(request); - } - - public async result( - workflowId: string, - options: WaitForCompletionOptions = {}, - ): Promise> { - try { - const rawResult = await this.operation.result(workflowId, options); - return this.mapper.mapResponse(rawResult); - } catch (error) { - if (error instanceof LinkedApiError && error.type === 'workflowTimeout') { - throw new LinkedApiWorkflowTimeoutError(workflowId, this.operationName); - } - throw error; - } - } - - public async status( - workflowId: string, - ): Promise> { - const result = await this.operation.status(workflowId); - if (result === 'running') { - return result; - } - return this.mapper.mapResponse(result); - } -} - -export class CustomWorkflowOperation { - constructor(private readonly httpClient: HttpClient) {} - - public async execute(params: TWorkflowDefinition): Promise { - const response = await this.httpClient.post(`/workflows`, params); + const response = await this.httpClient.post(`/workflows`, request); if (response.error) { throw new LinkedApiError(response.error.type as TLinkedApiErrorType, response.error.message); } @@ -103,23 +65,26 @@ export class CustomWorkflowOperation { public async result( workflowId: string, options: WaitForCompletionOptions = {}, - ): Promise { + ): Promise> { try { - return pollWorkflowResult(() => this.status(workflowId), options); + return pollWorkflowResult>(() => this.status(workflowId), options); } catch (error) { if (error instanceof LinkedApiError && error.type === 'workflowTimeout') { - throw new LinkedApiWorkflowTimeoutError(workflowId, 'customWorkflow'); + throw new LinkedApiWorkflowTimeoutError(workflowId, this.operationName); } throw error; } } - public async status(workflowId: string): Promise { + public async status( + workflowId: string, + ): Promise> { const workflowResult = await this.getWorkflowResult(workflowId); if (workflowResult.workflowStatus === 'running') { return workflowResult.workflowStatus; } - return this.getCompletion(workflowResult); + const result = this.getCompletion(workflowResult); + return this.mapper.mapResponse(result); } private async getWorkflowResult(workflowId: string): Promise { diff --git a/src/core/poll-results.ts b/src/core/poll-results.ts index 0c81e31..e9ec6aa 100644 --- a/src/core/poll-results.ts +++ b/src/core/poll-results.ts @@ -1,11 +1,11 @@ -import { LinkedApiError, TWorkflowCompletion, TWorkflowRunningStatus } from '../types'; +import { LinkedApiError, TWorkflowRunningStatus } from '../types'; import { WaitForCompletionOptions } from './operation'; -export async function pollWorkflowResult( - workflowResultFn: () => Promise, +export async function pollWorkflowResult( + workflowResultFn: () => Promise, options: WaitForCompletionOptions, -): Promise { +): Promise { const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); const { pollInterval = 5000, timeout = 24 * 60 * 60 * 1000 } = options; diff --git a/src/index.ts b/src/index.ts index 557689b..374ce6f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { Operation } from './core'; import { buildLinkedApiHttpClient } from './core/linked-api-http-client'; import type { TMappedResponse } from './mappers/base-mapper.abstract'; import { @@ -7,18 +8,18 @@ import { FetchCompany, FetchPerson, FetchPost, + NvFetchCompany, + NvFetchPerson, + NvSearchCompanies, + NvSearchPeople, + NvSendMessage, + NvSyncConversation, ReactToPost, RemoveConnection, RetrieveConnections, RetrievePendingRequests, RetrievePerformance, RetrieveSSI, - SalesNavigatorFetchCompany, - SalesNavigatorFetchPerson, - SalesNavigatorSearchCompanies, - SalesNavigatorSearchPeople, - SalesNavigatorSendMessage, - SalesNavigatorSyncConversation, SearchCompanies, SearchPeople, SendConnectionRequest, @@ -28,12 +29,13 @@ import { } from './operations'; import { HttpClient, + LinkedApiError, TApiUsageAction, - TApiUsageStatsParams, - TApiUsageStatsResponse, + TApiUsageParams, TConversationPollRequest, - TConversationPollResponse, TConversationPollResult, + TLinkedApiActionErrorType, + TLinkedApiErrorType, } from './types'; import type { TLinkedApiConfig } from './types/config'; import type { TLinkedApiResponse } from './types/responses'; @@ -80,35 +82,64 @@ class LinkedApi { if (config instanceof HttpClient) { this.httpClient = config; } else { - this.httpClient = buildLinkedApiHttpClient(config); + this.httpClient = buildLinkedApiHttpClient(config, 'node'); } this.customWorkflow = new CustomWorkflow(this.httpClient); - this.fetchPerson = new FetchPerson(this.httpClient); - this.searchCompanies = new SearchCompanies(this.httpClient); - this.fetchCompany = new FetchCompany(this.httpClient); - this.salesNavigatorFetchCompany = new SalesNavigatorFetchCompany(this.httpClient); this.sendMessage = new SendMessage(this.httpClient); - this.salesNavigatorSendMessage = new SalesNavigatorSendMessage(this.httpClient); this.syncConversation = new SyncConversation(this.httpClient); - this.salesNavigatorSyncConversation = new SalesNavigatorSyncConversation(this.httpClient); - this.salesNavigatorFetchPerson = new SalesNavigatorFetchPerson(this.httpClient); - this.salesNavigatorSearchCompanies = new SalesNavigatorSearchCompanies(this.httpClient); - this.fetchPost = new FetchPost(this.httpClient); - this.searchPeople = new SearchPeople(this.httpClient); - this.salesNavigatorSearchPeople = new SalesNavigatorSearchPeople(this.httpClient); - this.sendConnectionRequest = new SendConnectionRequest(this.httpClient); this.checkConnectionStatus = new CheckConnectionStatus(this.httpClient); + this.sendConnectionRequest = new SendConnectionRequest(this.httpClient); this.withdrawConnectionRequest = new WithdrawConnectionRequest(this.httpClient); this.retrievePendingRequests = new RetrievePendingRequests(this.httpClient); this.retrieveConnections = new RetrieveConnections(this.httpClient); this.removeConnection = new RemoveConnection(this.httpClient); + this.searchCompanies = new SearchCompanies(this.httpClient); + this.searchPeople = new SearchPeople(this.httpClient); + this.fetchCompany = new FetchCompany(this.httpClient); + this.fetchPerson = new FetchPerson(this.httpClient); + this.fetchPost = new FetchPost(this.httpClient); this.reactToPost = new ReactToPost(this.httpClient); this.commentOnPost = new CommentOnPost(this.httpClient); this.retrieveSSI = new RetrieveSSI(this.httpClient); this.retrievePerformance = new RetrievePerformance(this.httpClient); + this.nvSendMessage = new NvSendMessage(this.httpClient); + this.nvSyncConversation = new NvSyncConversation(this.httpClient); + this.nvSearchCompanies = new NvSearchCompanies(this.httpClient); + this.nvSearchPeople = new NvSearchPeople(this.httpClient); + this.nvFetchCompany = new NvFetchCompany(this.httpClient); + this.nvFetchPerson = new NvFetchPerson(this.httpClient); + + this.operations = [ + this.customWorkflow, + this.sendMessage, + this.syncConversation, + this.checkConnectionStatus, + this.sendConnectionRequest, + this.withdrawConnectionRequest, + this.retrievePendingRequests, + this.retrieveConnections, + this.removeConnection, + this.searchCompanies, + this.searchPeople, + this.fetchCompany, + this.fetchPerson, + this.fetchPost, + this.reactToPost, + this.commentOnPost, + this.retrieveSSI, + this.retrievePerformance, + this.nvSendMessage, + this.nvSyncConversation, + this.nvSearchCompanies, + this.nvSearchPeople, + this.nvFetchCompany, + this.nvFetchPerson, + ]; } + public operations: Operation[]; + /** * Execute a custom workflow with raw workflow definition. * @@ -215,17 +246,17 @@ class LinkedApi { * * @example * ```typescript - * const workflowId = await linkedapi.salesNavigatorSendMessage.execute({ + * const workflowId = await linkedapi.nvSendMessage.execute({ * personUrl: "https://www.linkedin.com/in/john-doe", * text: "Hi John! I'm reaching out regarding potential collaboration opportunities.", * subject: "Partnership Opportunity" * }); * - * await linkedapi.salesNavigatorSendMessage.result(workflowId); + * await linkedapi.nvSendMessage.result(workflowId); * console.log("Sales Navigator message sent successfully"); * ``` */ - public salesNavigatorSendMessage: SalesNavigatorSendMessage; + public nvSendMessage: NvSendMessage; /** * Sync a conversation with a LinkedIn user for Sales Navigator messaging. @@ -242,15 +273,15 @@ class LinkedApi { * * @example * ```typescript - * const workflowId = await linkedapi.salesNavigatorSyncConversation.execute({ + * const workflowId = await linkedapi.nvSyncConversation.execute({ * personUrl: "https://www.linkedin.com/in/john-doe" * }); * - * await linkedapi.salesNavigatorSyncConversation.result(workflowId); + * await linkedapi.nvSyncConversation.result(workflowId); * console.log("Sales Navigator conversation synced and ready for polling"); * ``` */ - public salesNavigatorSyncConversation: SalesNavigatorSyncConversation; + public nvSyncConversation: NvSyncConversation; /** * Poll multiple conversations to retrieve message history and new messages. @@ -295,17 +326,42 @@ class LinkedApi { */ public async pollConversations( conversations: TConversationPollRequest[], - ): Promise { - const response = await this.httpClient.post( - '/conversations/poll', - conversations, - ); - - return { - success: response.success, - result: response.result, - error: response.error, - }; + ): Promise> { + try { + const response = await this.httpClient.post( + '/conversations/poll', + conversations, + ); + if (response.success && response.result) { + return { + data: response.result, + errors: [], + }; + } else { + return { + data: undefined, + errors: [ + { + type: response.error?.type as TLinkedApiActionErrorType, + message: response.error?.message ?? '', + }, + ], + }; + } + } catch (error) { + if (error instanceof LinkedApiError && (error.type as unknown) === 'conversationsNotSynced') { + return { + data: undefined, + errors: [ + { + type: error.type as TLinkedApiActionErrorType, + message: error.message, + }, + ], + }; + } + throw error; + } } /** @@ -391,15 +447,15 @@ class LinkedApi { * * @example * ```typescript - * const workflowId = await linkedapi.salesNavigatorFetchPerson.execute({ + * const workflowId = await linkedapi.nvFetchPerson.execute({ * personHashedUrl: "https://www.linkedin.com/in/ABC123", * }); * - * const personResult = await linkedapi.salesNavigatorFetchPerson.result(workflowId); + * const personResult = await linkedapi.nvFetchPerson.result(workflowId); * console.log("Sales Navigator data:", personResult.data); * ``` */ - public salesNavigatorFetchPerson: SalesNavigatorFetchPerson; + public nvFetchPerson: NvFetchPerson; /** * Retrieve detailed information about a LinkedIn company profile. @@ -464,7 +520,7 @@ class LinkedApi { * @example * ```typescript * // Sales Navigator company fetch (new simplified syntax) - * const workflowId = await linkedapi.salesNavigatorFetchCompany.execute({ + * const workflowId = await linkedapi.nvFetchCompany.execute({ * companyHashedUrl: 'https://www.linkedin.com/sales/company/1035', * retrieveEmployees: true, * retrieveDMs: true, @@ -482,7 +538,7 @@ class LinkedApi { * }, * }); * - * const companyResult = await linkedapi.salesNavigatorFetchCompany.result(workflowId); + * const companyResult = await linkedapi.nvFetchCompany.result(workflowId); * if (companyResult.data) { * console.log("Company name:", companyResult.data.name); * console.log("Employees:", companyResult.data.employees?.length); @@ -490,7 +546,7 @@ class LinkedApi { * } * ``` */ - public salesNavigatorFetchCompany: SalesNavigatorFetchCompany; + public nvFetchCompany: NvFetchCompany; /** * Retrieve detailed information about a LinkedIn post. @@ -563,7 +619,7 @@ class LinkedApi { * * @example * ```typescript - * const workflowId = await linkedapi.salesNavigatorSearchCompanies.execute({ + * const workflowId = await linkedapi.nvSearchCompanies.execute({ * term: "fintech startup", * filter: { * locations: ["United States"], @@ -577,13 +633,13 @@ class LinkedApi { * limit: 50 * }); * - * const companiesResult = await linkedapi.salesNavigatorSearchCompanies.result(workflowId); + * const companiesResult = await linkedapi.nvSearchCompanies.result(workflowId); * if (companiesResult.data) { * console.log("Sales Navigator companies:", companiesResult.data.length); * } * ``` */ - public salesNavigatorSearchCompanies: SalesNavigatorSearchCompanies; + public nvSearchCompanies: NvSearchCompanies; /** * Search for people on LinkedIn using standard search. @@ -629,7 +685,7 @@ class LinkedApi { * * @example * ```typescript - * const workflowId = await linkedapi.salesNavigatorSearchPeople.execute({ + * const workflowId = await linkedapi.nvSearchPeople.execute({ * term: "VP Marketing B2B SaaS", * filter: { * locations: ["United States"], @@ -639,13 +695,13 @@ class LinkedApi { * limit: 25 * }); * - * const result = await linkedapi.salesNavigatorSearchPeople.result(workflowId); + * const result = await linkedapi.nvSearchPeople.result(workflowId); * if (result.data) { * console.log("Sales Navigator prospects:", result.data.length); * } * ``` */ - public salesNavigatorSearchPeople: SalesNavigatorSearchPeople; + public nvSearchPeople: NvSearchPeople; /** * Send a connection request to a LinkedIn user. @@ -941,7 +997,7 @@ class LinkedApi { * } * ``` */ - public async getApiUsageStats(params: TApiUsageStatsParams): Promise { + public async getApiUsage(params: TApiUsageParams): Promise> { const queryParams = new URLSearchParams({ start: params.start, end: params.end, @@ -951,17 +1007,22 @@ class LinkedApi { `/stats/actions?${queryParams.toString()}`, ); - return { - success: response.success, - result: response.result, - error: response.error, - }; + if (response.success && response.result) { + return { + data: response.result, + errors: [], + }; + } + throw new LinkedApiError( + response.error?.type as TLinkedApiErrorType, + response.error?.message ?? '', + ); } } export default LinkedApi; -export { LinkedApi }; +export { LinkedApi, Operation as PredefinedOperation }; export type { TLinkedApiConfig, diff --git a/src/operations/check-connection-status.ts b/src/operations/check-connection-status.ts index ba25019..529ca9f 100644 --- a/src/operations/check-connection-status.ts +++ b/src/operations/check-connection-status.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { SimpleWorkflowMapper } from '../mappers'; import { TCheckConnectionStatusParams, TCheckConnectionStatusResult } from '../types'; -export class CheckConnectionStatus extends PredefinedOperation< +export class CheckConnectionStatus extends Operation< TCheckConnectionStatusParams, TCheckConnectionStatusResult > { diff --git a/src/operations/comment-on-post.ts b/src/operations/comment-on-post.ts index 1965a91..c310fb5 100644 --- a/src/operations/comment-on-post.ts +++ b/src/operations/comment-on-post.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TCommentOnPostParams } from '../types'; -export class CommentOnPost extends PredefinedOperation { +export class CommentOnPost extends Operation { protected override readonly operationName: TOperationName = 'commentOnPost'; protected override readonly mapper = new VoidWorkflowMapper( 'st.commentOnPost', diff --git a/src/operations/custom-workflow.ts b/src/operations/custom-workflow.ts index 89d3f90..18836c3 100644 --- a/src/operations/custom-workflow.ts +++ b/src/operations/custom-workflow.ts @@ -1,3 +1,21 @@ -import { CustomWorkflowOperation } from '../core'; +import { Operation, TOperationName } from '../core'; +import { BaseMapper, TMappedResponse } from '../mappers'; +import { TWorkflowCompletion, TWorkflowDefinition } from '../types'; -export class CustomWorkflow extends CustomWorkflowOperation {} +export class CustomWorkflow extends Operation { + protected readonly operationName: TOperationName = 'customWorkflow'; + protected readonly mapper = new CustomWorkflowMapper(); +} + +class CustomWorkflowMapper extends BaseMapper { + override mapRequest(params: TWorkflowDefinition): TWorkflowDefinition { + return params; + } + + override mapResponse(completion: TWorkflowCompletion): TMappedResponse { + return { + data: completion, + errors: [], + }; + } +} diff --git a/src/operations/fetch-company.ts b/src/operations/fetch-company.ts index 1aef8a4..4c6ae26 100644 --- a/src/operations/fetch-company.ts +++ b/src/operations/fetch-company.ts @@ -1,4 +1,4 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { TActionConfig, ThenWorkflowMapper } from '../mappers/then-workflow-mapper.abstract'; import { HttpClient, @@ -7,10 +7,7 @@ import { TFetchCompanyResult, } from '../types'; -export class FetchCompany extends PredefinedOperation< - TBaseFetchCompanyParams, - TFetchCompanyResult -> { +export class FetchCompany extends Operation { protected override readonly operationName: TOperationName = 'fetchCompany'; protected override readonly mapper = new FetchCompanyMapper(); diff --git a/src/operations/fetch-person.ts b/src/operations/fetch-person.ts index e97e794..88b2717 100644 --- a/src/operations/fetch-person.ts +++ b/src/operations/fetch-person.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { TActionConfig, ThenWorkflowMapper } from '../mappers/then-workflow-mapper.abstract'; import { TBaseFetchPersonParams, TFetchPersonParams, TFetchPersonResult } from '../types'; -export class FetchPerson extends PredefinedOperation { +export class FetchPerson extends Operation { protected override readonly operationName: TOperationName = 'fetchPerson'; protected override readonly mapper = new FetchPersonMapper(); diff --git a/src/operations/fetch-post.ts b/src/operations/fetch-post.ts index e3d729e..9bfa53c 100644 --- a/src/operations/fetch-post.ts +++ b/src/operations/fetch-post.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { SimpleWorkflowMapper } from '../mappers'; import { TFetchPostParams, TFetchPostResult } from '../types'; -export class FetchPost extends PredefinedOperation { +export class FetchPost extends Operation { protected override readonly operationName: TOperationName = 'fetchPost'; protected override readonly mapper = new SimpleWorkflowMapper( { diff --git a/src/operations/index.ts b/src/operations/index.ts index 4d528c4..6ef6331 100644 --- a/src/operations/index.ts +++ b/src/operations/index.ts @@ -2,16 +2,16 @@ export * from './custom-workflow'; export * from './fetch-person'; export * from './search-companies'; export * from './fetch-company'; -export * from './sales-navigator-fetch-company'; +export * from './nv-fetch-company'; export * from './send-message'; -export * from './sales-navigator-send-message'; +export * from './nv-send-message'; export * from './sync-conversation'; -export * from './sales-navigator-sync-conversation'; -export * from './sales-navigator-fetch-person'; -export * from './sales-navigator-search-companies'; +export * from './nv-sync-conversation'; +export * from './nv-fetch-person'; +export * from './nv-search-companies'; export * from './fetch-post'; export * from './search-people'; -export * from './sales-navigator-search-people'; +export * from './nv-search-people'; export * from './send-connection-request'; export * from './check-connection-status'; export * from './withdraw-connection-request'; diff --git a/src/operations/sales-navigator-fetch-company.ts b/src/operations/nv-fetch-company.ts similarity index 82% rename from src/operations/sales-navigator-fetch-company.ts rename to src/operations/nv-fetch-company.ts index 4461cd8..821d0ec 100644 --- a/src/operations/sales-navigator-fetch-company.ts +++ b/src/operations/nv-fetch-company.ts @@ -1,12 +1,9 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { TActionConfig, ThenWorkflowMapper } from '../mappers/then-workflow-mapper.abstract'; import { TNvBaseFetchCompanyParams, TNvFetchCompanyParams, TNvFetchCompanyResult } from '../types'; -export class SalesNavigatorFetchCompany extends PredefinedOperation< - TNvBaseFetchCompanyParams, - TNvFetchCompanyResult -> { - protected override readonly operationName: TOperationName = 'salesNavigatorFetchCompany'; +export class NvFetchCompany extends Operation { + protected override readonly operationName: TOperationName = 'nvFetchCompany'; protected override readonly mapper = new NvFetchCompanyMapper(); public override async execute( diff --git a/src/operations/sales-navigator-fetch-person.ts b/src/operations/nv-fetch-person.ts similarity index 64% rename from src/operations/sales-navigator-fetch-person.ts rename to src/operations/nv-fetch-person.ts index 13b7e63..b5dbf71 100644 --- a/src/operations/sales-navigator-fetch-person.ts +++ b/src/operations/nv-fetch-person.ts @@ -1,12 +1,9 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ThenWorkflowMapper } from '../mappers'; import { TNvOpenPersonPageParams, TNvOpenPersonPageResult } from '../types'; -export class SalesNavigatorFetchPerson extends PredefinedOperation< - TNvOpenPersonPageParams, - TNvOpenPersonPageResult -> { - protected override readonly operationName: TOperationName = 'salesNavigatorFetchPerson'; +export class NvFetchPerson extends Operation { + protected override readonly operationName: TOperationName = 'nvFetchPerson'; protected override readonly mapper = new NvFetchPersonMapper(); } diff --git a/src/operations/sales-navigator-search-companies.ts b/src/operations/nv-search-companies.ts similarity index 60% rename from src/operations/sales-navigator-search-companies.ts rename to src/operations/nv-search-companies.ts index 1db2858..28944bc 100644 --- a/src/operations/sales-navigator-search-companies.ts +++ b/src/operations/nv-search-companies.ts @@ -1,12 +1,12 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TNvSearchCompaniesParams, TNvSearchCompanyResult } from '../types'; -export class SalesNavigatorSearchCompanies extends PredefinedOperation< +export class NvSearchCompanies extends Operation< TNvSearchCompaniesParams, TNvSearchCompanyResult[] > { - protected override readonly operationName: TOperationName = 'salesNavigatorSearchCompanies'; + protected override readonly operationName: TOperationName = 'nvSearchCompanies'; protected override readonly mapper = new ArrayWorkflowMapper< TNvSearchCompaniesParams, TNvSearchCompanyResult diff --git a/src/operations/sales-navigator-search-people.ts b/src/operations/nv-search-people.ts similarity index 50% rename from src/operations/sales-navigator-search-people.ts rename to src/operations/nv-search-people.ts index 7c05c01..59eb7be 100644 --- a/src/operations/sales-navigator-search-people.ts +++ b/src/operations/nv-search-people.ts @@ -1,12 +1,9 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TNvSearchPeopleParams, TNvSearchPeopleResult } from '../types'; -export class SalesNavigatorSearchPeople extends PredefinedOperation< - TNvSearchPeopleParams, - TNvSearchPeopleResult[] -> { - protected override readonly operationName: TOperationName = 'salesNavigatorSearchPeople'; +export class NvSearchPeople extends Operation { + protected override readonly operationName: TOperationName = 'nvSearchPeople'; protected override readonly mapper = new ArrayWorkflowMapper< TNvSearchPeopleParams, TNvSearchPeopleResult diff --git a/src/operations/nv-send-message.ts b/src/operations/nv-send-message.ts new file mode 100644 index 0000000..42bb3d7 --- /dev/null +++ b/src/operations/nv-send-message.ts @@ -0,0 +1,10 @@ +import { Operation, TOperationName } from '../core'; +import { VoidWorkflowMapper } from '../mappers/void-workflow-mapper'; +import { TNvSendMessageParams } from '../types'; + +export class NvSendMessage extends Operation { + protected override readonly operationName: TOperationName = 'nvSendMessage'; + protected override readonly mapper = new VoidWorkflowMapper( + 'nv.sendMessage', + ); +} diff --git a/src/operations/nv-sync-conversation.ts b/src/operations/nv-sync-conversation.ts new file mode 100644 index 0000000..2c6c06d --- /dev/null +++ b/src/operations/nv-sync-conversation.ts @@ -0,0 +1,10 @@ +import { Operation, TOperationName } from '../core'; +import { VoidWorkflowMapper } from '../mappers'; +import { TNvSyncConversationParams } from '../types'; + +export class NvSyncConversation extends Operation { + protected override readonly operationName: TOperationName = 'nvSyncConversation'; + protected override readonly mapper = new VoidWorkflowMapper( + 'nv.syncConversation', + ); +} diff --git a/src/operations/react-to-post.ts b/src/operations/react-to-post.ts index abb96f3..cc72898 100644 --- a/src/operations/react-to-post.ts +++ b/src/operations/react-to-post.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TReactToPostParams } from '../types'; -export class ReactToPost extends PredefinedOperation { +export class ReactToPost extends Operation { protected override readonly operationName: TOperationName = 'reactToPost'; protected override readonly mapper = new VoidWorkflowMapper('st.reactToPost'); } diff --git a/src/operations/remove-connection.ts b/src/operations/remove-connection.ts index ac2cf9f..a15ed46 100644 --- a/src/operations/remove-connection.ts +++ b/src/operations/remove-connection.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TRemoveConnectionParams } from '../types'; -export class RemoveConnection extends PredefinedOperation { +export class RemoveConnection extends Operation { protected override readonly operationName: TOperationName = 'removeConnection'; protected override readonly mapper = new VoidWorkflowMapper( 'st.removeConnection', diff --git a/src/operations/retrieve-connections.ts b/src/operations/retrieve-connections.ts index ea47e70..f4e708a 100644 --- a/src/operations/retrieve-connections.ts +++ b/src/operations/retrieve-connections.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TRetrieveConnectionsParams, TRetrieveConnectionsResult } from '../types'; -export class RetrieveConnections extends PredefinedOperation< +export class RetrieveConnections extends Operation< TRetrieveConnectionsParams, TRetrieveConnectionsResult[] > { diff --git a/src/operations/retrieve-pending-requests.ts b/src/operations/retrieve-pending-requests.ts index fd034e4..e6639fa 100644 --- a/src/operations/retrieve-pending-requests.ts +++ b/src/operations/retrieve-pending-requests.ts @@ -1,11 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TRetrievePendingRequestsResult } from '../types'; -export class RetrievePendingRequests extends PredefinedOperation< - void, - TRetrievePendingRequestsResult[] -> { +export class RetrievePendingRequests extends Operation { protected override readonly operationName: TOperationName = 'retrievePendingRequests'; protected override readonly mapper = new ArrayWorkflowMapper< void, diff --git a/src/operations/retrieve-performance.ts b/src/operations/retrieve-performance.ts index 03d5eeb..178617d 100644 --- a/src/operations/retrieve-performance.ts +++ b/src/operations/retrieve-performance.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { SimpleWorkflowMapper } from '../mappers'; import { TRetrievePerformanceResult } from '../types'; -export class RetrievePerformance extends PredefinedOperation { +export class RetrievePerformance extends Operation { protected override readonly operationName: TOperationName = 'retrievePerformance'; protected override readonly mapper = new SimpleWorkflowMapper({ actionType: 'st.retrievePerformance', diff --git a/src/operations/retrieve-ssi.ts b/src/operations/retrieve-ssi.ts index 4e9df1e..98206cf 100644 --- a/src/operations/retrieve-ssi.ts +++ b/src/operations/retrieve-ssi.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { SimpleWorkflowMapper } from '../mappers'; import { TRetrieveSSIResult } from '../types'; -export class RetrieveSSI extends PredefinedOperation { +export class RetrieveSSI extends Operation { protected override readonly operationName: TOperationName = 'retrieveSSI'; protected override readonly mapper = new SimpleWorkflowMapper({ actionType: 'st.retrieveSSI', diff --git a/src/operations/sales-navigator-send-message.ts b/src/operations/sales-navigator-send-message.ts deleted file mode 100644 index ae9f466..0000000 --- a/src/operations/sales-navigator-send-message.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PredefinedOperation, TOperationName } from '../core'; -import { VoidWorkflowMapper } from '../mappers/void-workflow-mapper'; -import { TNvSendMessageParams } from '../types'; - -export class SalesNavigatorSendMessage extends PredefinedOperation { - protected override readonly operationName: TOperationName = 'salesNavigatorSendMessage'; - protected override readonly mapper = new VoidWorkflowMapper( - 'nv.sendMessage', - ); -} diff --git a/src/operations/sales-navigator-sync-conversation.ts b/src/operations/sales-navigator-sync-conversation.ts deleted file mode 100644 index 6be2dd1..0000000 --- a/src/operations/sales-navigator-sync-conversation.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PredefinedOperation, TOperationName } from '../core'; -import { VoidWorkflowMapper } from '../mappers'; -import { TNvSyncConversationParams } from '../types'; - -export class SalesNavigatorSyncConversation extends PredefinedOperation< - TNvSyncConversationParams, - void -> { - protected override readonly operationName: TOperationName = 'salesNavigatorSyncConversation'; - protected override readonly mapper = new VoidWorkflowMapper( - 'nv.syncConversation', - ); -} diff --git a/src/operations/search-companies.ts b/src/operations/search-companies.ts index cc27dca..a5f6c17 100644 --- a/src/operations/search-companies.ts +++ b/src/operations/search-companies.ts @@ -1,11 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TSearchCompaniesParams, TSearchCompanyResult } from '../types'; -export class SearchCompanies extends PredefinedOperation< - TSearchCompaniesParams, - TSearchCompanyResult[] -> { +export class SearchCompanies extends Operation { protected override readonly operationName: TOperationName = 'searchCompanies'; protected override readonly mapper = new ArrayWorkflowMapper< TSearchCompaniesParams, diff --git a/src/operations/search-people.ts b/src/operations/search-people.ts index 03748a3..4dbeb4a 100644 --- a/src/operations/search-people.ts +++ b/src/operations/search-people.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { ArrayWorkflowMapper } from '../mappers/array-workflow-mapper'; import { TSearchPeopleParams, TSearchPeopleResult } from '../types'; -export class SearchPeople extends PredefinedOperation { +export class SearchPeople extends Operation { protected override readonly operationName: TOperationName = 'searchPeople'; protected override readonly mapper = new ArrayWorkflowMapper< TSearchPeopleParams, diff --git a/src/operations/send-connection-request.ts b/src/operations/send-connection-request.ts index 495275a..8a6ed8b 100644 --- a/src/operations/send-connection-request.ts +++ b/src/operations/send-connection-request.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TSendConnectionRequestParams } from '../types'; -export class SendConnectionRequest extends PredefinedOperation { +export class SendConnectionRequest extends Operation { protected override readonly operationName: TOperationName = 'sendConnectionRequest'; protected override readonly mapper = new VoidWorkflowMapper( 'st.sendConnectionRequest', diff --git a/src/operations/send-message.ts b/src/operations/send-message.ts index c86543a..aaabcb3 100644 --- a/src/operations/send-message.ts +++ b/src/operations/send-message.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers/void-workflow-mapper'; import { TSendMessageParams } from '../types'; -export class SendMessage extends PredefinedOperation { +export class SendMessage extends Operation { protected override readonly operationName: TOperationName = 'sendMessage'; protected override readonly mapper = new VoidWorkflowMapper('st.sendMessage'); } diff --git a/src/operations/sync-conversation.ts b/src/operations/sync-conversation.ts index 6aff759..698a46d 100644 --- a/src/operations/sync-conversation.ts +++ b/src/operations/sync-conversation.ts @@ -1,8 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TSyncConversationParams } from '../types'; -export class SyncConversation extends PredefinedOperation { +export class SyncConversation extends Operation { protected override readonly operationName: TOperationName = 'syncConversation'; protected override readonly mapper = new VoidWorkflowMapper( 'st.syncConversation', diff --git a/src/operations/withdraw-connection-request.ts b/src/operations/withdraw-connection-request.ts index 01d1908..a953348 100644 --- a/src/operations/withdraw-connection-request.ts +++ b/src/operations/withdraw-connection-request.ts @@ -1,11 +1,8 @@ -import { PredefinedOperation, TOperationName } from '../core'; +import { Operation, TOperationName } from '../core'; import { VoidWorkflowMapper } from '../mappers'; import { TWithdrawConnectionRequestParams } from '../types'; -export class WithdrawConnectionRequest extends PredefinedOperation< - TWithdrawConnectionRequestParams, - void -> { +export class WithdrawConnectionRequest extends Operation { protected override readonly operationName: TOperationName = 'withdrawConnectionRequest'; protected override readonly mapper = new VoidWorkflowMapper( 'st.withdrawConnectionRequest', diff --git a/src/types/actions/message.ts b/src/types/actions/message.ts index 81b5564..daf69e7 100644 --- a/src/types/actions/message.ts +++ b/src/types/actions/message.ts @@ -39,15 +39,6 @@ export interface TConversationPollResult { messages: TMessage[]; } -export interface TConversationPollResponse { - success: boolean; - result?: TConversationPollResult[]; - error?: { - type: string; - message: string; - }; -} - export const CONVERSATION_TYPE = { st: 'st', nv: 'nv', diff --git a/src/types/actions/statistics.ts b/src/types/actions/statistics.ts index f887850..891d6d6 100644 --- a/src/types/actions/statistics.ts +++ b/src/types/actions/statistics.ts @@ -11,7 +11,7 @@ export interface TRetrievePerformanceResult { searchAppearancesPreviousWeek: number; } -export interface TApiUsageStatsParams { +export interface TApiUsageParams { start: string; end: string; } @@ -21,12 +21,3 @@ export interface TApiUsageAction { success: boolean; time: string; } - -export interface TApiUsageStatsResponse { - success: boolean; - result?: TApiUsageAction[]; - error?: { - type: string; - message: string; - }; -} diff --git a/src/types/errors.ts b/src/types/errors.ts index 3130e00..ab8d4ed 100644 --- a/src/types/errors.ts +++ b/src/types/errors.ts @@ -5,20 +5,21 @@ import { TOperationName } from '../core'; * @see {@link https://linkedapi.io/docs/actions-overview/#result-options} * This error signals that the workflow action failed to complete, but the workflow completed as expected. * Common types: - * - personNotFound (sendMessage, syncConversation, checkConnectionStatus, sendConnectionRequest, withdrawConnectionRequest, removeConnection, fetchPerson, salesNavigatorSendMessage, salesNavigatorSyncConversation, salesNavigatorFetchPerson) - * - messagingNotAllowed (sendMessage, salesNavigatorSendMessage) + * - personNotFound (sendMessage, syncConversation, checkConnectionStatus, sendConnectionRequest, withdrawConnectionRequest, removeConnection, fetchPerson, nvSendMessage, nvSyncConversation, nvFetchPerson) + * - messagingNotAllowed (sendMessage, nvSendMessage) * - alreadyPending (sendConnectionRequest) * - alreadyConnected (sendConnectionRequest) * - emailRequired (sendConnectionRequest) * - requestNotAllowed (sendConnectionRequest) * - notPending (withdrawConnectionRequest)) - * - retrievingNotAllowed (retrieveConnections, fetchCompany, salesNavigatorFetchCompany) + * - retrievingNotAllowed (retrieveConnections, fetchCompany, nvFetchCompany) * - connectionNotFound (removeConnection) - * - searchingNotAllowed (searchCompanies, searchPeople, salesNavigatorSearchCompanies, salesNavigatorSearchPeople) - * - companyNotFound (fetchCompany, salesNavigatorFetchCompany) + * - searchingNotAllowed (searchCompanies, searchPeople, nvSearchCompanies, nvSearchPeople) + * - companyNotFound (fetchCompany, nvFetchCompany) * - postNotFound (fetchPost, reactToPost, commentOnPost) * - commentingNotAllowed (commentOnPost) - * - noSalesNavigator (salesNavigatorSendMessage, salesNavigatorSyncConversation, salesNavigatorSearchCompanies, salesNavigatorSearchPeople, salesNavigatorFetchCompany, salesNavigatorFetchPerson) + * - noSalesNavigator (nvSendMessage, nvSyncConversation, nvSearchCompanies, nvSearchPeople, nvFetchCompany, nvFetchPerson) + * - conversationsNotSynced (pollConversations) */ export const LINKED_API_ACTION_ERROR = { personNotFound: 'personNotFound', @@ -35,6 +36,7 @@ export const LINKED_API_ACTION_ERROR = { postNotFound: 'postNotFound', commentingNotAllowed: 'commentingNotAllowed', noSalesNavigator: 'noSalesNavigator', + conversationsNotSynced: 'conversationsNotSynced', } as const; export type TLinkedApiActionErrorType = (typeof LINKED_API_ACTION_ERROR)[keyof typeof LINKED_API_ACTION_ERROR];