@nlabs/reaktor 0.3.0 → 0.4.1

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 (128) hide show
  1. package/lib/actions/conversations.d.ts +14 -0
  2. package/lib/actions/conversations.js +333 -0
  3. package/lib/actions/dynamodb.js +155 -0
  4. package/lib/actions/email.js +177 -0
  5. package/lib/actions/files.js +319 -0
  6. package/lib/{data → actions}/groups.d.ts +4 -3
  7. package/lib/actions/groups.js +282 -0
  8. package/lib/actions/images.d.ts +22 -0
  9. package/lib/actions/images.js +682 -0
  10. package/lib/actions/index.js +40 -0
  11. package/lib/{data → actions}/ios.d.ts +2 -1
  12. package/lib/actions/ios.js +179 -0
  13. package/lib/actions/locations.js +112 -0
  14. package/lib/actions/messages.d.ts +13 -0
  15. package/lib/actions/messages.js +216 -0
  16. package/lib/actions/notifications.js +63 -0
  17. package/lib/{data → actions}/payments.d.ts +2 -2
  18. package/lib/actions/payments.js +491 -0
  19. package/lib/actions/posts.d.ts +19 -0
  20. package/lib/actions/posts.js +538 -0
  21. package/lib/actions/reactions.d.ts +30 -0
  22. package/lib/actions/reactions.js +340 -0
  23. package/lib/{data → actions}/s3.d.ts +1 -1
  24. package/lib/actions/s3.js +122 -0
  25. package/lib/{data → actions}/search.d.ts +2 -2
  26. package/lib/actions/search.js +99 -0
  27. package/lib/actions/sms.js +76 -0
  28. package/lib/actions/statistics.d.ts +2 -0
  29. package/lib/actions/statistics.js +63 -0
  30. package/lib/actions/subscription.js +209 -0
  31. package/lib/actions/tags.d.ts +26 -0
  32. package/lib/actions/tags.js +340 -0
  33. package/lib/actions/users.d.ts +44 -0
  34. package/lib/actions/users.js +571 -0
  35. package/lib/{data → actions}/websockets.d.ts +1 -1
  36. package/lib/actions/websockets.js +156 -0
  37. package/lib/config.d.ts +2 -3
  38. package/lib/config.js +120 -0
  39. package/lib/index.d.ts +1 -1
  40. package/lib/index.js +23 -0
  41. package/lib/templates/email/layout.d.ts +2 -0
  42. package/lib/templates/email/layout.js +292 -0
  43. package/lib/templates/email/passwordForgot.d.ts +2 -0
  44. package/lib/templates/email/passwordForgot.js +28 -0
  45. package/lib/templates/email/passwordRecovery.d.ts +2 -0
  46. package/lib/templates/email/passwordRecovery.js +25 -0
  47. package/lib/templates/email/verifyEmail.d.ts +2 -0
  48. package/lib/templates/email/verifyEmail.js +28 -0
  49. package/lib/templates/email/welcome.d.ts +2 -0
  50. package/lib/templates/email/welcome.js +28 -0
  51. package/lib/templates/sms/passwordForgot.d.ts +2 -0
  52. package/lib/templates/sms/passwordForgot.js +14 -0
  53. package/lib/templates/sms/passwordRecovery.d.ts +2 -0
  54. package/lib/templates/sms/passwordRecovery.js +14 -0
  55. package/lib/templates/sms/verifyEmail.d.ts +2 -0
  56. package/lib/templates/sms/verifyEmail.js +14 -0
  57. package/lib/templates/sms/verifyPhone.d.ts +2 -0
  58. package/lib/templates/sms/verifyPhone.js +14 -0
  59. package/lib/templates/sms/welcome.d.ts +2 -0
  60. package/lib/templates/sms/welcome.js +14 -0
  61. package/lib/types/apps.d.ts +2 -2
  62. package/lib/types/apps.js +4 -0
  63. package/lib/types/arangodb.js +4 -0
  64. package/lib/types/auth.d.ts +4 -8
  65. package/lib/types/auth.js +4 -0
  66. package/lib/types/conversations.d.ts +5 -3
  67. package/lib/types/conversations.js +4 -0
  68. package/lib/types/email.d.ts +2 -2
  69. package/lib/types/email.js +4 -0
  70. package/lib/types/files.js +4 -0
  71. package/lib/types/google.js +4 -0
  72. package/lib/types/groups.d.ts +2 -1
  73. package/lib/types/groups.js +4 -0
  74. package/lib/types/images.d.ts +8 -5
  75. package/lib/types/images.js +4 -0
  76. package/lib/types/index.d.ts +1 -1
  77. package/lib/types/index.js +37 -0
  78. package/lib/types/locations.js +4 -0
  79. package/lib/types/messages.d.ts +12 -2
  80. package/lib/types/messages.js +4 -0
  81. package/lib/types/notifications.d.ts +2 -2
  82. package/lib/types/notifications.js +4 -0
  83. package/lib/types/payments.js +4 -0
  84. package/lib/types/posts.d.ts +18 -1
  85. package/lib/types/posts.js +4 -0
  86. package/lib/types/statistics.d.ts +3 -0
  87. package/lib/types/statistics.js +4 -0
  88. package/lib/types/tags.d.ts +6 -0
  89. package/lib/types/tags.js +4 -0
  90. package/lib/types/users.d.ts +15 -10
  91. package/lib/types/users.js +4 -0
  92. package/lib/utils/analytics.d.ts +7 -0
  93. package/lib/utils/analytics.js +107 -0
  94. package/lib/utils/arangodb.d.ts +1 -1
  95. package/lib/utils/arangodb.js +122 -0
  96. package/lib/utils/auth.js +78 -0
  97. package/lib/utils/graphql.js +40 -0
  98. package/lib/utils/index.d.ts +1 -1
  99. package/lib/utils/index.js +26 -0
  100. package/lib/utils/objects.js +53 -0
  101. package/lib/utils/session.d.ts +18 -0
  102. package/lib/utils/session.js +42 -0
  103. package/package.json +35 -33
  104. package/lib/data/conversations.d.ts +0 -8
  105. package/lib/data/images.d.ts +0 -21
  106. package/lib/data/messages.d.ts +0 -9
  107. package/lib/data/posts.d.ts +0 -23
  108. package/lib/data/reactions.d.ts +0 -14
  109. package/lib/data/tags.d.ts +0 -14
  110. package/lib/data/users.d.ts +0 -17
  111. package/lib/types/reactions.d.ts +0 -15
  112. package/lib/utils/redis.d.ts +0 -1
  113. package/templates/email/layout.html +0 -279
  114. package/templates/email/passwordForgot.html +0 -15
  115. package/templates/email/passwordRecovery.html +0 -12
  116. package/templates/email/verifyEmail.html +0 -15
  117. package/templates/sms/passwordForgot.txt +0 -1
  118. package/templates/sms/passwordRecovery.txt +0 -1
  119. package/templates/sms/verifyEmail.txt +0 -1
  120. package/templates/sms/verifyPhone.txt +0 -1
  121. /package/lib/{data → actions}/dynamodb.d.ts +0 -0
  122. /package/lib/{data → actions}/email.d.ts +0 -0
  123. /package/lib/{data → actions}/files.d.ts +0 -0
  124. /package/lib/{data → actions}/index.d.ts +0 -0
  125. /package/lib/{data → actions}/locations.d.ts +0 -0
  126. /package/lib/{data → actions}/notifications.d.ts +0 -0
  127. /package/lib/{data → actions}/sms.d.ts +0 -0
  128. /package/lib/{data → actions}/subscription.d.ts +0 -0
@@ -0,0 +1,63 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
8
+ var __export = (target, all) => {
9
+ __markAsModule(target);
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __reExport = (target, module2, desc) => {
14
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
15
+ for (let key of __getOwnPropNames(module2))
16
+ if (!__hasOwnProp.call(target, key) && key !== "default")
17
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
18
+ }
19
+ return target;
20
+ };
21
+ var __toModule = (module2) => {
22
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
23
+ };
24
+ __export(exports, {
25
+ clearBadges: () => clearBadges,
26
+ getApnProvider: () => getApnProvider,
27
+ pushNotification: () => pushNotification
28
+ });
29
+ var import_apn = __toModule(require("apn"));
30
+ var import_config = __toModule(require("../config"));
31
+ const getApnProvider = () => new import_apn.Provider({
32
+ ca: import_config.Config.get("app.apn.ca"),
33
+ cert: import_config.Config.get("app.apn.cert"),
34
+ key: import_config.Config.get("app.apn.key"),
35
+ production: import_config.Config.get("environment") === "prod"
36
+ });
37
+ const pushNotification = (deviceTokens, note) => {
38
+ const provider = getApnProvider();
39
+ const notification = new import_apn.Notification();
40
+ notification.topic = import_config.Config.get("app.apn.id");
41
+ notification.alert = note.message;
42
+ if (note.data) {
43
+ notification.mutableContent = true;
44
+ notification.payload = note.data;
45
+ }
46
+ if (note.badge !== void 0) {
47
+ notification.badge = note.badge;
48
+ }
49
+ return provider.send(notification, deviceTokens);
50
+ };
51
+ const clearBadges = (deviceTokens) => {
52
+ const provider = getApnProvider();
53
+ const notification = new import_apn.Notification();
54
+ notification.badge = 0;
55
+ return provider.send(notification, deviceTokens);
56
+ };
57
+ // Annotate the CommonJS export names for ESM import in node:
58
+ 0 && (module.exports = {
59
+ clearBadges,
60
+ getApnProvider,
61
+ pushNotification
62
+ });
63
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvbm90aWZpY2F0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Tm90aWZpY2F0aW9uIGFzIEFQTk5vdGlmaWNhdGlvbiwgUHJvdmlkZXIsIFJlc3BvbnNlc30gZnJvbSAnYXBuJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge05vdGlmaWNhdGlvblR5cGV9IGZyb20gJy4uL3R5cGVzL25vdGlmaWNhdGlvbnMnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnbm90aWZpY2F0aW9ucyc7XG5cbi8vIFB1c2ggTm90aWZpY2F0aW9uc1xuZXhwb3J0IGNvbnN0IGdldEFwblByb3ZpZGVyID0gKCk6IFByb3ZpZGVyID0+IG5ldyBQcm92aWRlcih7XG4gIGNhOiBDb25maWcuZ2V0KCdhcHAuYXBuLmNhJyksXG4gIGNlcnQ6IENvbmZpZy5nZXQoJ2FwcC5hcG4uY2VydCcpLFxuICBrZXk6IENvbmZpZy5nZXQoJ2FwcC5hcG4ua2V5JyksXG4gIHByb2R1Y3Rpb246IENvbmZpZy5nZXQoJ2Vudmlyb25tZW50JykgPT09ICdwcm9kJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBwdXNoTm90aWZpY2F0aW9uID0gKGRldmljZVRva2Vuczogc3RyaW5nW10sIG5vdGU6IE5vdGlmaWNhdGlvblR5cGUpOiBQcm9taXNlPFJlc3BvbnNlcz4gPT4ge1xuICAvLyBQdXNoIG5vdGlmaWNhdGlvbiB0byBkZXZpY2VcbiAgY29uc3QgcHJvdmlkZXI6IFByb3ZpZGVyID0gZ2V0QXBuUHJvdmlkZXIoKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uOiBBUE5Ob3RpZmljYXRpb24gPSBuZXcgQVBOTm90aWZpY2F0aW9uKCk7XG4gIG5vdGlmaWNhdGlvbi50b3BpYyA9IENvbmZpZy5nZXQoJ2FwcC5hcG4uaWQnKTtcbiAgbm90aWZpY2F0aW9uLmFsZXJ0ID0gbm90ZS5tZXNzYWdlO1xuXG4gIGlmKG5vdGUuZGF0YSkge1xuICAgIG5vdGlmaWNhdGlvbi5tdXRhYmxlQ29udGVudCA9IHRydWU7XG4gICAgbm90aWZpY2F0aW9uLnBheWxvYWQgPSBub3RlLmRhdGE7XG4gIH1cblxuICBpZihub3RlLmJhZGdlICE9PSB1bmRlZmluZWQpIHtcbiAgICBub3RpZmljYXRpb24uYmFkZ2UgPSBub3RlLmJhZGdlO1xuICB9XG5cbiAgcmV0dXJuIHByb3ZpZGVyLnNlbmQobm90aWZpY2F0aW9uLCBkZXZpY2VUb2tlbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyQmFkZ2VzID0gKGRldmljZVRva2Vuczogc3RyaW5nW10pOiBQcm9taXNlPFJlc3BvbnNlcz4gPT4ge1xuICAvLyBQdXNoIG5vdGlmaWNhdGlvbiB0byBkZXZpY2VcbiAgY29uc3QgcHJvdmlkZXIgPSBnZXRBcG5Qcm92aWRlcigpO1xuICBjb25zdCBub3RpZmljYXRpb24gPSBuZXcgQVBOTm90aWZpY2F0aW9uKCk7XG4gIG5vdGlmaWNhdGlvbi5iYWRnZSA9IDA7XG5cbiAgcmV0dXJuIHByb3ZpZGVyLnNlbmQobm90aWZpY2F0aW9uLCBkZXZpY2VUb2tlbnMpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLGlCQUFtRTtBQUVuRSxvQkFBcUI7QUFNZCxNQUFNLGlCQUFpQixNQUFnQixJQUFJLG9CQUFTO0FBQUEsRUFDekQsSUFBSSxxQkFBTyxJQUFJO0FBQUEsRUFDZixNQUFNLHFCQUFPLElBQUk7QUFBQSxFQUNqQixLQUFLLHFCQUFPLElBQUk7QUFBQSxFQUNoQixZQUFZLHFCQUFPLElBQUksbUJBQW1CO0FBQUE7QUFHckMsTUFBTSxtQkFBbUIsQ0FBQyxjQUF3QixTQUErQztBQUV0RyxRQUFNLFdBQXFCO0FBQzNCLFFBQU0sZUFBZ0MsSUFBSTtBQUMxQyxlQUFhLFFBQVEscUJBQU8sSUFBSTtBQUNoQyxlQUFhLFFBQVEsS0FBSztBQUUxQixNQUFHLEtBQUssTUFBTTtBQUNaLGlCQUFhLGlCQUFpQjtBQUM5QixpQkFBYSxVQUFVLEtBQUs7QUFBQTtBQUc5QixNQUFHLEtBQUssVUFBVSxRQUFXO0FBQzNCLGlCQUFhLFFBQVEsS0FBSztBQUFBO0FBRzVCLFNBQU8sU0FBUyxLQUFLLGNBQWM7QUFBQTtBQUc5QixNQUFNLGNBQWMsQ0FBQyxpQkFBK0M7QUFFekUsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sZUFBZSxJQUFJO0FBQ3pCLGVBQWEsUUFBUTtBQUVyQixTQUFPLFNBQVMsS0FBSyxjQUFjO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,7 +1,7 @@
1
- import { ApiContext, PaymentBankAccount, PaymentCardType, PaymentCharge, PaymentTransfer, UserType } from '../types';
1
+ import { ApiContext, PaymentBankAccount, PaymentCardType, PaymentCharge, PaymentTransfer, User } from '../types';
2
2
  export declare const addCustomerAccount: (context: ApiContext) => Promise<boolean>;
3
3
  export declare const addBankAccount: (context: ApiContext, bankAccount: PaymentBankAccount) => Promise<boolean>;
4
- export declare const addCreditCard: (context: ApiContext, card: PaymentCardType) => Promise<UserType>;
4
+ export declare const addCreditCard: (context: ApiContext, card: PaymentCardType) => Promise<User>;
5
5
  export declare const updateCreditCard: (context: ApiContext, card: PaymentCardType) => Promise<PaymentCardType>;
6
6
  export declare const getCreditCards: (context: ApiContext) => Promise<PaymentCardType[]>;
7
7
  export declare const deleteCreditCard: (context: ApiContext, cardId: string) => Promise<boolean>;
@@ -0,0 +1,491 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
25
+ var __export = (target, all) => {
26
+ __markAsModule(target);
27
+ for (var name in all)
28
+ __defProp(target, name, { get: all[name], enumerable: true });
29
+ };
30
+ var __reExport = (target, module2, desc) => {
31
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
32
+ for (let key of __getOwnPropNames(module2))
33
+ if (!__hasOwnProp.call(target, key) && key !== "default")
34
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
35
+ }
36
+ return target;
37
+ };
38
+ var __toModule = (module2) => {
39
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
40
+ };
41
+ __export(exports, {
42
+ addBankAccount: () => addBankAccount,
43
+ addCreditCard: () => addCreditCard,
44
+ addCustomerAccount: () => addCustomerAccount,
45
+ createPaymentHold: () => createPaymentHold,
46
+ createPaymentTransfer: () => createPaymentTransfer,
47
+ deleteBankAccount: () => deleteBankAccount,
48
+ deleteCreditCard: () => deleteCreditCard,
49
+ getCreditCards: () => getCreditCards,
50
+ updateCreditCard: () => updateCreditCard
51
+ });
52
+ var import_utils = __toModule(require("@nlabs/utils"));
53
+ var import_arangojs = __toModule(require("arangojs"));
54
+ var import_graphql_errors = __toModule(require("graphql-errors"));
55
+ var import_isEmpty = __toModule(require("lodash/isEmpty"));
56
+ var import_stripe = __toModule(require("stripe"));
57
+ var import_config = __toModule(require("../config"));
58
+ var import_analytics = __toModule(require("../utils/analytics"));
59
+ var import_users = __toModule(require("./users"));
60
+ const eventCategory = "payments";
61
+ const apiVersion = "2020-03-02";
62
+ const addCustomerAccount = (context) => {
63
+ const action = "addCustomerAccount";
64
+ const { database, session: { userId: sessionId, username } } = context;
65
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
66
+ return stripeClient.customers.create({
67
+ metadata: {
68
+ userId: sessionId,
69
+ username
70
+ }
71
+ }).then((customer) => {
72
+ const now = Date.now();
73
+ const update = {
74
+ modified: now,
75
+ stripeCustomerId: customer.id
76
+ };
77
+ const aqlQry = import_arangojs.aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
78
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((updatedUser = {}) => !(0, import_isEmpty.default)(updatedUser)).catch((error) => (0, import_analytics.logError)({
79
+ action,
80
+ category: eventCategory,
81
+ label: "db_error"
82
+ }, error, context).then(() => null));
83
+ });
84
+ };
85
+ const addBankAccount = (context, bankAccount) => {
86
+ const action = "addPaymentAccountBank";
87
+ const { database, session: { userId: sessionId } } = context;
88
+ const {
89
+ accountNumber,
90
+ fullName,
91
+ routing
92
+ } = bankAccount;
93
+ const formatAccount = (0, import_utils.parseString)(accountNumber, 32);
94
+ if (formatAccount === "") {
95
+ throw new import_graphql_errors.UserError("required_account_number");
96
+ }
97
+ const formatFullName = (0, import_utils.parseVarChar)(fullName, 128);
98
+ if (formatFullName === "") {
99
+ throw new import_graphql_errors.UserError("required_full_name");
100
+ }
101
+ const formatRouting = (0, import_utils.parseString)(routing, 32);
102
+ if (formatRouting === "") {
103
+ throw new import_graphql_errors.UserError("required_routing_number");
104
+ }
105
+ return (0, import_users.getUser)(context, sessionId).then((user) => {
106
+ const { stripeAccountId } = user;
107
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
108
+ const source = {
109
+ account_holder_name: formatFullName,
110
+ account_holder_type: "individual",
111
+ account_number: formatAccount,
112
+ country: "US",
113
+ currency: "USD",
114
+ object: "bank_account",
115
+ routing_number: formatRouting
116
+ };
117
+ return stripeClient.customers.createSource(stripeAccountId, { source }).then((account) => {
118
+ const { id: bankId, last4: bankAccount2, routing_number: bankRouting } = account;
119
+ const update = {
120
+ bankAccount: bankAccount2,
121
+ bankFullName: formatFullName,
122
+ bankId,
123
+ bankRouting,
124
+ modified: Date.now()
125
+ };
126
+ const aqlQry = import_arangojs.aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
127
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((updatedUser = {}) => updatedUser);
128
+ }).catch((error) => {
129
+ const msg = error.message;
130
+ if (msg === "A bank account with that routing number and account number already exists for this customer.") {
131
+ return (0, import_analytics.logError)({
132
+ action,
133
+ category: eventCategory,
134
+ label: "bank_account_exists"
135
+ }, error, context).then(() => null);
136
+ }
137
+ return (0, import_analytics.logError)({
138
+ action,
139
+ category: eventCategory,
140
+ label: "payment_error"
141
+ }, error, context).then(() => null);
142
+ });
143
+ });
144
+ };
145
+ const addCreditCard = (context, card) => {
146
+ const action = "addCreditCard";
147
+ const { database, session: { userId: sessionId } } = context;
148
+ return (0, import_users.getUser)(context, sessionId).then((user) => {
149
+ const { stripeAccountId } = user;
150
+ const {
151
+ accountNumber,
152
+ city,
153
+ country,
154
+ cvc,
155
+ expMonth,
156
+ expYear,
157
+ fullName,
158
+ street1,
159
+ street2,
160
+ state,
161
+ zip
162
+ } = card;
163
+ const formatNumber = (0, import_utils.parseNum)(accountNumber, 16);
164
+ if (!formatNumber) {
165
+ throw new import_graphql_errors.UserError("required_credit_card_number");
166
+ }
167
+ const formatExpMonth = (0, import_utils.parseNum)(expMonth, 2);
168
+ if (!formatExpMonth) {
169
+ throw new import_graphql_errors.UserError("required_credit_card_exp_month");
170
+ }
171
+ const formatExpYear = (0, import_utils.parseNum)(expYear, 2);
172
+ if (!formatExpYear) {
173
+ throw new import_graphql_errors.UserError("required_credit_card_exp_year");
174
+ }
175
+ const formatCvc = (0, import_utils.parseNum)(cvc, 3);
176
+ const paymentCard = {};
177
+ const formatCity = (0, import_utils.parseVarChar)(city, 32);
178
+ if (formatCity) {
179
+ paymentCard.city = formatCity;
180
+ }
181
+ const formatCountry = (0, import_utils.parseChar)(country, 2);
182
+ if (formatCountry) {
183
+ paymentCard.country = formatCountry;
184
+ }
185
+ const formatFullName = (0, import_utils.parseVarChar)(fullName, 32);
186
+ if (formatFullName) {
187
+ paymentCard.fullName = formatFullName;
188
+ }
189
+ const formatStreet1 = (0, import_utils.parseVarChar)(street1, 32);
190
+ if (formatStreet1) {
191
+ paymentCard.street1 = formatStreet1;
192
+ }
193
+ const formatStreet2 = (0, import_utils.parseVarChar)(street2, 32);
194
+ if (formatStreet2) {
195
+ paymentCard.street2 = formatStreet2;
196
+ }
197
+ const formatState = (0, import_utils.parseChar)(state, 2);
198
+ if (formatState) {
199
+ paymentCard.state = formatState;
200
+ }
201
+ const formatZip = (0, import_utils.parseVarChar)(zip, 10);
202
+ if (formatZip) {
203
+ paymentCard.zip = formatZip;
204
+ }
205
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
206
+ const source = {
207
+ address_city: formatCity,
208
+ address_country: formatCountry,
209
+ address_line1: formatStreet1,
210
+ address_line2: formatStreet2,
211
+ address_state: formatState,
212
+ address_zip: formatZip,
213
+ cvc: formatCvc,
214
+ exp_month: formatExpMonth,
215
+ exp_year: formatExpYear,
216
+ name: fullName,
217
+ number: formatNumber,
218
+ object: "card"
219
+ };
220
+ return stripeClient.customers.createSource(stripeAccountId, { source }).then((newSource) => {
221
+ const { brand, cvc_check: cvcCheck, last4 } = newSource;
222
+ const now = Date.now();
223
+ const insert = __spreadProps(__spreadValues({}, paymentCard), {
224
+ _key: (0, import_utils.createHash)(`user-payment-${sessionId}`),
225
+ accountNumber: last4,
226
+ added: now,
227
+ brand,
228
+ cvcCheck,
229
+ expMonth,
230
+ expYear,
231
+ modified: now,
232
+ userId: sessionId
233
+ });
234
+ const insertAqlQry = import_arangojs.aql`INSERT ${insert} IN creditCards RETURN NEW`;
235
+ return database.query(insertAqlQry).then((cursor) => cursor.next()).then((newCard = {}) => {
236
+ if (!(0, import_isEmpty.default)(newCard)) {
237
+ const { _id: cardId, _key: cardKey } = card;
238
+ const edgeCollection = database.collection("hasPayment");
239
+ const edgeId = (0, import_utils.createHash)(`payment-${cardKey}`);
240
+ const edge = {
241
+ _from: `users/${sessionId}`,
242
+ _key: edgeId,
243
+ _to: cardId
244
+ };
245
+ return edgeCollection.save(edge, { returnNew: true }).then(() => card);
246
+ }
247
+ return newCard;
248
+ }).catch((error) => (0, import_analytics.logError)({
249
+ action,
250
+ category: eventCategory,
251
+ label: "payment_error"
252
+ }, error, context).then(() => null));
253
+ });
254
+ });
255
+ };
256
+ const updateCreditCard = (context, card) => {
257
+ const { database, session: { userId: sessionId } } = context;
258
+ const {
259
+ city,
260
+ country,
261
+ expMonth,
262
+ expYear,
263
+ fullName,
264
+ id,
265
+ street1,
266
+ state,
267
+ zip
268
+ } = card;
269
+ const formatId = (0, import_utils.parseId)(id);
270
+ if (formatId) {
271
+ throw new import_graphql_errors.UserError("required_credit_card_id");
272
+ }
273
+ const paymentCard = {};
274
+ const formatExpMonth = (0, import_utils.parseNum)(expMonth, 2);
275
+ const formatExpYear = (0, import_utils.parseNum)(expYear, 2);
276
+ const formatCity = (0, import_utils.parseVarChar)(city, 32);
277
+ const formatCountry = (0, import_utils.parseChar)(country, 2);
278
+ const formatFullName = (0, import_utils.parseVarChar)(fullName, 32);
279
+ const formatStreet1 = (0, import_utils.parseString)(street1, 32);
280
+ const formatState = (0, import_utils.parseChar)(state, 2);
281
+ const formatZip = (0, import_utils.parseVarChar)(zip, 10);
282
+ if (formatExpMonth) {
283
+ paymentCard.expMonth = formatExpMonth;
284
+ }
285
+ if (formatExpYear) {
286
+ paymentCard.expYear = formatExpYear;
287
+ }
288
+ if (formatCity) {
289
+ paymentCard.city = formatCity;
290
+ }
291
+ if (formatCountry) {
292
+ paymentCard.country = formatCountry;
293
+ }
294
+ if (formatFullName) {
295
+ paymentCard.fullName = formatFullName;
296
+ }
297
+ if (formatStreet1) {
298
+ paymentCard.street1 = formatStreet1;
299
+ }
300
+ if (formatState) {
301
+ paymentCard.state = formatState;
302
+ }
303
+ if (formatZip) {
304
+ paymentCard.zip = formatZip;
305
+ }
306
+ const update = paymentCard;
307
+ const aqlQry = import_arangojs.aql`
308
+ LET updatedCard = FIRST(
309
+ FOR c IN creditCards
310
+ FILTER c._key == ${formatId} && c.userId == ${sessionId}
311
+ UPDATE c WITH ${update} IN creditCards
312
+ LIMIT 1
313
+ RETURN NEW
314
+ )
315
+ LET user = FIRST(
316
+ FOR u IN users
317
+ FILTER u._key == ${sessionId}
318
+ LIMIT 1
319
+ RETURN u
320
+ )
321
+ RETURN {user: user, card: updatedCard}`;
322
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((results = { card: {}, user: {} }) => {
323
+ const updatedCard = results.card;
324
+ const { user } = results;
325
+ if ((0, import_isEmpty.default)(updatedCard)) {
326
+ throw new import_graphql_errors.UserError("not_found");
327
+ }
328
+ const { stripeCustomerId } = user;
329
+ const { stripeId } = card;
330
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
331
+ const update2 = {
332
+ address_city: formatCity,
333
+ address_country: formatCountry,
334
+ address_line1: formatStreet1,
335
+ address_state: formatState,
336
+ address_zip: formatZip,
337
+ exp_month: formatExpMonth,
338
+ exp_year: formatExpYear,
339
+ name: formatFullName
340
+ };
341
+ return stripeClient.customers.updateSource(stripeCustomerId, stripeId, update2).then(() => card).catch((error) => {
342
+ console.log("payments::updateCard::error", error);
343
+ throw new import_graphql_errors.UserError("payment_error");
344
+ });
345
+ });
346
+ };
347
+ const getCreditCards = (context) => {
348
+ const action = "getCreditCards";
349
+ const { database, session: { userId: sessionId } } = context;
350
+ const aqlQry = import_arangojs.aql`FOR c IN creditCards
351
+ FILTER c.userId == ${sessionId}
352
+ RETURN c`;
353
+ return database.query(aqlQry).then((cursor) => cursor.all()).then((list = []) => list).catch((error) => (0, import_analytics.logError)({
354
+ action,
355
+ category: eventCategory,
356
+ label: "db_error"
357
+ }, error, context).then(() => null));
358
+ };
359
+ const deleteCreditCard = (context, cardId) => {
360
+ const { database, session: { userId: sessionId } } = context;
361
+ const formatCardId = (0, import_utils.parseId)(cardId);
362
+ const aqlQry = import_arangojs.aql`
363
+ LET card = FIRST(
364
+ FOR c IN creditCards
365
+ FILTER c._key == ${formatCardId} && c.userId == ${sessionId}
366
+ LIMIT 1
367
+ REMOVE c IN creditCards
368
+ RETURN OLD
369
+ )
370
+ LET user = FIRST(
371
+ FOR u IN users
372
+ FILTER u._key == ${sessionId}
373
+ LIMIT 1
374
+ RETURN u
375
+ )
376
+ RETURN {user: user, card: card}`;
377
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((result = { card: {}, user: {} }) => {
378
+ if ((0, import_isEmpty.default)(result)) {
379
+ return false;
380
+ }
381
+ const { card, user } = result;
382
+ const { _key: cardKey } = card;
383
+ const edgeCollection = database.collection("hasPayment");
384
+ return edgeCollection.outEdges(cardKey).then((edges) => {
385
+ if (edges.length) {
386
+ return Promise.all(edges.map((edge) => {
387
+ const { _key: edgeKey } = edge;
388
+ const removeAqlQry = import_arangojs.aql`REMOVE {_key:${edgeKey}} IN hasPayment`;
389
+ return database.query(removeAqlQry);
390
+ })).then(() => {
391
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
392
+ return stripeClient.customers.deleteSource(user.stripeCustomerId, card.stripeId).then(() => true).catch((error) => {
393
+ console.log("payments::deleteCard::error", error);
394
+ throw new import_graphql_errors.UserError("payment_error");
395
+ });
396
+ });
397
+ }
398
+ return false;
399
+ });
400
+ });
401
+ };
402
+ const deleteBankAccount = (context, bankId) => {
403
+ const { database, session: { userId: sessionId } } = context;
404
+ const update = {
405
+ bankAccount: "",
406
+ bankFullName: "",
407
+ bankId: "",
408
+ bankRouting: "",
409
+ modified: Date.now()
410
+ };
411
+ const aqlQry = import_arangojs.aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
412
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((user = {}) => {
413
+ const { stripeAccountId } = user;
414
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
415
+ return stripeClient.customers.deleteSource(stripeAccountId, bankId).then((response = { deleted: false }) => response.deleted).catch(() => Promise.resolve(false));
416
+ });
417
+ };
418
+ const createPaymentTransfer = (context, transfer) => {
419
+ const { database, session: { userId: sessionId } } = context;
420
+ const { amount, currency } = transfer;
421
+ const formatAmount = (0, import_utils.parseNum)(amount);
422
+ const formatCurrency = (0, import_utils.parseChar)(currency, 3, "USD").toUpperCase();
423
+ return (0, import_users.getUser)(context, sessionId).then((user) => {
424
+ const { stripeAccountId } = user;
425
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
426
+ return stripeClient.transfers.create({
427
+ amount: formatAmount,
428
+ currency: formatCurrency,
429
+ destination: stripeAccountId
430
+ }).then((stripeTransfer) => {
431
+ console.log(stripeTransfer);
432
+ const now = Date.now();
433
+ const insert = {
434
+ added: now,
435
+ amount: formatAmount,
436
+ currency: formatCurrency,
437
+ modified: now,
438
+ userId: sessionId
439
+ };
440
+ const aqlQry = import_arangojs.aql`INSERT ${insert} IN transfers RETURN NEW`;
441
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((newTransfer) => newTransfer);
442
+ });
443
+ });
444
+ };
445
+ const createPaymentHold = (context, payment) => {
446
+ const { database, session: { userId: sessionId } } = context;
447
+ const { amount, capture, cardId, currency, description } = payment;
448
+ const formatCurrency = (0, import_utils.parseChar)(currency, 3, "USD").toUpperCase();
449
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
450
+ return stripeClient.charges.create({
451
+ amount,
452
+ capture,
453
+ currency: formatCurrency,
454
+ description,
455
+ source: cardId
456
+ }).then((stripeCharge) => {
457
+ const now = Date.now();
458
+ const insert = {
459
+ added: now,
460
+ amount,
461
+ capture,
462
+ cardId,
463
+ chargeFailCode: stripeCharge.failure_code,
464
+ chargeFailMsg: stripeCharge.failure_message,
465
+ chargeId: stripeCharge.id,
466
+ chargeStatus: stripeCharge.status,
467
+ currency: formatCurrency,
468
+ description,
469
+ modified: now,
470
+ userId: sessionId
471
+ };
472
+ const aqlQry = import_arangojs.aql`INSERT ${insert} IN payments RETURN NEW`;
473
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((newPayment) => newPayment);
474
+ }).catch((error) => {
475
+ console.log("payments::createHold::error", error);
476
+ throw new import_graphql_errors.UserError("payment_error");
477
+ });
478
+ };
479
+ // Annotate the CommonJS export names for ESM import in node:
480
+ 0 && (module.exports = {
481
+ addBankAccount,
482
+ addCreditCard,
483
+ addCustomerAccount,
484
+ createPaymentHold,
485
+ createPaymentTransfer,
486
+ deleteBankAccount,
487
+ deleteCreditCard,
488
+ getCreditCards,
489
+ updateCreditCard
490
+ });
491
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvY3Vyc29yJztcbmltcG9ydCB7VXNlckVycm9yfSBmcm9tICdncmFwaHFsLWVycm9ycyc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHtBcGlDb250ZXh0LCBQYXltZW50QmFua0FjY291bnQsIFBheW1lbnRDYXJkVHlwZSwgUGF5bWVudENoYXJnZSwgUGF5bWVudFRyYW5zZmVyLCBVc2VyfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHtnZXRVc2VyfSBmcm9tICcuL3VzZXJzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3BheW1lbnRzJztcbmNvbnN0IGFwaVZlcnNpb246IGFueSA9ICcyMDIwLTAzLTAyJztcblxuZXhwb3J0IGNvbnN0IGFkZEN1c3RvbWVyQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZEN1c3RvbWVyQWNjb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX19ID0gY29udGV4dDtcblxuICAvLyBTdHJpcGVcbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgIC5jcmVhdGUoe1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWQsXG4gICAgICAgIHVzZXJuYW1lXG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoY3VzdG9tZXIpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBzZXNzaW9uXG4gICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IFVzZXIgPSB7XG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHN0cmlwZUN1c3RvbWVySWQ6IGN1c3RvbWVyLmlkXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh1cGRhdGVkVXNlcjogVXNlciA9IHt9KSA9PiAhaXNFbXB0eSh1cGRhdGVkVXNlcikpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRCYW5rQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBiYW5rQWNjb3VudDogUGF5bWVudEJhbmtBY2NvdW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIC8vIFBhcmFtc1xuICBjb25zdCB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBmdWxsTmFtZSxcbiAgICByb3V0aW5nXG4gIH0gPSBiYW5rQWNjb3VudDtcblxuICBjb25zdCBmb3JtYXRBY2NvdW50OiBzdHJpbmcgPSBwYXJzZVN0cmluZyhhY2NvdW50TnVtYmVyLCAzMik7XG5cbiAgaWYoZm9ybWF0QWNjb3VudCA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9hY2NvdW50X251bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0RnVsbE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihmdWxsTmFtZSwgMTI4KTtcblxuICBpZihmb3JtYXRGdWxsTmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9mdWxsX25hbWUnKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdFJvdXRpbmc6IHN0cmluZyA9IHBhcnNlU3RyaW5nKHJvdXRpbmcsIDMyKTtcblxuICBpZihmb3JtYXRSb3V0aW5nID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX3JvdXRpbmdfbnVtYmVyJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0VXNlcihjb250ZXh0LCBzZXNzaW9uSWQpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXIpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9OiBVc2VyID0gdXNlcjtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuICAgICAgY29uc3Qgc291cmNlOiBhbnkgPSB7XG4gICAgICAgIGFjY291bnRfaG9sZGVyX25hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICBhY2NvdW50X2hvbGRlcl90eXBlOiAnaW5kaXZpZHVhbCcsXG4gICAgICAgIGFjY291bnRfbnVtYmVyOiBmb3JtYXRBY2NvdW50LFxuICAgICAgICBjb3VudHJ5OiAnVVMnLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIG9iamVjdDogJ2JhbmtfYWNjb3VudCcsXG4gICAgICAgIHJvdXRpbmdfbnVtYmVyOiBmb3JtYXRSb3V0aW5nXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuY3JlYXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwge3NvdXJjZX0pXG4gICAgICAgIC50aGVuKChhY2NvdW50OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB7aWQ6IGJhbmtJZCwgbGFzdDQ6IGJhbmtBY2NvdW50LCByb3V0aW5nX251bWJlcjogYmFua1JvdXRpbmd9ID0gYWNjb3VudDtcbiAgICAgICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgICAgICAgIGJhbmtBY2NvdW50LFxuICAgICAgICAgICAgYmFua0Z1bGxOYW1lOiBmb3JtYXRGdWxsTmFtZSxcbiAgICAgICAgICAgIGJhbmtJZCxcbiAgICAgICAgICAgIGJhbmtSb3V0aW5nLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXIgPSB7fSkgPT4gdXBkYXRlZFVzZXIpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycm9yLm1lc3NhZ2U7XG5cbiAgICAgICAgICBpZihtc2cgPT09ICdBIGJhbmsgYWNjb3VudCB3aXRoIHRoYXQgcm91dGluZyBudW1iZXIgYW5kIGFjY291bnQgbnVtYmVyICcgK1xuICAgICAgICAgICAgJ2FscmVhZHkgZXhpc3RzIGZvciB0aGlzIGN1c3RvbWVyLicpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIGxhYmVsOiAnYmFua19hY2NvdW50X2V4aXN0cydcbiAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZENyZWRpdENhcmQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY2FyZDogUGF5bWVudENhcmRUeXBlKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZENyZWRpdENhcmQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICByZXR1cm4gZ2V0VXNlcihjb250ZXh0LCBzZXNzaW9uSWQpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXIpID0+IHtcbiAgICAgIC8vIFVzZXJcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9OiBVc2VyID0gdXNlcjtcblxuICAgICAgLy8gQ2FyZFxuICAgICAgY29uc3Qge1xuICAgICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgICBjaXR5LFxuICAgICAgICBjb3VudHJ5LFxuICAgICAgICBjdmMsXG4gICAgICAgIGV4cE1vbnRoLFxuICAgICAgICBleHBZZWFyLFxuICAgICAgICBmdWxsTmFtZSxcbiAgICAgICAgc3RyZWV0MSxcbiAgICAgICAgc3RyZWV0MixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHppcFxuICAgICAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICAgICAgY29uc3QgZm9ybWF0TnVtYmVyOiBudW1iZXIgPSBwYXJzZU51bShhY2NvdW50TnVtYmVyLCAxNik7XG5cbiAgICAgIGlmKCFmb3JtYXROdW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfbnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEV4cE1vbnRoOiBudW1iZXIgPSBwYXJzZU51bShleHBNb250aCwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBNb250aCkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfbW9udGgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwWWVhcjogbnVtYmVyID0gcGFyc2VOdW0oZXhwWWVhciwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBZZWFyKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2V4cF95ZWFyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEN2YzogbnVtYmVyID0gcGFyc2VOdW0oY3ZjLCAzKTtcblxuICAgICAgLy8gQWRkcmVzc1xuICAgICAgY29uc3QgcGF5bWVudENhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHt9O1xuICAgICAgY29uc3QgZm9ybWF0Q2l0eTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGNpdHksIDMyKTtcblxuICAgICAgaWYoZm9ybWF0Q2l0eSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0Q291bnRyeTogc3RyaW5nID0gcGFyc2VDaGFyKGNvdW50cnksIDIpO1xuXG4gICAgICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgICAgIHBheW1lbnRDYXJkLmNvdW50cnkgPSBmb3JtYXRDb3VudHJ5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRGdWxsTmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdEZ1bGxOYW1lKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLmZ1bGxOYW1lID0gZm9ybWF0RnVsbE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDE6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihzdHJlZXQxLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDI6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihzdHJlZXQyLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDIpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MiA9IGZvcm1hdFN0cmVldDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0YXRlOiBzdHJpbmcgPSBwYXJzZUNoYXIoc3RhdGUsIDIpO1xuXG4gICAgICBpZihmb3JtYXRTdGF0ZSkge1xuICAgICAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRaaXA6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICAgICAgaWYoZm9ybWF0WmlwKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgICAgIH1cblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuICAgICAgY29uc3Qgc291cmNlOiBhbnkgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX2xpbmUyOiBmb3JtYXRTdHJlZXQyLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgY3ZjOiBmb3JtYXRDdmMsXG4gICAgICAgIGV4cF9tb250aDogZm9ybWF0RXhwTW9udGgsXG4gICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLFxuICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgbnVtYmVyOiBmb3JtYXROdW1iZXIsXG4gICAgICAgIG9iamVjdDogJ2NhcmQnXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuY3JlYXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwge3NvdXJjZX0pXG4gICAgICAgIC50aGVuKChuZXdTb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHticmFuZCwgY3ZjX2NoZWNrOiBjdmNDaGVjaywgbGFzdDR9ID0gbmV3U291cmNlO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgICAgICAgLi4ucGF5bWVudENhcmQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGB1c2VyLXBheW1lbnQtJHtzZXNzaW9uSWR9YCksXG4gICAgICAgICAgICBhY2NvdW50TnVtYmVyOiBsYXN0NCxcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgIGN2Y0NoZWNrLFxuICAgICAgICAgICAgZXhwTW9udGgsXG4gICAgICAgICAgICBleHBZZWFyLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gY3JlZGl0Q2FyZHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoaW5zZXJ0QXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge30pID0+IHtcbiAgICAgICAgICAgICAgaWYoIWlzRW1wdHkobmV3Q2FyZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgbGlua2VkIGVkZ2VcbiAgICAgICAgICAgICAgICBjb25zdCB7X2lkOiBjYXJkSWQsIF9rZXk6IGNhcmRLZXl9ID0gY2FyZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdoYXNQYXltZW50Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgcGF5bWVudC0ke2NhcmRLZXl9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgX2Zyb206IGB1c2Vycy8ke3Nlc3Npb25JZH1gLFxuICAgICAgICAgICAgICAgICAgX2tleTogZWRnZUlkLFxuICAgICAgICAgICAgICAgICAgX3RvOiBjYXJkSWRcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pLnRoZW4oKCkgPT4gY2FyZCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gbmV3Q2FyZDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUNyZWRpdENhcmQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY2FyZDogUGF5bWVudENhcmRUeXBlKTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNpdHksXG4gICAgY291bnRyeSxcbiAgICBleHBNb250aCxcbiAgICBleHBZZWFyLFxuICAgIGZ1bGxOYW1lLFxuICAgIGlkLFxuICAgIHN0cmVldDEsXG4gICAgc3RhdGUsXG4gICAgemlwXG4gIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGg6IG51bWJlciA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcbiAgY29uc3QgZm9ybWF0RXhwWWVhcjogbnVtYmVyID0gcGFyc2VOdW0oZXhwWWVhciwgMik7XG4gIGNvbnN0IGZvcm1hdENpdHk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnk6IHN0cmluZyA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcbiAgY29uc3QgZm9ybWF0RnVsbE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihmdWxsTmFtZSwgMzIpO1xuICBjb25zdCBmb3JtYXRTdHJlZXQxOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlOiBzdHJpbmcgPSBwYXJzZUNoYXIoc3RhdGUsIDIpO1xuICBjb25zdCBmb3JtYXRaaXA6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICBpZihmb3JtYXRFeHBNb250aCkge1xuICAgIHBheW1lbnRDYXJkLmV4cE1vbnRoID0gZm9ybWF0RXhwTW9udGg7XG4gIH1cblxuICBpZihmb3JtYXRFeHBZZWFyKSB7XG4gICAgcGF5bWVudENhcmQuZXhwWWVhciA9IGZvcm1hdEV4cFllYXI7XG4gIH1cblxuICBpZihmb3JtYXRDaXR5KSB7XG4gICAgcGF5bWVudENhcmQuY2l0eSA9IGZvcm1hdENpdHk7XG4gIH1cblxuICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgcGF5bWVudENhcmQuY291bnRyeSA9IGZvcm1hdENvdW50cnk7XG4gIH1cblxuICBpZihmb3JtYXRGdWxsTmFtZSkge1xuICAgIHBheW1lbnRDYXJkLmZ1bGxOYW1lID0gZm9ybWF0RnVsbE5hbWU7XG4gIH1cblxuICBpZihmb3JtYXRTdHJlZXQxKSB7XG4gICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gIH1cblxuICBpZihmb3JtYXRTdGF0ZSkge1xuICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gIH1cblxuICBpZihmb3JtYXRaaXApIHtcbiAgICBwYXltZW50Q2FyZC56aXAgPSBmb3JtYXRaaXA7XG4gIH1cblxuICBjb25zdCB1cGRhdGU6IGFueSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSB7Y2FyZDoge30sIHVzZXI6IHt9fSkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZENhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHJlc3VsdHMuY2FyZDtcbiAgICAgIGNvbnN0IHt1c2VyfSA9IHJlc3VsdHM7XG5cbiAgICAgIGlmKGlzRW1wdHkodXBkYXRlZENhcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ25vdF9mb3VuZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7c3RyaXBlQ3VzdG9tZXJJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qge3N0cmlwZUlkfSA9IGNhcmQ7XG5cbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcbiAgICAgIGNvbnN0IHVwZGF0ZTogYW55ID0ge1xuICAgICAgICBhZGRyZXNzX2NpdHk6IGZvcm1hdENpdHksXG4gICAgICAgIGFkZHJlc3NfY291bnRyeTogZm9ybWF0Q291bnRyeSxcbiAgICAgICAgYWRkcmVzc19saW5lMTogZm9ybWF0U3RyZWV0MSxcbiAgICAgICAgYWRkcmVzc19zdGF0ZTogZm9ybWF0U3RhdGUsXG4gICAgICAgIGFkZHJlc3NfemlwOiBmb3JtYXRaaXAsXG4gICAgICAgIGV4cF9tb250aDogZm9ybWF0RXhwTW9udGgsXG4gICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLFxuICAgICAgICBuYW1lOiBmb3JtYXRGdWxsTmFtZVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLnVwZGF0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVJZCwgdXBkYXRlKVxuICAgICAgICAudGhlbigoKSA9PiBjYXJkKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6dXBkYXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcmVkaXRDYXJkcyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDcmVkaXRDYXJkcyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgRklMVEVSIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q2FyZElkOiBzdHJpbmcgPSBwYXJzZUlkKGNhcmRJZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgTEVUIGNhcmQgPSBGSVJTVChcbiAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICBGSUxURVIgYy5fa2V5ID09ICR7Zm9ybWF0Q2FyZElkfSAmJiBjLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFTU9WRSBjIElOIGNyZWRpdENhcmRzXG4gICAgICBSRVRVUk4gT0xEXG4gICAgKVxuICAgIExFVCB1c2VyID0gRklSU1QoXG4gICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gICAgKVxuICAgIFJFVFVSTiB7dXNlcjogdXNlciwgY2FyZDogY2FyZH1gO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdCA9IHtjYXJkOiB7fSwgdXNlcjoge319KSA9PiB7XG4gICAgICBpZihpc0VtcHR5KHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7Y2FyZCwgdXNlcn0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7X2tleTogY2FyZEtleX0gPSBjYXJkO1xuXG4gICAgICAvLyBSZW1vdmUgbGlua2VkIGVkZ2VzXG4gICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXkpXG4gICAgICAgIC50aGVuKChlZGdlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBSRU1PVkUge19rZXk6JHtlZGdlS2V5fX0gSU4gaGFzUGF5bWVudGA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHJlbW92ZUFxbFFyeSk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXBlXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgICAgICAgICAgICAuZGVsZXRlU291cmNlKHVzZXIuc3RyaXBlQ3VzdG9tZXJJZCwgY2FyZC5zdHJpcGVJZClcbiAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OmRlbGV0ZUNhcmQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVCYW5rQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBiYW5rSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBDbGVhbiBkYlxuICBjb25zdCB1cGRhdGU6IFVzZXIgPSB7XG4gICAgYmFua0FjY291bnQ6ICcnLFxuICAgIGJhbmtGdWxsTmFtZTogJycsXG4gICAgYmFua0lkOiAnJyxcbiAgICBiYW5rUm91dGluZzogJycsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcjogVXNlciA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfSA9IHVzZXI7XG5cbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLmRlbGV0ZVNvdXJjZShzdHJpcGVBY2NvdW50SWQsIGJhbmtJZClcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkgPSB7ZGVsZXRlZDogZmFsc2V9KSA9PiByZXNwb25zZS5kZWxldGVkKVxuICAgICAgICAuY2F0Y2goKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUGF5bWVudFRyYW5zZmVyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRyYW5zZmVyOiBQYXltZW50VHJhbnNmZXIpOiBQcm9taXNlPFBheW1lbnRUcmFuc2Zlcj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudDogbnVtYmVyID0gcGFyc2VOdW0oYW1vdW50KTtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3k6IHN0cmluZyA9IHBhcnNlQ2hhcihjdXJyZW5jeSwgMywgJ1VTRCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyKSA9PiB7XG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfSA9IHVzZXI7XG5cbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC50cmFuc2ZlcnNcbiAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgYW1vdW50OiBmb3JtYXRBbW91bnQsXG4gICAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBzdHJpcGVBY2NvdW50SWRcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHN0cmlwZVRyYW5zZmVyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coc3RyaXBlVHJhbnNmZXIpO1xuICAgICAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRUcmFuc2ZlciA9IHtcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHRyYW5zZmVycyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKChuZXdUcmFuc2ZlcjogUGF5bWVudFRyYW5zZmVyKSA9PiBuZXdUcmFuc2Zlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBheW1lbnRIb2xkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBheW1lbnQ6IFBheW1lbnRDaGFyZ2UpOiBQcm9taXNlPFBheW1lbnRDaGFyZ2U+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHthbW91bnQsIGNhcHR1cmUsIGNhcmRJZCwgY3VycmVuY3ksIGRlc2NyaXB0aW9ufSA9IHBheW1lbnQ7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiBzdHJpcGVDbGllbnQuY2hhcmdlc1xuICAgIC5jcmVhdGUoe1xuICAgICAgYW1vdW50LFxuICAgICAgY2FwdHVyZSxcbiAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc291cmNlOiBjYXJkSWRcbiAgICB9KVxuICAgIC50aGVuKChzdHJpcGVDaGFyZ2UpID0+IHtcbiAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGluc2VydDogUGF5bWVudENoYXJnZSA9IHtcbiAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBjYXB0dXJlLFxuICAgICAgICBjYXJkSWQsXG4gICAgICAgIGNoYXJnZUZhaWxDb2RlOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9jb2RlLFxuICAgICAgICBjaGFyZ2VGYWlsTXNnOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9tZXNzYWdlLFxuICAgICAgICBjaGFyZ2VJZDogc3RyaXBlQ2hhcmdlLmlkLFxuICAgICAgICBjaGFyZ2VTdGF0dXM6IHN0cmlwZUNoYXJnZS5zdGF0dXMsXG4gICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9O1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBheW1lbnRzIFJFVFVSTiBORVdgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG5ld1BheW1lbnQ6IFBheW1lbnRDaGFyZ2UpID0+IG5ld1BheW1lbnQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6Y3JlYXRlSG9sZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgfSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSxtQkFBa0Y7QUFDbEYsc0JBQWtCO0FBSWxCLDRCQUF3QjtBQUN4QixxQkFBb0I7QUFDcEIsb0JBQW1CO0FBRW5CLG9CQUFxQjtBQUVyQix1QkFBdUI7QUFDdkIsbUJBQXNCO0FBRXRCLE1BQU0sZ0JBQXdCO0FBQzlCLE1BQU0sYUFBa0I7QUFFakIsTUFBTSxxQkFBcUIsQ0FBQyxZQUEwQztBQUMzRSxRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxVQUFVLFNBQVMsRUFBQyxRQUFRLFdBQVcsZUFBYTtBQUczRCxRQUFNLGVBQWUsSUFBSSxzQkFBTyxxQkFBTyxJQUFJLGlCQUFpQixFQUFDLFlBQVksWUFBWTtBQUVyRixTQUFPLGFBQWEsVUFDakIs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
@@ -0,0 +1,19 @@
1
+ import { Database } from 'arangojs';
2
+ import { ApiContext, FileType, PostInputType, PostOptions, PostType } from '../types';
3
+ export declare const parsePostOptions: (options?: PostOptions) => {
4
+ latitude: number;
5
+ limit: import("../types").ArangoDBLimit;
6
+ longitude: number;
7
+ type: string;
8
+ };
9
+ export declare const getPostOptional: (fields: string[], sessionId: string) => any;
10
+ export declare const getPost: (context: ApiContext, itemId: string, options: PostOptions) => Promise<Partial<PostType>>;
11
+ export declare const getPostsByReactions: (context: ApiContext, reactions?: string[], options?: PostOptions) => Promise<PostType[]>;
12
+ export declare const getPostsByTags: (context: ApiContext, tags?: string[], options?: PostOptions) => Promise<PostType[]>;
13
+ export declare const getPostsByUser: (context: ApiContext, userId: string, options?: PostOptions) => Promise<PostType[]>;
14
+ export declare const getPostComments: (context: ApiContext, itemId: string, options?: PostOptions) => Promise<PostType[]>;
15
+ export declare const addPost: (context: ApiContext, post: PostInputType) => Promise<PostType>;
16
+ export declare const updatePost: (context: ApiContext, post: PostInputType) => Promise<PostType>;
17
+ export declare const deletePost: (context: ApiContext, postId: string) => Promise<PostType>;
18
+ export declare const cleanPosts: (database: Database) => Promise<number>;
19
+ export declare const createPostEdge: (db: Database, file: FileType, postId: string) => Promise<FileType>;