@carlonicora/nestjs-neo4jsonapi 4.14.0 → 4.15.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.
Files changed (151) hide show
  1. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  2. package/dist/bootstrap/app.module.factory.js +1 -0
  3. package/dist/bootstrap/app.module.factory.js.map +1 -1
  4. package/dist/bootstrap/bootstrap.options.d.ts +22 -0
  5. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  6. package/dist/config/base.config.d.ts.map +1 -1
  7. package/dist/config/base.config.js +5 -0
  8. package/dist/config/base.config.js.map +1 -1
  9. package/dist/config/enums/queue.id.d.ts +1 -0
  10. package/dist/config/enums/queue.id.d.ts.map +1 -1
  11. package/dist/config/enums/queue.id.js +1 -0
  12. package/dist/config/enums/queue.id.js.map +1 -1
  13. package/dist/config/interfaces/base.config.interface.d.ts +2 -0
  14. package/dist/config/interfaces/base.config.interface.d.ts.map +1 -1
  15. package/dist/config/interfaces/config.analytics.interface.d.ts +13 -0
  16. package/dist/config/interfaces/config.analytics.interface.d.ts.map +1 -0
  17. package/dist/config/interfaces/config.analytics.interface.js +3 -0
  18. package/dist/config/interfaces/config.analytics.interface.js.map +1 -0
  19. package/dist/config/interfaces/index.d.ts +1 -0
  20. package/dist/config/interfaces/index.d.ts.map +1 -1
  21. package/dist/config/interfaces/index.js +1 -0
  22. package/dist/config/interfaces/index.js.map +1 -1
  23. package/dist/foundations/analytics/analytics.module.d.ts +39 -0
  24. package/dist/foundations/analytics/analytics.module.d.ts.map +1 -0
  25. package/dist/foundations/analytics/analytics.module.js +122 -0
  26. package/dist/foundations/analytics/analytics.module.js.map +1 -0
  27. package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts +32 -0
  28. package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -0
  29. package/dist/foundations/analytics/controllers/analytics.admin.controller.js +197 -0
  30. package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -0
  31. package/dist/foundations/analytics/controllers/analytics.controller.d.ts +29 -0
  32. package/dist/foundations/analytics/controllers/analytics.controller.d.ts.map +1 -0
  33. package/dist/foundations/analytics/controllers/analytics.controller.js +85 -0
  34. package/dist/foundations/analytics/controllers/analytics.controller.js.map +1 -0
  35. package/dist/foundations/analytics/cron/analytics-retention.cron.d.ts +13 -0
  36. package/dist/foundations/analytics/cron/analytics-retention.cron.d.ts.map +1 -0
  37. package/dist/foundations/analytics/cron/analytics-retention.cron.js +61 -0
  38. package/dist/foundations/analytics/cron/analytics-retention.cron.js.map +1 -0
  39. package/dist/foundations/analytics/dtos/analytics-event.post.dto.d.ts +21 -0
  40. package/dist/foundations/analytics/dtos/analytics-event.post.dto.d.ts.map +1 -0
  41. package/dist/foundations/analytics/dtos/analytics-event.post.dto.js +105 -0
  42. package/dist/foundations/analytics/dtos/analytics-event.post.dto.js.map +1 -0
  43. package/dist/foundations/analytics/entities/analytics-breakdown.d.ts +17 -0
  44. package/dist/foundations/analytics/entities/analytics-breakdown.d.ts.map +1 -0
  45. package/dist/foundations/analytics/entities/analytics-breakdown.js +18 -0
  46. package/dist/foundations/analytics/entities/analytics-breakdown.js.map +1 -0
  47. package/dist/foundations/analytics/entities/analytics-breakdown.meta.d.ts +3 -0
  48. package/dist/foundations/analytics/entities/analytics-breakdown.meta.d.ts.map +1 -0
  49. package/dist/foundations/analytics/entities/analytics-breakdown.meta.js +10 -0
  50. package/dist/foundations/analytics/entities/analytics-breakdown.meta.js.map +1 -0
  51. package/dist/foundations/analytics/entities/analytics-daily-summary.d.ts +30 -0
  52. package/dist/foundations/analytics/entities/analytics-daily-summary.d.ts.map +1 -0
  53. package/dist/foundations/analytics/entities/analytics-daily-summary.js +28 -0
  54. package/dist/foundations/analytics/entities/analytics-daily-summary.js.map +1 -0
  55. package/dist/foundations/analytics/entities/analytics-daily-summary.meta.d.ts +3 -0
  56. package/dist/foundations/analytics/entities/analytics-daily-summary.meta.d.ts.map +1 -0
  57. package/dist/foundations/analytics/entities/analytics-daily-summary.meta.js +10 -0
  58. package/dist/foundations/analytics/entities/analytics-daily-summary.meta.js.map +1 -0
  59. package/dist/foundations/analytics/entities/analytics-event.meta.d.ts +8 -0
  60. package/dist/foundations/analytics/entities/analytics-event.meta.d.ts.map +1 -0
  61. package/dist/foundations/analytics/entities/analytics-event.meta.js +15 -0
  62. package/dist/foundations/analytics/entities/analytics-event.meta.js.map +1 -0
  63. package/dist/foundations/analytics/entities/analytics-page-view.d.ts +39 -0
  64. package/dist/foundations/analytics/entities/analytics-page-view.d.ts.map +1 -0
  65. package/dist/foundations/analytics/entities/analytics-page-view.js +38 -0
  66. package/dist/foundations/analytics/entities/analytics-page-view.js.map +1 -0
  67. package/dist/foundations/analytics/entities/analytics-page-view.meta.d.ts +3 -0
  68. package/dist/foundations/analytics/entities/analytics-page-view.meta.d.ts.map +1 -0
  69. package/dist/foundations/analytics/entities/analytics-page-view.meta.js +10 -0
  70. package/dist/foundations/analytics/entities/analytics-page-view.meta.js.map +1 -0
  71. package/dist/foundations/analytics/entities/analytics-session.d.ts +52 -0
  72. package/dist/foundations/analytics/entities/analytics-session.d.ts.map +1 -0
  73. package/dist/foundations/analytics/entities/analytics-session.js +47 -0
  74. package/dist/foundations/analytics/entities/analytics-session.js.map +1 -0
  75. package/dist/foundations/analytics/entities/analytics-session.meta.d.ts +3 -0
  76. package/dist/foundations/analytics/entities/analytics-session.meta.d.ts.map +1 -0
  77. package/dist/foundations/analytics/entities/analytics-session.meta.js +10 -0
  78. package/dist/foundations/analytics/entities/analytics-session.meta.js.map +1 -0
  79. package/dist/foundations/analytics/entities/analytics-summary.d.ts +24 -0
  80. package/dist/foundations/analytics/entities/analytics-summary.d.ts.map +1 -0
  81. package/dist/foundations/analytics/entities/analytics-summary.js +20 -0
  82. package/dist/foundations/analytics/entities/analytics-summary.js.map +1 -0
  83. package/dist/foundations/analytics/entities/analytics-summary.meta.d.ts +3 -0
  84. package/dist/foundations/analytics/entities/analytics-summary.meta.d.ts.map +1 -0
  85. package/dist/foundations/analytics/entities/analytics-summary.meta.js +10 -0
  86. package/dist/foundations/analytics/entities/analytics-summary.meta.js.map +1 -0
  87. package/dist/foundations/analytics/entities/analytics-timeline.d.ts +20 -0
  88. package/dist/foundations/analytics/entities/analytics-timeline.d.ts.map +1 -0
  89. package/dist/foundations/analytics/entities/analytics-timeline.js +18 -0
  90. package/dist/foundations/analytics/entities/analytics-timeline.js.map +1 -0
  91. package/dist/foundations/analytics/entities/analytics-timeline.meta.d.ts +3 -0
  92. package/dist/foundations/analytics/entities/analytics-timeline.meta.d.ts.map +1 -0
  93. package/dist/foundations/analytics/entities/analytics-timeline.meta.js +10 -0
  94. package/dist/foundations/analytics/entities/analytics-timeline.meta.js.map +1 -0
  95. package/dist/foundations/analytics/index.d.ts +27 -0
  96. package/dist/foundations/analytics/index.d.ts.map +1 -0
  97. package/dist/foundations/analytics/index.js +54 -0
  98. package/dist/foundations/analytics/index.js.map +1 -0
  99. package/dist/foundations/analytics/interfaces/analytics.config.interface.d.ts +80 -0
  100. package/dist/foundations/analytics/interfaces/analytics.config.interface.d.ts.map +1 -0
  101. package/dist/foundations/analytics/interfaces/analytics.config.interface.js +28 -0
  102. package/dist/foundations/analytics/interfaces/analytics.config.interface.js.map +1 -0
  103. package/dist/foundations/analytics/interfaces/analytics.page-view.input.d.ts +30 -0
  104. package/dist/foundations/analytics/interfaces/analytics.page-view.input.d.ts.map +1 -0
  105. package/dist/foundations/analytics/interfaces/analytics.page-view.input.js +3 -0
  106. package/dist/foundations/analytics/interfaces/analytics.page-view.input.js.map +1 -0
  107. package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.d.ts +30 -0
  108. package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.d.ts.map +1 -0
  109. package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.js +3 -0
  110. package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.js.map +1 -0
  111. package/dist/foundations/analytics/processors/analytics.processor.d.ts +33 -0
  112. package/dist/foundations/analytics/processors/analytics.processor.d.ts.map +1 -0
  113. package/dist/foundations/analytics/processors/analytics.processor.js +126 -0
  114. package/dist/foundations/analytics/processors/analytics.processor.js.map +1 -0
  115. package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.d.ts +38 -0
  116. package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.d.ts.map +1 -0
  117. package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.js +142 -0
  118. package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.js.map +1 -0
  119. package/dist/foundations/analytics/repositories/analytics-page-view.repository.d.ts +30 -0
  120. package/dist/foundations/analytics/repositories/analytics-page-view.repository.d.ts.map +1 -0
  121. package/dist/foundations/analytics/repositories/analytics-page-view.repository.js +62 -0
  122. package/dist/foundations/analytics/repositories/analytics-page-view.repository.js.map +1 -0
  123. package/dist/foundations/analytics/repositories/analytics-session.repository.d.ts +87 -0
  124. package/dist/foundations/analytics/repositories/analytics-session.repository.d.ts.map +1 -0
  125. package/dist/foundations/analytics/repositories/analytics-session.repository.js +261 -0
  126. package/dist/foundations/analytics/repositories/analytics-session.repository.js.map +1 -0
  127. package/dist/foundations/analytics/repositories/analytics.admin.repository.d.ts +145 -0
  128. package/dist/foundations/analytics/repositories/analytics.admin.repository.d.ts.map +1 -0
  129. package/dist/foundations/analytics/repositories/analytics.admin.repository.js +490 -0
  130. package/dist/foundations/analytics/repositories/analytics.admin.repository.js.map +1 -0
  131. package/dist/foundations/analytics/services/analytics.admin.service.d.ts +74 -0
  132. package/dist/foundations/analytics/services/analytics.admin.service.d.ts.map +1 -0
  133. package/dist/foundations/analytics/services/analytics.admin.service.js +126 -0
  134. package/dist/foundations/analytics/services/analytics.admin.service.js.map +1 -0
  135. package/dist/foundations/analytics/services/analytics.service.d.ts +31 -0
  136. package/dist/foundations/analytics/services/analytics.service.d.ts.map +1 -0
  137. package/dist/foundations/analytics/services/analytics.service.js +57 -0
  138. package/dist/foundations/analytics/services/analytics.service.js.map +1 -0
  139. package/dist/foundations/analytics/services/analytics.visitor-id.service.d.ts +34 -0
  140. package/dist/foundations/analytics/services/analytics.visitor-id.service.d.ts.map +1 -0
  141. package/dist/foundations/analytics/services/analytics.visitor-id.service.js +93 -0
  142. package/dist/foundations/analytics/services/analytics.visitor-id.service.js.map +1 -0
  143. package/dist/foundations/foundations.modules.d.ts +3 -0
  144. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  145. package/dist/foundations/foundations.modules.js +3 -1
  146. package/dist/foundations/foundations.modules.js.map +1 -1
  147. package/dist/foundations/index.d.ts +1 -0
  148. package/dist/foundations/index.d.ts.map +1 -1
  149. package/dist/foundations/index.js +1 -0
  150. package/dist/foundations/index.js.map +1 -1
  151. package/package.json +1 -1
@@ -0,0 +1,197 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AnalyticsAdminController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const system_roles_1 = require("../../../common/constants/system.roles");
18
+ const roles_decorator_1 = require("../../../common/decorators/roles.decorator");
19
+ const crud_handlers_1 = require("../../../common/handlers/crud.handlers");
20
+ const audit_decorator_1 = require("../../../common/decorators/audit.decorator");
21
+ const jwt_auth_guard_1 = require("../../../common/guards/jwt.auth.guard");
22
+ const audit_service_1 = require("../../audit/services/audit.service");
23
+ const analytics_breakdown_meta_1 = require("../entities/analytics-breakdown.meta");
24
+ const analytics_page_view_meta_1 = require("../entities/analytics-page-view.meta");
25
+ const analytics_session_meta_1 = require("../entities/analytics-session.meta");
26
+ const analytics_summary_meta_1 = require("../entities/analytics-summary.meta");
27
+ const analytics_timeline_meta_1 = require("../entities/analytics-timeline.meta");
28
+ const analytics_admin_repository_1 = require("../repositories/analytics.admin.repository");
29
+ const analytics_admin_service_1 = require("../services/analytics.admin.service");
30
+ const DEFAULT_WINDOW_DAYS = 30;
31
+ const MAX_WINDOW_DAYS = 400;
32
+ const DEFAULT_BREAKDOWN_LIMIT = 20;
33
+ const MAX_BREAKDOWN_LIMIT = 100;
34
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
35
+ /**
36
+ * Platform-wide web analytics reporting. Every route is administrator-only:
37
+ * JwtAuthGuard._validateRoles enforces @Roles and always admits the
38
+ * Administrator role, so a non-administrator receives 401.
39
+ *
40
+ * Mounted at /analytics/administration/* — the only other analytics route is
41
+ * the public POST /analytics/events beacon, so there is no Fastify overlap.
42
+ *
43
+ * Enum-valued query params are validated against a closed allowlist here rather
44
+ * than in a DTO: DTOs are body validation for POST/PUT/PATCH, and GET filters
45
+ * use bare @Query() params. The allowlist matters — the repository interpolates
46
+ * granularity and dimension into Cypher (they select a clause, they are not
47
+ * values), so an unvalidated string would be an injection vector.
48
+ */
49
+ let AnalyticsAdminController = class AnalyticsAdminController {
50
+ constructor(service, auditService) {
51
+ this.service = service;
52
+ this.auditService = auditService;
53
+ this.crud = (0, crud_handlers_1.createCrudHandlers)(() => this.service);
54
+ }
55
+ async getSummary(reply, from, to, section) {
56
+ const range = this._range(from, to);
57
+ reply.send(await this.service.getSummary({
58
+ ...range,
59
+ section: this._oneOf(section, analytics_admin_repository_1.SECTIONS, "all"),
60
+ }));
61
+ }
62
+ async getTimeline(reply, from, to, section, granularity) {
63
+ const range = this._range(from, to);
64
+ reply.send(await this.service.getTimeline({
65
+ ...range,
66
+ section: this._oneOf(section, analytics_admin_repository_1.SECTIONS, "all"),
67
+ granularity: this._oneOf(granularity, analytics_admin_repository_1.GRANULARITIES, "day"),
68
+ }));
69
+ }
70
+ async getBreakdown(reply, from, to, section, dimension, limit) {
71
+ const range = this._range(from, to);
72
+ const parsedLimit = limit === undefined ? DEFAULT_BREAKDOWN_LIMIT : Number(limit);
73
+ if (!Number.isInteger(parsedLimit) || parsedLimit < 1 || parsedLimit > MAX_BREAKDOWN_LIMIT)
74
+ throw new common_1.BadRequestException(`limit must be an integer between 1 and ${MAX_BREAKDOWN_LIMIT}`);
75
+ reply.send(await this.service.getBreakdown({
76
+ ...range,
77
+ section: this._oneOf(section, analytics_admin_repository_1.SECTIONS, "all"),
78
+ dimension: this._oneOf(dimension, analytics_admin_repository_1.DIMENSIONS, "source"),
79
+ limit: parsedLimit,
80
+ }));
81
+ }
82
+ async getSessions(reply, query, from, to, section, visitorId, userId) {
83
+ const range = this._range(from, to);
84
+ reply.send(await this.service.getSessions({
85
+ query,
86
+ ...range,
87
+ section: this._oneOf(section, analytics_admin_repository_1.SECTIONS, "all"),
88
+ visitorId,
89
+ userId,
90
+ }));
91
+ }
92
+ // The inherited AbstractService.findById builds the single JSON:API document,
93
+ // with the optional `user` relationship included from the descriptor.
94
+ async getSession(reply, sessionId) {
95
+ return this.crud.findById(reply, sessionId);
96
+ }
97
+ async getSessionPageViews(reply, sessionId) {
98
+ reply.send(await this.service.getSessionPageViews({ sessionId }));
99
+ }
100
+ _oneOf(value, allowed, fallback) {
101
+ if (value === undefined)
102
+ return fallback;
103
+ if (!allowed.includes(value))
104
+ throw new common_1.BadRequestException(`Expected one of ${allowed.join(", ")}, received "${value}"`);
105
+ return value;
106
+ }
107
+ _range(from, to) {
108
+ const toDate = to ? new Date(to) : new Date();
109
+ if (Number.isNaN(toDate.getTime()))
110
+ throw new common_1.BadRequestException("`to` is not a valid date");
111
+ const fromDate = from ? new Date(from) : new Date(toDate.getTime() - DEFAULT_WINDOW_DAYS * ONE_DAY_MS);
112
+ if (Number.isNaN(fromDate.getTime()))
113
+ throw new common_1.BadRequestException("`from` is not a valid date");
114
+ if (fromDate > toDate)
115
+ throw new common_1.BadRequestException("`from` must not be later than `to`");
116
+ if (toDate.getTime() - fromDate.getTime() > MAX_WINDOW_DAYS * ONE_DAY_MS)
117
+ throw new common_1.BadRequestException(`The range must not exceed ${MAX_WINDOW_DAYS} days`);
118
+ return { from: fromDate.toISOString(), to: toDate.toISOString() };
119
+ }
120
+ };
121
+ exports.AnalyticsAdminController = AnalyticsAdminController;
122
+ __decorate([
123
+ (0, common_1.Get)(analytics_summary_meta_1.analyticsSummaryMeta.endpoint),
124
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
125
+ __param(0, (0, common_1.Res)()),
126
+ __param(1, (0, common_1.Query)("from")),
127
+ __param(2, (0, common_1.Query)("to")),
128
+ __param(3, (0, common_1.Query)("section")),
129
+ __metadata("design:type", Function),
130
+ __metadata("design:paramtypes", [Object, String, String, String]),
131
+ __metadata("design:returntype", Promise)
132
+ ], AnalyticsAdminController.prototype, "getSummary", null);
133
+ __decorate([
134
+ (0, common_1.Get)(analytics_timeline_meta_1.analyticsTimelineMeta.endpoint),
135
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
136
+ __param(0, (0, common_1.Res)()),
137
+ __param(1, (0, common_1.Query)("from")),
138
+ __param(2, (0, common_1.Query)("to")),
139
+ __param(3, (0, common_1.Query)("section")),
140
+ __param(4, (0, common_1.Query)("granularity")),
141
+ __metadata("design:type", Function),
142
+ __metadata("design:paramtypes", [Object, String, String, String, String]),
143
+ __metadata("design:returntype", Promise)
144
+ ], AnalyticsAdminController.prototype, "getTimeline", null);
145
+ __decorate([
146
+ (0, common_1.Get)(analytics_breakdown_meta_1.analyticsBreakdownMeta.endpoint),
147
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
148
+ __param(0, (0, common_1.Res)()),
149
+ __param(1, (0, common_1.Query)("from")),
150
+ __param(2, (0, common_1.Query)("to")),
151
+ __param(3, (0, common_1.Query)("section")),
152
+ __param(4, (0, common_1.Query)("dimension")),
153
+ __param(5, (0, common_1.Query)("limit")),
154
+ __metadata("design:type", Function),
155
+ __metadata("design:paramtypes", [Object, String, String, String, String, String]),
156
+ __metadata("design:returntype", Promise)
157
+ ], AnalyticsAdminController.prototype, "getBreakdown", null);
158
+ __decorate([
159
+ (0, common_1.Get)(analytics_session_meta_1.analyticsSessionMeta.endpoint),
160
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
161
+ __param(0, (0, common_1.Res)()),
162
+ __param(1, (0, common_1.Query)()),
163
+ __param(2, (0, common_1.Query)("from")),
164
+ __param(3, (0, common_1.Query)("to")),
165
+ __param(4, (0, common_1.Query)("section")),
166
+ __param(5, (0, common_1.Query)("visitorId")),
167
+ __param(6, (0, common_1.Query)("userId")),
168
+ __metadata("design:type", Function),
169
+ __metadata("design:paramtypes", [Object, Object, String, String, String, String, String]),
170
+ __metadata("design:returntype", Promise)
171
+ ], AnalyticsAdminController.prototype, "getSessions", null);
172
+ __decorate([
173
+ (0, common_1.Get)(`${analytics_session_meta_1.analyticsSessionMeta.endpoint}/:sessionId`),
174
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
175
+ (0, audit_decorator_1.Audit)(analytics_session_meta_1.analyticsSessionMeta, "sessionId"),
176
+ __param(0, (0, common_1.Res)()),
177
+ __param(1, (0, common_1.Param)("sessionId")),
178
+ __metadata("design:type", Function),
179
+ __metadata("design:paramtypes", [Object, String]),
180
+ __metadata("design:returntype", Promise)
181
+ ], AnalyticsAdminController.prototype, "getSession", null);
182
+ __decorate([
183
+ (0, common_1.Get)(`${analytics_session_meta_1.analyticsSessionMeta.endpoint}/:sessionId/${analytics_page_view_meta_1.analyticsPageViewMeta.endpoint}`),
184
+ (0, roles_decorator_1.Roles)(system_roles_1.SystemRoles.Administrator),
185
+ __param(0, (0, common_1.Res)()),
186
+ __param(1, (0, common_1.Param)("sessionId")),
187
+ __metadata("design:type", Function),
188
+ __metadata("design:paramtypes", [Object, String]),
189
+ __metadata("design:returntype", Promise)
190
+ ], AnalyticsAdminController.prototype, "getSessionPageViews", null);
191
+ exports.AnalyticsAdminController = AnalyticsAdminController = __decorate([
192
+ (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
193
+ (0, common_1.Controller)(),
194
+ __metadata("design:paramtypes", [analytics_admin_service_1.AnalyticsAdminService,
195
+ audit_service_1.AuditService])
196
+ ], AnalyticsAdminController);
197
+ //# sourceMappingURL=analytics.admin.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.admin.controller.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/controllers/analytics.admin.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { FastifyRequest } from "fastify";
2
+ import { AnalyticsEventPostDTO } from "../dtos/analytics-event.post.dto";
3
+ import { AnalyticsService } from "../services/analytics.service";
4
+ /**
5
+ * Public page-view beacon. Anonymous visitors are accepted; when a valid JWT is
6
+ * present OptionalJwtAuthGuard attaches the user so the session can be linked.
7
+ *
8
+ * The controller only enriches the DTO with the request-derived values
9
+ * (client IP, user agent, user id, receive time) and hands the job to
10
+ * AnalyticsService.track, which queues it and never throws. Raw IP and user
11
+ * agent travel only inside the queued job: the worker hashes / classifies them
12
+ * and nothing raw reaches Neo4j.
13
+ */
14
+ export declare class AnalyticsController {
15
+ private readonly analyticsService;
16
+ constructor(analyticsService: AnalyticsService);
17
+ track(request: FastifyRequest & {
18
+ user?: {
19
+ userId?: string;
20
+ };
21
+ }, body: AnalyticsEventPostDTO): Promise<void>;
22
+ /**
23
+ * First comma-separated hop of X-Forwarded-For, trimmed; request.ip otherwise.
24
+ * Later hops are proxies and would split one visitor across several hashes.
25
+ */
26
+ private _clientIp;
27
+ private _header;
28
+ }
29
+ //# sourceMappingURL=analytics.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/analytics/controllers/analytics.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE;;;;;;;;;GASG;AACH,qBACa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,gBAAgB;IAMzD,KAAK,CACF,OAAO,EAAE,cAAc,GAAG;QAAE,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EACvD,IAAI,EAAE,qBAAqB,GAClC,OAAO,CAAC,IAAI,CAAC;IAuBhB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,85 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AnalyticsController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const throttler_1 = require("@nestjs/throttler");
18
+ const jwt_auth_optional_guard_1 = require("../../../common/guards/jwt.auth.optional.guard");
19
+ const analytics_event_post_dto_1 = require("../dtos/analytics-event.post.dto");
20
+ const analytics_event_meta_1 = require("../entities/analytics-event.meta");
21
+ const analytics_service_1 = require("../services/analytics.service");
22
+ /**
23
+ * Public page-view beacon. Anonymous visitors are accepted; when a valid JWT is
24
+ * present OptionalJwtAuthGuard attaches the user so the session can be linked.
25
+ *
26
+ * The controller only enriches the DTO with the request-derived values
27
+ * (client IP, user agent, user id, receive time) and hands the job to
28
+ * AnalyticsService.track, which queues it and never throws. Raw IP and user
29
+ * agent travel only inside the queued job: the worker hashes / classifies them
30
+ * and nothing raw reaches Neo4j.
31
+ */
32
+ let AnalyticsController = class AnalyticsController {
33
+ constructor(analyticsService) {
34
+ this.analyticsService = analyticsService;
35
+ }
36
+ async track(request, body) {
37
+ const attributes = body.data.attributes;
38
+ const input = {
39
+ path: attributes.path,
40
+ section: attributes.section,
41
+ referrer: attributes.referrer,
42
+ utmSource: attributes.utmSource,
43
+ utmMedium: attributes.utmMedium,
44
+ utmCampaign: attributes.utmCampaign,
45
+ utmTerm: attributes.utmTerm,
46
+ utmContent: attributes.utmContent,
47
+ visitorId: attributes.visitorId,
48
+ screenWidth: attributes.screenWidth,
49
+ clientIp: this._clientIp(request),
50
+ userAgent: this._header(request.headers["user-agent"]) ?? "",
51
+ userId: request.user?.userId,
52
+ receivedAt: new Date().toISOString(),
53
+ };
54
+ await this.analyticsService.track(input);
55
+ }
56
+ /**
57
+ * First comma-separated hop of X-Forwarded-For, trimmed; request.ip otherwise.
58
+ * Later hops are proxies and would split one visitor across several hashes.
59
+ */
60
+ _clientIp(request) {
61
+ const forwarded = this._header(request.headers["x-forwarded-for"]);
62
+ const firstHop = forwarded?.split(",")[0]?.trim();
63
+ return firstHop || request.ip;
64
+ }
65
+ _header(value) {
66
+ return Array.isArray(value) ? value[0] : value;
67
+ }
68
+ };
69
+ exports.AnalyticsController = AnalyticsController;
70
+ __decorate([
71
+ (0, common_1.Post)(analytics_event_meta_1.analyticsEventMeta.endpoint),
72
+ (0, common_1.UseGuards)(jwt_auth_optional_guard_1.OptionalJwtAuthGuard),
73
+ (0, throttler_1.Throttle)({ default: { limit: 60, ttl: 60000 }, ip: { limit: 60, ttl: 60000 } }),
74
+ (0, common_1.HttpCode)(common_1.HttpStatus.ACCEPTED),
75
+ __param(0, (0, common_1.Req)()),
76
+ __param(1, (0, common_1.Body)()),
77
+ __metadata("design:type", Function),
78
+ __metadata("design:paramtypes", [Object, analytics_event_post_dto_1.AnalyticsEventPostDTO]),
79
+ __metadata("design:returntype", Promise)
80
+ ], AnalyticsController.prototype, "track", null);
81
+ exports.AnalyticsController = AnalyticsController = __decorate([
82
+ (0, common_1.Controller)(),
83
+ __metadata("design:paramtypes", [analytics_service_1.AnalyticsService])
84
+ ], AnalyticsController);
85
+ //# sourceMappingURL=analytics.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.controller.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/controllers/analytics.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA8F;AAC9F,iDAA6C;AAE7C,4FAAsF;AACtF,+EAAyE;AACzE,2EAAsE;AAEtE,qEAAiE;AAEjE;;;;;;;;;GASG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAG,CAAC;IAM7D,AAAN,KAAK,CAAC,KAAK,CACF,OAAwD,EACvD,IAA2B;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAExC,MAAM,KAAK,GAA2B;YACpC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE;YAC5D,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM;YAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QAEF,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,OAAuB;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAClD,OAAO,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;IAChC,CAAC;IAEO,OAAO,CAAC,KAAoC;QAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,CAAC;CACF,CAAA;AA9CY,kDAAmB;AAOxB;IAJL,IAAA,aAAI,EAAC,yCAAkB,CAAC,QAAQ,CAAC;IACjC,IAAA,kBAAS,EAAC,8CAAoB,CAAC;IAC/B,IAAA,oBAAQ,EAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;IAC/E,IAAA,iBAAQ,EAAC,mBAAU,CAAC,QAAQ,CAAC;IAE3B,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAO,gDAAqB;;gDAsBpC;8BA/BU,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAEoC,oCAAgB;GADpD,mBAAmB,CA8C/B"}
@@ -0,0 +1,13 @@
1
+ import { AppLoggingService } from "../../../core/logging/services/logging.service";
2
+ import { AnalyticsDailySummaryRepository } from "../repositories/analytics-daily-summary.repository";
3
+ import { AnalyticsSessionRepository } from "../repositories/analytics-session.repository";
4
+ import { AnalyticsAdminService } from "../services/analytics.admin.service";
5
+ export declare class AnalyticsRetentionCron {
6
+ private readonly analyticsSessionRepository;
7
+ private readonly analyticsDailySummaryRepository;
8
+ private readonly analyticsAdminService;
9
+ private readonly logger;
10
+ constructor(analyticsSessionRepository: AnalyticsSessionRepository, analyticsDailySummaryRepository: AnalyticsDailySummaryRepository, analyticsAdminService: AnalyticsAdminService, logger: AppLoggingService);
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=analytics-retention.cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-retention.cron.d.ts","sourceRoot":"","sources":["../../../../src/foundations/analytics/cron/analytics-retention.cron.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,+BAA+B,EAAE,MAAM,oDAAoD,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAK5E,qBACa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,+BAA+B;IAChD,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHN,0BAA0B,EAAE,0BAA0B,EACtD,+BAA+B,EAAE,+BAA+B,EAChE,qBAAqB,EAAE,qBAAqB,EAC5C,MAAM,EAAE,iBAAiB;IAItC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyB3B"}
@@ -0,0 +1,61 @@
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.AnalyticsRetentionCron = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const schedule_1 = require("@nestjs/schedule");
15
+ const logging_service_1 = require("../../../core/logging/services/logging.service");
16
+ const analytics_daily_summary_repository_1 = require("../repositories/analytics-daily-summary.repository");
17
+ const analytics_session_repository_1 = require("../repositories/analytics-session.repository");
18
+ const analytics_admin_service_1 = require("../services/analytics.admin.service");
19
+ /** Maximum calendar days drained per run, so a backlog empties over a month. */
20
+ const MAX_DAYS_PER_RUN = 31;
21
+ let AnalyticsRetentionCron = class AnalyticsRetentionCron {
22
+ constructor(analyticsSessionRepository, analyticsDailySummaryRepository, analyticsAdminService, logger) {
23
+ this.analyticsSessionRepository = analyticsSessionRepository;
24
+ this.analyticsDailySummaryRepository = analyticsDailySummaryRepository;
25
+ this.analyticsAdminService = analyticsAdminService;
26
+ this.logger = logger;
27
+ }
28
+ async run() {
29
+ const expiredDays = await this.analyticsSessionRepository.findExpiredDays({
30
+ cutoff: this.analyticsAdminService.retentionCutoff(),
31
+ limit: MAX_DAYS_PER_RUN,
32
+ });
33
+ for (const date of expiredDays) {
34
+ try {
35
+ const summaryRows = await this.analyticsDailySummaryRepository.rollupDay({ date });
36
+ const deleted = await this.analyticsSessionRepository.deleteDay({ date });
37
+ this.logger.log(`Analytics day ${date}: ${summaryRows} summary rows written, ${deleted.sessions} sessions and ${deleted.pageViews} page views deleted`, "AnalyticsRetentionCron");
38
+ }
39
+ catch (error) {
40
+ this.logger.error(`Failed to roll up and delete analytics day ${date}: ${error.message}`, "AnalyticsRetentionCron");
41
+ }
42
+ }
43
+ const unlinked = await this.analyticsSessionRepository.unlinkDeletedUsers();
44
+ this.logger.log(`Analytics sessions unlinked from deleted users: ${unlinked}`, "AnalyticsRetentionCron");
45
+ }
46
+ };
47
+ exports.AnalyticsRetentionCron = AnalyticsRetentionCron;
48
+ __decorate([
49
+ (0, schedule_1.Cron)("0 3 * * *"),
50
+ __metadata("design:type", Function),
51
+ __metadata("design:paramtypes", []),
52
+ __metadata("design:returntype", Promise)
53
+ ], AnalyticsRetentionCron.prototype, "run", null);
54
+ exports.AnalyticsRetentionCron = AnalyticsRetentionCron = __decorate([
55
+ (0, common_1.Injectable)(),
56
+ __metadata("design:paramtypes", [analytics_session_repository_1.AnalyticsSessionRepository,
57
+ analytics_daily_summary_repository_1.AnalyticsDailySummaryRepository,
58
+ analytics_admin_service_1.AnalyticsAdminService,
59
+ logging_service_1.AppLoggingService])
60
+ ], AnalyticsRetentionCron);
61
+ //# sourceMappingURL=analytics-retention.cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-retention.cron.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/cron/analytics-retention.cron.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+CAAwC;AACxC,oFAAmF;AACnF,2GAAqG;AACrG,+FAA0F;AAC1F,iFAA4E;AAE5E,gFAAgF;AAChF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAGrB,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YACmB,0BAAsD,EACtD,+BAAgE,EAChE,qBAA4C,EAC5C,MAAyB;QAHzB,+BAA0B,GAA1B,0BAA0B,CAA4B;QACtD,oCAA+B,GAA/B,+BAA+B,CAAiC;QAChE,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,WAAM,GAAN,MAAM,CAAmB;IACzC,CAAC;IAGE,AAAN,KAAK,CAAC,GAAG;QACP,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC;YACxE,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE;YACpD,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,iBAAiB,IAAI,KAAK,WAAW,0BAA0B,OAAO,CAAC,QAAQ,iBAAiB,OAAO,CAAC,SAAS,qBAAqB,EACtI,wBAAwB,CACzB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8CAA8C,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EACjF,wBAAwB,CACzB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,EAAE,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mDAAmD,QAAQ,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAC3G,CAAC;CACF,CAAA;AAlCY,wDAAsB;AAS3B;IADL,IAAA,eAAI,EAAC,WAAW,CAAC;;;;iDAyBjB;iCAjCU,sBAAsB;IADlC,IAAA,mBAAU,GAAE;qCAGoC,yDAA0B;QACrB,oEAA+B;QACzC,+CAAqB;QACpC,mCAAiB;GALjC,sBAAsB,CAkClC"}
@@ -0,0 +1,21 @@
1
+ export declare class AnalyticsEventPostAttributesDTO {
2
+ path: string;
3
+ section: "public" | "app";
4
+ referrer?: string;
5
+ utmSource?: string;
6
+ utmMedium?: string;
7
+ utmCampaign?: string;
8
+ utmTerm?: string;
9
+ utmContent?: string;
10
+ visitorId?: string;
11
+ screenWidth?: number;
12
+ }
13
+ export declare class AnalyticsEventPostDataDTO {
14
+ type: string;
15
+ id?: string;
16
+ attributes: AnalyticsEventPostAttributesDTO;
17
+ }
18
+ export declare class AnalyticsEventPostDTO {
19
+ data: AnalyticsEventPostDataDTO;
20
+ }
21
+ //# sourceMappingURL=analytics-event.post.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-event.post.dto.d.ts","sourceRoot":"","sources":["../../../../src/foundations/analytics/dtos/analytics-event.post.dto.ts"],"names":[],"mappings":"AAgBA,qBAAa,+BAA+B;IAK1C,IAAI,EAAE,MAAM,CAAC;IAIb,OAAO,EAAE,QAAQ,GAAG,KAAK,CAAC;IAK1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,yBAAyB;IAEpC,IAAI,EAAE,MAAM,CAAC;IAIb,EAAE,CAAC,EAAE,MAAM,CAAC;IAKZ,UAAU,EAAE,+BAA+B,CAAC;CAC7C;AAED,qBAAa,qBAAqB;IAIhC,IAAI,EAAE,yBAAyB,CAAC;CACjC"}
@@ -0,0 +1,105 @@
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.AnalyticsEventPostDTO = exports.AnalyticsEventPostDataDTO = exports.AnalyticsEventPostAttributesDTO = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const analytics_event_meta_1 = require("../entities/analytics-event.meta");
16
+ class AnalyticsEventPostAttributesDTO {
17
+ }
18
+ exports.AnalyticsEventPostAttributesDTO = AnalyticsEventPostAttributesDTO;
19
+ __decorate([
20
+ (0, class_validator_1.IsDefined)(),
21
+ (0, class_validator_1.IsNotEmpty)(),
22
+ (0, class_validator_1.IsString)(),
23
+ (0, class_validator_1.MaxLength)(2048),
24
+ __metadata("design:type", String)
25
+ ], AnalyticsEventPostAttributesDTO.prototype, "path", void 0);
26
+ __decorate([
27
+ (0, class_validator_1.IsDefined)(),
28
+ (0, class_validator_1.IsIn)(["public", "app"]),
29
+ __metadata("design:type", String)
30
+ ], AnalyticsEventPostAttributesDTO.prototype, "section", void 0);
31
+ __decorate([
32
+ (0, class_validator_1.IsOptional)(),
33
+ (0, class_validator_1.IsString)(),
34
+ (0, class_validator_1.MaxLength)(2048),
35
+ __metadata("design:type", String)
36
+ ], AnalyticsEventPostAttributesDTO.prototype, "referrer", void 0);
37
+ __decorate([
38
+ (0, class_validator_1.IsOptional)(),
39
+ (0, class_validator_1.IsString)(),
40
+ (0, class_validator_1.MaxLength)(255),
41
+ __metadata("design:type", String)
42
+ ], AnalyticsEventPostAttributesDTO.prototype, "utmSource", void 0);
43
+ __decorate([
44
+ (0, class_validator_1.IsOptional)(),
45
+ (0, class_validator_1.IsString)(),
46
+ (0, class_validator_1.MaxLength)(255),
47
+ __metadata("design:type", String)
48
+ ], AnalyticsEventPostAttributesDTO.prototype, "utmMedium", void 0);
49
+ __decorate([
50
+ (0, class_validator_1.IsOptional)(),
51
+ (0, class_validator_1.IsString)(),
52
+ (0, class_validator_1.MaxLength)(255),
53
+ __metadata("design:type", String)
54
+ ], AnalyticsEventPostAttributesDTO.prototype, "utmCampaign", void 0);
55
+ __decorate([
56
+ (0, class_validator_1.IsOptional)(),
57
+ (0, class_validator_1.IsString)(),
58
+ (0, class_validator_1.MaxLength)(255),
59
+ __metadata("design:type", String)
60
+ ], AnalyticsEventPostAttributesDTO.prototype, "utmTerm", void 0);
61
+ __decorate([
62
+ (0, class_validator_1.IsOptional)(),
63
+ (0, class_validator_1.IsString)(),
64
+ (0, class_validator_1.MaxLength)(255),
65
+ __metadata("design:type", String)
66
+ ], AnalyticsEventPostAttributesDTO.prototype, "utmContent", void 0);
67
+ __decorate([
68
+ (0, class_validator_1.IsOptional)(),
69
+ (0, class_validator_1.IsUUID)(),
70
+ __metadata("design:type", String)
71
+ ], AnalyticsEventPostAttributesDTO.prototype, "visitorId", void 0);
72
+ __decorate([
73
+ (0, class_validator_1.IsOptional)(),
74
+ (0, class_validator_1.IsInt)(),
75
+ (0, class_validator_1.Min)(0),
76
+ __metadata("design:type", Number)
77
+ ], AnalyticsEventPostAttributesDTO.prototype, "screenWidth", void 0);
78
+ class AnalyticsEventPostDataDTO {
79
+ }
80
+ exports.AnalyticsEventPostDataDTO = AnalyticsEventPostDataDTO;
81
+ __decorate([
82
+ (0, class_validator_1.Equals)(analytics_event_meta_1.analyticsEventMeta.type),
83
+ __metadata("design:type", String)
84
+ ], AnalyticsEventPostDataDTO.prototype, "type", void 0);
85
+ __decorate([
86
+ (0, class_validator_1.IsOptional)(),
87
+ (0, class_validator_1.IsUUID)(),
88
+ __metadata("design:type", String)
89
+ ], AnalyticsEventPostDataDTO.prototype, "id", void 0);
90
+ __decorate([
91
+ (0, class_validator_1.ValidateNested)(),
92
+ (0, class_validator_1.IsDefined)(),
93
+ (0, class_transformer_1.Type)(() => AnalyticsEventPostAttributesDTO),
94
+ __metadata("design:type", AnalyticsEventPostAttributesDTO)
95
+ ], AnalyticsEventPostDataDTO.prototype, "attributes", void 0);
96
+ class AnalyticsEventPostDTO {
97
+ }
98
+ exports.AnalyticsEventPostDTO = AnalyticsEventPostDTO;
99
+ __decorate([
100
+ (0, class_validator_1.ValidateNested)(),
101
+ (0, class_validator_1.IsDefined)(),
102
+ (0, class_transformer_1.Type)(() => AnalyticsEventPostDataDTO),
103
+ __metadata("design:type", AnalyticsEventPostDataDTO)
104
+ ], AnalyticsEventPostDTO.prototype, "data", void 0);
105
+ //# sourceMappingURL=analytics-event.post.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-event.post.dto.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/dtos/analytics-event.post.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAyC;AACzC,qDAYyB;AACzB,2EAAsE;AAEtE,MAAa,+BAA+B;CAiD3C;AAjDD,0EAiDC;AA5CC;IAJC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,IAAI,CAAC;;6DACH;AAIb;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,sBAAI,EAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;;gEACE;AAK1B;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,IAAI,CAAC;;iEACE;AAKlB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;kEACI;AAKnB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;kEACI;AAKnB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;oEACM;AAKrB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;gEACE;AAKjB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;mEACK;AAIpB;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,GAAE;;kEACU;AAKnB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;oEACc;AAGvB,MAAa,yBAAyB;CAYrC;AAZD,8DAYC;AAVC;IADC,IAAA,wBAAM,EAAC,yCAAkB,CAAC,IAAI,CAAC;;uDACnB;AAIb;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,GAAE;;qDACG;AAKZ;IAHC,IAAA,gCAAc,GAAE;IAChB,IAAA,2BAAS,GAAE;IACX,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC;8BAChC,+BAA+B;6DAAC;AAG9C,MAAa,qBAAqB;CAKjC;AALD,sDAKC;AADC;IAHC,IAAA,gCAAc,GAAE;IAChB,IAAA,2BAAS,GAAE;IACX,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC;8BAChC,yBAAyB;mDAAC"}
@@ -0,0 +1,17 @@
1
+ import { Entity } from "../../../common/abstracts/entity";
2
+ /**
3
+ * One (dimension, key) row of the admin breakdown tables: traffic grouped by
4
+ * source, medium, campaign, referrer, route or landing route.
5
+ *
6
+ * NOT a Neo4j node — serialisation shape only (see the summary descriptor).
7
+ */
8
+ export type AnalyticsBreakdownEntity = Entity & {
9
+ dimension: string;
10
+ key: string;
11
+ visitors: number;
12
+ sessions: number;
13
+ pageViews: number;
14
+ };
15
+ export declare const AnalyticsBreakdownDescriptor: import("../../..").EntityDescriptor<AnalyticsBreakdownEntity, {}>;
16
+ export type AnalyticsBreakdownDescriptorType = typeof AnalyticsBreakdownDescriptor;
17
+ //# sourceMappingURL=analytics-breakdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-breakdown.d.ts","sourceRoot":"","sources":["../../../../src/foundations/analytics/entities/analytics-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI1D;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,4BAA4B,mEAcvC,CAAC;AAEH,MAAM,MAAM,gCAAgC,GAAG,OAAO,4BAA4B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnalyticsBreakdownDescriptor = void 0;
4
+ const define_entity_1 = require("../../../common/helpers/define-entity");
5
+ const analytics_breakdown_meta_1 = require("./analytics-breakdown.meta");
6
+ exports.AnalyticsBreakdownDescriptor = (0, define_entity_1.defineEntity)()({
7
+ ...analytics_breakdown_meta_1.analyticsBreakdownMeta,
8
+ isCompanyScoped: false,
9
+ fields: {
10
+ dimension: { type: "string", required: true },
11
+ key: { type: "string", required: true },
12
+ visitors: { type: "number", required: true },
13
+ sessions: { type: "number", required: true },
14
+ pageViews: { type: "number", required: true },
15
+ },
16
+ relationships: {},
17
+ });
18
+ //# sourceMappingURL=analytics-breakdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-breakdown.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/entities/analytics-breakdown.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,yEAAoE;AAgBvD,QAAA,4BAA4B,GAAG,IAAA,4BAAY,GAA4B,CAAC;IACnF,GAAG,iDAAsB;IAEzB,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC9C;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DataMeta } from "../../../common/interfaces/datamodel.interface";
2
+ export declare const analyticsBreakdownMeta: DataMeta;
3
+ //# sourceMappingURL=analytics-breakdown.meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-breakdown.meta.d.ts","sourceRoot":"","sources":["../../../../src/foundations/analytics/entities/analytics-breakdown.meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAE1E,eAAO,MAAM,sBAAsB,EAAE,QAKpC,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyticsBreakdownMeta = void 0;
4
+ exports.analyticsBreakdownMeta = {
5
+ type: "analytics-breakdowns",
6
+ endpoint: "analytics/administration/breakdown",
7
+ nodeName: "analyticsBreakdown",
8
+ labelName: "AnalyticsBreakdown",
9
+ };
10
+ //# sourceMappingURL=analytics-breakdown.meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-breakdown.meta.js","sourceRoot":"","sources":["../../../../src/foundations/analytics/entities/analytics-breakdown.meta.ts"],"names":[],"mappings":";;;AAEa,QAAA,sBAAsB,GAAa;IAC9C,IAAI,EAAE,sBAAsB;IAC5B,QAAQ,EAAE,oCAAoC;IAC9C,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,oBAAoB;CAChC,CAAC"}