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.
@@ -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==