medusa-analytics 0.0.2 → 0.0.4
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/.medusa/server/src/admin/index.js +431 -54
- package/.medusa/server/src/admin/index.mjs +432 -55
- package/.medusa/server/src/api/admin/analytics/customers-over-time/route.js +266 -0
- package/.medusa/server/src/api/admin/analytics/customers-over-time/types.js +7 -0
- package/.medusa/server/src/api/admin/analytics/customers-summary/route.js +90 -0
- package/.medusa/server/src/api/admin/analytics/customers-summary/types.js +7 -0
- package/.medusa/server/src/api/admin/analytics/orders-over-time/route.js +142 -0
- package/.medusa/server/src/api/admin/analytics/orders-over-time/types.js +7 -0
- package/.medusa/server/src/api/admin/analytics/orders-summary/route.js +14 -25
- package/.medusa/server/src/api/admin/analytics/orders-summary/types.js +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const ALLOWED_PERIODS = ["daily", "weekly", "monthly", "yearly"];
|
|
6
|
+
function toDateKey(d) {
|
|
7
|
+
return d.toISOString().slice(0, 10);
|
|
8
|
+
}
|
|
9
|
+
/** Monday 00:00 UTC for the week containing d */
|
|
10
|
+
function getWeekStart(d) {
|
|
11
|
+
const x = new Date(d);
|
|
12
|
+
x.setUTCHours(0, 0, 0, 0);
|
|
13
|
+
const day = x.getUTCDay();
|
|
14
|
+
const diff = day === 0 ? -6 : 1 - day;
|
|
15
|
+
x.setUTCDate(x.getUTCDate() + diff);
|
|
16
|
+
return x;
|
|
17
|
+
}
|
|
18
|
+
/** First day of month 00:00 UTC */
|
|
19
|
+
function getMonthStart(d) {
|
|
20
|
+
const x = new Date(d);
|
|
21
|
+
x.setUTCHours(0, 0, 0, 0);
|
|
22
|
+
x.setUTCDate(1);
|
|
23
|
+
return x;
|
|
24
|
+
}
|
|
25
|
+
/** First day of year 00:00 UTC */
|
|
26
|
+
function getYearStart(d) {
|
|
27
|
+
const x = new Date(d);
|
|
28
|
+
x.setUTCHours(0, 0, 0, 0);
|
|
29
|
+
x.setUTCMonth(0, 1);
|
|
30
|
+
return x;
|
|
31
|
+
}
|
|
32
|
+
async function GET(req, res) {
|
|
33
|
+
const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
34
|
+
const periodParam = req.query?.period;
|
|
35
|
+
const period = typeof periodParam === "string" &&
|
|
36
|
+
ALLOWED_PERIODS.includes(periodParam)
|
|
37
|
+
? periodParam
|
|
38
|
+
: "weekly";
|
|
39
|
+
// #region agent log
|
|
40
|
+
fetch("http://127.0.0.1:7242/ingest/47f434f8-0643-48e5-bd1a-edfe05973288", {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "4a7f37" },
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
sessionId: "4a7f37",
|
|
45
|
+
location: "customers-over-time/route.ts:period",
|
|
46
|
+
message: "customers-over-time GET",
|
|
47
|
+
data: { periodParam, period, queryKeys: req.query ? Object.keys(req.query) : [] },
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
hypothesisId: "H3-H4",
|
|
50
|
+
}),
|
|
51
|
+
}).catch(() => { });
|
|
52
|
+
// #endregion
|
|
53
|
+
const today = new Date();
|
|
54
|
+
today.setUTCHours(0, 0, 0, 0);
|
|
55
|
+
try {
|
|
56
|
+
const customerQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
57
|
+
entryPoint: "customer",
|
|
58
|
+
fields: ["id", "created_at"],
|
|
59
|
+
take: 50000,
|
|
60
|
+
});
|
|
61
|
+
const customersRaw = await remoteQuery(customerQuery);
|
|
62
|
+
const allCustomers = Array.isArray(customersRaw)
|
|
63
|
+
? customersRaw
|
|
64
|
+
: customersRaw
|
|
65
|
+
? [customersRaw]
|
|
66
|
+
: [];
|
|
67
|
+
let registeredIds = new Set();
|
|
68
|
+
try {
|
|
69
|
+
const authQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
70
|
+
entryPoint: "auth_identity",
|
|
71
|
+
fields: ["entity_id"],
|
|
72
|
+
take: 50000,
|
|
73
|
+
});
|
|
74
|
+
const authRaw = await remoteQuery(authQuery);
|
|
75
|
+
const authIdentities = Array.isArray(authRaw) ? authRaw : authRaw ? [authRaw] : [];
|
|
76
|
+
for (const a of authIdentities) {
|
|
77
|
+
const identity = a;
|
|
78
|
+
if (identity.entity_id)
|
|
79
|
+
registeredIds.add(identity.entity_id);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
registeredIds = new Set();
|
|
84
|
+
}
|
|
85
|
+
const rangeEnd = new Date(today);
|
|
86
|
+
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
87
|
+
function buildBucketMap(rangeStart, rangeEnd, getBucketKey) {
|
|
88
|
+
const bucketMap = {};
|
|
89
|
+
for (const c of allCustomers) {
|
|
90
|
+
const row = c;
|
|
91
|
+
const createdAt = row.created_at ? new Date(row.created_at) : null;
|
|
92
|
+
if (!createdAt ||
|
|
93
|
+
!row.id ||
|
|
94
|
+
createdAt < rangeStart ||
|
|
95
|
+
createdAt > rangeEnd)
|
|
96
|
+
continue;
|
|
97
|
+
const key = getBucketKey(createdAt);
|
|
98
|
+
if (!bucketMap[key])
|
|
99
|
+
bucketMap[key] = { registered: 0, guest: 0 };
|
|
100
|
+
if (registeredIds.has(row.id))
|
|
101
|
+
bucketMap[key].registered += 1;
|
|
102
|
+
else
|
|
103
|
+
bucketMap[key].guest += 1;
|
|
104
|
+
}
|
|
105
|
+
return bucketMap;
|
|
106
|
+
}
|
|
107
|
+
if (period === "daily") {
|
|
108
|
+
const maxDays = 7;
|
|
109
|
+
const rangeStart = new Date(today);
|
|
110
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (maxDays - 1));
|
|
111
|
+
const bucketMap = buildBucketMap(rangeStart, rangeEnd, (d) => toDateKey(d));
|
|
112
|
+
const series = [];
|
|
113
|
+
for (let i = 0; i < maxDays; i++) {
|
|
114
|
+
const d = new Date(rangeStart);
|
|
115
|
+
d.setUTCDate(d.getUTCDate() + i);
|
|
116
|
+
const key = toDateKey(d);
|
|
117
|
+
const bucket = bucketMap[key] ?? { registered: 0, guest: 0 };
|
|
118
|
+
series.push({
|
|
119
|
+
date: key,
|
|
120
|
+
registered_count: Math.floor(bucket.registered),
|
|
121
|
+
guest_count: Math.floor(bucket.guest),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
series.sort((a, b) => a.date.localeCompare(b.date));
|
|
125
|
+
// #region agent log
|
|
126
|
+
fetch("http://127.0.0.1:7242/ingest/47f434f8-0643-48e5-bd1a-edfe05973288", {
|
|
127
|
+
method: "POST",
|
|
128
|
+
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "4a7f37" },
|
|
129
|
+
body: JSON.stringify({
|
|
130
|
+
sessionId: "4a7f37",
|
|
131
|
+
location: "customers-over-time/route.ts:branch",
|
|
132
|
+
message: "customers-over-time branch",
|
|
133
|
+
data: { branch: "daily", seriesLength: series.length, firstDate: series[0]?.date, lastDate: series[series.length - 1]?.date },
|
|
134
|
+
timestamp: Date.now(),
|
|
135
|
+
hypothesisId: "H4",
|
|
136
|
+
}),
|
|
137
|
+
}).catch(() => { });
|
|
138
|
+
// #endregion
|
|
139
|
+
res.json({ series });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (period === "weekly") {
|
|
143
|
+
const maxWeeks = 7;
|
|
144
|
+
const currentWeekStart = getWeekStart(today);
|
|
145
|
+
const rangeStart = new Date(currentWeekStart);
|
|
146
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (maxWeeks - 1) * 7);
|
|
147
|
+
const bucketMap = buildBucketMap(rangeStart, rangeEnd, (d) => toDateKey(getWeekStart(d)));
|
|
148
|
+
const series = [];
|
|
149
|
+
for (let i = 0; i < maxWeeks; i++) {
|
|
150
|
+
const w = new Date(currentWeekStart);
|
|
151
|
+
w.setUTCDate(w.getUTCDate() - (maxWeeks - 1 - i) * 7);
|
|
152
|
+
const key = toDateKey(w);
|
|
153
|
+
const weekNum = maxWeeks - i;
|
|
154
|
+
const dayOfMonth = w.getUTCDate();
|
|
155
|
+
const bucket = bucketMap[key] ?? { registered: 0, guest: 0 };
|
|
156
|
+
series.push({
|
|
157
|
+
date: key,
|
|
158
|
+
label: `week${weekNum}/${String(dayOfMonth).padStart(2, "0")}`,
|
|
159
|
+
registered_count: Math.floor(bucket.registered),
|
|
160
|
+
guest_count: Math.floor(bucket.guest),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
series.sort((a, b) => a.date.localeCompare(b.date));
|
|
164
|
+
// #region agent log
|
|
165
|
+
fetch("http://127.0.0.1:7242/ingest/47f434f8-0643-48e5-bd1a-edfe05973288", {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "4a7f37" },
|
|
168
|
+
body: JSON.stringify({
|
|
169
|
+
sessionId: "4a7f37",
|
|
170
|
+
location: "customers-over-time/route.ts:branch",
|
|
171
|
+
message: "customers-over-time branch",
|
|
172
|
+
data: { branch: "weekly", seriesLength: series.length, firstDate: series[0]?.date, lastDate: series[series.length - 1]?.date },
|
|
173
|
+
timestamp: Date.now(),
|
|
174
|
+
hypothesisId: "H4",
|
|
175
|
+
}),
|
|
176
|
+
}).catch(() => { });
|
|
177
|
+
// #endregion
|
|
178
|
+
res.json({ series });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (period === "monthly") {
|
|
182
|
+
const maxMonths = 12;
|
|
183
|
+
const currentMonthStart = getMonthStart(today);
|
|
184
|
+
const rangeStart = new Date(currentMonthStart);
|
|
185
|
+
rangeStart.setUTCMonth(rangeStart.getUTCMonth() - (maxMonths - 1));
|
|
186
|
+
const monthLabels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
187
|
+
const bucketMap = buildBucketMap(rangeStart, rangeEnd, (d) => toDateKey(getMonthStart(d)));
|
|
188
|
+
const series = [];
|
|
189
|
+
for (let i = 0; i < maxMonths; i++) {
|
|
190
|
+
const m = new Date(currentMonthStart);
|
|
191
|
+
m.setUTCMonth(m.getUTCMonth() - (maxMonths - 1 - i));
|
|
192
|
+
const key = toDateKey(m);
|
|
193
|
+
const bucket = bucketMap[key] ?? { registered: 0, guest: 0 };
|
|
194
|
+
series.push({
|
|
195
|
+
date: key,
|
|
196
|
+
label: monthLabels[m.getUTCMonth()],
|
|
197
|
+
registered_count: Math.floor(bucket.registered),
|
|
198
|
+
guest_count: Math.floor(bucket.guest),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
series.sort((a, b) => a.date.localeCompare(b.date));
|
|
202
|
+
// #region agent log
|
|
203
|
+
fetch("http://127.0.0.1:7242/ingest/47f434f8-0643-48e5-bd1a-edfe05973288", {
|
|
204
|
+
method: "POST",
|
|
205
|
+
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "4a7f37" },
|
|
206
|
+
body: JSON.stringify({
|
|
207
|
+
sessionId: "4a7f37",
|
|
208
|
+
location: "customers-over-time/route.ts:branch",
|
|
209
|
+
message: "customers-over-time branch",
|
|
210
|
+
data: { branch: "monthly", seriesLength: series.length, firstDate: series[0]?.date, lastDate: series[series.length - 1]?.date },
|
|
211
|
+
timestamp: Date.now(),
|
|
212
|
+
hypothesisId: "H4",
|
|
213
|
+
}),
|
|
214
|
+
}).catch(() => { });
|
|
215
|
+
// #endregion
|
|
216
|
+
res.json({ series });
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (period === "yearly") {
|
|
220
|
+
const maxYears = 5;
|
|
221
|
+
const currentYearStart = getYearStart(today);
|
|
222
|
+
const rangeStart = new Date(currentYearStart);
|
|
223
|
+
rangeStart.setUTCFullYear(rangeStart.getUTCFullYear() - (maxYears - 1));
|
|
224
|
+
const bucketMap = buildBucketMap(rangeStart, rangeEnd, (d) => toDateKey(getYearStart(d)));
|
|
225
|
+
const series = [];
|
|
226
|
+
for (let i = 0; i < maxYears; i++) {
|
|
227
|
+
const y = new Date(currentYearStart);
|
|
228
|
+
y.setUTCFullYear(y.getUTCFullYear() - (maxYears - 1 - i));
|
|
229
|
+
const key = toDateKey(y);
|
|
230
|
+
const bucket = bucketMap[key] ?? { registered: 0, guest: 0 };
|
|
231
|
+
series.push({
|
|
232
|
+
date: key,
|
|
233
|
+
label: String(y.getUTCFullYear()),
|
|
234
|
+
registered_count: Math.floor(bucket.registered),
|
|
235
|
+
guest_count: Math.floor(bucket.guest),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
series.sort((a, b) => a.date.localeCompare(b.date));
|
|
239
|
+
// #region agent log
|
|
240
|
+
fetch("http://127.0.0.1:7242/ingest/47f434f8-0643-48e5-bd1a-edfe05973288", {
|
|
241
|
+
method: "POST",
|
|
242
|
+
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "4a7f37" },
|
|
243
|
+
body: JSON.stringify({
|
|
244
|
+
sessionId: "4a7f37",
|
|
245
|
+
location: "customers-over-time/route.ts:branch",
|
|
246
|
+
message: "customers-over-time branch",
|
|
247
|
+
data: { branch: "yearly", seriesLength: series.length, firstDate: series[0]?.date, lastDate: series[series.length - 1]?.date },
|
|
248
|
+
timestamp: Date.now(),
|
|
249
|
+
hypothesisId: "H4",
|
|
250
|
+
}),
|
|
251
|
+
}).catch(() => { });
|
|
252
|
+
// #endregion
|
|
253
|
+
res.json({ series });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
res.json({ series: [] });
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
console.error("Customers over time analytics error:", err);
|
|
260
|
+
res.status(500).json({
|
|
261
|
+
error: "Failed to fetch customers over time",
|
|
262
|
+
message: err instanceof Error ? err.message : String(err),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9jdXN0b21lcnMtb3Zlci10aW1lL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOENBLGtCQW9RQztBQTVTRCxxREFHa0M7QUFJbEMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQVUsQ0FBQTtBQUd6RSxTQUFTLFNBQVMsQ0FBQyxDQUFPO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDckMsQ0FBQztBQUVELGlEQUFpRDtBQUNqRCxTQUFTLFlBQVksQ0FBQyxDQUFPO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ25DLE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQztBQUVELG1DQUFtQztBQUNuQyxTQUFTLGFBQWEsQ0FBQyxDQUFPO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxD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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DTO for GET /admin/analytics/customers-over-time response.
|
|
4
|
+
* Time series of registered and guest customer counts for the graph.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9jdXN0b21lcnMtb3Zlci10aW1lL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0cifQ==
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const MIN_DAYS = 1;
|
|
6
|
+
const MAX_DAYS = 365;
|
|
7
|
+
function toDateKey(d) {
|
|
8
|
+
return d.toISOString().slice(0, 10);
|
|
9
|
+
}
|
|
10
|
+
function parseDaysParam(value) {
|
|
11
|
+
if (value === undefined || value === null)
|
|
12
|
+
return 7;
|
|
13
|
+
const n = Number(value);
|
|
14
|
+
if (!Number.isInteger(n) || n < MIN_DAYS)
|
|
15
|
+
return MIN_DAYS;
|
|
16
|
+
if (n > MAX_DAYS)
|
|
17
|
+
return MAX_DAYS;
|
|
18
|
+
return n;
|
|
19
|
+
}
|
|
20
|
+
async function GET(req, res) {
|
|
21
|
+
const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
22
|
+
const days = parseDaysParam(req.query?.days);
|
|
23
|
+
const today = new Date();
|
|
24
|
+
today.setUTCHours(0, 0, 0, 0);
|
|
25
|
+
const rangeStart = new Date(today);
|
|
26
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (days - 1));
|
|
27
|
+
rangeStart.setUTCHours(0, 0, 0, 0);
|
|
28
|
+
const rangeEnd = new Date(today);
|
|
29
|
+
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
30
|
+
try {
|
|
31
|
+
const customerQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
32
|
+
entryPoint: "customer",
|
|
33
|
+
fields: ["id", "created_at"],
|
|
34
|
+
take: 50000,
|
|
35
|
+
});
|
|
36
|
+
const customersRaw = await remoteQuery(customerQuery);
|
|
37
|
+
const allCustomers = Array.isArray(customersRaw)
|
|
38
|
+
? customersRaw
|
|
39
|
+
: customersRaw
|
|
40
|
+
? [customersRaw]
|
|
41
|
+
: [];
|
|
42
|
+
const inRangeCustomerIds = [];
|
|
43
|
+
for (const c of allCustomers) {
|
|
44
|
+
const row = c;
|
|
45
|
+
const createdAt = row.created_at ? new Date(row.created_at) : null;
|
|
46
|
+
if (createdAt &&
|
|
47
|
+
row.id &&
|
|
48
|
+
createdAt >= rangeStart &&
|
|
49
|
+
createdAt <= rangeEnd) {
|
|
50
|
+
inRangeCustomerIds.push(row.id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const totalCount = inRangeCustomerIds.length;
|
|
54
|
+
let registeredCount = 0;
|
|
55
|
+
try {
|
|
56
|
+
const authQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
57
|
+
entryPoint: "auth_identity",
|
|
58
|
+
fields: ["entity_id"],
|
|
59
|
+
take: 50000,
|
|
60
|
+
});
|
|
61
|
+
const authRaw = await remoteQuery(authQuery);
|
|
62
|
+
const authIdentities = Array.isArray(authRaw) ? authRaw : authRaw ? [authRaw] : [];
|
|
63
|
+
const registeredIds = new Set();
|
|
64
|
+
for (const a of authIdentities) {
|
|
65
|
+
const identity = a;
|
|
66
|
+
if (identity.entity_id)
|
|
67
|
+
registeredIds.add(identity.entity_id);
|
|
68
|
+
}
|
|
69
|
+
registeredCount = inRangeCustomerIds.filter((id) => registeredIds.has(id)).length;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
registeredCount = 0;
|
|
73
|
+
}
|
|
74
|
+
const guestCount = totalCount - registeredCount;
|
|
75
|
+
const body = {
|
|
76
|
+
guestCount: Math.floor(guestCount),
|
|
77
|
+
registeredCount: Math.floor(registeredCount),
|
|
78
|
+
totalCount: Math.floor(totalCount),
|
|
79
|
+
};
|
|
80
|
+
res.json(body);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error("Customers summary analytics error:", err);
|
|
84
|
+
res.status(500).json({
|
|
85
|
+
error: "Failed to fetch customers summary",
|
|
86
|
+
message: err instanceof Error ? err.message : String(err),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9jdXN0b21lcnMtc3VtbWFyeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJCQSxrQkFxRkM7QUEzR0QscURBR2tDO0FBSWxDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQTtBQUNsQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUE7QUFFcEIsU0FBUyxTQUFTLENBQUMsQ0FBTztJQUN4QixPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUFjO0lBQ3BDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQ3pELElBQUksQ0FBQyxHQUFHLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQTtJQUNqQyxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFFTSxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUFrQixFQUNsQixHQUFtQjtJQUVuQixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbkMsaUNBQXlCLENBQUMsWUFBWSxDQUN2QyxDQUFBO0lBRUQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUN4QixLQUFLLENBQUMs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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DTO for GET /admin/analytics/customers-summary response.
|
|
4
|
+
* Guest, registered, and total customer counts for a dynamic day range.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9jdXN0b21lcnMtc3VtbWFyeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHIn0=
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const ALLOWED_PERIODS = ["daily", "weekly", "monthly"];
|
|
6
|
+
function toDateKey(d) {
|
|
7
|
+
return d.toISOString().slice(0, 10);
|
|
8
|
+
}
|
|
9
|
+
/** Monday 00:00 UTC for the week containing d */
|
|
10
|
+
function getWeekStart(d) {
|
|
11
|
+
const x = new Date(d);
|
|
12
|
+
x.setUTCHours(0, 0, 0, 0);
|
|
13
|
+
const day = x.getUTCDay();
|
|
14
|
+
const diff = day === 0 ? -6 : 1 - day;
|
|
15
|
+
x.setUTCDate(x.getUTCDate() + diff);
|
|
16
|
+
return x;
|
|
17
|
+
}
|
|
18
|
+
/** First day of month 00:00 UTC */
|
|
19
|
+
function getMonthStart(d) {
|
|
20
|
+
const x = new Date(d);
|
|
21
|
+
x.setUTCHours(0, 0, 0, 0);
|
|
22
|
+
x.setUTCDate(1);
|
|
23
|
+
return x;
|
|
24
|
+
}
|
|
25
|
+
async function GET(req, res) {
|
|
26
|
+
const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
27
|
+
const periodParam = req.query?.period;
|
|
28
|
+
const period = typeof periodParam === "string" && ALLOWED_PERIODS.includes(periodParam)
|
|
29
|
+
? periodParam
|
|
30
|
+
: "weekly";
|
|
31
|
+
const today = new Date();
|
|
32
|
+
today.setUTCHours(0, 0, 0, 0);
|
|
33
|
+
try {
|
|
34
|
+
const queryObject = (0, utils_1.remoteQueryObjectFromString)({
|
|
35
|
+
entryPoint: "order",
|
|
36
|
+
fields: ["id", "created_at"],
|
|
37
|
+
take: 50000,
|
|
38
|
+
});
|
|
39
|
+
const ordersRaw = await remoteQuery(queryObject);
|
|
40
|
+
const allOrders = Array.isArray(ordersRaw) ? ordersRaw : ordersRaw ? [ordersRaw] : [];
|
|
41
|
+
const bucketMap = {};
|
|
42
|
+
if (period === "daily") {
|
|
43
|
+
const rangeEnd = new Date(today);
|
|
44
|
+
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
45
|
+
const maxDays = 7;
|
|
46
|
+
const rangeStart = new Date(today);
|
|
47
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (maxDays - 1));
|
|
48
|
+
for (const order of allOrders) {
|
|
49
|
+
const o = order;
|
|
50
|
+
const createdAt = o.created_at ? new Date(o.created_at) : null;
|
|
51
|
+
const dateKey = createdAt ? toDateKey(createdAt) : null;
|
|
52
|
+
if (createdAt && dateKey && createdAt >= rangeStart && createdAt <= rangeEnd) {
|
|
53
|
+
bucketMap[dateKey] = (bucketMap[dateKey] ?? 0) + 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const dailyOrders = [];
|
|
57
|
+
for (let i = 0; i < maxDays; i++) {
|
|
58
|
+
const d = new Date(rangeStart);
|
|
59
|
+
d.setUTCDate(d.getUTCDate() + i);
|
|
60
|
+
const key = toDateKey(d);
|
|
61
|
+
dailyOrders.push({ date: key, orders_count: bucketMap[key] ?? 0 });
|
|
62
|
+
}
|
|
63
|
+
dailyOrders.sort((a, b) => a.date.localeCompare(b.date));
|
|
64
|
+
res.json({ dailyOrders });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (period === "weekly") {
|
|
68
|
+
const rangeEnd = new Date(today);
|
|
69
|
+
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
70
|
+
const maxWeeks = 7;
|
|
71
|
+
const currentWeekStart = getWeekStart(today);
|
|
72
|
+
const rangeStart = new Date(currentWeekStart);
|
|
73
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (maxWeeks - 1) * 7);
|
|
74
|
+
for (const order of allOrders) {
|
|
75
|
+
const o = order;
|
|
76
|
+
const createdAt = o.created_at ? new Date(o.created_at) : null;
|
|
77
|
+
if (!createdAt || createdAt < rangeStart || createdAt > rangeEnd)
|
|
78
|
+
continue;
|
|
79
|
+
const weekStart = getWeekStart(createdAt);
|
|
80
|
+
const key = toDateKey(weekStart);
|
|
81
|
+
bucketMap[key] = (bucketMap[key] ?? 0) + 1;
|
|
82
|
+
}
|
|
83
|
+
const dailyOrders = [];
|
|
84
|
+
for (let i = 0; i < maxWeeks; i++) {
|
|
85
|
+
const w = new Date(currentWeekStart);
|
|
86
|
+
w.setUTCDate(w.getUTCDate() - (maxWeeks - 1 - i) * 7);
|
|
87
|
+
const key = toDateKey(w);
|
|
88
|
+
const weekNum = maxWeeks - i;
|
|
89
|
+
const dayOfMonth = w.getUTCDate();
|
|
90
|
+
dailyOrders.push({
|
|
91
|
+
date: key,
|
|
92
|
+
orders_count: bucketMap[key] ?? 0,
|
|
93
|
+
label: `week${weekNum}/${String(dayOfMonth).padStart(2, "0")}`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
dailyOrders.sort((a, b) => a.date.localeCompare(b.date));
|
|
97
|
+
res.json({ dailyOrders });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (period === "monthly") {
|
|
101
|
+
const rangeEnd = new Date(today);
|
|
102
|
+
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
103
|
+
const maxMonths = 12;
|
|
104
|
+
const currentMonthStart = getMonthStart(today);
|
|
105
|
+
const rangeStart = new Date(currentMonthStart);
|
|
106
|
+
rangeStart.setUTCMonth(rangeStart.getUTCMonth() - (maxMonths - 1));
|
|
107
|
+
const monthLabels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
108
|
+
for (const order of allOrders) {
|
|
109
|
+
const o = order;
|
|
110
|
+
const createdAt = o.created_at ? new Date(o.created_at) : null;
|
|
111
|
+
if (!createdAt || createdAt < rangeStart || createdAt > rangeEnd)
|
|
112
|
+
continue;
|
|
113
|
+
const monthStart = getMonthStart(createdAt);
|
|
114
|
+
const key = toDateKey(monthStart);
|
|
115
|
+
bucketMap[key] = (bucketMap[key] ?? 0) + 1;
|
|
116
|
+
}
|
|
117
|
+
const dailyOrders = [];
|
|
118
|
+
for (let i = 0; i < maxMonths; i++) {
|
|
119
|
+
const m = new Date(currentMonthStart);
|
|
120
|
+
m.setUTCMonth(m.getUTCMonth() - (maxMonths - 1 - i));
|
|
121
|
+
const key = toDateKey(m);
|
|
122
|
+
dailyOrders.push({
|
|
123
|
+
date: key,
|
|
124
|
+
orders_count: bucketMap[key] ?? 0,
|
|
125
|
+
label: monthLabels[m.getUTCMonth()],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
dailyOrders.sort((a, b) => a.date.localeCompare(b.date));
|
|
129
|
+
res.json({ dailyOrders });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
res.json({ dailyOrders: [] });
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
console.error("Orders over time analytics error:", err);
|
|
136
|
+
res.status(500).json({
|
|
137
|
+
error: "Failed to fetch orders over time",
|
|
138
|
+
message: err instanceof Error ? err.message : String(err),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtb3Zlci10aW1lL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbUNBLGtCQXVJQztBQXBLRCxxREFBa0c7QUFJbEcsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBVSxDQUFBO0FBRy9ELFNBQVMsU0FBUyxDQUFDLENBQU87SUFDeEIsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELFNBQVMsWUFBWSxDQUFDLENBQU87SUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7SUFDckMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7SUFDbkMsT0FBTyxDQUFDLENBQUE7QUFDVixDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLFNBQVMsYUFBYSxDQUFDLENBQU87SUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFD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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DTO for GET /admin/analytics/orders-over-time response.
|
|
4
|
+
* Dedicated endpoint for the "Orders over time" chart; real-time data per period (1d, 7d, 30d).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtb3Zlci10aW1lL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0cifQ==
|