@ingeno/pipedream-services 1.0.64 → 1.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/zoho-crm/index.d.ts +1 -4
- package/dist/zoho-crm/index.d.ts.map +1 -1
- package/dist/zoho-crm/index.js +1 -4
- package/dist/zoho-crm/index.js.map +1 -1
- package/dist/zoho-crm/zoho-crm-fetcher.d.ts +2 -8
- package/dist/zoho-crm/zoho-crm-fetcher.d.ts.map +1 -1
- package/dist/zoho-crm/zoho-crm-fetcher.js +108 -97
- package/dist/zoho-crm/zoho-crm-fetcher.js.map +1 -1
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.d.ts +8 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.d.ts.map +1 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.js +117 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.js.map +1 -0
- package/package.json +1 -1
- package/dist/zoho-crm/module-processor.d.ts +0 -8
- package/dist/zoho-crm/module-processor.d.ts.map +0 -1
- package/dist/zoho-crm/module-processor.js +0 -114
- package/dist/zoho-crm/module-processor.js.map +0 -1
package/dist/zoho-crm/index.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zoho CRM integration utilities for Pipedream workflows
|
|
3
|
-
*/
|
|
4
1
|
export * from './zoho-crm-client.js';
|
|
5
2
|
export * from './zoho-auth.js';
|
|
6
|
-
export * from './
|
|
3
|
+
export * from './zoho-crm-to-database-collection-converter.js';
|
|
7
4
|
export * from './zoho-crm-fetcher.js';
|
|
8
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gDAAgD,CAAA;AAC9D,cAAc,uBAAuB,CAAA"}
|
package/dist/zoho-crm/index.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zoho CRM integration utilities for Pipedream workflows
|
|
3
|
-
*/
|
|
4
1
|
export * from './zoho-crm-client.js';
|
|
5
2
|
export * from './zoho-auth.js';
|
|
6
|
-
export * from './
|
|
3
|
+
export * from './zoho-crm-to-database-collection-converter.js';
|
|
7
4
|
export * from './zoho-crm-fetcher.js';
|
|
8
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gDAAgD,CAAA;AAC9D,cAAc,uBAAuB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { PostgresAuth } from '../index.js';
|
|
1
|
+
import type { PostgresAuth, ZohoCredentials } from '../index.js';
|
|
2
2
|
export interface ZohoCRMFetchOptions {
|
|
3
|
-
zohoCredentials:
|
|
3
|
+
zohoCredentials: ZohoCredentials;
|
|
4
4
|
postgresCredentials: PostgresAuth;
|
|
5
5
|
modules: string[];
|
|
6
6
|
maxResults?: number;
|
|
@@ -12,11 +12,5 @@ export interface ZohoCRMFetchResult {
|
|
|
12
12
|
records: number;
|
|
13
13
|
}>;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Reusable function to fetch data from Zoho CRM modules and save to PostgreSQL
|
|
17
|
-
*
|
|
18
|
-
* @param options Configuration options for the fetch operation
|
|
19
|
-
* @returns Summary of tables created and records processed
|
|
20
|
-
*/
|
|
21
15
|
export declare function fetchZohoCRMData(options: ZohoCRMFetchOptions): Promise<ZohoCRMFetchResult>;
|
|
22
16
|
//# sourceMappingURL=zoho-crm-fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoho-crm-fetcher.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"zoho-crm-fetcher.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEhE,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,CAAA;IAChC,mBAAmB,EAAE,YAAY,CAAA;IACjC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAgJD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmBhG"}
|
|
@@ -1,114 +1,125 @@
|
|
|
1
|
-
import { ZohoCRMClient, ZohoAuth, collectionSummary, collectionsToTables, fillTables,
|
|
2
|
-
|
|
3
|
-
* Reusable function to fetch data from Zoho CRM modules and save to PostgreSQL
|
|
4
|
-
*
|
|
5
|
-
* @param options Configuration options for the fetch operation
|
|
6
|
-
* @returns Summary of tables created and records processed
|
|
7
|
-
*/
|
|
8
|
-
export async function fetchZohoCRMData(options) {
|
|
9
|
-
const { zohoCredentials, postgresCredentials, modules, maxResults, tablesPrefix = 'zoho_crm_' } = options;
|
|
10
|
-
// Initialize Zoho Auth and Client
|
|
1
|
+
import { ZohoCRMClient, ZohoAuth, collectionSummary, collectionsToTables, fillTables, convertZohoCRMModuleToDatabaseCollection } from '../index.js';
|
|
2
|
+
async function createAuthenticatedZohoCRMClient(zohoCredentials) {
|
|
11
3
|
const zohoAuth = new ZohoAuth(zohoCredentials);
|
|
12
4
|
const accessToken = await zohoAuth.getAccessToken();
|
|
13
|
-
|
|
5
|
+
return new ZohoCRMClient({
|
|
14
6
|
accessToken,
|
|
15
7
|
apiDomain: zohoCredentials.api_domain,
|
|
16
8
|
});
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
}
|
|
10
|
+
function addRequiredModuleDependencies(modules) {
|
|
11
|
+
const modulesWithDependencies = [...modules];
|
|
12
|
+
const shouldIncludePipelines = modules.includes('Deals');
|
|
13
|
+
if (shouldIncludePipelines && !modulesWithDependencies.includes('DealHistory')) {
|
|
14
|
+
modulesWithDependencies.push('DealHistory');
|
|
22
15
|
console.log('Added DealHistory module since Deals is included');
|
|
23
16
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
catch (error) {
|
|
94
|
-
console.warn('Failed to fetch pipelines:', error.message);
|
|
95
|
-
}
|
|
17
|
+
return { modulesWithDependencies, shouldIncludePipelines };
|
|
18
|
+
}
|
|
19
|
+
function buildCollectionSchema(name, columns, prepareMode = 'drop') {
|
|
20
|
+
return {
|
|
21
|
+
name,
|
|
22
|
+
prepareMode,
|
|
23
|
+
columns,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function buildPipelinesCollection(pipelinesData) {
|
|
27
|
+
const pipelinesSchema = buildCollectionSchema('pipelines', [
|
|
28
|
+
{ name: 'id', type: 'id' },
|
|
29
|
+
{ name: 'pipeline_id', path: 'id' },
|
|
30
|
+
{ name: 'display_value', type: 'text' },
|
|
31
|
+
{ name: 'default', type: 'bool' },
|
|
32
|
+
{ name: 'stages_count', transform: (pipeline) => pipeline.stages?.length || 0 },
|
|
33
|
+
{ name: 'stages_data', type: 'json', path: 'stages' },
|
|
34
|
+
]);
|
|
35
|
+
return {
|
|
36
|
+
schema: pipelinesSchema,
|
|
37
|
+
objects: pipelinesData.map((pipeline, index) => ({
|
|
38
|
+
id: index + 1,
|
|
39
|
+
...pipeline,
|
|
40
|
+
})),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function buildPipelineStagesCollection(pipelinesData) {
|
|
44
|
+
const flattenedStages = pipelinesData
|
|
45
|
+
.filter((pipeline) => pipeline.stages && Array.isArray(pipeline.stages))
|
|
46
|
+
.flatMap((pipeline) => pipeline.stages.map((stage) => ({
|
|
47
|
+
id: stage.id,
|
|
48
|
+
pipeline_id: pipeline.id,
|
|
49
|
+
pipeline_display_value: pipeline.display_value,
|
|
50
|
+
stage_id: stage.id,
|
|
51
|
+
stage_display_value: stage.display_value,
|
|
52
|
+
sequence_number: stage.sequence_number,
|
|
53
|
+
forecast_category: stage.forecast_category,
|
|
54
|
+
forecast_type: stage.forecast_type,
|
|
55
|
+
probability: stage.probability || 0,
|
|
56
|
+
})));
|
|
57
|
+
const stagesSchema = buildCollectionSchema('pipeline_stages', [
|
|
58
|
+
{ name: 'id', type: 'id' },
|
|
59
|
+
{ name: 'pipeline_id', type: 'text' },
|
|
60
|
+
{ name: 'pipeline_display_value', type: 'text' },
|
|
61
|
+
{ name: 'stage_id', type: 'text' },
|
|
62
|
+
{ name: 'stage_display_value', type: 'text' },
|
|
63
|
+
{ name: 'sequence_number', type: 'number' },
|
|
64
|
+
{ name: 'forecast_category', type: 'text' },
|
|
65
|
+
{ name: 'forecast_type', type: 'text' },
|
|
66
|
+
{ name: 'probability', type: 'number' },
|
|
67
|
+
]);
|
|
68
|
+
return {
|
|
69
|
+
schema: stagesSchema,
|
|
70
|
+
objects: flattenedStages,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function fetchAndBuildPipelineCollections(client) {
|
|
74
|
+
console.log('Fetching Deals pipelines...');
|
|
75
|
+
try {
|
|
76
|
+
const pipelinesData = await client.getDealsPipelines();
|
|
77
|
+
const pipelinesCollection = buildPipelinesCollection(pipelinesData);
|
|
78
|
+
const pipelineStagesCollection = buildPipelineStagesCollection(pipelinesData);
|
|
79
|
+
console.log(`Processed ${pipelinesData.length} pipelines`);
|
|
80
|
+
console.log(`Processed ${pipelineStagesCollection.objects.length} pipeline stages`);
|
|
81
|
+
return [pipelinesCollection, pipelineStagesCollection];
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.warn('Failed to fetch pipelines:', error.message);
|
|
85
|
+
return [];
|
|
96
86
|
}
|
|
97
|
-
|
|
87
|
+
}
|
|
88
|
+
async function saveCollectionsAndCreateSummary(collections, postgresCredentials, tablesPrefix) {
|
|
98
89
|
collectionSummary(collections);
|
|
99
|
-
// Convert to table format
|
|
100
90
|
const tablesRows = collectionsToTables(collections);
|
|
101
|
-
// Fill PostgreSQL tables
|
|
102
91
|
await fillTables({
|
|
103
92
|
auth: postgresCredentials,
|
|
104
93
|
tablesRows,
|
|
105
94
|
tablesPrefix,
|
|
106
95
|
});
|
|
107
|
-
return {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
96
|
+
return collections.map((collection) => ({
|
|
97
|
+
table: `${tablesPrefix}${collection.schema.name}`,
|
|
98
|
+
records: collection.objects.length,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
function logFetchOperationDetails(modules, maxResults) {
|
|
102
|
+
console.log(`Fetching data from modules: ${modules.join(', ')}`);
|
|
103
|
+
console.log(`Max results per module: ${maxResults || 'all'}`);
|
|
104
|
+
}
|
|
105
|
+
async function fetchAllModuleCollections(modules, client, maxResults) {
|
|
106
|
+
return await Promise.all(modules.map(async (moduleName) => {
|
|
107
|
+
console.log(`Fetching ${moduleName}...`);
|
|
108
|
+
return await convertZohoCRMModuleToDatabaseCollection(moduleName, client, { maxRecords: maxResults || undefined });
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
export async function fetchZohoCRMData(options) {
|
|
112
|
+
const { zohoCredentials, postgresCredentials, modules, maxResults, tablesPrefix = 'zoho_crm_' } = options;
|
|
113
|
+
const client = await createAuthenticatedZohoCRMClient(zohoCredentials);
|
|
114
|
+
const { modulesWithDependencies, shouldIncludePipelines } = addRequiredModuleDependencies(modules);
|
|
115
|
+
logFetchOperationDetails(modulesWithDependencies, maxResults);
|
|
116
|
+
const moduleCollections = await fetchAllModuleCollections(modulesWithDependencies, client, maxResults);
|
|
117
|
+
const allCollections = [...moduleCollections];
|
|
118
|
+
if (shouldIncludePipelines) {
|
|
119
|
+
const pipelineCollections = await fetchAndBuildPipelineCollections(client);
|
|
120
|
+
allCollections.push(...pipelineCollections);
|
|
121
|
+
}
|
|
122
|
+
const summary = await saveCollectionsAndCreateSummary(allCollections, postgresCredentials, tablesPrefix);
|
|
123
|
+
return { summary };
|
|
113
124
|
}
|
|
114
125
|
//# sourceMappingURL=zoho-crm-fetcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoho-crm-fetcher.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"zoho-crm-fetcher.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Collection, CollectionSchema } from '../collections/types.js';
|
|
2
|
+
import type { ZohoCRMClient, ZohoCRMRecord } from './zoho-crm-client.js';
|
|
3
|
+
export interface ZohoCRMConversionOptions {
|
|
4
|
+
maxRecords?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function createDatabaseSchemaFromZohoCRMRecords(records: ZohoCRMRecord[], schemaName: string): CollectionSchema;
|
|
7
|
+
export declare function convertZohoCRMModuleToDatabaseCollection(moduleName: string, client: ZohoCRMClient, options?: ZohoCRMConversionOptions): Promise<Collection>;
|
|
8
|
+
//# sourceMappingURL=zoho-crm-to-database-collection-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoho-crm-to-database-collection-converter.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-to-database-collection-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAExE,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAwHD,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAarH;AAED,wBAAsB,wCAAwC,CAC5D,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,UAAU,CAAC,CAmBrB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
function createEmptyDatabaseSchema(schemaName) {
|
|
2
|
+
return {
|
|
3
|
+
name: schemaName,
|
|
4
|
+
prepareMode: 'drop',
|
|
5
|
+
columns: [
|
|
6
|
+
{ name: 'id', type: 'id' },
|
|
7
|
+
{ name: 'raw_data', transform: (record) => JSON.stringify(record) },
|
|
8
|
+
],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function extractAllFieldNamesFromRecords(records) {
|
|
12
|
+
const allFieldNames = records
|
|
13
|
+
.flatMap(record => Object.keys(record));
|
|
14
|
+
return [...new Set(allFieldNames)].sort();
|
|
15
|
+
}
|
|
16
|
+
function sanitizeFieldNameForDatabase(fieldName) {
|
|
17
|
+
return fieldName.toLowerCase().replace(/[^a-z0-9_]/g, '_');
|
|
18
|
+
}
|
|
19
|
+
function inferColumnTypeFromFieldName(fieldName) {
|
|
20
|
+
if (fieldName.includes('Date') || fieldName.includes('Time') || fieldName.includes('_time')) {
|
|
21
|
+
return fieldName.includes('Date') && !fieldName.includes('Time') ? 'date' : 'datetime';
|
|
22
|
+
}
|
|
23
|
+
if (fieldName.includes('Amount') || fieldName.includes('Revenue') || fieldName.includes('_amount')) {
|
|
24
|
+
return 'currency';
|
|
25
|
+
}
|
|
26
|
+
if (fieldName.includes('Probability') || fieldName.includes('Rate') || fieldName.includes('_rate') || fieldName.includes('_number')) {
|
|
27
|
+
return 'number';
|
|
28
|
+
}
|
|
29
|
+
if (fieldName.includes('Opt_Out') || fieldName.includes('_opt_out') || fieldName.includes('converted')) {
|
|
30
|
+
return 'bool';
|
|
31
|
+
}
|
|
32
|
+
return 'text';
|
|
33
|
+
}
|
|
34
|
+
function extractSampleValuesFromRecords(records, fieldName, sampleSize = 10) {
|
|
35
|
+
return records
|
|
36
|
+
.slice(0, sampleSize)
|
|
37
|
+
.map((record) => record[fieldName])
|
|
38
|
+
.filter((value) => value !== null && value !== undefined && value !== '');
|
|
39
|
+
}
|
|
40
|
+
function refineColumnTypeFromSampleValue(sampleValue, inferredType) {
|
|
41
|
+
if (typeof sampleValue === 'boolean') {
|
|
42
|
+
return 'bool';
|
|
43
|
+
}
|
|
44
|
+
if (typeof sampleValue === 'number') {
|
|
45
|
+
return 'number';
|
|
46
|
+
}
|
|
47
|
+
if (typeof sampleValue === 'string' && (inferredType === 'date' || inferredType === 'datetime')) {
|
|
48
|
+
const parsedDate = new Date(sampleValue);
|
|
49
|
+
return isNaN(parsedDate.getTime()) ? 'text' : inferredType;
|
|
50
|
+
}
|
|
51
|
+
return inferredType;
|
|
52
|
+
}
|
|
53
|
+
function createColumnsForNestedObject(fieldName, sanitizedColumnName, sampleValue) {
|
|
54
|
+
const nestedProperties = [
|
|
55
|
+
{ key: 'name', exists: sampleValue.name },
|
|
56
|
+
{ key: 'id', exists: sampleValue.id },
|
|
57
|
+
{ key: 'email', exists: sampleValue.email }
|
|
58
|
+
];
|
|
59
|
+
return nestedProperties
|
|
60
|
+
.filter(property => property.exists)
|
|
61
|
+
.map(property => ({
|
|
62
|
+
name: `${sanitizedColumnName}_${property.key}`,
|
|
63
|
+
path: `${fieldName}.${property.key}`
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
function createColumnFromField(fieldName, records) {
|
|
67
|
+
if (fieldName === 'id') {
|
|
68
|
+
return [{ name: 'record_id', path: 'id' }];
|
|
69
|
+
}
|
|
70
|
+
const sanitizedColumnName = sanitizeFieldNameForDatabase(fieldName);
|
|
71
|
+
let columnType = inferColumnTypeFromFieldName(fieldName);
|
|
72
|
+
const sampleValues = extractSampleValuesFromRecords(records, fieldName);
|
|
73
|
+
if (sampleValues.length > 0) {
|
|
74
|
+
const firstSampleValue = sampleValues[0];
|
|
75
|
+
if (typeof firstSampleValue === 'object' && firstSampleValue !== null) {
|
|
76
|
+
return createColumnsForNestedObject(fieldName, sanitizedColumnName, firstSampleValue);
|
|
77
|
+
}
|
|
78
|
+
columnType = refineColumnTypeFromSampleValue(firstSampleValue, columnType);
|
|
79
|
+
}
|
|
80
|
+
return [{ name: sanitizedColumnName, path: fieldName, type: columnType }];
|
|
81
|
+
}
|
|
82
|
+
function convertFieldsToColumns(fieldNames, records) {
|
|
83
|
+
const baseColumns = [{ name: 'id', type: 'id' }];
|
|
84
|
+
const fieldColumns = fieldNames.flatMap(fieldName => createColumnFromField(fieldName, records));
|
|
85
|
+
const rawDataColumn = [
|
|
86
|
+
{ name: 'raw_data', transform: (record) => JSON.stringify(record) }
|
|
87
|
+
];
|
|
88
|
+
return [...baseColumns, ...fieldColumns, ...rawDataColumn];
|
|
89
|
+
}
|
|
90
|
+
export function createDatabaseSchemaFromZohoCRMRecords(records, schemaName) {
|
|
91
|
+
if (!records || records.length === 0) {
|
|
92
|
+
return createEmptyDatabaseSchema(schemaName);
|
|
93
|
+
}
|
|
94
|
+
const allFieldNames = extractAllFieldNamesFromRecords(records);
|
|
95
|
+
const databaseColumns = convertFieldsToColumns(allFieldNames, records);
|
|
96
|
+
return {
|
|
97
|
+
name: schemaName,
|
|
98
|
+
prepareMode: 'drop',
|
|
99
|
+
columns: databaseColumns,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export async function convertZohoCRMModuleToDatabaseCollection(moduleName, client, options = {}) {
|
|
103
|
+
const { maxRecords } = options;
|
|
104
|
+
console.log(`Processing module: ${moduleName}`);
|
|
105
|
+
const zohoCRMRecords = await client.getAllRecordsWithFields(moduleName, { maxRecords: maxRecords || undefined });
|
|
106
|
+
const databaseSchema = createDatabaseSchemaFromZohoCRMRecords(zohoCRMRecords, moduleName.toLowerCase());
|
|
107
|
+
const databaseCollection = {
|
|
108
|
+
schema: databaseSchema,
|
|
109
|
+
objects: zohoCRMRecords.map((record, index) => ({
|
|
110
|
+
id: index + 1,
|
|
111
|
+
...record,
|
|
112
|
+
})),
|
|
113
|
+
};
|
|
114
|
+
console.log(`Processed ${zohoCRMRecords.length} records for module: ${moduleName}`);
|
|
115
|
+
return databaseCollection;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=zoho-crm-to-database-collection-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoho-crm-to-database-collection-converter.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-to-database-collection-converter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Collection, CollectionSchema } from '../collections/types.js';
|
|
2
|
-
import type { ZohoCRMClient, ZohoCRMRecord } from './zoho-crm-client.js';
|
|
3
|
-
export interface ModuleProcessorOptions {
|
|
4
|
-
maxRecords?: number;
|
|
5
|
-
}
|
|
6
|
-
export declare function generateSchemaFromRecords(records: ZohoCRMRecord[], schemaName: string): CollectionSchema;
|
|
7
|
-
export declare function processModule(moduleName: string, client: ZohoCRMClient, options?: ModuleProcessorOptions): Promise<Collection>;
|
|
8
|
-
//# sourceMappingURL=module-processor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module-processor.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/module-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAExE,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAuGxG;AAGD,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// Helper function to dynamically generate schema from Zoho CRM records
|
|
2
|
-
export function generateSchemaFromRecords(records, schemaName) {
|
|
3
|
-
if (!records || records.length === 0) {
|
|
4
|
-
return {
|
|
5
|
-
name: schemaName,
|
|
6
|
-
prepareMode: 'drop',
|
|
7
|
-
columns: [
|
|
8
|
-
{ name: 'id', type: 'id' },
|
|
9
|
-
{ name: 'raw_data', transform: (record) => JSON.stringify(record) },
|
|
10
|
-
],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
const allFields = new Set();
|
|
14
|
-
// Collect all field names from all records
|
|
15
|
-
records.forEach((record) => {
|
|
16
|
-
Object.keys(record).forEach((key) => {
|
|
17
|
-
allFields.add(key);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
// Convert field names to database column definitions
|
|
21
|
-
const columns = [{ name: 'id', type: 'id' }];
|
|
22
|
-
// Sort fields for consistent ordering
|
|
23
|
-
const sortedFields = Array.from(allFields).sort();
|
|
24
|
-
sortedFields.forEach((field) => {
|
|
25
|
-
// Skip the 'id' field from Zoho as we handle it separately
|
|
26
|
-
if (field === 'id') {
|
|
27
|
-
columns.push({ name: 'record_id', path: 'id' });
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const columnName = field.toLowerCase().replace(/[^a-z0-9_]/g, '_');
|
|
31
|
-
// Determine data type based on field name patterns and sample data
|
|
32
|
-
let type = 'text';
|
|
33
|
-
// Check field name patterns
|
|
34
|
-
if (field.includes('Date') || field.includes('Time') || field.includes('_time')) {
|
|
35
|
-
type = field.includes('Date') && !field.includes('Time') ? 'date' : 'datetime';
|
|
36
|
-
}
|
|
37
|
-
else if (field.includes('Amount') || field.includes('Revenue') || field.includes('_amount')) {
|
|
38
|
-
type = 'currency';
|
|
39
|
-
}
|
|
40
|
-
else if (field.includes('Probability') ||
|
|
41
|
-
field.includes('Rate') ||
|
|
42
|
-
field.includes('_rate') ||
|
|
43
|
-
field.includes('_number')) {
|
|
44
|
-
type = 'number';
|
|
45
|
-
}
|
|
46
|
-
else if (field.includes('Opt_Out') || field.includes('_opt_out') || field.includes('converted')) {
|
|
47
|
-
type = 'bool';
|
|
48
|
-
}
|
|
49
|
-
// Sample the data to refine type detection
|
|
50
|
-
const sampleValues = records
|
|
51
|
-
.slice(0, 10)
|
|
52
|
-
.map((record) => record[field])
|
|
53
|
-
.filter((val) => val !== null && val !== undefined && val !== '');
|
|
54
|
-
if (sampleValues.length > 0) {
|
|
55
|
-
const sampleValue = sampleValues[0];
|
|
56
|
-
if (typeof sampleValue === 'boolean') {
|
|
57
|
-
type = 'bool';
|
|
58
|
-
}
|
|
59
|
-
else if (typeof sampleValue === 'number') {
|
|
60
|
-
type = 'number';
|
|
61
|
-
}
|
|
62
|
-
else if (typeof sampleValue === 'object' && sampleValue !== null) {
|
|
63
|
-
// Handle nested objects (like Owner, Account_Name, etc.)
|
|
64
|
-
if (sampleValue.name) {
|
|
65
|
-
columns.push({ name: `${columnName}_name`, path: `${field}.name` });
|
|
66
|
-
}
|
|
67
|
-
if (sampleValue.id) {
|
|
68
|
-
columns.push({ name: `${columnName}_id`, path: `${field}.id` });
|
|
69
|
-
}
|
|
70
|
-
if (sampleValue.email) {
|
|
71
|
-
columns.push({ name: `${columnName}_email`, path: `${field}.email` });
|
|
72
|
-
}
|
|
73
|
-
return; // Skip adding the main field since we're handling nested properties
|
|
74
|
-
}
|
|
75
|
-
else if (typeof sampleValue === 'string') {
|
|
76
|
-
// Check if it's a valid date/timestamp string
|
|
77
|
-
if (type === 'date' || type === 'datetime') {
|
|
78
|
-
// Try to parse the date to validate it's a proper timestamp
|
|
79
|
-
const date = new Date(sampleValue);
|
|
80
|
-
if (isNaN(date.getTime())) {
|
|
81
|
-
// Invalid date, treat as text
|
|
82
|
-
type = 'text';
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
columns.push({ name: columnName, path: field, type });
|
|
88
|
-
});
|
|
89
|
-
// Always add raw_data column for full JSON
|
|
90
|
-
columns.push({ name: 'raw_data', transform: (record) => JSON.stringify(record) });
|
|
91
|
-
return {
|
|
92
|
-
name: schemaName,
|
|
93
|
-
prepareMode: 'drop',
|
|
94
|
-
columns,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
// Generic function to process any Zoho CRM module
|
|
98
|
-
export async function processModule(moduleName, client, options = {}) {
|
|
99
|
-
const { maxRecords } = options;
|
|
100
|
-
console.log(`Processing module: ${moduleName}`);
|
|
101
|
-
const records = await client.getAllRecordsWithFields(moduleName, { maxRecords: maxRecords || undefined });
|
|
102
|
-
const schema = generateSchemaFromRecords(records, moduleName.toLowerCase());
|
|
103
|
-
// Create collection with manually assigned IDs
|
|
104
|
-
const collection = {
|
|
105
|
-
schema,
|
|
106
|
-
objects: records.map((record, index) => ({
|
|
107
|
-
id: index + 1,
|
|
108
|
-
...record,
|
|
109
|
-
})),
|
|
110
|
-
};
|
|
111
|
-
console.log(`Processed ${records.length} records for module: ${moduleName}`);
|
|
112
|
-
return collection;
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=module-processor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module-processor.js","sourceRoot":"","sources":["../../src/zoho-crm/module-processor.ts"],"names":[],"mappings":"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"}
|