@deenruv/admin-ui-plugin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/lib/admin-ui/123.1d21e707f57ee3b4.js +33 -0
- package/lib/admin-ui/123.1d21e707f57ee3b4.js.map +1 -0
- package/lib/admin-ui/132.9c69fc8bd3b0cec4.js +2 -0
- package/lib/admin-ui/132.9c69fc8bd3b0cec4.js.map +1 -0
- package/lib/admin-ui/153.7eec6efd3edd54b4.js +321 -0
- package/lib/admin-ui/153.7eec6efd3edd54b4.js.map +1 -0
- package/lib/admin-ui/3rdpartylicenses.txt +1393 -0
- package/lib/admin-ui/473.fc9f902d000ba044.js +2 -0
- package/lib/admin-ui/473.fc9f902d000ba044.js.map +1 -0
- package/lib/admin-ui/53.7f3fee856943b03f.js +86 -0
- package/lib/admin-ui/53.7f3fee856943b03f.js.map +1 -0
- package/lib/admin-ui/625.64b1900ed11327c1.js +46 -0
- package/lib/admin-ui/625.64b1900ed11327c1.js.map +1 -0
- package/lib/admin-ui/697.ff9c92dd4b564093.js +73 -0
- package/lib/admin-ui/697.ff9c92dd4b564093.js.map +1 -0
- package/lib/admin-ui/99.b9d2442a2288abdb.js +379 -0
- package/lib/admin-ui/99.b9d2442a2288abdb.js.map +1 -0
- package/lib/admin-ui/assets/.gitkeep +0 -0
- package/lib/admin-ui/assets/logo-login.webp +0 -0
- package/lib/admin-ui/assets/logo-top.webp +0 -0
- package/lib/admin-ui/common.868070cec3f2418e.js +2 -0
- package/lib/admin-ui/common.868070cec3f2418e.js.map +1 -0
- package/lib/admin-ui/deenruv-ui-config.json +290 -0
- package/lib/admin-ui/favicon.ico +0 -0
- package/lib/admin-ui/fonts/fonts.scss +253 -0
- package/lib/admin-ui/fonts/inter-cyrillic-ext.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-cyrillic.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-greek-ext.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-greek.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-latin-ext.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-latin.woff2 +0 -0
- package/lib/admin-ui/fonts/inter-vietnamese.woff2 +0 -0
- package/lib/admin-ui/i18n-messages/ar.json +814 -0
- package/lib/admin-ui/i18n-messages/cs.json +814 -0
- package/lib/admin-ui/i18n-messages/de.json +814 -0
- package/lib/admin-ui/i18n-messages/en.json +814 -0
- package/lib/admin-ui/i18n-messages/es.json +814 -0
- package/lib/admin-ui/i18n-messages/fa.json +814 -0
- package/lib/admin-ui/i18n-messages/fr.json +814 -0
- package/lib/admin-ui/i18n-messages/he.json +814 -0
- package/lib/admin-ui/i18n-messages/hr.json +814 -0
- package/lib/admin-ui/i18n-messages/it.json +814 -0
- package/lib/admin-ui/i18n-messages/nb.json +812 -0
- package/lib/admin-ui/i18n-messages/ne.json +814 -0
- package/lib/admin-ui/i18n-messages/pl.json +814 -0
- package/lib/admin-ui/i18n-messages/pt_BR.json +814 -0
- package/lib/admin-ui/i18n-messages/pt_PT.json +814 -0
- package/lib/admin-ui/i18n-messages/ru.json +814 -0
- package/lib/admin-ui/i18n-messages/sv.json +807 -0
- package/lib/admin-ui/i18n-messages/uk.json +814 -0
- package/lib/admin-ui/i18n-messages/zh_Hans.json +814 -0
- package/lib/admin-ui/i18n-messages/zh_Hant.json +814 -0
- package/lib/admin-ui/index.html +14 -0
- package/lib/admin-ui/inter-cyrillic-ext.f62cc866835dd717.woff2 +0 -0
- package/lib/admin-ui/inter-cyrillic.fd42267cbb1bfdb0.woff2 +0 -0
- package/lib/admin-ui/inter-greek-ext.f876a5a3ea45d9a5.woff2 +0 -0
- package/lib/admin-ui/inter-greek.0455348926d6f41d.woff2 +0 -0
- package/lib/admin-ui/inter-latin-ext.7df16007e26681f5.woff2 +0 -0
- package/lib/admin-ui/inter-latin.40c45725dc5f525d.woff2 +0 -0
- package/lib/admin-ui/inter-vietnamese.530676b65c9e977f.woff2 +0 -0
- package/lib/admin-ui/main.a1f6ce60f6b53c40.js +3241 -0
- package/lib/admin-ui/main.a1f6ce60f6b53c40.js.map +1 -0
- package/lib/admin-ui/polyfills.34e462102e9d0666.js +2 -0
- package/lib/admin-ui/polyfills.34e462102e9d0666.js.map +1 -0
- package/lib/admin-ui/polyfills.ts +66 -0
- package/lib/admin-ui/runtime.12183b5e8f8cfd14.js +2 -0
- package/lib/admin-ui/runtime.12183b5e8f8cfd14.js.map +1 -0
- package/lib/admin-ui/styles/_mixins.scss +60 -0
- package/lib/admin-ui/styles/_variables.scss +11 -0
- package/lib/admin-ui/styles/component/prosemirror.scss +511 -0
- package/lib/admin-ui/styles/global/_buttons.scss +147 -0
- package/lib/admin-ui/styles/global/_clarity.scss +140 -0
- package/lib/admin-ui/styles/global/_forms.scss +187 -0
- package/lib/admin-ui/styles/global/_global.scss +41 -0
- package/lib/admin-ui/styles/global/_overrides.scss +165 -0
- package/lib/admin-ui/styles/global/_sass-overrides.scss +8 -0
- package/lib/admin-ui/styles/global/_utilities.scss +155 -0
- package/lib/admin-ui/styles/rtl.scss +143 -0
- package/lib/admin-ui/styles/styles.scss +19 -0
- package/lib/admin-ui/styles/theme/dark.scss +591 -0
- package/lib/admin-ui/styles/theme/default.scss +254 -0
- package/lib/admin-ui/styles/ui-extension-theme.scss +13 -0
- package/lib/admin-ui/styles.2de83a2df5e76526.css +3 -0
- package/lib/admin-ui/styles.2de83a2df5e76526.css.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/src/api/metrics.resolver.d.ts +8 -0
- package/lib/src/api/metrics.resolver.js +41 -0
- package/lib/src/api/metrics.resolver.js.map +1 -0
- package/lib/src/config/metrics-strategies.d.ts +39 -0
- package/lib/src/config/metrics-strategies.js +92 -0
- package/lib/src/config/metrics-strategies.js.map +1 -0
- package/lib/src/constants.d.ts +7 -0
- package/lib/src/constants.js +286 -0
- package/lib/src/constants.js.map +1 -0
- package/lib/src/plugin.d.ts +129 -0
- package/lib/src/plugin.js +332 -0
- package/lib/src/plugin.js.map +1 -0
- package/lib/src/service/metrics.service.d.ts +16 -0
- package/lib/src/service/metrics.service.js +144 -0
- package/lib/src/service/metrics.service.js.map +1 -0
- package/lib/src/types.d.ts +23 -0
- package/lib/src/types.js +14 -0
- package/lib/src/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
var AdminUiPlugin_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.AdminUiPlugin = void 0;
|
|
17
|
+
const shared_constants_1 = require("@deenruv/common/lib/shared-constants");
|
|
18
|
+
const core_1 = require("@deenruv/core");
|
|
19
|
+
const express_1 = __importDefault(require("express"));
|
|
20
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const metrics_resolver_1 = require("./api/metrics.resolver");
|
|
23
|
+
const constants_1 = require("./constants");
|
|
24
|
+
const metrics_service_1 = require("./service/metrics.service");
|
|
25
|
+
const graphql_tag_1 = __importDefault(require("graphql-tag"));
|
|
26
|
+
/**
|
|
27
|
+
* @description
|
|
28
|
+
* This plugin starts a static server for the Admin UI app, and proxies it via the `/admin/` path of the main Deenruv server.
|
|
29
|
+
*
|
|
30
|
+
* The Admin UI allows you to administer all aspects of your store, from inventory management to order tracking. It is the tool used by
|
|
31
|
+
* store administrators on a day-to-day basis for the management of the store.
|
|
32
|
+
*
|
|
33
|
+
* ## Installation
|
|
34
|
+
*
|
|
35
|
+
* `yarn add \@deenruv/admin-ui-plugin`
|
|
36
|
+
*
|
|
37
|
+
* or
|
|
38
|
+
*
|
|
39
|
+
* `npm install \@deenruv/admin-ui-plugin`
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { AdminUiPlugin } from '\@deenruv/admin-ui-plugin';
|
|
44
|
+
*
|
|
45
|
+
* const config: DeenruvConfig = {
|
|
46
|
+
* // Add an instance of the plugin to the plugins array
|
|
47
|
+
* plugins: [
|
|
48
|
+
* AdminUiPlugin.init({ port: 3002 }),
|
|
49
|
+
* ],
|
|
50
|
+
* };
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* ## Metrics
|
|
54
|
+
*
|
|
55
|
+
* This plugin also defines a `metricSummary` query which is used by the Admin UI to display the order metrics on the dashboard.
|
|
56
|
+
*
|
|
57
|
+
* If you are building a stand-alone version of the Admin UI app, and therefore don't need this plugin to server the Admin UI,
|
|
58
|
+
* you can still use the `metricSummary` query by adding the `AdminUiPlugin` to the `plugins` array, but without calling the `init()` method:
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { AdminUiPlugin } from '\@deenruv/admin-ui-plugin';
|
|
63
|
+
*
|
|
64
|
+
* const config: DeenruvConfig = {
|
|
65
|
+
* plugins: [
|
|
66
|
+
* AdminUiPlugin, // <-- no call to .init()
|
|
67
|
+
* ],
|
|
68
|
+
* // ...
|
|
69
|
+
* };
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @docsCategory core plugins/AdminUiPlugin
|
|
73
|
+
*/
|
|
74
|
+
let AdminUiPlugin = AdminUiPlugin_1 = class AdminUiPlugin {
|
|
75
|
+
constructor(configService, processContext) {
|
|
76
|
+
this.configService = configService;
|
|
77
|
+
this.processContext = processContext;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @description
|
|
81
|
+
* Set the plugin options
|
|
82
|
+
*/
|
|
83
|
+
static init(options) {
|
|
84
|
+
this.options = options;
|
|
85
|
+
return AdminUiPlugin_1;
|
|
86
|
+
}
|
|
87
|
+
async configure(consumer) {
|
|
88
|
+
if (this.processContext.isWorker) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (!AdminUiPlugin_1.options) {
|
|
92
|
+
core_1.Logger.info(`AdminUiPlugin's init() method was not called. The Admin UI will not be served.`, constants_1.loggerCtx);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const { app, hostname, route, adminUiConfig } = AdminUiPlugin_1.options;
|
|
96
|
+
const adminUiAppPath = AdminUiPlugin_1.isDevModeApp(app)
|
|
97
|
+
? path_1.default.join(app.sourcePath, "src")
|
|
98
|
+
: (app && app.path) || constants_1.DEFAULT_APP_PATH;
|
|
99
|
+
const adminUiConfigPath = path_1.default.join(adminUiAppPath, "deenruv-ui-config.json");
|
|
100
|
+
const indexHtmlPath = path_1.default.join(adminUiAppPath, "index.html");
|
|
101
|
+
const overwriteConfig = async () => {
|
|
102
|
+
const uiConfig = this.getAdminUiConfig(adminUiConfig);
|
|
103
|
+
await this.overwriteAdminUiConfig(adminUiConfigPath, uiConfig);
|
|
104
|
+
await this.overwriteBaseHref(indexHtmlPath, route);
|
|
105
|
+
};
|
|
106
|
+
let port;
|
|
107
|
+
if (AdminUiPlugin_1.isDevModeApp(app)) {
|
|
108
|
+
port = app.port;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
port = AdminUiPlugin_1.options.port;
|
|
112
|
+
}
|
|
113
|
+
if (AdminUiPlugin_1.isDevModeApp(app)) {
|
|
114
|
+
core_1.Logger.info("Creating admin ui middleware (dev mode)", constants_1.loggerCtx);
|
|
115
|
+
consumer
|
|
116
|
+
.apply((0, core_1.createProxyHandler)({
|
|
117
|
+
hostname,
|
|
118
|
+
port,
|
|
119
|
+
route,
|
|
120
|
+
label: "Admin UI",
|
|
121
|
+
basePath: route,
|
|
122
|
+
}))
|
|
123
|
+
.forRoutes(route);
|
|
124
|
+
consumer
|
|
125
|
+
.apply((0, core_1.createProxyHandler)({
|
|
126
|
+
hostname,
|
|
127
|
+
port,
|
|
128
|
+
route: "sockjs-node",
|
|
129
|
+
label: "Admin UI live reload",
|
|
130
|
+
basePath: "sockjs-node",
|
|
131
|
+
}))
|
|
132
|
+
.forRoutes("sockjs-node");
|
|
133
|
+
core_1.Logger.info("Compiling Admin UI app in development mode", constants_1.loggerCtx);
|
|
134
|
+
app.compile().then(() => {
|
|
135
|
+
core_1.Logger.info("Admin UI compiling and watching for changes...", constants_1.loggerCtx);
|
|
136
|
+
}, (err) => {
|
|
137
|
+
core_1.Logger.error(`Failed to compile: ${JSON.stringify(err)}`, constants_1.loggerCtx, err.stack);
|
|
138
|
+
});
|
|
139
|
+
await overwriteConfig();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
core_1.Logger.info("Creating admin ui middleware (prod mode)", constants_1.loggerCtx);
|
|
143
|
+
consumer.apply(await this.createStaticServer(app)).forRoutes(route);
|
|
144
|
+
if (app && typeof app.compile === "function") {
|
|
145
|
+
core_1.Logger.info("Compiling Admin UI app in production mode...", constants_1.loggerCtx);
|
|
146
|
+
app
|
|
147
|
+
.compile()
|
|
148
|
+
.then(overwriteConfig)
|
|
149
|
+
.then(() => {
|
|
150
|
+
core_1.Logger.info("Admin UI successfully compiled", constants_1.loggerCtx);
|
|
151
|
+
}, (err) => {
|
|
152
|
+
core_1.Logger.error(`Failed to compile: ${JSON.stringify(err)}`, constants_1.loggerCtx, err.stack);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
await overwriteConfig();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
(0, core_1.registerPluginStartupMessage)("Admin UI", route);
|
|
160
|
+
}
|
|
161
|
+
async createStaticServer(app) {
|
|
162
|
+
const adminUiAppPath = (app && app.path) || constants_1.DEFAULT_APP_PATH;
|
|
163
|
+
const adminUiServer = express_1.default.Router();
|
|
164
|
+
adminUiServer.use(express_1.default.static(adminUiAppPath));
|
|
165
|
+
adminUiServer.use((req, res) => {
|
|
166
|
+
res.sendFile(path_1.default.join(adminUiAppPath, "index.html"));
|
|
167
|
+
});
|
|
168
|
+
return adminUiServer;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Takes an optional AdminUiConfig provided in the plugin options, and returns a complete
|
|
172
|
+
* config object for writing to disk.
|
|
173
|
+
*/
|
|
174
|
+
getAdminUiConfig(partialConfig) {
|
|
175
|
+
var _a, _b, _c, _d, _e;
|
|
176
|
+
const { authOptions, apiOptions } = this.configService;
|
|
177
|
+
const options = AdminUiPlugin_1.options;
|
|
178
|
+
const propOrDefault = (prop, defaultVal, isArray = false) => {
|
|
179
|
+
var _a;
|
|
180
|
+
if (isArray) {
|
|
181
|
+
const isValidArray = partialConfig
|
|
182
|
+
? !!((_a = partialConfig[prop]) === null || _a === void 0 ? void 0 : _a.length)
|
|
183
|
+
: false;
|
|
184
|
+
return !!partialConfig && isValidArray
|
|
185
|
+
? partialConfig[prop]
|
|
186
|
+
: defaultVal;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
return partialConfig
|
|
190
|
+
? partialConfig[prop] || defaultVal
|
|
191
|
+
: defaultVal;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
return {
|
|
195
|
+
adminApiPath: propOrDefault("adminApiPath", apiOptions.adminApiPath),
|
|
196
|
+
apiHost: propOrDefault("apiHost", "auto"),
|
|
197
|
+
apiPort: propOrDefault("apiPort", "auto"),
|
|
198
|
+
tokenMethod: propOrDefault("tokenMethod", authOptions.tokenMethod === "bearer" ? "bearer" : "cookie"),
|
|
199
|
+
authTokenHeaderKey: propOrDefault("authTokenHeaderKey", authOptions.authTokenHeaderKey || shared_constants_1.DEFAULT_AUTH_TOKEN_HEADER_KEY),
|
|
200
|
+
channelTokenKey: propOrDefault("channelTokenKey", apiOptions.channelTokenKey || shared_constants_1.DEFAULT_CHANNEL_TOKEN_KEY),
|
|
201
|
+
defaultLanguage: propOrDefault("defaultLanguage", constants_1.defaultLanguage),
|
|
202
|
+
defaultLocale: propOrDefault("defaultLocale", constants_1.defaultLocale),
|
|
203
|
+
availableLanguages: propOrDefault("availableLanguages", constants_1.defaultAvailableLanguages, true),
|
|
204
|
+
availableLocales: propOrDefault("availableLocales", constants_1.defaultAvailableLocales, true),
|
|
205
|
+
loginUrl: (_a = options.adminUiConfig) === null || _a === void 0 ? void 0 : _a.loginUrl,
|
|
206
|
+
brand: (_b = options.adminUiConfig) === null || _b === void 0 ? void 0 : _b.brand,
|
|
207
|
+
hideDeenruvBranding: propOrDefault("hideDeenruvBranding", ((_c = options.adminUiConfig) === null || _c === void 0 ? void 0 : _c.hideDeenruvBranding) || false),
|
|
208
|
+
hideVersion: propOrDefault("hideVersion", ((_d = options.adminUiConfig) === null || _d === void 0 ? void 0 : _d.hideVersion) || false),
|
|
209
|
+
loginImageUrl: (_e = options.adminUiConfig) === null || _e === void 0 ? void 0 : _e.loginImageUrl,
|
|
210
|
+
cancellationReasons: propOrDefault("cancellationReasons", undefined),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Overwrites the parts of the admin-ui app's `deenruv-ui-config.json` file relating to connecting to
|
|
215
|
+
* the server admin API.
|
|
216
|
+
*/
|
|
217
|
+
async overwriteAdminUiConfig(adminUiConfigPath, config) {
|
|
218
|
+
try {
|
|
219
|
+
const content = await this.pollForFile(adminUiConfigPath);
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
core_1.Logger.error(e.message, constants_1.loggerCtx);
|
|
223
|
+
throw e;
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
await fs_extra_1.default.writeFile(adminUiConfigPath, JSON.stringify(config, null, 2));
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
throw new Error("[AdminUiPlugin] Could not write deenruv-ui-config.json file:\n" +
|
|
230
|
+
JSON.stringify(e.message));
|
|
231
|
+
}
|
|
232
|
+
core_1.Logger.verbose("Applied configuration to deenruv-ui-config.json file", constants_1.loggerCtx);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Overwrites the parts of the admin-ui app's `deenruv-ui-config.json` file relating to connecting to
|
|
236
|
+
* the server admin API.
|
|
237
|
+
*/
|
|
238
|
+
async overwriteBaseHref(indexHtmlPath, baseHref) {
|
|
239
|
+
let indexHtmlContent;
|
|
240
|
+
try {
|
|
241
|
+
indexHtmlContent = await this.pollForFile(indexHtmlPath);
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
core_1.Logger.error(e.message, constants_1.loggerCtx);
|
|
245
|
+
throw e;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
const withCustomBaseHref = indexHtmlContent.replace(/<base href=".+"\s*\/>/, `<base href="/${baseHref}/" />`);
|
|
249
|
+
await fs_extra_1.default.writeFile(indexHtmlPath, withCustomBaseHref);
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
throw new Error("[AdminUiPlugin] Could not write index.html file:\n" +
|
|
253
|
+
JSON.stringify(e.message));
|
|
254
|
+
}
|
|
255
|
+
core_1.Logger.verbose(`Applied baseHref "/${baseHref}/" to index.html file`, constants_1.loggerCtx);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* It might be that the ui-devkit compiler has not yet copied the config
|
|
259
|
+
* file to the expected location (particularly when running in watch mode),
|
|
260
|
+
* so polling is used to check multiple times with a delay.
|
|
261
|
+
*/
|
|
262
|
+
async pollForFile(filePath) {
|
|
263
|
+
const maxRetries = 10;
|
|
264
|
+
const retryDelay = 200;
|
|
265
|
+
let attempts = 0;
|
|
266
|
+
const pause = () => new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
267
|
+
while (attempts < maxRetries) {
|
|
268
|
+
try {
|
|
269
|
+
core_1.Logger.verbose(`Checking for admin ui file: ${filePath}`, constants_1.loggerCtx);
|
|
270
|
+
const configFileContent = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
271
|
+
return configFileContent;
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
attempts++;
|
|
275
|
+
core_1.Logger.verbose(`Unable to locate admin ui file: ${filePath} (attempt ${attempts})`, constants_1.loggerCtx);
|
|
276
|
+
}
|
|
277
|
+
await pause();
|
|
278
|
+
}
|
|
279
|
+
throw new Error(`Unable to locate admin ui file: ${filePath}`);
|
|
280
|
+
}
|
|
281
|
+
static isDevModeApp(app) {
|
|
282
|
+
if (!app) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
return !!app.sourcePath;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
exports.AdminUiPlugin = AdminUiPlugin;
|
|
289
|
+
exports.AdminUiPlugin = AdminUiPlugin = AdminUiPlugin_1 = __decorate([
|
|
290
|
+
(0, core_1.DeenruvPlugin)({
|
|
291
|
+
imports: [core_1.PluginCommonModule],
|
|
292
|
+
adminApiExtensions: {
|
|
293
|
+
schema: (0, graphql_tag_1.default) `
|
|
294
|
+
type MetricSummary {
|
|
295
|
+
interval: MetricInterval!
|
|
296
|
+
type: MetricType!
|
|
297
|
+
title: String!
|
|
298
|
+
entries: [MetricSummaryEntry!]!
|
|
299
|
+
}
|
|
300
|
+
enum MetricInterval {
|
|
301
|
+
Daily
|
|
302
|
+
}
|
|
303
|
+
enum MetricType {
|
|
304
|
+
OrderCount
|
|
305
|
+
OrderTotal
|
|
306
|
+
AverageOrderValue
|
|
307
|
+
}
|
|
308
|
+
type MetricSummaryEntry {
|
|
309
|
+
label: String!
|
|
310
|
+
value: Float!
|
|
311
|
+
}
|
|
312
|
+
input MetricSummaryInput {
|
|
313
|
+
interval: MetricInterval!
|
|
314
|
+
types: [MetricType!]!
|
|
315
|
+
refresh: Boolean
|
|
316
|
+
}
|
|
317
|
+
extend type Query {
|
|
318
|
+
"""
|
|
319
|
+
Get metrics for the given interval and metric types.
|
|
320
|
+
"""
|
|
321
|
+
metricSummary(input: MetricSummaryInput): [MetricSummary!]!
|
|
322
|
+
}
|
|
323
|
+
`,
|
|
324
|
+
resolvers: [metrics_resolver_1.MetricsResolver],
|
|
325
|
+
},
|
|
326
|
+
providers: [metrics_service_1.MetricsService],
|
|
327
|
+
compatibility: "^0.0.0",
|
|
328
|
+
}),
|
|
329
|
+
__metadata("design:paramtypes", [core_1.ConfigService,
|
|
330
|
+
core_1.ProcessContext])
|
|
331
|
+
], AdminUiPlugin);
|
|
332
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2EAG8C;AAO9C,wCAQuB;AACvB,sDAA8B;AAC9B,wDAA0B;AAC1B,gDAAwB;AAExB,6DAAyD;AACzD,2CAOqB;AACrB,+DAA2D;AAC3D,8DAA8B;AA8C9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAwCI,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAGxB,YACU,aAA4B,EAC5B,cAA8B;QAD9B,kBAAa,GAAb,aAAa,CAAe;QAC5B,mBAAc,GAAd,cAAc,CAAgB;IACrC,CAAC;IAEJ;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,eAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAA4B;QAC1C,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,aAAM,CAAC,IAAI,CACT,gFAAgF,EAChF,qBAAS,CACV,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,eAAa,CAAC,OAAO,CAAC;QACtE,MAAM,cAAc,GAAG,eAAa,CAAC,YAAY,CAAC,GAAG,CAAC;YACpD,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;YAClC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,4BAAgB,CAAC;QAC1C,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CACjC,cAAc,EACd,wBAAwB,CACzB,CAAC;QACF,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAE9D,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,IAAI,IAAY,CAAC;QACjB,IAAI,eAAa,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,eAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,CAAC;QAED,IAAI,eAAa,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,aAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,qBAAS,CAAC,CAAC;YAClE,QAAQ;iBACL,KAAK,CACJ,IAAA,yBAAkB,EAAC;gBACjB,QAAQ;gBACR,IAAI;gBACJ,KAAK;gBACL,KAAK,EAAE,UAAU;gBACjB,QAAQ,EAAE,KAAK;aAChB,CAAC,CACH;iBACA,SAAS,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ;iBACL,KAAK,CACJ,IAAA,yBAAkB,EAAC;gBACjB,QAAQ;gBACR,IAAI;gBACJ,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,sBAAsB;gBAC7B,QAAQ,EAAE,aAAa;aACxB,CAAC,CACH;iBACA,SAAS,CAAC,aAAa,CAAC,CAAC;YAE5B,aAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,qBAAS,CAAC,CAAC;YACrE,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAChB,GAAG,EAAE;gBACH,aAAM,CAAC,IAAI,CACT,gDAAgD,EAChD,qBAAS,CACV,CAAC;YACJ,CAAC,EACD,CAAC,GAAQ,EAAE,EAAE;gBACX,aAAM,CAAC,KAAK,CACV,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAC3C,qBAAS,EACT,GAAG,CAAC,KAAK,CACV,CAAC;YACJ,CAAC,CACF,CAAC;YACF,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,aAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,qBAAS,CAAC,CAAC;YACnE,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEpE,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC7C,aAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE,qBAAS,CAAC,CAAC;gBACvE,GAAG;qBACA,OAAO,EAAE;qBACT,IAAI,CAAC,eAAe,CAAC;qBACrB,IAAI,CACH,GAAG,EAAE;oBACH,aAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,qBAAS,CAAC,CAAC;gBAC3D,CAAC,EACD,CAAC,GAAQ,EAAE,EAAE;oBACX,aAAM,CAAC,KAAK,CACV,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAC3C,qBAAS,EACT,GAAG,CAAC,KAAK,CACV,CAAC;gBACJ,CAAC,CACF,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAA,mCAA4B,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,GAAsB;QACrD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,4BAAgB,CAAC;QAE7D,MAAM,aAAa,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAC;QACvC,aAAa,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAClD,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;OAGG;IACK,gBAAgB,CACtB,aAAsC;;QAEtC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAEvD,MAAM,OAAO,GAAG,eAAa,CAAC,OAAQ,CAAC;QACvC,MAAM,aAAa,GAAG,CACpB,IAAU,EACV,UAA+B,EAC/B,UAAmB,KAAK,EACH,EAAE;;YACvB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,YAAY,GAAG,aAAa;oBAChC,CAAC,CAAC,CAAC,CAAC,CAAA,MAAE,aAA+B,CAAC,IAAI,CAAW,0CAAE,MAAM,CAAA;oBAC7D,CAAC,CAAC,KAAK,CAAC;gBAEV,OAAO,CAAC,CAAC,aAAa,IAAI,YAAY;oBACpC,CAAC,CAAE,aAA+B,CAAC,IAAI,CAAC;oBACxC,CAAC,CAAC,UAAU,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,aAAa;oBAClB,CAAC,CAAE,aAA+B,CAAC,IAAI,CAAC,IAAI,UAAU;oBACtD,CAAC,CAAC,UAAU,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QACF,OAAO;YACL,YAAY,EAAE,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC;YACpE,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC;YACzC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC;YACzC,WAAW,EAAE,aAAa,CACxB,aAAa,EACb,WAAW,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAC3D;YACD,kBAAkB,EAAE,aAAa,CAC/B,oBAAoB,EACpB,WAAW,CAAC,kBAAkB,IAAI,gDAA6B,CAChE;YACD,eAAe,EAAE,aAAa,CAC5B,iBAAiB,EACjB,UAAU,CAAC,eAAe,IAAI,4CAAyB,CACxD;YACD,eAAe,EAAE,aAAa,CAAC,iBAAiB,EAAE,2BAAe,CAAC;YAClE,aAAa,EAAE,aAAa,CAAC,eAAe,EAAE,yBAAa,CAAC;YAC5D,kBAAkB,EAAE,aAAa,CAC/B,oBAAoB,EACpB,qCAAyB,EACzB,IAAI,CACL;YACD,gBAAgB,EAAE,aAAa,CAC7B,kBAAkB,EAClB,mCAAuB,EACvB,IAAI,CACL;YACD,QAAQ,EAAE,MAAA,OAAO,CAAC,aAAa,0CAAE,QAAQ;YACzC,KAAK,EAAE,MAAA,OAAO,CAAC,aAAa,0CAAE,KAAK;YACnC,mBAAmB,EAAE,aAAa,CAChC,qBAAqB,EACrB,CAAA,MAAA,OAAO,CAAC,aAAa,0CAAE,mBAAmB,KAAI,KAAK,CACpD;YACD,WAAW,EAAE,aAAa,CACxB,aAAa,EACb,CAAA,MAAA,OAAO,CAAC,aAAa,0CAAE,WAAW,KAAI,KAAK,CAC5C;YACD,aAAa,EAAE,MAAA,OAAO,CAAC,aAAa,0CAAE,aAAa;YACnD,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,EAAE,SAAS,CAAC;SACrE,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB,CAClC,iBAAyB,EACzB,MAAqB;QAErB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,aAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAS,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC;QACV,CAAC;QACD,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,gEAAgE;gBAC9D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAC5B,CAAC;QACJ,CAAC;QACD,aAAM,CAAC,OAAO,CACZ,sDAAsD,EACtD,qBAAS,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAAC,aAAqB,EAAE,QAAgB;QACrE,IAAI,gBAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,aAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAS,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC;QACV,CAAC;QACD,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CACjD,uBAAuB,EACvB,gBAAgB,QAAQ,OAAO,CAChC,CAAC;YACF,MAAM,kBAAE,CAAC,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,oDAAoD;gBAClD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAC5B,CAAC;QACJ,CAAC;QACD,aAAM,CAAC,OAAO,CACZ,sBAAsB,QAAQ,uBAAuB,EACrD,qBAAS,CACV,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,WAAW,CAAC,QAAgB;QACxC,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAE5D,OAAO,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,aAAM,CAAC,OAAO,CAAC,+BAA+B,QAAQ,EAAE,EAAE,qBAAS,CAAC,CAAC;gBACrE,MAAM,iBAAiB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,iBAAiB,CAAC;YAC3B,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,QAAQ,EAAE,CAAC;gBACX,aAAM,CAAC,OAAO,CACZ,mCAAmC,QAAQ,aAAa,QAAQ,GAAG,EACnE,qBAAS,CACV,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAEO,MAAM,CAAC,YAAY,CACzB,GAAgD;QAEhD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAE,GAA+B,CAAC,UAAU,CAAC;IACvD,CAAC;CACF,CAAA;AA7SY,sCAAa;wBAAb,aAAa;IAvCzB,IAAA,oBAAa,EAAC;QACb,OAAO,EAAE,CAAC,yBAAkB,CAAC;QAC7B,kBAAkB,EAAE;YAClB,MAAM,EAAE,IAAA,qBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8BV;YACD,SAAS,EAAE,CAAC,kCAAe,CAAC;SAC7B;QACD,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,aAAa,EAAE,QAAQ;KACxB,CAAC;qCAKyB,oBAAa;QACZ,qBAAc;GAL7B,aAAa,CA6SzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ConfigService, Order, RequestContext, TransactionalConnection } from "@deenruv/core";
|
|
2
|
+
import { MetricCalculation } from "../config/metrics-strategies";
|
|
3
|
+
import { MetricInterval, MetricSummary, MetricSummaryInput } from "../types";
|
|
4
|
+
export type MetricData = {
|
|
5
|
+
date: Date;
|
|
6
|
+
orders: Order[];
|
|
7
|
+
};
|
|
8
|
+
export declare class MetricsService {
|
|
9
|
+
private connection;
|
|
10
|
+
private configService;
|
|
11
|
+
private cache;
|
|
12
|
+
metricCalculations: MetricCalculation[];
|
|
13
|
+
constructor(connection: TransactionalConnection, configService: ConfigService);
|
|
14
|
+
getMetrics(ctx: RequestContext, { interval, types, refresh }: MetricSummaryInput): Promise<MetricSummary[]>;
|
|
15
|
+
loadData(ctx: RequestContext, interval: MetricInterval, endDate: Date): Promise<Map<number, MetricData>>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MetricsService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const shared_utils_1 = require("@deenruv/common/lib/shared-utils");
|
|
15
|
+
const core_1 = require("@deenruv/core");
|
|
16
|
+
const date_fns_1 = require("date-fns");
|
|
17
|
+
const metrics_strategies_1 = require("../config/metrics-strategies");
|
|
18
|
+
const constants_1 = require("../constants");
|
|
19
|
+
const types_1 = require("../types");
|
|
20
|
+
let MetricsService = class MetricsService {
|
|
21
|
+
constructor(connection, configService) {
|
|
22
|
+
this.connection = connection;
|
|
23
|
+
this.configService = configService;
|
|
24
|
+
this.cache = new core_1.TtlCache({
|
|
25
|
+
ttl: 1000 * 60 * 60 * 24,
|
|
26
|
+
});
|
|
27
|
+
this.metricCalculations = [
|
|
28
|
+
new metrics_strategies_1.AverageOrderValueMetric(),
|
|
29
|
+
new metrics_strategies_1.OrderCountMetric(),
|
|
30
|
+
new metrics_strategies_1.OrderTotalMetric(),
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
async getMetrics(ctx, { interval, types, refresh }) {
|
|
34
|
+
// Set 23:59:59.999 as endDate
|
|
35
|
+
const endDate = (0, date_fns_1.endOfDay)(new Date());
|
|
36
|
+
// Check if we have cached result
|
|
37
|
+
const cacheKey = JSON.stringify({
|
|
38
|
+
endDate,
|
|
39
|
+
types: types.sort(),
|
|
40
|
+
interval,
|
|
41
|
+
channel: ctx.channel.token,
|
|
42
|
+
});
|
|
43
|
+
const cachedMetricList = this.cache.get(cacheKey);
|
|
44
|
+
if (cachedMetricList && refresh !== true) {
|
|
45
|
+
core_1.Logger.verbose(`Returning cached metrics for channel ${ctx.channel.token}`, constants_1.loggerCtx);
|
|
46
|
+
return cachedMetricList;
|
|
47
|
+
}
|
|
48
|
+
// No cache, calculating new metrics
|
|
49
|
+
core_1.Logger.verbose(`No cache hit, calculating ${interval} metrics until ${endDate.toISOString()} for channel ${ctx.channel.token} for all orders`, constants_1.loggerCtx);
|
|
50
|
+
const data = await this.loadData(ctx, interval, endDate);
|
|
51
|
+
const metrics = [];
|
|
52
|
+
for (const type of types) {
|
|
53
|
+
const metric = this.metricCalculations.find((m) => m.type === type);
|
|
54
|
+
if (!metric) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Calculate entry (month or week)
|
|
58
|
+
const entries = [];
|
|
59
|
+
data.forEach((dataPerTick) => {
|
|
60
|
+
entries.push(metric.calculateEntry(ctx, interval, dataPerTick));
|
|
61
|
+
});
|
|
62
|
+
// Create metric with calculated entries
|
|
63
|
+
metrics.push({
|
|
64
|
+
interval,
|
|
65
|
+
title: metric.getTitle(ctx),
|
|
66
|
+
type: metric.type,
|
|
67
|
+
entries,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.cache.set(cacheKey, metrics);
|
|
71
|
+
return metrics;
|
|
72
|
+
}
|
|
73
|
+
async loadData(ctx, interval, endDate) {
|
|
74
|
+
let nrOfEntries;
|
|
75
|
+
let backInTimeAmount;
|
|
76
|
+
const orderRepo = this.connection.getRepository(ctx, core_1.Order);
|
|
77
|
+
// What function to use to get the current Tick of a date (i.e. the week or month number)
|
|
78
|
+
let getTickNrFn;
|
|
79
|
+
let maxTick;
|
|
80
|
+
switch (interval) {
|
|
81
|
+
case types_1.MetricInterval.Daily: {
|
|
82
|
+
nrOfEntries = 30;
|
|
83
|
+
backInTimeAmount = { days: nrOfEntries };
|
|
84
|
+
getTickNrFn = date_fns_1.getDayOfYear;
|
|
85
|
+
maxTick = 365;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
(0, shared_utils_1.assertNever)(interval);
|
|
90
|
+
}
|
|
91
|
+
const startDate = (0, date_fns_1.startOfDay)((0, date_fns_1.sub)(endDate, backInTimeAmount));
|
|
92
|
+
const startTick = getTickNrFn(startDate);
|
|
93
|
+
// Get orders in a loop until we have all
|
|
94
|
+
let skip = 0;
|
|
95
|
+
const take = 1000;
|
|
96
|
+
let hasMoreOrders = true;
|
|
97
|
+
const orders = [];
|
|
98
|
+
while (hasMoreOrders) {
|
|
99
|
+
const query = orderRepo
|
|
100
|
+
.createQueryBuilder("order")
|
|
101
|
+
.leftJoin("order.channels", "orderChannel")
|
|
102
|
+
.where("orderChannel.id=:channelId", { channelId: ctx.channelId })
|
|
103
|
+
.andWhere("order.orderPlacedAt >= :startDate", {
|
|
104
|
+
startDate: startDate.toISOString(),
|
|
105
|
+
})
|
|
106
|
+
.skip(skip)
|
|
107
|
+
.take(take);
|
|
108
|
+
const [items, nrOfOrders] = await query.getManyAndCount();
|
|
109
|
+
orders.push(...items);
|
|
110
|
+
core_1.Logger.verbose(`Fetched orders ${skip}-${skip + take} for channel ${ctx.channel.token} for ${interval} metrics`, constants_1.loggerCtx);
|
|
111
|
+
skip += items.length;
|
|
112
|
+
if (orders.length >= nrOfOrders) {
|
|
113
|
+
hasMoreOrders = false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
core_1.Logger.verbose(`Finished fetching all ${orders.length} orders for channel ${ctx.channel.token} for ${interval} metrics`, constants_1.loggerCtx);
|
|
117
|
+
const dataPerInterval = new Map();
|
|
118
|
+
const ticks = [];
|
|
119
|
+
for (let i = 1; i <= nrOfEntries; i++) {
|
|
120
|
+
if (startTick + i >= maxTick) {
|
|
121
|
+
// make sure we dont go over month 12 or week 52
|
|
122
|
+
ticks.push(startTick + i - maxTick);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
ticks.push(startTick + i);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
ticks.forEach((tick) => {
|
|
129
|
+
const ordersInCurrentTick = orders.filter((order) => getTickNrFn(order.orderPlacedAt) === tick);
|
|
130
|
+
dataPerInterval.set(tick, {
|
|
131
|
+
orders: ordersInCurrentTick,
|
|
132
|
+
date: (0, date_fns_1.setDayOfYear)(endDate, tick),
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
return dataPerInterval;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
exports.MetricsService = MetricsService;
|
|
139
|
+
exports.MetricsService = MetricsService = __decorate([
|
|
140
|
+
(0, common_1.Injectable)(),
|
|
141
|
+
__metadata("design:paramtypes", [core_1.TransactionalConnection,
|
|
142
|
+
core_1.ConfigService])
|
|
143
|
+
], MetricsService);
|
|
144
|
+
//# sourceMappingURL=metrics.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.service.js","sourceRoot":"","sources":["../../../src/service/metrics.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type MetricSummary = {
|
|
2
|
+
interval: MetricInterval;
|
|
3
|
+
type: MetricType;
|
|
4
|
+
title: string;
|
|
5
|
+
entries: MetricSummaryEntry[];
|
|
6
|
+
};
|
|
7
|
+
export declare enum MetricType {
|
|
8
|
+
OrderCount = "OrderCount",
|
|
9
|
+
OrderTotal = "OrderTotal",
|
|
10
|
+
AverageOrderValue = "AverageOrderValue"
|
|
11
|
+
}
|
|
12
|
+
export declare enum MetricInterval {
|
|
13
|
+
Daily = "Daily"
|
|
14
|
+
}
|
|
15
|
+
export type MetricSummaryEntry = {
|
|
16
|
+
label: string;
|
|
17
|
+
value: number;
|
|
18
|
+
};
|
|
19
|
+
export interface MetricSummaryInput {
|
|
20
|
+
interval: MetricInterval;
|
|
21
|
+
types: MetricType[];
|
|
22
|
+
refresh?: boolean;
|
|
23
|
+
}
|
package/lib/src/types.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetricInterval = exports.MetricType = void 0;
|
|
4
|
+
var MetricType;
|
|
5
|
+
(function (MetricType) {
|
|
6
|
+
MetricType["OrderCount"] = "OrderCount";
|
|
7
|
+
MetricType["OrderTotal"] = "OrderTotal";
|
|
8
|
+
MetricType["AverageOrderValue"] = "AverageOrderValue";
|
|
9
|
+
})(MetricType || (exports.MetricType = MetricType = {}));
|
|
10
|
+
var MetricInterval;
|
|
11
|
+
(function (MetricInterval) {
|
|
12
|
+
MetricInterval["Daily"] = "Daily";
|
|
13
|
+
})(MetricInterval || (exports.MetricInterval = MetricInterval = {}));
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AASA,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,uCAAyB,CAAA;IACzB,qDAAuC,CAAA;AACzC,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB;AAED,IAAY,cAEX;AAFD,WAAY,cAAc;IACxB,iCAAe,CAAA;AACjB,CAAC,EAFW,cAAc,8BAAd,cAAc,QAEzB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deenruv/admin-ui-plugin",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "lib/index.js",
|
|
5
|
+
"types": "lib/index.d.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"lib/**/*"
|
|
8
|
+
],
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"homepage": "https://deenruv.com/",
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/express": "^4.17.21",
|
|
16
|
+
"@types/fs-extra": "^11.0.4",
|
|
17
|
+
"express": "^4.18.3",
|
|
18
|
+
"rimraf": "^5.0.5",
|
|
19
|
+
"typescript": "5.4.2",
|
|
20
|
+
"@deenruv/common": "1.0.0",
|
|
21
|
+
"@deenruv/admin-ui": "1.0.0",
|
|
22
|
+
"@deenruv/core": "1.0.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@nestjs/common": "~10.3.10",
|
|
26
|
+
"@nestjs/graphql": "~12.2.0",
|
|
27
|
+
"date-fns": "^2.30.0",
|
|
28
|
+
"fs-extra": "^11.2.0",
|
|
29
|
+
"graphql": "~16.9.0",
|
|
30
|
+
"graphql-tag": "^2.12.6"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@deenruv/core": "^0.1.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "rimraf lib && node -r ts-node/register build.ts && npm run compile",
|
|
37
|
+
"watch": "tsc -p ./tsconfig.build.json --watch",
|
|
38
|
+
"lint": "eslint .",
|
|
39
|
+
"lint:fix": "eslint --fix .",
|
|
40
|
+
"compile": "tsc -p ./tsconfig.build.json"
|
|
41
|
+
}
|
|
42
|
+
}
|