@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,76 @@
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
+ sendSms: () => sendSms,
26
+ sendSmsTemplate: () => sendSmsTemplate
27
+ });
28
+ var import_utils = __toModule(require("@nlabs/utils"));
29
+ var import_fs = __toModule(require("fs"));
30
+ var import_twilio = __toModule(require("twilio"));
31
+ var import_config = __toModule(require("../config"));
32
+ var import_email = __toModule(require("./email"));
33
+ const sendSms = (params) => {
34
+ const {
35
+ app = {},
36
+ content,
37
+ user = {}
38
+ } = params;
39
+ const country = user.country || "US";
40
+ const phone = (0, import_utils.parsePhone)(user.phone, country);
41
+ const templateContent = (0, import_email.appTemplate)(app, content);
42
+ const twilio = (0, import_twilio.default)(import_config.Config.get("twilio.sid"), import_config.Config.get("twilio.token"));
43
+ const cfg = {
44
+ body: templateContent,
45
+ from: import_config.Config.get("twilio.number"),
46
+ to: phone
47
+ };
48
+ return new Promise((resolve, reject) => {
49
+ twilio.sendMessage(cfg, (error, data) => {
50
+ if (error) {
51
+ reject(new Error(error.error_message));
52
+ } else {
53
+ resolve(data);
54
+ }
55
+ });
56
+ });
57
+ };
58
+ const sendSmsTemplate = (templateName, smsParams) => {
59
+ const { app, user, vars } = smsParams;
60
+ try {
61
+ const data = import_fs.default.readFileSync(`./templates/sms/${templateName}.txt`, "utf8");
62
+ const text = (0, import_email.appTemplate)(app, data, vars);
63
+ const params = { app, text, user };
64
+ return sendSms(params).then((res) => res.status === "queued").catch((error) => {
65
+ throw error;
66
+ });
67
+ } catch (error) {
68
+ return Promise.reject(error);
69
+ }
70
+ };
71
+ // Annotate the CommonJS export names for ESM import in node:
72
+ 0 && (module.exports = {
73
+ sendSms,
74
+ sendSmsTemplate
75
+ });
76
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvc21zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtwYXJzZVBob25lfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB0d2lsaW9TZGsgZnJvbSAndHdpbGlvJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge1NNU1BhcmFtc1R5cGUsIFR3aWxpb09wdGlvbnNUeXBlfSBmcm9tICcuLi90eXBlcy9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7YXBwVGVtcGxhdGV9IGZyb20gJy4vZW1haWwnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnc21zJztcblxuLy8gVHdpbGlvXG5leHBvcnQgY29uc3Qgc2VuZFNtcyA9IChwYXJhbXM6IFNNU1BhcmFtc1R5cGUpOiBhbnkgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwID0ge30sXG4gICAgY29udGVudCxcbiAgICB1c2VyID0ge31cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBjb3VudHJ5ID0gdXNlci5jb3VudHJ5IHx8ICdVUyc7XG4gIGNvbnN0IHBob25lID0gcGFyc2VQaG9uZSh1c2VyLnBob25lLCBjb3VudHJ5KTtcbiAgY29uc3QgdGVtcGxhdGVDb250ZW50OiBzdHJpbmcgPSBhcHBUZW1wbGF0ZShhcHAsIGNvbnRlbnQpO1xuXG4gIGNvbnN0IHR3aWxpbzogYW55ID0gdHdpbGlvU2RrKENvbmZpZy5nZXQoJ3R3aWxpby5zaWQnKSwgQ29uZmlnLmdldCgndHdpbGlvLnRva2VuJykpO1xuICBjb25zdCBjZmc6IFR3aWxpb09wdGlvbnNUeXBlID0ge1xuICAgIGJvZHk6IHRlbXBsYXRlQ29udGVudCxcbiAgICBmcm9tOiBDb25maWcuZ2V0KCd0d2lsaW8ubnVtYmVyJyksXG4gICAgdG86IHBob25lXG4gIH07XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0d2lsaW8uc2VuZE1lc3NhZ2UoY2ZnLCAoZXJyb3IsIGRhdGEpID0+IHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IuZXJyb3JfbWVzc2FnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZFNtc1RlbXBsYXRlID0gKHRlbXBsYXRlTmFtZTogc3RyaW5nLCBzbXNQYXJhbXM6IFNNU1BhcmFtc1R5cGUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2FwcCwgdXNlciwgdmFyc30gPSBzbXNQYXJhbXM7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhgLi90ZW1wbGF0ZXMvc21zLyR7dGVtcGxhdGVOYW1lfS50eHRgLCAndXRmOCcpO1xuICAgIGNvbnN0IHRleHQgPSBhcHBUZW1wbGF0ZShhcHAsIGRhdGEsIHZhcnMpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHthcHAsIHRleHQsIHVzZXJ9O1xuXG4gICAgcmV0dXJuIHNlbmRTbXMocGFyYW1zKVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSxtQkFBeUI7QUFDekIsZ0JBQWU7QUFDZixvQkFBc0I7QUFFdEIsb0JBQXFCO0FBRXJCLG1CQUEwQjtBQUtuQixNQUFNLFVBQVUsQ0FBQyxXQUErQjtBQUNyRCxRQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0w7QUFFSixRQUFNLFVBQVUsS0FBSyxXQUFXO0FBQ2hDLFFBQU0sUUFBUSw2QkFBVyxLQUFLLE9BQU87QUFDckMsUUFBTSxrQkFBMEIsOEJBQVksS0FBSztBQUVqRCxRQUFNLFNBQWMsMkJBQVUscUJBQU8sSUFBSSxlQUFlLHFCQUFPLElBQUk7QUFDbkUsUUFBTSxNQUF5QjtBQUFBLElBQzdCLE1BQU07QUFBQSxJQUNOLE1BQU0scUJBQU8sSUFBSTtBQUFBLElBQ2pCLElBQUk7QUFBQTtBQUdOLFNBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RDLFdBQU8sWUFBWSxLQUFLLENBQUMsT0FBTyxTQUFTO0FBQ3ZDLFVBQUcsT0FBTztBQUNSLGVBQU8sSUFBSSxNQUFNLE1BQU07QUFBQSxhQUNsQjtBQUNMLGdCQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNVCxNQUFNLGtCQUFrQixDQUFDLGNBQXNCLGNBQStDO0FBQ25HLFFBQU0sRUFBQyxLQUFLLE1BQU0sU0FBUTtBQUMxQixNQUFJO0FBQ0YsVUFBTSxPQUFPLGtCQUFHLGFBQWEsbUJBQW1CLG9CQUFvQjtBQUNwRSxVQUFNLE9BQU8sOEJBQVksS0FBSyxNQUFNO0FBQ3BDLFVBQU0sU0FBUyxFQUFDLEtBQUssTUFBTTtBQUUzQixXQUFPLFFBQVEsUUFDWixLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsVUFDN0IsTUFBTSxDQUFDLFVBQWlCO0FBQ3ZCLFlBQU07QUFBQTtBQUFBLFdBRUosT0FBTjtBQUNBLFdBQU8sUUFBUSxPQUFPO0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,2 @@
1
+ import { ApiContext, StatisticsType } from '../types';
2
+ export declare const getGlobalStatistics: (context: ApiContext) => Promise<Partial<StatisticsType>>;
@@ -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
+ getGlobalStatistics: () => getGlobalStatistics
26
+ });
27
+ var import_arangojs = __toModule(require("arangojs"));
28
+ var import__ = __toModule(require("."));
29
+ var import_utils = __toModule(require("../utils"));
30
+ const eventCategory = "statistics";
31
+ const getGlobalStatistics = async (context) => {
32
+ const action = "getStatistics";
33
+ const { database } = context;
34
+ const statisticsQuery = import_arangojs.aql`FOR s IN statistics
35
+ FILTER s.isGlobal == true
36
+ LIMIT 1
37
+ RETURN s`;
38
+ const statistics = await database.query(statisticsQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils.logError)({
39
+ action,
40
+ category: eventCategory,
41
+ label: "db_error"
42
+ }, error, context).then(() => null));
43
+ if (statistics) {
44
+ return statistics;
45
+ }
46
+ const activeUsers = (0, import__.getActiveUserCount)(context);
47
+ const updatedData = { activeUsers };
48
+ const updateQuery = import_arangojs.aql`UPSERT {isGlobal: true}
49
+ INSERT ${updatedData}
50
+ UPDATE ${updatedData}
51
+ IN statistics RETURN NEW`;
52
+ const updatedStatistics = await database.query(updateQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils.logError)({
53
+ action,
54
+ category: eventCategory,
55
+ label: "db_error"
56
+ }, error, context).then(() => ({})));
57
+ return updatedStatistics;
58
+ };
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ getGlobalStatistics
62
+ });
63
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvc3RhdGlzdGljcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9jdXJzb3InO1xuXG5pbXBvcnQge2dldEFjdGl2ZVVzZXJDb3VudH0gZnJvbSAnLic7XG5pbXBvcnQge0FwaUNvbnRleHQsIFN0YXRpc3RpY3NUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdzdGF0aXN0aWNzJztcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbFN0YXRpc3RpY3MgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8UGFydGlhbDxTdGF0aXN0aWNzVHlwZT4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0U3RhdGlzdGljcyc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBzdGF0aXN0aWNzUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBzIElOIHN0YXRpc3RpY3NcbiAgICBGSUxURVIgcy5pc0dsb2JhbCA9PSB0cnVlXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBzYDtcblxuICBjb25zdCBzdGF0aXN0aWNzID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoc3RhdGlzdGljc1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gKG51bGwpKSk7XG5cbiAgaWYoc3RhdGlzdGljcykge1xuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG4gIGNvbnN0IGFjdGl2ZVVzZXJzID0gZ2V0QWN0aXZlVXNlckNvdW50KGNvbnRleHQpO1xuICBjb25zdCB1cGRhdGVkRGF0YSA9IHthY3RpdmVVc2Vyc307XG5cbiAgY29uc3QgdXBkYXRlUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7aXNHbG9iYWw6IHRydWV9XG4gIElOU0VSVCAke3VwZGF0ZWREYXRhfVxuICBVUERBVEUgJHt1cGRhdGVkRGF0YX1cbiAgSU4gc3RhdGlzdGljcyBSRVRVUk4gTkVXYDtcblxuICBjb25zdCB1cGRhdGVkU3RhdGlzdGljcyA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVwZGF0ZVF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gKHt9KSkpO1xuXG4gIHJldHVybiB1cGRhdGVkU3RhdGlzdGljcztcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFrQjtBQUlsQixlQUFpQztBQUVqQyxtQkFBdUI7QUFFdkIsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxzQkFBc0IsT0FBTyxZQUEwRDtBQUNsRyxRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxhQUFZO0FBQ25CLFFBQU0sa0JBQTRCO0FBQUE7QUFBQTtBQUFBO0FBS2xDLFFBQU0sYUFBYSxNQUFNLFNBQVMsTUFBTSxpQkFDckMsS0FBSyxDQUFDLFdBQXdCLE9BQU8sUUFDckMsTUFBTSxDQUFDLFVBQWlCLDJCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxLQUNOLE9BQU8sU0FBUyxLQUFLLE1BQU87QUFFakMsTUFBRyxZQUFZO0FBQ2IsV0FBTztBQUFBO0FBRVQsUUFBTSxjQUFjLGlDQUFtQjtBQUN2QyxRQUFNLGNBQWMsRUFBQztBQUVyQixRQUFNLGNBQXdCO0FBQUEsV0FDckI7QUFBQSxXQUNBO0FBQUE7QUFHVCxRQUFNLG9CQUFvQixNQUFNLFNBQVMsTUFBTSxhQUM1QyxLQUFLLENBQUMsV0FBd0IsT0FBTyxRQUNyQyxNQUFNLENBQUMsVUFBaUIsMkJBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsT0FBTztBQUFBLEtBQ04sT0FBTyxTQUFTLEtBQUssTUFBTztBQUVqQyxTQUFPO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,209 @@
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
+ addPlan: () => addPlan,
26
+ addSubscription: () => addSubscription,
27
+ deleteSubscription: () => deleteSubscription,
28
+ getPlanList: () => getPlanList,
29
+ getSubscription: () => getSubscription
30
+ });
31
+ var import_utils = __toModule(require("@nlabs/utils"));
32
+ var import_arangojs = __toModule(require("arangojs"));
33
+ var import_luxon = __toModule(require("luxon"));
34
+ var import_stripe = __toModule(require("stripe"));
35
+ var import_config = __toModule(require("../config"));
36
+ var import_utils2 = __toModule(require("../utils"));
37
+ var import_users = __toModule(require("./users"));
38
+ const eventCategory = "subscription";
39
+ const apiVersion = "2020-03-02";
40
+ const getPlanList = (context, from = 0, to = 30) => {
41
+ const action = "getList";
42
+ const { database } = context;
43
+ const limit = (0, import_utils2.getLimit)(from, to);
44
+ const aqlQry = `FOR p IN plans
45
+ ${limit.aql}
46
+ SORT p.amount
47
+ RETURN p`;
48
+ return database.query(aqlQry).then((cursor) => cursor.all()).then((list = []) => list).catch((error) => (0, import_utils2.logError)({
49
+ action,
50
+ category: eventCategory,
51
+ label: "db_error"
52
+ }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
53
+ };
54
+ const getSubscription = (context) => {
55
+ const action = "getItem";
56
+ const { database, session: { userId: sessionId } } = context;
57
+ const aqlQry = `FOR s IN subscriptions
58
+ FILTER s.userId == ${sessionId} && s.cancelled > 0
59
+ LET plan = FIRST(
60
+ FOR p IN plans
61
+ FILTER p._key == s.planId
62
+ )
63
+ LIMIT 1
64
+ RETURN MERGE(s, {plan: plan})`;
65
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((subscription = {}) => subscription).catch((error) => (0, import_utils2.logError)({
66
+ action,
67
+ category: eventCategory,
68
+ label: "db_error"
69
+ }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
70
+ };
71
+ const addPlan = (context, item) => {
72
+ const action = "addPlan";
73
+ const { database, session: { userId: sessionId, userAccess } } = context;
74
+ const isAdmin = userAccess > 2;
75
+ if (!isAdmin) {
76
+ return (0, import_utils2.logException)({
77
+ action,
78
+ category: eventCategory,
79
+ label: "unauthorized",
80
+ value: "invalid_session"
81
+ }, context).then(() => null);
82
+ }
83
+ const now = Date.now();
84
+ const formatId = (0, import_utils.parseId)(item.id);
85
+ const planId = formatId === "" ? (0, import_utils.createHash)(`subscription-${sessionId}`) : formatId;
86
+ const { amount, currency = "USD", description, interval, intervalCount, name } = item;
87
+ const formatAmount = (0, import_utils.parseNum)(amount);
88
+ const formatInterval = (0, import_utils.parseChar)(interval, 5).toLowerCase();
89
+ const formatIntervalCnt = (0, import_utils.parseNum)(intervalCount, 5);
90
+ const formatName = (0, import_utils.parseVarChar)(name, 32);
91
+ const formatDesc = (0, import_utils.parseVarChar)(description, 32);
92
+ const insert = {
93
+ _key: planId,
94
+ added: now,
95
+ amount: formatAmount,
96
+ currency,
97
+ description: formatDesc,
98
+ interval: formatInterval,
99
+ intervalCount: formatIntervalCnt,
100
+ modified: now,
101
+ name: formatName
102
+ };
103
+ const aqlQry = import_arangojs.aql`INSERT ${insert} IN plans RETURN NEW`;
104
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((plan = {}) => {
105
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
106
+ const stripePlan = {
107
+ amount: formatAmount * 100,
108
+ currency,
109
+ id: planId,
110
+ interval: formatInterval,
111
+ interval_count: formatIntervalCnt,
112
+ metadata: {},
113
+ name: formatName,
114
+ statement_descriptor: formatDesc
115
+ };
116
+ return stripeClient.plans.create(stripePlan).then(() => plan);
117
+ }).catch((error) => (0, import_utils2.logError)({
118
+ action,
119
+ category: eventCategory,
120
+ label: "db_error"
121
+ }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
122
+ };
123
+ const addSubscription = (context, item) => {
124
+ const action = "addSubscription";
125
+ const { database, session: { userId: sessionId, userAccess } } = context;
126
+ const isAdmin = userAccess > 2;
127
+ if (!isAdmin) {
128
+ return (0, import_utils2.logException)({
129
+ action,
130
+ category: eventCategory,
131
+ label: "unauthorized",
132
+ value: "invalid_session"
133
+ }, context).then(() => null);
134
+ }
135
+ const now = Date.now();
136
+ const formatId = (0, import_utils.parseId)(item.id);
137
+ const subscriptionId = formatId === "" ? (0, import_utils.createHash)(`subscription-${sessionId}`) : formatId;
138
+ const { planId, trialEnd, trialPeriod } = item;
139
+ const formatPlanId = (0, import_utils.parseId)(planId);
140
+ const formatTrialPeriod = 0;
141
+ let formatTrialEnd = trialEnd || Date.now();
142
+ if (formatTrialPeriod) {
143
+ formatTrialEnd = import_luxon.DateTime.local().plus({ days: trialPeriod }).toMillis();
144
+ }
145
+ return (0, import_users.getUser)(context, sessionId).then((user) => {
146
+ const insert = {
147
+ _key: subscriptionId,
148
+ added: now,
149
+ cancelDate: 0,
150
+ modified: now,
151
+ planId: formatPlanId,
152
+ trialEnd: formatTrialEnd,
153
+ userId: sessionId
154
+ };
155
+ const aqlQry = import_arangojs.aql`INSERT ${insert} IN plans RETURN NEW`;
156
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((subscription = {}) => {
157
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
158
+ return stripeClient.subscriptions.create({
159
+ customer: user.stripeCustomerId,
160
+ items: [
161
+ {
162
+ plan: formatPlanId
163
+ }
164
+ ],
165
+ metadata: {
166
+ userId: sessionId
167
+ },
168
+ trial_end: formatTrialEnd
169
+ }).then(() => subscription);
170
+ }).catch((error) => (0, import_utils2.logError)({
171
+ action,
172
+ category: eventCategory,
173
+ label: "db_error"
174
+ }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
175
+ });
176
+ };
177
+ const deleteSubscription = (context) => {
178
+ const action = "deleteSubscription";
179
+ const { database } = context;
180
+ const now = Date.now();
181
+ return getSubscription(context).then((subscription) => {
182
+ const stripeClient = new import_stripe.default(import_config.Config.get("stripe.token"), { apiVersion, typescript: true });
183
+ return stripeClient.subscriptions.del(subscription.transactionId).then(({ canceled_at: cancelDate }) => {
184
+ if (cancelDate) {
185
+ const update = {
186
+ cancelDate,
187
+ modified: now,
188
+ planId: ""
189
+ };
190
+ const aqlQry = import_arangojs.aql`UPDATE s WITH ${update} IN subscriptions`;
191
+ return database.query(aqlQry).then(() => true).catch((error) => (0, import_utils2.logError)({
192
+ action,
193
+ category: eventCategory,
194
+ label: "db_error"
195
+ }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
196
+ }
197
+ return false;
198
+ });
199
+ });
200
+ };
201
+ // Annotate the CommonJS export names for ESM import in node:
202
+ 0 && (module.exports = {
203
+ addPlan,
204
+ addSubscription,
205
+ deleteSubscription,
206
+ getPlanList,
207
+ getSubscription
208
+ });
209
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvc3Vic2NyaXB0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHtBcmFuZ29EQkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYic7XG5pbXBvcnQge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgnO1xuaW1wb3J0IHtQYXltZW50SW50ZXJ2YWwsIFBheW1lbnRQbGFuLCBQYXltZW50U3Vic2NyaXB0aW9ufSBmcm9tICcuLi90eXBlcy9wYXltZW50cyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge2dldFVzZXJ9IGZyb20gJy4vdXNlcnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnc3Vic2NyaXB0aW9uJztcbmNvbnN0IGFwaVZlcnNpb246IGFueSA9ICcyMDIwLTAzLTAyJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYW5MaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZyb206IG51bWJlciA9IDAsIHRvOiBudW1iZXIgPSAzMCk6IFByb21pc2U8UGF5bWVudFBsYW5bXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwbGFuc1xuICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICBTT1JUIHAuYW1vdW50XG4gICAgICBSRVRVUk4gcGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0ID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdWJzY3JpcHRpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8UGF5bWVudFN1YnNjcmlwdGlvbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBzIElOIHN1YnNjcmlwdGlvbnNcbiAgICAgIEZJTFRFUiBzLnVzZXJJZCA9PSAke3Nlc3Npb25JZH0gJiYgcy5jYW5jZWxsZWQgPiAwXG4gICAgICBMRVQgcGxhbiA9IEZJUlNUKFxuICAgICAgICBGT1IgcCBJTiBwbGFuc1xuICAgICAgICBGSUxURVIgcC5fa2V5ID09IHMucGxhbklkXG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gTUVSR0Uocywge3BsYW46IHBsYW59KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoc3Vic2NyaXB0aW9uID0ge30pID0+IHN1YnNjcmlwdGlvbilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCB7fSkudGhlbigoKSA9PiBudWxsKS5jYXRjaCgoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBsYW4gPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogUGF5bWVudFBsYW4pOiBQcm9taXNlPFBheW1lbnRQbGFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBsYW4nO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlckFjY2Vzc319ID0gY29udGV4dDtcbiAgY29uc3QgaXNBZG1pbjogYm9vbGVhbiA9IHVzZXJBY2Nlc3MgPiAyO1xuXG4gIGlmKCFpc0FkbWluKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAndW5hdXRob3JpemVkJyxcbiAgICAgIHZhbHVlOiAnaW52YWxpZF9zZXNzaW9uJ1xuICAgIH0sIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gIH1cblxuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW0uaWQpO1xuICBjb25zdCBwbGFuSWQ6IHN0cmluZyA9IGZvcm1hdElkID09PSAnJyA/IGNyZWF0ZUhhc2goYHN1YnNjcmlwdGlvbi0ke3Nlc3Npb25JZH1gKSA6IGZvcm1hdElkO1xuICBjb25zdCB7YW1vdW50LCBjdXJyZW5jeSA9ICdVU0QnLCBkZXNjcmlwdGlvbiwgaW50ZXJ2YWwsIGludGVydmFsQ291bnQsIG5hbWV9ID0gaXRlbTtcbiAgY29uc3QgZm9ybWF0QW1vdW50OiBudW1iZXIgPSBwYXJzZU51bShhbW91bnQpO1xuICBjb25zdCBmb3JtYXRJbnRlcnZhbDogUGF5bWVudEludGVydmFsID0gcGFyc2VDaGFyKGludGVydmFsLCA1KS50b0xvd2VyQ2FzZSgpIGFzIFBheW1lbnRJbnRlcnZhbDtcbiAgY29uc3QgZm9ybWF0SW50ZXJ2YWxDbnQ6IG51bWJlciA9IHBhcnNlTnVtKGludGVydmFsQ291bnQsIDUpO1xuICBjb25zdCBmb3JtYXROYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIobmFtZSwgMzIpO1xuICBjb25zdCBmb3JtYXREZXNjOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZGVzY3JpcHRpb24sIDMyKTtcblxuICBjb25zdCBpbnNlcnQ6IFBheW1lbnRQbGFuID0ge1xuICAgIF9rZXk6IHBsYW5JZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgIGN1cnJlbmN5LFxuICAgIGRlc2NyaXB0aW9uOiBmb3JtYXREZXNjLFxuICAgIGludGVydmFsOiBmb3JtYXRJbnRlcnZhbCxcbiAgICBpbnRlcnZhbENvdW50OiBmb3JtYXRJbnRlcnZhbENudCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IGZvcm1hdE5hbWVcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBsYW5zIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHBsYW46IFBheW1lbnRQbGFuID0ge30pID0+IHtcbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcbiAgICAgIGNvbnN0IHN0cmlwZVBsYW46IGFueSA9IHtcbiAgICAgICAgYW1vdW50OiBmb3JtYXRBbW91bnQgKiAxMDAsXG4gICAgICAgIGN1cnJlbmN5LFxuICAgICAgICBpZDogcGxhbklkLFxuICAgICAgICBpbnRlcnZhbDogZm9ybWF0SW50ZXJ2YWwsXG4gICAgICAgIGludGVydmFsX2NvdW50OiBmb3JtYXRJbnRlcnZhbENudCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogZm9ybWF0TmFtZSxcbiAgICAgICAgc3RhdGVtZW50X2Rlc2NyaXB0b3I6IGZvcm1hdERlc2NcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQucGxhbnNcbiAgICAgICAgLmNyZWF0ZShzdHJpcGVQbGFuKVxuICAgICAgICAudGhlbigoKSA9PiBwbGFuKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3Vic2NyaXB0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW0pOiBQcm9taXNlPFBheW1lbnRTdWJzY3JpcHRpb24+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkU3Vic2NyaXB0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJBY2Nlc3N9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlzQWRtaW46IGJvb2xlYW4gPSB1c2VyQWNjZXNzID4gMjtcblxuICBpZighaXNBZG1pbikge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICB9XG5cbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChpdGVtLmlkKTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyA9IGZvcm1hdElkID09PSAnJyA/IGNyZWF0ZUhhc2goYHN1YnNjcmlwdGlvbi0ke3Nlc3Npb25JZH1gKSA6IGZvcm1hdElkO1xuICBjb25zdCB7cGxhbklkLCB0cmlhbEVuZCwgdHJpYWxQZXJpb2R9ID0gaXRlbTtcbiAgY29uc3QgZm9ybWF0UGxhbklkOiBzdHJpbmcgPSBwYXJzZUlkKHBsYW5JZCk7XG4gIGNvbnN0IGZvcm1hdFRyaWFsUGVyaW9kOiBudW1iZXIgPSAwO1xuICBsZXQgZm9ybWF0VHJpYWxFbmQ6IG51bWJlciA9IHRyaWFsRW5kIHx8IERhdGUubm93KCk7XG5cbiAgaWYoZm9ybWF0VHJpYWxQZXJpb2QpIHtcbiAgICBmb3JtYXRUcmlhbEVuZCA9IERhdGVUaW1lLmxvY2FsKCkucGx1cyh7ZGF5czogdHJpYWxQZXJpb2R9KS50b01pbGxpcygpO1xuICB9XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRTdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIF9rZXk6IHN1YnNjcmlwdGlvbklkLFxuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBjYW5jZWxEYXRlOiAwLFxuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBwbGFuSWQ6IGZvcm1hdFBsYW5JZCxcbiAgICAgICAgdHJpYWxFbmQ6IGZvcm1hdFRyaWFsRW5kLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBwbGFucyBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChzdWJzY3JpcHRpb246IFBheW1lbnRTdWJzY3JpcHRpb24gPSB7fSkgPT4ge1xuICAgICAgICAgIC8vIFN0cmlwZVxuICAgICAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG4gICAgICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5zdWJzY3JpcHRpb25zXG4gICAgICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICAgICAgY3VzdG9tZXI6IHVzZXIuc3RyaXBlQ3VzdG9tZXJJZCxcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwbGFuOiBmb3JtYXRQbGFuSWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHJpYWxfZW5kOiBmb3JtYXRUcmlhbEVuZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgIH0sIGVycm9yLCB7fSkudGhlbigoKSA9PiBudWxsKS5jYXRjaCgoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVN1YnNjcmlwdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVN1YnNjcmlwdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgcmV0dXJuIGdldFN1YnNjcmlwdGlvbihjb250ZXh0KVxuICAgIC50aGVuKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuc3Vic2NyaXB0aW9uc1xuICAgICAgICAuZGVsKHN1YnNjcmlwdGlvbi50cmFuc2FjdGlvbklkKVxuICAgICAgICAudGhlbigoe2NhbmNlbGVkX2F0OiBjYW5jZWxEYXRlfSkgPT4ge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW5jZWxsZWQgb24gU3RyaXBlIGJlZm9yZSB1cGRhdGluZyB0aGUgZGJcbiAgICAgICAgICBpZihjYW5jZWxEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGU6IFBheW1lbnRTdWJzY3JpcHRpb24gPSB7XG4gICAgICAgICAgICAgIGNhbmNlbERhdGUsXG4gICAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICAgIHBsYW5JZDogJydcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSBzIFdJVEggJHt1cGRhdGV9IElOIHN1YnNjcmlwdGlvbnNgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgICAgICAgICAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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
@@ -0,0 +1,26 @@
1
+ import { Database } from 'arangojs';
2
+ import { ApiContext } from '../types/auth';
3
+ import { TagType } from '../types/tags';
4
+ export declare const getTags: (context: ApiContext, args: any) => Promise<TagType[]>;
5
+ export declare const getTagsByItem: (context: ApiContext, itemId: string, args: any) => Promise<TagType[]>;
6
+ export declare const getTagsByOwner: (context: ApiContext, args: any) => Promise<TagType[]>;
7
+ export declare const getTag: (context: ApiContext, tagId: string) => Promise<TagType>;
8
+ export declare const addTag: (context: ApiContext, { tag }: {
9
+ tag: any;
10
+ }) => Promise<TagType>;
11
+ export declare const addTagToItem: (context: ApiContext, { itemId, tagId }: {
12
+ itemId: any;
13
+ tagId: any;
14
+ }) => Promise<TagType>;
15
+ export declare const updateTag: (context: ApiContext, item?: TagType) => Promise<TagType>;
16
+ export declare const deleteTag: (context: ApiContext, { tagId }: {
17
+ tagId: any;
18
+ }) => Promise<TagType>;
19
+ export declare const deleteTagFromItem: (context: ApiContext, { itemId, tagId }: {
20
+ itemId: any;
21
+ tagId: any;
22
+ }) => Promise<TagType>;
23
+ export declare const createTag: (db: Database, tagName: string) => Promise<TagType>;
24
+ export declare const createTagEdge: (db: Database, tag: TagType, itemId: string) => Promise<TagType>;
25
+ export declare const linkTags: (db: Database, tagNames: string[], itemId: string) => Promise<TagType[]>;
26
+ export declare const extractTags: (db: Database, itemId: any, content: any) => Promise<TagType[]>;