@flink-app/s3-plugin 0.3.5

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 (165) hide show
  1. package/.flink/generated-schemas.json +311 -0
  2. package/.flink/generatedHandlers.ts +7 -0
  3. package/.flink/generatedRepos.ts +5 -0
  4. package/.flink/schemas/schemas.json +5 -0
  5. package/.flink/schemas/schemas.ts +1 -0
  6. package/.flink/start.ts +4 -0
  7. package/dist/.flink/generatedHandlers.d.ts +1 -0
  8. package/dist/.flink/generatedHandlers.js +7 -0
  9. package/dist/.flink/generatedRepos.d.ts +1 -0
  10. package/dist/.flink/generatedRepos.js +7 -0
  11. package/dist/.flink/schemas/schemas.d.ts +0 -0
  12. package/dist/.flink/schemas/schemas.js +2 -0
  13. package/dist/.flink/schemas/schemas.json +5 -0
  14. package/dist/.flink/start.d.ts +3 -0
  15. package/dist/.flink/start.js +6 -0
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.js +172 -0
  18. package/dist/s3Client.d.ts +36 -0
  19. package/dist/s3Client.js +233 -0
  20. package/dist/s3PluginContext.d.ts +6 -0
  21. package/dist/s3PluginContext.js +2 -0
  22. package/dist/schemas/ListObjectsResponse.d.ts +5 -0
  23. package/dist/schemas/ListObjectsResponse.js +2 -0
  24. package/dist/schemas/s3ClientOptions.d.ts +7 -0
  25. package/dist/schemas/s3ClientOptions.js +2 -0
  26. package/dist/schemas/s3PluginOptions.d.ts +11 -0
  27. package/dist/schemas/s3PluginOptions.js +2 -0
  28. package/dist/src/Ctx.d.ts +19 -0
  29. package/dist/src/Ctx.js +2 -0
  30. package/dist/src/handlers/HandlebarsTemplateHandler.d.ts +5 -0
  31. package/dist/src/handlers/HandlebarsTemplateHandler.js +63 -0
  32. package/dist/src/handlers/Management/Get.d.ts +7 -0
  33. package/dist/src/handlers/Management/Get.js +53 -0
  34. package/dist/src/handlers/Management/GetManagement.d.ts +8 -0
  35. package/dist/src/handlers/Management/GetManagement.js +53 -0
  36. package/dist/src/handlers/User/DeleteByUserid.d.ts +9 -0
  37. package/dist/src/handlers/User/DeleteByUserid.js +70 -0
  38. package/dist/src/handlers/User/GetByUserid.d.ts +9 -0
  39. package/dist/src/handlers/User/GetByUserid.js +71 -0
  40. package/dist/src/handlers/User/GetList.d.ts +9 -0
  41. package/dist/src/handlers/User/GetList.js +64 -0
  42. package/dist/src/handlers/User/GetMe.d.ts +8 -0
  43. package/dist/src/handlers/User/GetMe.js +81 -0
  44. package/dist/src/handlers/User/Post.d.ts +10 -0
  45. package/dist/src/handlers/User/Post.js +87 -0
  46. package/dist/src/handlers/User/PostLogin.d.ts +10 -0
  47. package/dist/src/handlers/User/PostLogin.js +86 -0
  48. package/dist/src/handlers/User/PutByUserid.d.ts +9 -0
  49. package/dist/src/handlers/User/PutByUserid.js +97 -0
  50. package/dist/src/index.d.ts +4 -0
  51. package/dist/src/index.js +380 -0
  52. package/dist/src/lib/customer.d.ts +6 -0
  53. package/dist/src/lib/customer.js +121 -0
  54. package/dist/src/lib/payment.d.ts +6 -0
  55. package/dist/src/lib/payment.js +113 -0
  56. package/dist/src/managementApiContext.d.ts +7 -0
  57. package/dist/src/managementApiContext.js +2 -0
  58. package/dist/src/models/ManagementApi.d.ts +28 -0
  59. package/dist/src/models/ManagementApi.js +8 -0
  60. package/dist/src/repos/ConnectSessionRepo.d.ts +5 -0
  61. package/dist/src/repos/ConnectSessionRepo.js +26 -0
  62. package/dist/src/repos/ManagementUserRepo.d.ts +5 -0
  63. package/dist/src/repos/ManagementUserRepo.js +26 -0
  64. package/dist/src/reposx/ConnectSessionRepo.d.ts +5 -0
  65. package/dist/src/reposx/ConnectSessionRepo.js +26 -0
  66. package/dist/src/schemas/ConnectSession.d.ts +4 -0
  67. package/dist/src/schemas/ConnectSession.js +2 -0
  68. package/dist/src/schemas/Management/GetReq.d.ts +2 -0
  69. package/dist/src/schemas/Management/GetReq.js +2 -0
  70. package/dist/src/schemas/Management/GetRes.d.ts +3 -0
  71. package/dist/src/schemas/Management/GetRes.js +2 -0
  72. package/dist/src/schemas/ManagementUser.d.ts +6 -0
  73. package/dist/src/schemas/ManagementUser.js +2 -0
  74. package/dist/src/schemas/ManagementUserViewModel.d.ts +4 -0
  75. package/dist/src/schemas/ManagementUserViewModel.js +19 -0
  76. package/dist/src/schemas/ModuleList.d.ts +18 -0
  77. package/dist/src/schemas/ModuleList.js +2 -0
  78. package/dist/src/schemas/User/DeleteByUseridReq.d.ts +2 -0
  79. package/dist/src/schemas/User/DeleteByUseridReq.js +2 -0
  80. package/dist/src/schemas/User/DeleteByUseridRes.d.ts +2 -0
  81. package/dist/src/schemas/User/DeleteByUseridRes.js +2 -0
  82. package/dist/src/schemas/User/GetByUseridReq.d.ts +2 -0
  83. package/dist/src/schemas/User/GetByUseridReq.js +2 -0
  84. package/dist/src/schemas/User/GetByUseridRes.d.ts +3 -0
  85. package/dist/src/schemas/User/GetByUseridRes.js +2 -0
  86. package/dist/src/schemas/User/GetListReq.d.ts +2 -0
  87. package/dist/src/schemas/User/GetListReq.js +2 -0
  88. package/dist/src/schemas/User/GetListRes.d.ts +4 -0
  89. package/dist/src/schemas/User/GetListRes.js +2 -0
  90. package/dist/src/schemas/User/GetMeReq.d.ts +2 -0
  91. package/dist/src/schemas/User/GetMeReq.js +2 -0
  92. package/dist/src/schemas/User/GetMeRes.d.ts +3 -0
  93. package/dist/src/schemas/User/GetMeRes.js +2 -0
  94. package/dist/src/schemas/User/PostLoginReq.d.ts +4 -0
  95. package/dist/src/schemas/User/PostLoginReq.js +2 -0
  96. package/dist/src/schemas/User/PostLoginRes.d.ts +5 -0
  97. package/dist/src/schemas/User/PostLoginRes.js +2 -0
  98. package/dist/src/schemas/User/PostReq.d.ts +3 -0
  99. package/dist/src/schemas/User/PostReq.js +2 -0
  100. package/dist/src/schemas/User/PostRes.d.ts +3 -0
  101. package/dist/src/schemas/User/PostRes.js +2 -0
  102. package/dist/src/schemas/User/PutByUseridReq.d.ts +3 -0
  103. package/dist/src/schemas/User/PutByUseridReq.js +2 -0
  104. package/dist/src/schemas/User/PutByUseridRes.d.ts +3 -0
  105. package/dist/src/schemas/User/PutByUseridRes.js +2 -0
  106. package/dist/src/schemas/createStripeCustomerOptions.d.ts +11 -0
  107. package/dist/src/schemas/createStripeCustomerOptions.js +2 -0
  108. package/dist/src/schemas/customer/connectToStripeConnectOptions.d.ts +3 -0
  109. package/dist/src/schemas/customer/connectToStripeConnectOptions.js +2 -0
  110. package/dist/src/schemas/customer/hasPaymentMethodOptions.d.ts +3 -0
  111. package/dist/src/schemas/customer/hasPaymentMethodOptions.js +2 -0
  112. package/dist/src/schemas/customer/setupCardOptions.d.ts +3 -0
  113. package/dist/src/schemas/customer/setupCardOptions.js +2 -0
  114. package/dist/src/schemas/customer/setupCardResponse.d.ts +4 -0
  115. package/dist/src/schemas/customer/setupCardResponse.js +2 -0
  116. package/dist/src/schemas/customer/setupCardTokenOptions.d.ts +4 -0
  117. package/dist/src/schemas/customer/setupCardTokenOptions.js +2 -0
  118. package/dist/src/schemas/payment/capturePaymentOptions.d.ts +4 -0
  119. package/dist/src/schemas/payment/capturePaymentOptions.js +2 -0
  120. package/dist/src/schemas/payment/confirmPaymentOptions.d.ts +4 -0
  121. package/dist/src/schemas/payment/confirmPaymentOptions.js +2 -0
  122. package/dist/src/schemas/payment/confirmPaymentResponse.d.ts +7 -0
  123. package/dist/src/schemas/payment/confirmPaymentResponse.js +2 -0
  124. package/dist/src/schemas/payment/confirmPaymentTokenOptions.d.ts +4 -0
  125. package/dist/src/schemas/payment/confirmPaymentTokenOptions.js +2 -0
  126. package/dist/src/schemas/payment/createPaymentResponse.d.ts +5 -0
  127. package/dist/src/schemas/payment/createPaymentResponse.js +2 -0
  128. package/dist/src/schemas/stripeAPIToken.d.ts +4 -0
  129. package/dist/src/schemas/stripeAPIToken.js +2 -0
  130. package/dist/src/schemas/stripePluginOptions.d.ts +31 -0
  131. package/dist/src/schemas/stripePluginOptions.js +2 -0
  132. package/dist/src/stripeAPI.d.ts +32 -0
  133. package/dist/src/stripeAPI.js +163 -0
  134. package/dist/src/stripePlguinContext.d.ts +5 -0
  135. package/dist/src/stripePlguinContext.js +2 -0
  136. package/dist/src/stripePluginContext.d.ts +6 -0
  137. package/dist/src/stripePluginContext.js +2 -0
  138. package/dist/src/templates/connect-done.d.ts +1 -0
  139. package/dist/src/templates/connect-done.js +4 -0
  140. package/dist/src/templates/error.d.ts +1 -0
  141. package/dist/src/templates/error.js +4 -0
  142. package/dist/src/templates/master.d.ts +1 -0
  143. package/dist/src/templates/master.js +4 -0
  144. package/dist/src/templates/pay-enter-card.d.ts +1 -0
  145. package/dist/src/templates/pay-enter-card.js +4 -0
  146. package/dist/src/templates/pay-select-card.d.ts +1 -0
  147. package/dist/src/templates/pay-select-card.js +4 -0
  148. package/dist/src/templates/setup-card.d.ts +1 -0
  149. package/dist/src/templates/setup-card.js +4 -0
  150. package/dist/src/templates/setup-done.d.ts +1 -0
  151. package/dist/src/templates/setup-done.js +4 -0
  152. package/dist/src/templates/style.d.ts +1 -0
  153. package/dist/src/templates/style.js +4 -0
  154. package/dist/src/utils/bcrypt.d.ts +2 -0
  155. package/dist/src/utils/bcrypt.js +28 -0
  156. package/nodemon.json +7 -0
  157. package/package.json +34 -0
  158. package/readme.md +57 -0
  159. package/src/index.ts +100 -0
  160. package/src/s3Client.ts +150 -0
  161. package/src/s3PluginContext.ts +8 -0
  162. package/src/schemas/ListObjectsResponse.ts +3 -0
  163. package/src/schemas/s3ClientOptions.ts +7 -0
  164. package/src/schemas/s3PluginOptions.ts +11 -0
  165. package/tsconfig.json +23 -0
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.StripeAPI = void 0;
40
+ var stripe_1 = require("stripe");
41
+ var customer_1 = require("./lib/customer");
42
+ var payment_1 = require("./lib/payment");
43
+ var StripeAPI = /** @class */ (function () {
44
+ function StripeAPI(options) {
45
+ var _this = this;
46
+ this.config = {
47
+ setRepo: function (repo) {
48
+ _this.repo = repo;
49
+ },
50
+ };
51
+ this.payment = {
52
+ create: function (options) { return __awaiter(_this, void 0, void 0, function () {
53
+ var resp;
54
+ return __generator(this, function (_a) {
55
+ switch (_a.label) {
56
+ case 0: return [4 /*yield*/, payment_1.createPaymentIntent(this.stripe, this.pluginOptions.JTW_TOKEN, options)];
57
+ case 1:
58
+ resp = _a.sent();
59
+ resp.paymentUrl = (this.pluginOptions.baseUrl || "/stripe") + "/payment/confirm/" + resp.token;
60
+ return [2 /*return*/, resp];
61
+ }
62
+ });
63
+ }); },
64
+ confirm: function (options) { return __awaiter(_this, void 0, void 0, function () {
65
+ var resp;
66
+ return __generator(this, function (_a) {
67
+ switch (_a.label) {
68
+ case 0: return [4 /*yield*/, payment_1.confirmPayment(this.stripe, this.pluginOptions.JTW_TOKEN, options)];
69
+ case 1:
70
+ resp = _a.sent();
71
+ if (resp.token != null) {
72
+ resp.redirectUrl = (this.pluginOptions.baseUrl || "/stripe") + "/payment/confirm/" + resp.token;
73
+ }
74
+ return [2 /*return*/, resp];
75
+ }
76
+ });
77
+ }); },
78
+ createAndConfirm: function (options) { return __awaiter(_this, void 0, void 0, function () {
79
+ var createPaymentResponse, resp;
80
+ return __generator(this, function (_a) {
81
+ switch (_a.label) {
82
+ case 0: return [4 /*yield*/, payment_1.createPaymentIntent(this.stripe, this.pluginOptions.JTW_TOKEN, options)];
83
+ case 1:
84
+ createPaymentResponse = _a.sent();
85
+ return [4 /*yield*/, payment_1.confirmPayment(this.stripe, this.pluginOptions.JTW_TOKEN, { paymentIntentId: createPaymentResponse.paymentIntentId })];
86
+ case 2:
87
+ resp = _a.sent();
88
+ if (resp.token != null) {
89
+ resp.redirectUrl = (this.pluginOptions.baseUrl || "/stripe") + "/payment/confirm/" + resp.token;
90
+ }
91
+ return [2 /*return*/, resp];
92
+ }
93
+ });
94
+ }); },
95
+ capture: function (options) { return __awaiter(_this, void 0, void 0, function () {
96
+ var captureResponse;
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0: return [4 /*yield*/, this.stripe.paymentIntents.capture(options.paymentIntentId, { amount_to_capture: options.amount })];
100
+ case 1:
101
+ captureResponse = _a.sent();
102
+ return [2 /*return*/, captureResponse.status == "succeeded"];
103
+ }
104
+ });
105
+ }); },
106
+ };
107
+ this.customer = {
108
+ create: function (options) { return __awaiter(_this, void 0, void 0, function () {
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0: return [4 /*yield*/, customer_1.createStripeCustomer(this.stripe, options)];
112
+ case 1: return [2 /*return*/, _a.sent()];
113
+ }
114
+ });
115
+ }); },
116
+ hasPaymentMethod: function (options) { return __awaiter(_this, void 0, void 0, function () {
117
+ return __generator(this, function (_a) {
118
+ switch (_a.label) {
119
+ case 0: return [4 /*yield*/, customer_1.hasPaymentMethod(this.stripe, options)];
120
+ case 1: return [2 /*return*/, _a.sent()];
121
+ }
122
+ });
123
+ }); },
124
+ setupCard: function (options) { return __awaiter(_this, void 0, void 0, function () {
125
+ var token;
126
+ return __generator(this, function (_a) {
127
+ switch (_a.label) {
128
+ case 0: return [4 /*yield*/, customer_1.setupCardRegistration(this.stripe, this.pluginOptions.JTW_TOKEN, options)];
129
+ case 1:
130
+ token = _a.sent();
131
+ return [2 /*return*/, {
132
+ token: token,
133
+ redirectUrl: (this.pluginOptions.baseUrl || "/stripe") + "/customer/setup-card/" + token,
134
+ }];
135
+ }
136
+ });
137
+ }); },
138
+ connectToStripeConnect: function (options) { return __awaiter(_this, void 0, void 0, function () {
139
+ var session, url;
140
+ return __generator(this, function (_a) {
141
+ switch (_a.label) {
142
+ case 0:
143
+ if (this.repo == null) {
144
+ throw "Repo not set, cannot use connectToStripeConnect()";
145
+ }
146
+ return [4 /*yield*/, this.repo.create(options)];
147
+ case 1:
148
+ session = _a.sent();
149
+ url = "https://connect.stripe.com/express/oauth/authorize?client_id=" + this.pluginOptions.stripeConnectClientID + "&state=" + session._id;
150
+ return [2 /*return*/, url];
151
+ }
152
+ });
153
+ }); },
154
+ };
155
+ var stripe = new stripe_1.Stripe(options.stripeSecreteKey, {
156
+ apiVersion: "2020-08-27",
157
+ });
158
+ this.stripe = stripe;
159
+ this.pluginOptions = options;
160
+ }
161
+ return StripeAPI;
162
+ }());
163
+ exports.StripeAPI = StripeAPI;
@@ -0,0 +1,5 @@
1
+ export interface genericAuthContext {
2
+ stripePlugin: {
3
+ callbackTest(): void;
4
+ };
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { StripeAPI } from "./stripeAPI";
2
+ export interface stripePluginContext {
3
+ stripePlugin: {
4
+ stripeAPI: StripeAPI;
5
+ };
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const connectDoneTemplate = "\n <div id=\"success\">\n <i class=\"fas fa-check\"></i>\n <div id=\"sucess_message\">{{message}}</div>\n </div>\n\n {{#if redirectUrl}}\n <script>\n setTimeout(function(){\n window.location=\"{{redirectUrl}}\";\n }, 1000)\n </script>\n {{/if}}\n";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.connectDoneTemplate = void 0;
4
+ exports.connectDoneTemplate = "\n <div id=\"success\">\n <i class=\"fas fa-check\"></i>\n <div id=\"sucess_message\">{{message}}</div>\n </div>\n\n {{#if redirectUrl}}\n <script>\n setTimeout(function(){\n window.location=\"{{redirectUrl}}\";\n }, 1000)\n </script>\n {{/if}}\n";
@@ -0,0 +1 @@
1
+ export declare const errorTemplate = "N\u00E5gonting gick fel, v\u00E4nligen f\u00F6rs\u00F6k igen.";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.errorTemplate = void 0;
4
+ exports.errorTemplate = "N\u00E5gonting gick fel, v\u00E4nligen f\u00F6rs\u00F6k igen.";
@@ -0,0 +1 @@
1
+ export declare const masterTemplate = "\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <script src=\"https://kit.fontawesome.com/b439aafa7e.js\" crossorigin=\"anonymous\"></script>\n <script src=\"https://code.jquery.com/jquery-3.5.1.min.js\" integrity=\"sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=\" crossorigin=\"anonymous\"></script>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\" />\n <link href=\"https://fonts.googleapis.com/css2?family=Open+Sans&display=swap\" rel=\"stylesheet\">\n <script src=\"https://js.stripe.com/v3/\"></script>\n\n <style>\n {{{style}}}\n </style>\n </head>\n <body>\n {{{body}}}\n </body>\n</html>\n\n";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.masterTemplate = void 0;
4
+ exports.masterTemplate = "\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <script src=\"https://kit.fontawesome.com/b439aafa7e.js\" crossorigin=\"anonymous\"></script>\n <script src=\"https://code.jquery.com/jquery-3.5.1.min.js\" integrity=\"sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=\" crossorigin=\"anonymous\"></script>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\" />\n <link href=\"https://fonts.googleapis.com/css2?family=Open+Sans&display=swap\" rel=\"stylesheet\">\n <script src=\"https://js.stripe.com/v3/\"></script>\n\n <style>\n {{{style}}}\n </style>\n </head>\n <body>\n {{{body}}}\n </body>\n</html>\n\n";
@@ -0,0 +1 @@
1
+ export declare const payEnterCardTemplate = "\n\n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n\n<div id=\"card-container\">\n\n <div id=\"card-element\">\n <!-- Elements will create input elements here -->\n </div>\n\n <div id=\"card-errors\" role=\"alert\"></div>\n\n <div id=\"card-submit\">\n {{paymentEnterCardPayButtonText}}\n </div>\n\n\n\n</div>\n\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n<script>\nvar stripe = Stripe('{{publishableKey}}');\nvar elements = stripe.elements();\n\nvar style = {\n base: {\n color: \"#32325d\",\n }\n};\n\nvar card = elements.create(\"card\", { style: style });\ncard.mount(\"#card-element\"); \ncard.on('ready',function(){\n $(\"#loading_container\").hide();\n})\n\n\n\ncard.addEventListener('change', function(event) {\n if (event.error) {\n $(\"#card-errors\").text(event.error.message)\n $(\"#card-errors\").show();\n } else {\n $(\"#card-errors\").text('')\n $(\"#card-errors\").hide();\n \n }\n});\n\n\n\n$(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardPayment('{{client_secrect}}', {\n payment_method: { card: card },\n setup_future_usage: 'off_session'\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n\n if(result.paymentIntent != null){\n document.location = \"{{baseUrl}}/payment/done/{{token}}\";\n }\n });\n})\n\n</script>";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.payEnterCardTemplate = void 0;
4
+ exports.payEnterCardTemplate = "\n\n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n\n<div id=\"card-container\">\n\n <div id=\"card-element\">\n <!-- Elements will create input elements here -->\n </div>\n\n <div id=\"card-errors\" role=\"alert\"></div>\n\n <div id=\"card-submit\">\n {{paymentEnterCardPayButtonText}}\n </div>\n\n\n\n</div>\n\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n<script>\nvar stripe = Stripe('{{publishableKey}}');\nvar elements = stripe.elements();\n\nvar style = {\n base: {\n color: \"#32325d\",\n }\n};\n\nvar card = elements.create(\"card\", { style: style });\ncard.mount(\"#card-element\"); \ncard.on('ready',function(){\n $(\"#loading_container\").hide();\n})\n\n\n\ncard.addEventListener('change', function(event) {\n if (event.error) {\n $(\"#card-errors\").text(event.error.message)\n $(\"#card-errors\").show();\n } else {\n $(\"#card-errors\").text('')\n $(\"#card-errors\").hide();\n \n }\n});\n\n\n\n$(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardPayment('{{client_secrect}}', {\n payment_method: { card: card },\n setup_future_usage: 'off_session'\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n\n if(result.paymentIntent != null){\n document.location = \"{{baseUrl}}/payment/done/{{token}}\";\n }\n });\n})\n\n</script>";
@@ -0,0 +1 @@
1
+ export declare const paySelectCardTemplate = "\n\n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n<div id=\"payment-price\">\n {{price}}\n</div>\n{{#if description}}\n <div id=\"payment-description\">\n {{description}}\n </div>\n{{/if}}\n\n\n<div id=\"card-container\">\n <div id=\"existing-card\">\n <div id=\"existing-card-brand\"><i class=\"fab fa-cc-{{card.brand}}\"></i></div>\n <div id=\"existing-card-number\">XXXX-XXXX-XXXX-{{card.last4}}</div>\n </div>\n <div id=\"card-errors\" role=\"alert\"></div>\n <div id=\"card-submit\">\n {{paymentSelectCardPayButtonText}}\n </div>\n <div id=\"card-change\">\n {{paymentSelectCardChangeCardButtonText}}\n </div> \n</div>\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n<script>\n$(\"#loading_container\").hide();\n\nvar stripe = Stripe('{{publishableKey}}');\n\n$(\"#card-change\").click(function(){\n document.location='{{baseUrl}}/payment/enter-card/{{token}}'\n})\n\n\n$(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardPayment('{{client_secrect}}', {\n payment_method: '{{paymentMethodId}}',\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n if(result.paymentIntent != null){\n document.location = \"{{baseUrl}}/payment/done/{{token}}\"\n }\n console.log(result)\n });\n})\n\n</script>";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.paySelectCardTemplate = void 0;
4
+ exports.paySelectCardTemplate = "\n\n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n<div id=\"payment-price\">\n {{price}}\n</div>\n{{#if description}}\n <div id=\"payment-description\">\n {{description}}\n </div>\n{{/if}}\n\n\n<div id=\"card-container\">\n <div id=\"existing-card\">\n <div id=\"existing-card-brand\"><i class=\"fab fa-cc-{{card.brand}}\"></i></div>\n <div id=\"existing-card-number\">XXXX-XXXX-XXXX-{{card.last4}}</div>\n </div>\n <div id=\"card-errors\" role=\"alert\"></div>\n <div id=\"card-submit\">\n {{paymentSelectCardPayButtonText}}\n </div>\n <div id=\"card-change\">\n {{paymentSelectCardChangeCardButtonText}}\n </div> \n</div>\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n<script>\n$(\"#loading_container\").hide();\n\nvar stripe = Stripe('{{publishableKey}}');\n\n$(\"#card-change\").click(function(){\n document.location='{{baseUrl}}/payment/enter-card/{{token}}'\n})\n\n\n$(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardPayment('{{client_secrect}}', {\n payment_method: '{{paymentMethodId}}',\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n if(result.paymentIntent != null){\n document.location = \"{{baseUrl}}/payment/done/{{token}}\"\n }\n console.log(result)\n });\n})\n\n</script>";
@@ -0,0 +1 @@
1
+ export declare const setupCardTemplate = "\n \n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n{{#if setupDescription}}\n <div id=\"setup_description\">\n {{setupDescription}}\n </div>\n{{/if}}\n\n\n<div id=\"card-container\">\n\n <div id=\"card-element\">\n <!-- Elements will create input elements here -->\n </div>\n \n <div id=\"card-errors\" role=\"alert\"></div>\n\n <div id=\"card-submit\">\n {{setupButtonText}}\n </div>\n</div>\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n\n\n\n \n \n<script>\n var stripe = Stripe('{{stripePublishableKey}}');\n var elements = stripe.elements();\n\n var style = {\n base: {\n color: \"#32325d\",\n }\n };\n\n var card = elements.create(\"card\", { style: style });\n card.mount(\"#card-element\"); \n card.on('ready',function(){\n $(\"#loading_container\").hide();\n })\n \n \n \n card.addEventListener('change', function(event) {\n if (event.error) {\n $(\"#card-errors\").text(event.error.message)\n $(\"#card-errors\").show();\n } else {\n $(\"#card-errors\").text('')\n $(\"#card-errors\").hide();\n \n }\n });\n\n\n\n $(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardSetup('{{client_secret}}', {\n payment_method: { card: card },\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n document.location = \"{{baseUrl}}/customer/setup-card-done\";\n console.log(result)\n });\n })\n\n</script>\n\n\n";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupCardTemplate = void 0;
4
+ exports.setupCardTemplate = "\n \n{{#if logo}}\n <div id=\"logo-image-holder\">\n <img src=\"{{logo}}\" id=\"logo-image\"/>\n </div>\n{{/if}}\n\n\n{{#if setupDescription}}\n <div id=\"setup_description\">\n {{setupDescription}}\n </div>\n{{/if}}\n\n\n<div id=\"card-container\">\n\n <div id=\"card-element\">\n <!-- Elements will create input elements here -->\n </div>\n \n <div id=\"card-errors\" role=\"alert\"></div>\n\n <div id=\"card-submit\">\n {{setupButtonText}}\n </div>\n</div>\n\n<div id=\"loading_container\">\n <div id=\"loading\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n </div> \n</div> \n\n\n\n\n\n \n \n<script>\n var stripe = Stripe('{{stripePublishableKey}}');\n var elements = stripe.elements();\n\n var style = {\n base: {\n color: \"#32325d\",\n }\n };\n\n var card = elements.create(\"card\", { style: style });\n card.mount(\"#card-element\"); \n card.on('ready',function(){\n $(\"#loading_container\").hide();\n })\n \n \n \n card.addEventListener('change', function(event) {\n if (event.error) {\n $(\"#card-errors\").text(event.error.message)\n $(\"#card-errors\").show();\n } else {\n $(\"#card-errors\").text('')\n $(\"#card-errors\").hide();\n \n }\n });\n\n\n\n $(\"#card-submit\").click(function(){\n $(\"#card-errors\").hide();\n $(\"#loading_container\").show();\n stripe.confirmCardSetup('{{client_secret}}', {\n payment_method: { card: card },\n }).then(function(result) {\n if(result.error!=null){\n $(\"#card-errors\").text(result.error.message)\n $(\"#card-errors\").show();\n $(\"#loading_container\").hide();\n return;\n }\n document.location = \"{{baseUrl}}/customer/setup-card-done\";\n console.log(result)\n });\n })\n\n</script>\n\n\n";
@@ -0,0 +1 @@
1
+ export declare const setupDoneTemplate = "\n <div id=\"success\">\n <i class=\"fas fa-check\"></i>\n <div id=\"sucess_message\">{{message}}</div>\n </div>\n\n {{#if redirectUrl}}\n <script>\n setTimeout(function(){\n window.location=\"{{redirectUrl}}\";\n }, 1000)\n </script>\n {{/if}}\n";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupDoneTemplate = void 0;
4
+ exports.setupDoneTemplate = "\n <div id=\"success\">\n <i class=\"fas fa-check\"></i>\n <div id=\"sucess_message\">{{message}}</div>\n </div>\n\n {{#if redirectUrl}}\n <script>\n setTimeout(function(){\n window.location=\"{{redirectUrl}}\";\n }, 1000)\n </script>\n {{/if}}\n";
@@ -0,0 +1 @@
1
+ export declare const styleTemplate = "\n body{\n font-family: 'Open Sans';\n background-color:#fff;\n color:#000\n }\n #loading_container{\n background-color:rgba(255,255,255,0.6);\n color:#000;\n position: fixed;\n left:0px;\n right:0px;\n top:0px;\n bottom:0px;\n z-index:1000;\n font-size:128px;\n }\n #loading{\n position: absolute;\n left:50%;\n top:50%;\n transform:translate(-50%,-50%)\n } \n #card-element{\n padding : 20px;\n border : 1px solid rgb(185, 185, 185);\n border-radius: 5px;\n background-color : #fff;\n box-shadow : 0px 5px 16px -2px rgba(0,0,0,0.25);\n }\n #logo-image{\n width: 200px;\n margin-bottom: 20px;\n }\n #logo-image-holder{\n text-align : center;\n }\n #logo-icon{\n font-size : 72px;\n text-align : center;\n margin-bottom : 20px;\n margin-top : 20px\n } \n #card-container{\n margin-top : 20px\n } \n #card-submit{\n margin-top: 20px;\n text-align: center;\n padding: 20px;\n color: #fff;\n background-color: #000;\n box-shadow: 0px 5px 16px -2px rgba(0,0,0,0.25);\n border-radius: 5px;\n } \n #card-errors{\n background-color: #ff3f34,\n color : #fff,\n padding : 20px,\n border-radius : 5px,\n margin-top : 20px,\n display : none\n }\n #payment-amount-container{\n font-size : 48px,\n text-align : center,\n margin-bottom : 20px,\n color : #000\n\n }\n #payment-amount-description-container{\n text-align : center;\n font-size : 24px;\n } \n #setup_description{\n text-align : center;\n margin-bottom : 20px;\n }\n\n #success{\n position: fixed;\n left:50%;\n top:50%;\n transform: translate(-50%,-50%);\n font-size:128px;\n color:##Colors.success##;\n text-align:center\n \n }\n #sucess_message{\n color:#000;\n font-size:20px;\n margin-top:10px;\n }\n\n #existing-card{\n background-color: #fff;\n border-radius: 10px;\n position: relative;\n display: flex;\n align-items: center;\n }\n #existing-card-brand{\n font-size: 46px;\n color : #171531;\n flex:1\n }\n #existing-card-number{\n color: #171531;\n } \n \n #card-change{\n margin-top: 20px;\n text-align: center;\n padding: 20px;\n color: #fff;\n background-color: #000;\n box-shadow: 0px 5px 16px -2px rgba(0,0,0,0.25);\n border-radius: 5px;\n }\n\n\n #payment-price{\n text-align: center;\n font-size: 32px;\n }\n\n #payment-description{\n text-align: center;\n font-style: italic;\n }\n \n\n\n";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.styleTemplate = void 0;
4
+ exports.styleTemplate = "\n body{\n font-family: 'Open Sans';\n background-color:#fff;\n color:#000\n }\n #loading_container{\n background-color:rgba(255,255,255,0.6);\n color:#000;\n position: fixed;\n left:0px;\n right:0px;\n top:0px;\n bottom:0px;\n z-index:1000;\n font-size:128px;\n }\n #loading{\n position: absolute;\n left:50%;\n top:50%;\n transform:translate(-50%,-50%)\n } \n #card-element{\n padding : 20px;\n border : 1px solid rgb(185, 185, 185);\n border-radius: 5px;\n background-color : #fff;\n box-shadow : 0px 5px 16px -2px rgba(0,0,0,0.25);\n }\n #logo-image{\n width: 200px;\n margin-bottom: 20px;\n }\n #logo-image-holder{\n text-align : center;\n }\n #logo-icon{\n font-size : 72px;\n text-align : center;\n margin-bottom : 20px;\n margin-top : 20px\n } \n #card-container{\n margin-top : 20px\n } \n #card-submit{\n margin-top: 20px;\n text-align: center;\n padding: 20px;\n color: #fff;\n background-color: #000;\n box-shadow: 0px 5px 16px -2px rgba(0,0,0,0.25);\n border-radius: 5px;\n } \n #card-errors{\n background-color: #ff3f34,\n color : #fff,\n padding : 20px,\n border-radius : 5px,\n margin-top : 20px,\n display : none\n }\n #payment-amount-container{\n font-size : 48px,\n text-align : center,\n margin-bottom : 20px,\n color : #000\n\n }\n #payment-amount-description-container{\n text-align : center;\n font-size : 24px;\n } \n #setup_description{\n text-align : center;\n margin-bottom : 20px;\n }\n\n #success{\n position: fixed;\n left:50%;\n top:50%;\n transform: translate(-50%,-50%);\n font-size:128px;\n color:##Colors.success##;\n text-align:center\n \n }\n #sucess_message{\n color:#000;\n font-size:20px;\n margin-top:10px;\n }\n\n #existing-card{\n background-color: #fff;\n border-radius: 10px;\n position: relative;\n display: flex;\n align-items: center;\n }\n #existing-card-brand{\n font-size: 46px;\n color : #171531;\n flex:1\n }\n #existing-card-number{\n color: #171531;\n } \n \n #card-change{\n margin-top: 20px;\n text-align: center;\n padding: 20px;\n color: #fff;\n background-color: #000;\n box-shadow: 0px 5px 16px -2px rgba(0,0,0,0.25);\n border-radius: 5px;\n }\n\n\n #payment-price{\n text-align: center;\n font-size: 32px;\n }\n\n #payment-description{\n text-align: center;\n font-style: italic;\n }\n \n\n\n";
@@ -0,0 +1,2 @@
1
+ export declare function encrypt(password: string, salt: string): Promise<string>;
2
+ export declare function genSalt(rounds?: number): Promise<string>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.genSalt = exports.encrypt = void 0;
7
+ var bcrypt_1 = __importDefault(require("bcrypt"));
8
+ function encrypt(password, salt) {
9
+ return new Promise(function (resolve, reject) {
10
+ bcrypt_1.default.hash(password, salt, function (err, hash) {
11
+ if (err)
12
+ reject(err);
13
+ resolve(hash);
14
+ });
15
+ });
16
+ }
17
+ exports.encrypt = encrypt;
18
+ function genSalt(rounds) {
19
+ if (rounds === void 0) { rounds = 10; }
20
+ return new Promise(function (resolve, reject) {
21
+ bcrypt_1.default.genSalt(rounds, function (err, salt) {
22
+ if (err)
23
+ reject(err);
24
+ resolve(salt);
25
+ });
26
+ });
27
+ }
28
+ exports.genSalt = genSalt;
package/nodemon.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "watch": ["src", "spec"],
3
+ "ext": "ts,json",
4
+ "watchOptions": {
5
+ "followSymlinks": false
6
+ }
7
+ }
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@flink-app/s3-plugin",
3
+ "version": "0.3.5",
4
+ "description": "Flink plugin to work with s3",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\"",
7
+ "prepublish": "tsc"
8
+ },
9
+ "author": "johan@frost.se",
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "license": "MIT",
14
+ "types": "dist/index.d.ts",
15
+ "main": "dist/index.js",
16
+ "dependencies": {
17
+ "@types/mime-types": "^2.1.1",
18
+ "aws-sdk": "^2.1117.0",
19
+ "express": "^4.17.1",
20
+ "express-fileupload": "^1.3.1",
21
+ "mime-types": "^2.1.35",
22
+ "node-color-log": "^5.3.1"
23
+ },
24
+ "devDependencies": {
25
+ "@flink-app/flink": "^0.3.0",
26
+ "@types/express": "4.17.13",
27
+ "@types/express-fileupload": "^1.2.2",
28
+ "@types/node": "^15.6.2",
29
+ "@types/uuid": "^8.3.4",
30
+ "ts-node": "^9.1.1",
31
+ "typescript": "^4.2.4"
32
+ },
33
+ "gitHead": "4842a9ec23adee7e70e98f63adb9ff3629a76c2a"
34
+ }
package/readme.md ADDED
@@ -0,0 +1,57 @@
1
+ # Flink API Docs
2
+
3
+ **WORK IN PROGRESS 👷‍♀️👷🏻‍♂️**
4
+
5
+ A FLINK plugin that lets you work with s3.
6
+
7
+ ## Usage
8
+
9
+ Install plugin to your flink app project:
10
+
11
+ ```
12
+ npm i -S @flink-app/s3-plugin
13
+ ```
14
+
15
+ Add and configure plugin in your app startup (probable the `index.ts` in root project):
16
+
17
+ ```
18
+ import { s3Plugin } from "@flink-app/s3-plugin";
19
+
20
+
21
+ function start() {
22
+ new FlinkApp<AppContext>({
23
+ name: "My app",
24
+ plugins: [
25
+ // Register plugin
26
+ s3Plugin({
27
+ accessKeyId: "XXX",
28
+ secretAccessKey: "YYY",
29
+ bucket: "ZZZ",
30
+ s3Acl: "public-read",
31
+ enableUpload: true,
32
+ }),
33
+ ],
34
+ }).start();
35
+ }
36
+ ```
37
+
38
+ Finally add the s3PluginContext to your `Ctx.ts`
39
+ ```
40
+ import { s3PluginContext } from "@flink-app/s3-plugin"
41
+ export interface Ctx extends FlinkContext<s3PluginContext> {
42
+
43
+ }
44
+ ```
45
+
46
+
47
+
48
+ ## Using built in upload endpoint
49
+ Set `enableUpload = true` to enable the /file-upload endpoint.
50
+ Post a multipart file upload to that endpoint to upload the file to S3.
51
+ Protect this route by specifying the required permission by specifying `uploadPermissionRequired` property to the required permission. Eg. `uploadPermissionRequired="authenticated"` setting.
52
+
53
+
54
+ ## Using the s3Client
55
+ From your handlers, access the s3Client by `ctx.plugins.s3Plugin.s3Client`.
56
+ You will find methods for upload, delete and so on.
57
+
package/src/index.ts ADDED
@@ -0,0 +1,100 @@
1
+ import { badRequest, FlinkApp, FlinkPlugin, HttpMethod, internalServerError, log, unauthorized } from "@flink-app/flink";
2
+ import { s3PluginOptions } from "./schemas/s3PluginOptions";
3
+ export * from "./s3PluginContext";
4
+ import S3Client from "./s3Client";
5
+ import expressFileupload from "express-fileupload";
6
+ import { UploadedFile } from "express-fileupload";
7
+ import * as uuid from "uuid";
8
+ import mime from "mime-types";
9
+
10
+ export const s3Plugin = (options: s3PluginOptions): FlinkPlugin => {
11
+ const s3Client = new S3Client({
12
+ accessKeyId: options.accessKeyId,
13
+ secretAccessKey: options.secretAccessKey,
14
+ bucket: options.bucket,
15
+ s3Acl: options.s3Acl,
16
+ endpoint: options.endpoint,
17
+ });
18
+
19
+ return {
20
+ id: "s3Plugin",
21
+ init: (app) => init(app, options),
22
+ ctx: {
23
+ s3Client,
24
+ },
25
+ };
26
+ };
27
+
28
+ function init(app: FlinkApp<any>, options: s3PluginOptions) {
29
+ if (options.enableUpload) {
30
+ let maxFileSize = options.maxFileSize || 10;
31
+ app.expressApp!.use(
32
+ expressFileupload({
33
+ limits: { fileSize: maxFileSize * 1024 * 1024 },
34
+ abortOnLimit: true,
35
+ })
36
+ );
37
+
38
+ let uploadUrl = options.uploadUrl || "/file-upload";
39
+
40
+ app.expressApp!.post(uploadUrl, async (req, res) => {
41
+ if (options.uploadPermissionRequired) {
42
+ let authenticated = (await app.ctx.auth?.authenticateRequest(req, [options.uploadPermissionRequired])) as boolean;
43
+ if (!authenticated) {
44
+ res.status(500).json({
45
+ status: 500,
46
+ error: { id: uuid.v4(), title: "Permission denied", detail: "Permission denied to this endpoint", code: "permissionDenied" },
47
+ });
48
+ return;
49
+ }
50
+ }
51
+ const file = req.files?.file as UploadedFile;
52
+ if (!file) {
53
+ res.status(500).json({ status: 500, error: { id: uuid.v4(), title: "No file", detail: "No file specified", code: "badRequest" } });
54
+ return;
55
+ }
56
+
57
+ const { path } = req.query;
58
+
59
+ const s3Client = app.ctx.plugins.s3Plugin.s3Client as S3Client;
60
+ if (s3Client == null) {
61
+ res.status(500).json({
62
+ status: 500,
63
+ error: { id: uuid.v4(), title: "Plugin not initialized", detail: "S3 Client not initialized", code: "badRequest" },
64
+ });
65
+ return;
66
+ }
67
+
68
+ const fileSplit = file.name.split(".");
69
+ const fileExt = fileSplit.length > 1 ? fileSplit[fileSplit.length - 1] : mime.extension(file.mimetype);
70
+ const filename = formatS3Path(path ? (path as string) : "") + uuid.v4() + "." + fileExt;
71
+ try {
72
+ const uploadData = await s3Client.uploadFile(filename, file.data, file.mimetype);
73
+ res.json({
74
+ url: uploadData.Location,
75
+ });
76
+ } catch (ex) {
77
+ res.status(500).json({
78
+ status: 500,
79
+ error: { id: uuid.v4(), title: "Internal server error", detail: "Internal server errror while communicating with S3", code: "badRequest" },
80
+ });
81
+ }
82
+ });
83
+ log.info("Registered route POST " + uploadUrl);
84
+ }
85
+ }
86
+
87
+ function formatS3Path(path: string) {
88
+ path = path.trim();
89
+
90
+ if (path) {
91
+ if (path.startsWith("/")) {
92
+ path = path.substr(1);
93
+ }
94
+
95
+ if (!path.endsWith("/")) {
96
+ path = path + "/";
97
+ }
98
+ }
99
+ return path;
100
+ }