@carlonicora/nestjs-neo4jsonapi 4.13.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.
- package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
- package/dist/bootstrap/app.module.factory.js +1 -0
- package/dist/bootstrap/app.module.factory.js.map +1 -1
- package/dist/bootstrap/bootstrap.options.d.ts +22 -0
- package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
- package/dist/config/base.config.d.ts.map +1 -1
- package/dist/config/base.config.js +5 -0
- package/dist/config/base.config.js.map +1 -1
- package/dist/config/enums/queue.id.d.ts +1 -0
- package/dist/config/enums/queue.id.d.ts.map +1 -1
- package/dist/config/enums/queue.id.js +1 -0
- package/dist/config/enums/queue.id.js.map +1 -1
- package/dist/config/interfaces/base.config.interface.d.ts +2 -0
- package/dist/config/interfaces/base.config.interface.d.ts.map +1 -1
- package/dist/config/interfaces/config.analytics.interface.d.ts +13 -0
- package/dist/config/interfaces/config.analytics.interface.d.ts.map +1 -0
- package/dist/config/interfaces/config.analytics.interface.js +3 -0
- package/dist/config/interfaces/config.analytics.interface.js.map +1 -0
- package/dist/config/interfaces/index.d.ts +1 -0
- package/dist/config/interfaces/index.d.ts.map +1 -1
- package/dist/config/interfaces/index.js +1 -0
- package/dist/config/interfaces/index.js.map +1 -1
- package/dist/foundations/analytics/analytics.module.d.ts +39 -0
- package/dist/foundations/analytics/analytics.module.d.ts.map +1 -0
- package/dist/foundations/analytics/analytics.module.js +122 -0
- package/dist/foundations/analytics/analytics.module.js.map +1 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts +32 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js +197 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -0
- package/dist/foundations/analytics/controllers/analytics.controller.d.ts +29 -0
- package/dist/foundations/analytics/controllers/analytics.controller.d.ts.map +1 -0
- package/dist/foundations/analytics/controllers/analytics.controller.js +85 -0
- package/dist/foundations/analytics/controllers/analytics.controller.js.map +1 -0
- package/dist/foundations/analytics/cron/analytics-retention.cron.d.ts +13 -0
- package/dist/foundations/analytics/cron/analytics-retention.cron.d.ts.map +1 -0
- package/dist/foundations/analytics/cron/analytics-retention.cron.js +61 -0
- package/dist/foundations/analytics/cron/analytics-retention.cron.js.map +1 -0
- package/dist/foundations/analytics/dtos/analytics-event.post.dto.d.ts +21 -0
- package/dist/foundations/analytics/dtos/analytics-event.post.dto.d.ts.map +1 -0
- package/dist/foundations/analytics/dtos/analytics-event.post.dto.js +105 -0
- package/dist/foundations/analytics/dtos/analytics-event.post.dto.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.d.ts +17 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.js +18 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-breakdown.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.d.ts +30 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.js +28 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-daily-summary.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-event.meta.d.ts +8 -0
- package/dist/foundations/analytics/entities/analytics-event.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-event.meta.js +15 -0
- package/dist/foundations/analytics/entities/analytics-event.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-page-view.d.ts +39 -0
- package/dist/foundations/analytics/entities/analytics-page-view.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-page-view.js +38 -0
- package/dist/foundations/analytics/entities/analytics-page-view.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-page-view.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-page-view.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-page-view.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-page-view.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-session.d.ts +52 -0
- package/dist/foundations/analytics/entities/analytics-session.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-session.js +47 -0
- package/dist/foundations/analytics/entities/analytics-session.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-session.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-session.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-session.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-session.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-summary.d.ts +24 -0
- package/dist/foundations/analytics/entities/analytics-summary.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-summary.js +20 -0
- package/dist/foundations/analytics/entities/analytics-summary.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-summary.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-summary.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-summary.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-summary.meta.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-timeline.d.ts +20 -0
- package/dist/foundations/analytics/entities/analytics-timeline.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-timeline.js +18 -0
- package/dist/foundations/analytics/entities/analytics-timeline.js.map +1 -0
- package/dist/foundations/analytics/entities/analytics-timeline.meta.d.ts +3 -0
- package/dist/foundations/analytics/entities/analytics-timeline.meta.d.ts.map +1 -0
- package/dist/foundations/analytics/entities/analytics-timeline.meta.js +10 -0
- package/dist/foundations/analytics/entities/analytics-timeline.meta.js.map +1 -0
- package/dist/foundations/analytics/index.d.ts +27 -0
- package/dist/foundations/analytics/index.d.ts.map +1 -0
- package/dist/foundations/analytics/index.js +54 -0
- package/dist/foundations/analytics/index.js.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.config.interface.d.ts +80 -0
- package/dist/foundations/analytics/interfaces/analytics.config.interface.d.ts.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.config.interface.js +28 -0
- package/dist/foundations/analytics/interfaces/analytics.config.interface.js.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.page-view.input.d.ts +30 -0
- package/dist/foundations/analytics/interfaces/analytics.page-view.input.d.ts.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.page-view.input.js +3 -0
- package/dist/foundations/analytics/interfaces/analytics.page-view.input.js.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.d.ts +30 -0
- package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.d.ts.map +1 -0
- package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.js +3 -0
- package/dist/foundations/analytics/interfaces/analytics.resolved-page-view.js.map +1 -0
- package/dist/foundations/analytics/processors/analytics.processor.d.ts +33 -0
- package/dist/foundations/analytics/processors/analytics.processor.d.ts.map +1 -0
- package/dist/foundations/analytics/processors/analytics.processor.js +126 -0
- package/dist/foundations/analytics/processors/analytics.processor.js.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.d.ts +38 -0
- package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.d.ts.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.js +142 -0
- package/dist/foundations/analytics/repositories/analytics-daily-summary.repository.js.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-page-view.repository.d.ts +30 -0
- package/dist/foundations/analytics/repositories/analytics-page-view.repository.d.ts.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-page-view.repository.js +62 -0
- package/dist/foundations/analytics/repositories/analytics-page-view.repository.js.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-session.repository.d.ts +87 -0
- package/dist/foundations/analytics/repositories/analytics-session.repository.d.ts.map +1 -0
- package/dist/foundations/analytics/repositories/analytics-session.repository.js +261 -0
- package/dist/foundations/analytics/repositories/analytics-session.repository.js.map +1 -0
- package/dist/foundations/analytics/repositories/analytics.admin.repository.d.ts +145 -0
- package/dist/foundations/analytics/repositories/analytics.admin.repository.d.ts.map +1 -0
- package/dist/foundations/analytics/repositories/analytics.admin.repository.js +490 -0
- package/dist/foundations/analytics/repositories/analytics.admin.repository.js.map +1 -0
- package/dist/foundations/analytics/services/analytics.admin.service.d.ts +74 -0
- package/dist/foundations/analytics/services/analytics.admin.service.d.ts.map +1 -0
- package/dist/foundations/analytics/services/analytics.admin.service.js +126 -0
- package/dist/foundations/analytics/services/analytics.admin.service.js.map +1 -0
- package/dist/foundations/analytics/services/analytics.service.d.ts +31 -0
- package/dist/foundations/analytics/services/analytics.service.d.ts.map +1 -0
- package/dist/foundations/analytics/services/analytics.service.js +57 -0
- package/dist/foundations/analytics/services/analytics.service.js.map +1 -0
- package/dist/foundations/analytics/services/analytics.visitor-id.service.d.ts +34 -0
- package/dist/foundations/analytics/services/analytics.visitor-id.service.d.ts.map +1 -0
- package/dist/foundations/analytics/services/analytics.visitor-id.service.js +93 -0
- package/dist/foundations/analytics/services/analytics.visitor-id.service.js.map +1 -0
- package/dist/foundations/foundations.modules.d.ts +3 -0
- package/dist/foundations/foundations.modules.d.ts.map +1 -1
- package/dist/foundations/foundations.modules.js +3 -1
- package/dist/foundations/foundations.modules.js.map +1 -1
- package/dist/foundations/index.d.ts +1 -0
- package/dist/foundations/index.d.ts.map +1 -1
- package/dist/foundations/index.js +1 -0
- package/dist/foundations/index.js.map +1 -1
- package/dist/foundations/s3/services/s3.service.d.ts +1 -0
- package/dist/foundations/s3/services/s3.service.d.ts.map +1 -1
- package/dist/foundations/s3/services/s3.service.js +10 -3
- package/dist/foundations/s3/services/s3.service.js.map +1 -1
- 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 @@
|
|
|
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"}
|