@orchesty/connector-zoho 1.0.0

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.
Files changed (50) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +190 -0
  3. package/coverage/clover.xml +124 -0
  4. package/coverage/coverage-final.json +5 -0
  5. package/coverage/lcov-report/base.css +224 -0
  6. package/coverage/lcov-report/block-navigation.js +87 -0
  7. package/coverage/lcov-report/favicon.png +0 -0
  8. package/coverage/lcov-report/index.html +146 -0
  9. package/coverage/lcov-report/prettify.css +1 -0
  10. package/coverage/lcov-report/prettify.js +2 -0
  11. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  12. package/coverage/lcov-report/sorter.js +210 -0
  13. package/coverage/lcov-report/src/Connector/ZohoAddRecordsConnector.ts.html +310 -0
  14. package/coverage/lcov-report/src/Connector/ZohoGetRecordsConnector.ts.html +436 -0
  15. package/coverage/lcov-report/src/Connector/index.html +131 -0
  16. package/coverage/lcov-report/src/ZohoApplication.ts.html +430 -0
  17. package/coverage/lcov-report/src/index.html +116 -0
  18. package/coverage/lcov-report/test/dataProvider.ts.html +271 -0
  19. package/coverage/lcov-report/test/index.html +116 -0
  20. package/coverage/lcov.info +182 -0
  21. package/dist/Connector/ZohoAddRecordsConnector.d.ts +36 -0
  22. package/dist/Connector/ZohoAddRecordsConnector.js +30 -0
  23. package/dist/Connector/ZohoGetRecordsConnector.d.ts +76 -0
  24. package/dist/Connector/ZohoGetRecordsConnector.js +34 -0
  25. package/dist/ZohoApplication.d.ts +26 -0
  26. package/dist/ZohoApplication.js +123 -0
  27. package/dist/package.json +22 -0
  28. package/jest.config.js +13 -0
  29. package/package.json +22 -0
  30. package/src/Connector/ZohoAddRecordsConnector.ts +75 -0
  31. package/src/Connector/ZohoGetRecordsConnector.ts +117 -0
  32. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/error-input.json +25 -0
  33. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/error-mock.json +39 -0
  34. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/error-output.json +37 -0
  35. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/input.json +25 -0
  36. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/mock.json +12 -0
  37. package/src/Connector/__tests__/Data/ZohoAddRecordsConnector/output.json +8 -0
  38. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/error-input.json +8 -0
  39. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/error-mock.json +79 -0
  40. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/error-output.json +76 -0
  41. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/input.json +8 -0
  42. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/mock.json +11 -0
  43. package/src/Connector/__tests__/Data/ZohoGetRecordsConnector/output.json +11 -0
  44. package/src/Connector/__tests__/ZohoAddRecordsConnector.ts +21 -0
  45. package/src/Connector/__tests__/ZohoGetRecordsConnector.ts +21 -0
  46. package/src/ZohoApplication.ts +115 -0
  47. package/test/dataProvider.ts +62 -0
  48. package/tsconfig.json +8 -0
  49. package/tsconfig.prod.json +13 -0
  50. package/tsconfig.prod.tsbuildinfo +1 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "http": "POST https://creator.zoho.eu/api/v2/hanaboso/HanabosoApp/form/karel",
3
+ "code": 200,
4
+ "body": {
5
+ "code": 3000,
6
+ "data": {
7
+ "ID": "152208000000007011"
8
+ },
9
+ "message": "Data Added Successfully!"
10
+ }
11
+ }
12
+
@@ -0,0 +1,8 @@
1
+ {
2
+ "headers": {
3
+ "user": "TestUser"
4
+ },
5
+ "data": {
6
+ "ID": "152208000000007011"
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "headers": {
3
+ "user": "TestUser"
4
+ },
5
+ "data": {
6
+ "recordId": "123"
7
+ }
8
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "http": "GET https://creator.zoho.com/api/v2/name/name_app/report/report_link/123",
3
+ "code": 200,
4
+ "body": {
5
+ "code": 2900,
6
+ "data": {
7
+ "Multi_Line": "Multiples\nLines\nof Text",
8
+ "Email": "jason@zylker.com",
9
+ "Address": {
10
+ "display_value": "4154 High Meadow Lane, Scranton, PA, 18503, United States",
11
+ "country": "United States",
12
+ "district_city": "Scranton",
13
+ "latitude": "41.4086874",
14
+ "address_line_1": "4154 High Meadow Lane",
15
+ "state_province": "PA",
16
+ "address_line_2": "",
17
+ "postal_code": "18503",
18
+ "longitude": "-75.6621294"
19
+ },
20
+ "Phone_Number": "+15704961113",
21
+ "Time": "10:30:00",
22
+ "Image": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Image/download?filepath=1605793663620_jasonprofile.jpg",
23
+ "Url": {
24
+ "value": "Zylker Inc",
25
+ "url": "https://www.zylker.com"
26
+ },
27
+ "Name": {
28
+ "display_value": "Mr. Jason Bowley Jr",
29
+ "prefix": "Mr.",
30
+ "last_name": "Bowley",
31
+ "suffix": "Jr",
32
+ "first_name": "Jason"
33
+ },
34
+ "Formula": "Single Line of Text - jason@zylker.com",
35
+ "Single_Line": "Single Line of Text",
36
+ "Number": "20",
37
+ "Decimal": "20.43",
38
+ "Decision_box": "true",
39
+ "File_upload": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/File_upload/download?filepath=1605793668376_myfile.txt",
40
+ "Checkbox": "Choice 1,Choice 2",
41
+ "Currency": "1230.89",
42
+ "Rich_Text": "<div><b>Rich</b> <i><span class=\"highlight\" style=\"background-color: rgb(254, 255, 51)\">Text</span></i> <u><span class=\"colour\" style=\"color: rgb(51, 51, 255)\">data</span></u>.<br /></div>",
43
+ "Lookup": {
44
+ "display_value": "asdasd",
45
+ "ID": "3888833000000114027"
46
+ },
47
+ "ID": "3888833000000114023",
48
+ "Integration": {
49
+ "display_value": "Webster",
50
+ "ID": "3888833000000114007"
51
+ },
52
+ "Multi_Select": [
53
+ "Choice 2",
54
+ "Choice 3"
55
+ ],
56
+ "Keyword": "Multiples Lines,Text",
57
+ "Percent": "34.34",
58
+ "Prediction": "",
59
+ "Dropdown": "Choice 2",
60
+ "Inline_SubForm": [
61
+ {
62
+ "display_value": "Barry",
63
+ "ID": "3888833000000114013"
64
+ }
65
+ ],
66
+ "Radio": "Choice 1",
67
+ "Auto_Number": "1",
68
+ "users": "jason18",
69
+ "Audio": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Audio/download?filepath=1605793663623_audiofile.mp3",
70
+ "Video": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Video/download?filepath=1605793663626_videofile.mp4",
71
+ "Signature": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Signature/download?filepath=1605793663691_signature.png",
72
+ "Sentiment": "Positive",
73
+ "Date_Time": "24-Apr-2020 10:30:00",
74
+ "Date_field": "24-Apr-2020",
75
+ "Object_Detection": "tv,laptop"
76
+ }
77
+ }
78
+ }
79
+
@@ -0,0 +1,76 @@
1
+ {
2
+ "headers": {
3
+ "user": "TestUser"
4
+ },
5
+ "data": {
6
+ "Multi_Line": "Multiples\nLines\nof Text",
7
+ "Email": "jason@zylker.com",
8
+ "Address": {
9
+ "display_value": "4154 High Meadow Lane, Scranton, PA, 18503, United States",
10
+ "country": "United States",
11
+ "district_city": "Scranton",
12
+ "latitude": "41.4086874",
13
+ "address_line_1": "4154 High Meadow Lane",
14
+ "state_province": "PA",
15
+ "address_line_2": "",
16
+ "postal_code": "18503",
17
+ "longitude": "-75.6621294"
18
+ },
19
+ "Phone_Number": "+15704961113",
20
+ "Time": "10:30:00",
21
+ "Image": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Image/download?filepath=1605793663620_jasonprofile.jpg",
22
+ "Url": {
23
+ "value": "Zylker Inc",
24
+ "url": "https://www.zylker.com"
25
+ },
26
+ "Name": {
27
+ "display_value": "Mr. Jason Bowley Jr",
28
+ "prefix": "Mr.",
29
+ "last_name": "Bowley",
30
+ "suffix": "Jr",
31
+ "first_name": "Jason"
32
+ },
33
+ "Formula": "Single Line of Text - jason@zylker.com",
34
+ "Single_Line": "Single Line of Text",
35
+ "Number": "20",
36
+ "Decimal": "20.43",
37
+ "Decision_box": "true",
38
+ "File_upload": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/File_upload/download?filepath=1605793668376_myfile.txt",
39
+ "Checkbox": "Choice 1,Choice 2",
40
+ "Currency": "1230.89",
41
+ "Rich_Text": "<div><b>Rich</b> <i><span class=\"highlight\" style=\"background-color: rgb(254, 255, 51)\">Text</span></i> <u><span class=\"colour\" style=\"color: rgb(51, 51, 255)\">data</span></u>.<br /></div>",
42
+ "Lookup": {
43
+ "display_value": "asdasd",
44
+ "ID": "3888833000000114027"
45
+ },
46
+ "ID": "3888833000000114023",
47
+ "Integration": {
48
+ "display_value": "Webster",
49
+ "ID": "3888833000000114007"
50
+ },
51
+ "Multi_Select": [
52
+ "Choice 2",
53
+ "Choice 3"
54
+ ],
55
+ "Keyword": "Multiples Lines,Text",
56
+ "Percent": "34.34",
57
+ "Prediction": "",
58
+ "Dropdown": "Choice 2",
59
+ "Inline_SubForm": [
60
+ {
61
+ "display_value": "Barry",
62
+ "ID": "3888833000000114013"
63
+ }
64
+ ],
65
+ "Radio": "Choice 1",
66
+ "Auto_Number": "1",
67
+ "users": "jason18",
68
+ "Audio": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Audio/download?filepath=1605793663623_audiofile.mp3",
69
+ "Video": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Video/download?filepath=1605793663626_videofile.mp4",
70
+ "Signature": "/api/v2/jason18/zylker-store/report/All_Orders/3888833000000114023/Signature/download?filepath=1605793663691_signature.png",
71
+ "Sentiment": "Positive",
72
+ "Date_Time": "24-Apr-2020 10:30:00",
73
+ "Date_field": "24-Apr-2020",
74
+ "Object_Detection": "tv,laptop"
75
+ }
76
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "headers": {
3
+ "user": "TestUser"
4
+ },
5
+ "data": {
6
+ "recordId": "152208000000004003"
7
+ }
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "http": "GET https://creator.zoho.eu/api/v2/hanaboso/HanabosoApp/report/karel_Report/152208000000004003",
3
+ "code": 200,
4
+ "body": {
5
+ "code": 3000,
6
+ "data": {
7
+ "ID": "152208000000004003"
8
+ }
9
+ }
10
+ }
11
+
@@ -0,0 +1,11 @@
1
+ {
2
+ "headers": {
3
+ "user": "TestUser"
4
+ },
5
+ "data": {
6
+ "ID": "152208000000004003"
7
+ }
8
+ }
9
+
10
+
11
+
@@ -0,0 +1,21 @@
1
+ import { container } from '@orchesty/nodejs-connectors/test/TestAbstract';
2
+ import NodeTester from '@orchesty/nodejs-sdk/dist/test/Testers/NodeTester';
3
+ import init from '../../../test/dataProvider';
4
+ import { NAME as ZOHO_ADD_RECORDS_CONNECTOR } from '../ZohoAddRecordsConnector';
5
+
6
+ let tester: NodeTester;
7
+
8
+ describe('Tests for ZohoAddRecordsConnector', () => {
9
+ beforeAll(() => {
10
+ tester = new NodeTester(container, __filename);
11
+ init();
12
+ });
13
+
14
+ it('process - ok', async () => {
15
+ await tester.testConnector(ZOHO_ADD_RECORDS_CONNECTOR);
16
+ });
17
+
18
+ it('process - error', async () => {
19
+ await tester.testConnector(ZOHO_ADD_RECORDS_CONNECTOR, 'error', Error);
20
+ });
21
+ });
@@ -0,0 +1,21 @@
1
+ import { container } from '@orchesty/nodejs-connectors/test/TestAbstract';
2
+ import NodeTester from '@orchesty/nodejs-sdk/dist/test/Testers/NodeTester';
3
+ import init from '../../../test/dataProvider';
4
+ import { NAME as ZOHO_GET_RECORDS_CONNECTOR } from '../ZohoGetRecordsConnector';
5
+
6
+ let tester: NodeTester;
7
+
8
+ describe('Tests for ZohoGetRecordsConnector', () => {
9
+ beforeAll(() => {
10
+ tester = new NodeTester(container, __filename);
11
+ init();
12
+ });
13
+
14
+ it('process - ok', async () => {
15
+ await tester.testConnector(ZOHO_GET_RECORDS_CONNECTOR);
16
+ });
17
+
18
+ it('process - error', async () => {
19
+ await tester.testConnector(ZOHO_GET_RECORDS_CONNECTOR, 'error', Error);
20
+ });
21
+ });
@@ -0,0 +1,115 @@
1
+ import CoreFormsEnum, { getFormName } from '@orchesty/nodejs-sdk/dist/lib/Application/Base/CoreFormsEnum';
2
+ import { ApplicationInstall } from '@orchesty/nodejs-sdk/dist/lib/Application/Database/ApplicationInstall';
3
+ import Field from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Field';
4
+ import FieldType from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FieldType';
5
+ import Form from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Form';
6
+ import FormStack from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack';
7
+ import ScopeSeparatorEnum from '@orchesty/nodejs-sdk/dist/lib/Authorization/ScopeSeparatorEnum';
8
+ import { TOKEN } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication';
9
+ import AOAuth2Application from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/OAuth2/AOAuth2Application';
10
+ import { CLIENT_ID, CLIENT_SECRET } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/OAuth2/IOAuth2Application';
11
+ import RequestDto from '@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto';
12
+ import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
13
+ import AProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/AProcessDto';
14
+ import { CommonHeaders, JSON_TYPE } from '@orchesty/nodejs-sdk/dist/lib/Utils/Headers';
15
+
16
+ const API_PATH = '/api/v2';
17
+
18
+ export const NAME = 'zoho';
19
+ export const API_DOMAIN = 'api_domain';
20
+ export const CREATOR_FORM = 'creator_form';
21
+ export const ACCOUNT_OWNER_NAME = 'account_owner_name';
22
+ export const APP_LINK_NAME = 'app_link_name';
23
+ export const FORM_LINK_NAME = 'form_link_name';
24
+ export const REPORT_LINK_NAME = 'report_link_name';
25
+
26
+ export default class ZohoApplication extends AOAuth2Application {
27
+
28
+ public getAuthUrl(): string {
29
+ return 'https://accounts.zoho.eu/oauth/v2/auth';
30
+ }
31
+
32
+ public getDescription(): string {
33
+ return 'Zoho is a provider of a Customer Relationship Management (CRM) solution';
34
+ }
35
+
36
+ public getName(): string {
37
+ return NAME;
38
+ }
39
+
40
+ public getPublicName(): string {
41
+ return 'Zoho';
42
+ }
43
+
44
+ public getLogo(): string {
45
+ return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlZyc3R2YV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAwIDEwMDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNFNzkyMjQ7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMV8pO30KCS5zdDJ7ZmlsbDojRkVGMjZGO30KCS5zdDN7ZmlsbDojOTFDOUVEO30KCS5zdDR7ZmlsbDp1cmwoI1NWR0lEXzJfKTt9Cgkuc3Q1e2ZpbGw6IzBCOUFENjt9Cgkuc3Q2e2NsaXAtcGF0aDp1cmwoI1NWR0lEXzRfKTt9Cgkuc3Q3e2ZpbGw6dXJsKCNTVkdJRF81Xyk7fQoJLnN0OHtmaWxsOiM5OEQwQTA7fQoJLnN0OXtmaWxsOiM2OEJGNkI7fQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9Cgkuc3QxMXtmaWxsOiNFRjQ2M0Q7fQoJLnN0MTJ7ZmlsbDojNzYxMTE2O30KCS5zdDEze2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDEwMC4wOCkiPgoJPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjI5Mzc4IDAgMCAuMjkzNzggMCAuMDQyMzczKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzQwLjM4IDIwMC44NCkiPgoJCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ4NS4yLTQ3LjF2LTYyLjZsLTguNC04LjR2NjEuMkwtNDg1LjItNDcuMSIvPgoJCTwvZz4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSItNjE1LjQ1MjkiIHkxPSItOTUwLjEzOTUiIHgyPSItNjE1LjA5NjUiIHkyPSItOTUwLjEzOTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTIuNzQxODc4ZS0wNiAtNjQuMzU1OCAtNjQuMzU1OCAyLjc0MTg3OGUtMDYgLTYwOTI3LjY5MTQgLTM5NDY0LjgzOTgpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRTUwMCIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkNCODIyIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjQ2LjksMTQ0aC01NS4zVjgyLjdoNTUuM1YxNDR6Ii8+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTgxLjEgMjAwLjcyKSI+CgkJCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0tMzgwLjgtNDdsLTguNy05LjhoNTUuM2w4LjIsOS44TC0zODAuOC00NyIvPgoJCTwvZz4KCQk8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzODIuMjMgMTkzLjE5KSI+CgkJCTxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0tMjUwLjQtNDIuMWw1NC40LDcuOGwtNC42LTEzLjVsLTUxLjUtOC41bDAuMiw5LjZMLTI1MC40LTQyLjEiLz4KCQk8L2c+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iLTYxOS40Njc3IiB5MT0iLTk0MC40Nzg4IiB4Mj0iLTYxOS4xMTg4IiB5Mj0iLTk0MC40Nzg4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDYzLjA5NDUgLTUwLjY2OTkgLTUwLjY2OTkgLTYzLjA5NDUgLTg0MzguMjQ1MSAtOTA1OTEpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzE2OENDQyIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMDA2NDlFIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTgxLjcsMTQ1LjRsNy41LTU0LjlsLTUzLjYtNy44bC03LjIsNTMuMWwzLjEsMi41TDE4MS43LDE0NS40Ii8+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTQwLjE4IDIxNS4xNSkiPgoJCQk8cGF0aCBjbGFzcz0ic3Q1IiBkPSJNLTM1NC01Ni4zbDAtMC4zbDcuMS01Ni4ybC00LjEtMTEuOGwtNy41LDU0LjkiLz4KCQk8L2c+CgkJPGc+CgkJCTxkZWZzPgoJCQkJPHBvbHlsaW5lIGlkPSJTVkdJRF8zXyIgcG9pbnRzPSI4NS44LDE1NS43IDEzNCwxMzMuMyAxMTIuMyw4Mi4yIDY0LjEsMTA0LjcgODUuOCwxNTUuNyAJCQkJIi8+CgkJCTwvZGVmcz4KCQkJPGNsaXBQYXRoIGlkPSJTVkdJRF80XyI+CgkJCQk8dXNlIHhsaW5rOmhyZWY9IiNTVkdJRF8zXyIgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIvPgoJCQk8L2NsaXBQYXRoPgoJCQk8ZyBjbGFzcz0ic3Q2Ij4KCQkJCQoJCQkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iLTYxMy41NiIgeTE9Ii05NTUuMTc0NiIgeDI9Ii02MTMuMjAzNiIgeTI9Ii05NTUuMTc0NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMi4zNTAxODFlLTA2IC01Ni4zODA4IC01Ni4zODA4IDIuMzUwMTgxZS0wNiAtNTM3MjUuOTAyMyAtMzQ0NTcuNzE4OCkiPgoJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMyNUExNDkiLz4KCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMDA4QTUyIi8+CgkJCQk8L2xpbmVhckdyYWRpZW50PgoJCQkJPHBhdGggY2xhc3M9InN0NyIgZD0iTTAuMSwxNzMuMmgyNTV2LTkxSDAuMVYxNzMuMnoiLz4KCQkJPC9nPgoJCTwvZz4KCQk8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzQuMzEgMjU1LjM2KSI+CgkJCTxwYXRoIGNsYXNzPSJzdDgiIGQ9Ik0tMTUzLjUtODIuMWw1LTE3LjVsNDguMi0yMi41bC00LDE2LjdMLTE1My41LTgyLjEiLz4KCQk8L2c+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM0LjMxIDI1NS4zNikiPgoJCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNLTE1My41LTgyLjFsLTE5LjQtNDcuNmwyLjctMjAuOWwyMS43LDUxTC0xNTMuNS04Mi4xIi8+CgkJPC9nPgoJCQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ii02MTIuODc2NyIgeTE9Ii05NTMuNzc4OCIgeDI9Ii02MTIuNTIyNiIgeTI9Ii05NTMuNzc4OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg5LjY5NjEgLTU4LjUzNTIgLTU4LjUzNTIgLTkuNjk2MSAtNDk4NjAuMTA5NCAtNDQ5ODIuNTgyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTIyMzEiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JBMjIzNCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik01NCwxNDUuNWw3LjktNTRMOC43LDgyLjhsLTguNSw1NC4xTDU0LDE0NS41Ii8+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxNTMuNTcpIj4KCQkJPHBhdGggY2xhc3M9InN0MTEiIGQ9Ik0wLjEtMTYuNkwzLjksMi43bDUzLjcsOC45TDU0LTguMUwwLjEtMTYuNiIvPgoJCTwvZz4KCQk8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYuODggMjMyLjcpIj4KCQkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik0tMTA5LjMtNjcuNmw3LjktNTQuNWwtMy42LTE5LjFsLTcuOSw1NEwtMTA5LjMtNjcuNiIvPgoJCTwvZz4KCQk8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MDAuNDcgMTQ3Ljc2KSI+CgkJCTxwYXRoIGNsYXNzPSJzdDEzIiBkPSJNLTMyNy45LTEyLjljLTAuMiwxLjctMC44LDMtMS43LDMuOWMtMC43LDAuNy0xLjYsMS0yLjcsMWMtMC4zLDAtMC41LDAtMC44LTAuMWMtMS40LTAuMi0yLjUtMC45LTMuMS0yCgkJCQljLTAuNS0wLjgtMC43LTEuOC0wLjctMi45YzAtMC40LDAtMC45LDAuMS0xLjNsMi0xNC4zbC0xNS40LTIuM2wtMiwxNC4zYy0wLjIsMS43LTAuOCwyLjktMS43LDMuOGMtMC43LDAuNy0xLjYsMS4xLTIuNywxLjEKCQkJCWMtMC4yLDAtMC41LDAtMC43LTAuMWMtMS41LTAuMi0yLjYtMC45LTMuMi0yYy0wLjUtMC44LTAuNy0xLjctMC43LTIuOWMwLTAuNCwwLTAuOSwwLjEtMS40bDUuMy0zNy4xYzAuMi0xLjcsMC44LTMsMS44LTMuOAoJCQkJYzAuNy0wLjcsMS43LTEsMi43LTFjMC4zLDAsMC42LDAsMC45LDAuMWMxLjMsMC4yLDIuNCwwLjksMywyYzAuNCwwLjgsMC43LDEuNywwLjcsMi44YzAsMC40LDAsMC45LTAuMSwxLjRsLTIuMiwxNC43bDE1LjQsMi4zCgkJCQlsMi4yLTE0LjdjMC4yLTEuNywwLjgtMywxLjctMy44YzAuNy0wLjcsMS43LTEsMi43LTFjMC4zLDAsMC41LDAsMC44LDAuMWMxLjQsMC4yLDIuNSwwLjksMy4xLDJjMC41LDAuOCwwLjcsMS43LDAuNywyLjgKCQkJCWMwLDAuNCwwLDAuOS0wLjEsMS40TC0zMjcuOS0xMi45eiBNLTM5MC43LTMzLjRjLTEuOC00LjQtNC4yLTcuNS03LjItOS4xYy0xLjYtMC45LTMuMi0xLjMtNC45LTEuM2MtMS41LDAtMywwLjMtNC41LDEKCQkJCWMtMy40LDEuNS01LjUsMy45LTYuNCw3LjJjLTAuMywxLjEtMC41LDIuMy0wLjUsMy42YzAsMi41LDAuNiw1LjIsMS44LDguMWMxLjksNC41LDQuMyw3LjYsNy4yLDkuM2MxLjYsMC45LDMuMiwxLjQsNC45LDEuNAoJCQkJYzEuNSwwLDMtMC4zLDQuNi0xYzMuMy0xLjUsNS40LTMuOSw2LjMtNy4zYzAuMy0xLjEsMC40LTIuMywwLjQtMy41Qy0zODguOC0yNy42LTM4OS40LTMwLjQtMzkwLjctMzMuNHogTS0zODUuNC0xMS4yCgkJCQljLTEuOSwyLjEtNC4yLDMuNy02LjksNC45Yy0yLjcsMS4yLTUuNCwxLjgtOC4xLDEuOGwtMC4xLDBjLTIuOCwwLTUuNS0wLjctOC4yLTEuOXYwYy0yLjgtMS4zLTUuMy0zLTcuNC01LjMKCQkJCWMtMi4xLTIuMy0zLjgtNS01LjEtOC4yYy0xLjMtMy4yLTItNi4zLTIuMS05LjVjMC0wLjQsMC0wLjcsMC0xLjFjMC0yLjgsMC41LTUuNSwxLjQtOC4yYzEtMi44LDIuNC01LjMsNC4zLTcuMwoJCQkJYzEuOS0yLjEsNC4zLTMuNyw3LTQuOXYwYzIuNy0xLjIsNS4zLTEuOCw4LjEtMS43aDAuMWMyLjgsMCw1LjUsMC42LDguMiwxLjhsMCwwbDAsMGMyLjgsMS4zLDUuMywzLjEsNy40LDUuNAoJCQkJYzIuMSwyLjMsMy44LDUsNS4xLDguMmMxLjMsMy4yLDIsNi4zLDIuMSw5LjVjMCwwLjMsMCwwLjYsMCwwLjljMCwyLjgtMC41LDUuNi0xLjUsOC4zQy0zODItMTUuNy0zODMuNS0xMy4zLTM4NS40LTExLjJ6CgkJCQkgTS00NTIuMi00Ny43Yy0wLjQsMC41LTEsMC45LTEuNywxLjJjLTAuNywwLjMtMS42LDAuNC0yLjYsMC40Yy0wLjksMC0yLTAuMS0zLjMtMC4zbC0xNC0yLjVjMC4xLDEuMSwwLjcsMi42LDEuNiw0LjQKCQkJCWMxLjEsMiwyLjYsNC40LDQuNyw3LjJsMCwwYzAuNywxLDEuMiwxLjcsMS42LDIuMmMwLjMsMC4zLDAuNiwwLjgsMS4xLDEuNWMzLjIsNC40LDUuMiw3LjksNiwxMC43YzAuNCwxLjYsMC43LDMuMiwwLjgsNC44CgkJCQljMCwwLjQsMCwwLjksMCwxLjNjMCwxLjEtMC4xLDIuMy0wLjMsMy40Yy0wLjIsMS0wLjQsMS45LTAuNywyLjVjLTAuMywwLjctMC43LDEuMi0xLjIsMS41Yy0wLjYsMC40LTEuNCwwLjUtMi40LDAuNQoJCQkJYy0wLjksMC0xLjktMC4xLTMuMS0wLjNsLTE2LjItMi45Yy0yLTAuMy0zLjQtMC45LTQuMy0xLjhjLTAuNy0wLjctMS4xLTEuNi0xLjEtMi43YzAtMC4zLDAtMC42LDAuMS0wLjljMC4yLTEuNCwwLjktMi41LDIuMS0zCgkJCQljMC43LTAuMywxLjUtMC41LDIuNS0wLjVjMC43LDAsMS40LDAuMSwyLjIsMC4ybDEzLjYsMi40YzAtMC4yLDAtMC41LDAtMC43YzAtMC45LTAuMS0xLjctMC40LTIuNmMtMC40LTEuMi0xLjQtMi44LTMtNC45CgkJCQljLTAuNS0wLjYtMS4yLTEuNS0yLjEtMi43Yy0zLjctNC42LTYuMy04LjUtNy45LTExLjhjMCwwLDAsMCwwLDBjMCwwLDAsMCwwLDBjLTEuMS0yLjItMS45LTQuNS0yLjMtNi42CgkJCQljLTAuMy0xLjMtMC40LTIuNS0wLjQtMy43YzAtMC44LDAuMS0xLjYsMC4yLTIuNGMwLjItMS4xLDAuNS0yLjEsMC44LTIuOGMwLjQtMC43LDAuOC0xLjMsMS40LTEuNmMwLjUtMC4zLDEuMy0wLjQsMi40LTAuNAoJCQkJYzEuNCwwLDMuMiwwLjIsNS41LDAuNmwxNC43LDIuNmMyLjYsMC41LDQuNCwxLjEsNS41LDJjMC44LDAuNywxLjMsMS43LDEuMywyLjljMCwwLjMsMCwwLjYtMC4xLDAuOQoJCQkJQy00NTEuNS00OC45LTQ1MS44LTQ4LjItNDUyLjItNDcuN0wtNDUyLjItNDcuN3ogTS00NjQuNy0zMy42TC00NjQuNy0zMy42Qy00NjQuNy0zMy42LTQ2NC43LTMzLjYtNDY0LjctMzMuNkwtNDY0LjctMzMuNgoJCQkJTC00NjQuNy0zMy42eiBNLTI3My4zLTQ2Yy0yLjEtMi42LTUtNC04LjctNGMtMy43LDAtNi42LDEuMy04LjcsNGMtMi4xLDIuNi0zLjIsNi4zLTMuMiwxMC45YzAsNC43LDEuMSw4LjQsMy4yLDExLjEKCQkJCWMyLjEsMi43LDUsNCw4LjcsNGMzLjcsMCw2LjUtMS4zLDguNy00YzIuMS0yLjcsMy4yLTYuMywzLjItMTEuMUMtMjcwLjEtMzkuOC0yNzEuMi00My40LTI3My4zLTQ2eiBNLTI2Mi0yNS44CgkJCQljLTEuMSwyLjgtMi43LDUuNC00LjksNy42Yy0yLjEsMi4yLTQuNCwzLjgtNi45LDQuOWMtMi41LDEuMS01LjMsMS42LTguMywxLjZjLTMsMC01LjgtMC41LTguMy0xLjZjLTIuNi0xLjEtNC45LTIuNy02LjktNC45CgkJCQljLTIuMS0yLjItMy44LTQuOC00LjgtNy42Yy0xLjEtMi44LTEuNi02LTEuNi05LjNjMC0zLjMsMC41LTYuNCwxLjYtOS4zYzEuMS0yLjksMi43LTUuNCw0LjgtNy43YzItMi4xLDQuMy0zLjcsNi44LTQuOAoJCQkJYzIuNi0xLjEsNS40LTEuNiw4LjQtMS42YzIuOSwwLDUuNywwLjUsOC4yLDEuNmMyLjYsMS4xLDQuOSwyLjcsNi45LDQuOGMyLjEsMi4zLDMuOCw0LjgsNC45LDcuN2MxLjEsMi45LDEuNiw2LDEuNiw5LjMKCQkJCVMtMjYwLjktMjguNy0yNjItMjUuOCIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K';
46
+ }
47
+
48
+ public getRequestDto(
49
+ dto: AProcessDto,
50
+ applicationInstall: ApplicationInstall,
51
+ method: HttpMethods,
52
+ uri?: string,
53
+ data?: unknown,
54
+ ): Promise<RequestDto> | RequestDto {
55
+ const domain = applicationInstall.getSettings()[CoreFormsEnum.AUTHORIZATION_FORM][TOKEN][API_DOMAIN];
56
+ const url = `${domain}${API_PATH}${uri}`;
57
+
58
+ const request = new RequestDto(url ?? '', method, dto);
59
+ request.setHeaders({
60
+ [CommonHeaders.CONTENT_TYPE]: JSON_TYPE,
61
+ [CommonHeaders.ACCEPT]: JSON_TYPE,
62
+ [CommonHeaders.AUTHORIZATION]: `Zoho-oauthtoken ${this.getAccessToken(applicationInstall)}`,
63
+ });
64
+
65
+ if (data) {
66
+ request.setJsonBody(data);
67
+ }
68
+
69
+ return request;
70
+ }
71
+
72
+ public getScopes(
73
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
+ applicationInstall: ApplicationInstall,
75
+ ): string[] {
76
+ return ['ZohoCRM.modules.ALL', 'ZohoCRM.settings.ALL', 'ZohoCreator.form.ALL', 'ZohoCreator.report.ALL'];
77
+ }
78
+
79
+ public getFormStack(): FormStack {
80
+ const form = new Form(CoreFormsEnum.AUTHORIZATION_FORM, getFormName(CoreFormsEnum.AUTHORIZATION_FORM))
81
+ .addField(new Field(FieldType.TEXT, CLIENT_ID, 'Client Id', undefined, true))
82
+ .addField(new Field(FieldType.TEXT, CLIENT_SECRET, 'Client Secret', undefined, true));
83
+
84
+ const creatorForm = new Form(CREATOR_FORM, 'Creator settings')
85
+ .addField(new Field(FieldType.TEXT, ACCOUNT_OWNER_NAME, 'Account owner name', undefined, true))
86
+ .addField(new Field(FieldType.TEXT, APP_LINK_NAME, 'App link name', undefined, true))
87
+ .addField(new Field(FieldType.TEXT, FORM_LINK_NAME, 'Form link name', undefined, true))
88
+ .addField(new Field(FieldType.TEXT, REPORT_LINK_NAME, 'report_link_name', undefined, true));
89
+
90
+ return new FormStack()
91
+ .addForm(form)
92
+ .addForm(creatorForm);
93
+ }
94
+
95
+ public isAuthorized(applicationInstall: ApplicationInstall): boolean {
96
+ const authorizationForm = applicationInstall.getSettings()[CoreFormsEnum.AUTHORIZATION_FORM];
97
+ const creatorForm = applicationInstall.getSettings()[CREATOR_FORM];
98
+ return super.isAuthorized(applicationInstall)
99
+ && authorizationForm?.[CLIENT_ID]
100
+ && authorizationForm?.[CLIENT_SECRET]
101
+ && creatorForm?.[ACCOUNT_OWNER_NAME]
102
+ && creatorForm?.[APP_LINK_NAME]
103
+ && creatorForm?.[FORM_LINK_NAME]
104
+ && creatorForm?.[REPORT_LINK_NAME];
105
+ }
106
+
107
+ public getTokenUrl(): string {
108
+ return 'https://accounts.zoho.eu/oauth/v2/token';
109
+ }
110
+
111
+ protected getScopesSeparator(): string {
112
+ return ScopeSeparatorEnum.SPACE;
113
+ }
114
+
115
+ }
@@ -0,0 +1,62 @@
1
+ import {
2
+ appInstall,
3
+ DEFAULT_ACCESS_TOKEN,
4
+ DEFAULT_CLIENT_ID,
5
+ DEFAULT_CLIENT_SECRET,
6
+ DEFAULT_USER,
7
+ } from '@orchesty/nodejs-connectors/test/DataProvider';
8
+ import {
9
+ container, db, oauth2Provider, sender,
10
+ } from '@orchesty/nodejs-connectors/test/TestAbstract';
11
+ import CoreFormsEnum from '@orchesty/nodejs-sdk/dist/lib/Application/Base/CoreFormsEnum';
12
+ import { ACCESS_TOKEN } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Provider/OAuth2/OAuth2Provider';
13
+ import { TOKEN } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication';
14
+ import { CLIENT_ID, CLIENT_SECRET } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/OAuth2/IOAuth2Application';
15
+ import ZohoAddRecordsConnector from '../src/Connector/ZohoAddRecordsConnector';
16
+ import ZohoGetRecordsConnector from '../src/Connector/ZohoGetRecordsConnector';
17
+ import
18
+ ZohoApplication,
19
+ {
20
+ ACCOUNT_OWNER_NAME,
21
+ API_DOMAIN,
22
+ APP_LINK_NAME,
23
+ CREATOR_FORM, FORM_LINK_NAME,
24
+ NAME as ZOHO_APP, REPORT_LINK_NAME,
25
+ } from '../src/ZohoApplication';
26
+
27
+ export default function init(): void {
28
+ appInstall(ZOHO_APP, DEFAULT_USER, {
29
+ [CoreFormsEnum.AUTHORIZATION_FORM]: {
30
+ [CLIENT_ID]: DEFAULT_CLIENT_ID,
31
+ [CLIENT_SECRET]: DEFAULT_CLIENT_SECRET,
32
+ [TOKEN]: {
33
+ [ACCESS_TOKEN]: DEFAULT_ACCESS_TOKEN,
34
+ [API_DOMAIN]: 'https://creator.zoho.eu',
35
+ },
36
+ },
37
+ [CREATOR_FORM]: {
38
+ [ACCOUNT_OWNER_NAME]: 'hanaboso',
39
+ [APP_LINK_NAME]: 'HanabosoApp',
40
+ [FORM_LINK_NAME]: 'karel',
41
+ [REPORT_LINK_NAME]: 'karel_Report',
42
+ },
43
+ });
44
+
45
+ const zohoApp = new ZohoApplication(oauth2Provider);
46
+ container.setApplication(zohoApp);
47
+
48
+ const addRecords = new ZohoAddRecordsConnector();
49
+ const getRecords = new ZohoGetRecordsConnector();
50
+
51
+ addRecords
52
+ .setSender(sender)
53
+ .setDb(db)
54
+ .setApplication(zohoApp);
55
+ container.setConnector(addRecords);
56
+
57
+ getRecords
58
+ .setSender(sender)
59
+ .setDb(db)
60
+ .setApplication(zohoApp);
61
+ container.setConnector(getRecords);
62
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "composite": true
6
+ },
7
+ "include": ["src", "test", "../../test"]
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ },
6
+ "include": [
7
+ "src",
8
+ ],
9
+ "exclude": [
10
+ "node_modules",
11
+ "src/**/__tests__",
12
+ ]
13
+ }