@carlonicora/nestjs-neo4jsonapi 8.12.1 → 8.14.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/foundations/account-deletion/repositories/account-deletion.wipe.repository.d.ts +2 -1
- package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.d.ts.map +1 -1
- package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.js +8 -1
- package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.js.map +1 -1
- package/dist/foundations/chunker/services/chunker.service.d.ts +32 -0
- package/dist/foundations/chunker/services/chunker.service.d.ts.map +1 -1
- package/dist/foundations/chunker/services/chunker.service.js +129 -0
- package/dist/foundations/chunker/services/chunker.service.js.map +1 -1
- package/dist/foundations/chunker/utils/zip-limits.d.ts +9 -0
- package/dist/foundations/chunker/utils/zip-limits.d.ts.map +1 -1
- package/dist/foundations/chunker/utils/zip-limits.js +5 -2
- package/dist/foundations/chunker/utils/zip-limits.js.map +1 -1
- package/dist/foundations/company/repositories/company.repository.d.ts +2 -2
- package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
- package/dist/foundations/company/repositories/company.repository.js +10 -2
- package/dist/foundations/company/repositories/company.repository.js.map +1 -1
- package/dist/foundations/referral/controllers/index.d.ts +2 -0
- package/dist/foundations/referral/controllers/index.d.ts.map +1 -1
- package/dist/foundations/referral/controllers/index.js +2 -0
- package/dist/foundations/referral/controllers/index.js.map +1 -1
- package/dist/foundations/referral/controllers/referral.admin.controller.d.ts +24 -0
- package/dist/foundations/referral/controllers/referral.admin.controller.d.ts.map +1 -0
- package/dist/foundations/referral/controllers/referral.admin.controller.js +100 -0
- package/dist/foundations/referral/controllers/referral.admin.controller.js.map +1 -0
- package/dist/foundations/referral/controllers/referral.public.controller.d.ts +19 -0
- package/dist/foundations/referral/controllers/referral.public.controller.d.ts.map +1 -0
- package/dist/foundations/referral/controllers/referral.public.controller.js +57 -0
- package/dist/foundations/referral/controllers/referral.public.controller.js.map +1 -0
- package/dist/foundations/referral/dtos/index.d.ts +1 -0
- package/dist/foundations/referral/dtos/index.d.ts.map +1 -1
- package/dist/foundations/referral/dtos/index.js +1 -0
- package/dist/foundations/referral/dtos/index.js.map +1 -1
- package/dist/foundations/referral/dtos/referral-visit.post.dto.d.ts +11 -0
- package/dist/foundations/referral/dtos/referral-visit.post.dto.d.ts.map +1 -0
- package/dist/foundations/referral/dtos/referral-visit.post.dto.js +48 -0
- package/dist/foundations/referral/dtos/referral-visit.post.dto.js.map +1 -0
- package/dist/foundations/referral/entities/index.d.ts +11 -0
- package/dist/foundations/referral/entities/index.d.ts.map +1 -1
- package/dist/foundations/referral/entities/index.js +11 -0
- package/dist/foundations/referral/entities/index.js.map +1 -1
- package/dist/foundations/referral/entities/referral-admin-referral.d.ts +23 -0
- package/dist/foundations/referral/entities/referral-admin-referral.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referral.js +23 -0
- package/dist/foundations/referral/entities/referral-admin-referral.js.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referral.meta.d.ts +3 -0
- package/dist/foundations/referral/entities/referral-admin-referral.meta.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referral.meta.js +10 -0
- package/dist/foundations/referral/entities/referral-admin-referral.meta.js.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.d.ts +22 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.js +23 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.js.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.meta.d.ts +3 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.meta.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.meta.js +10 -0
- package/dist/foundations/referral/entities/referral-admin-referrer.meta.js.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-summary.d.ts +23 -0
- package/dist/foundations/referral/entities/referral-admin-summary.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-summary.js +22 -0
- package/dist/foundations/referral/entities/referral-admin-summary.js.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-summary.meta.d.ts +3 -0
- package/dist/foundations/referral/entities/referral-admin-summary.meta.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-admin-summary.meta.js +10 -0
- package/dist/foundations/referral/entities/referral-admin-summary.meta.js.map +1 -0
- package/dist/foundations/referral/entities/referral-invite.d.ts +27 -0
- package/dist/foundations/referral/entities/referral-invite.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-invite.js +28 -0
- package/dist/foundations/referral/entities/referral-invite.js.map +1 -0
- package/dist/foundations/referral/entities/referral-invite.meta.d.ts +3 -0
- package/dist/foundations/referral/entities/referral-invite.meta.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-invite.meta.js +10 -0
- package/dist/foundations/referral/entities/referral-invite.meta.js.map +1 -0
- package/dist/foundations/referral/entities/referral-source.d.ts +10 -0
- package/dist/foundations/referral/entities/referral-source.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-source.js +9 -0
- package/dist/foundations/referral/entities/referral-source.js.map +1 -0
- package/dist/foundations/referral/entities/referral-visit.d.ts +19 -0
- package/dist/foundations/referral/entities/referral-visit.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-visit.js +21 -0
- package/dist/foundations/referral/entities/referral-visit.js.map +1 -0
- package/dist/foundations/referral/entities/referral-visit.meta.d.ts +7 -0
- package/dist/foundations/referral/entities/referral-visit.meta.d.ts.map +1 -0
- package/dist/foundations/referral/entities/referral-visit.meta.js +14 -0
- package/dist/foundations/referral/entities/referral-visit.meta.js.map +1 -0
- package/dist/foundations/referral/entities/referral.d.ts +3 -0
- package/dist/foundations/referral/entities/referral.d.ts.map +1 -1
- package/dist/foundations/referral/entities/referral.js +1 -0
- package/dist/foundations/referral/entities/referral.js.map +1 -1
- package/dist/foundations/referral/index.d.ts +1 -0
- package/dist/foundations/referral/index.d.ts.map +1 -1
- package/dist/foundations/referral/index.js +1 -0
- package/dist/foundations/referral/index.js.map +1 -1
- package/dist/foundations/referral/referral.module.d.ts.map +1 -1
- package/dist/foundations/referral/referral.module.js +20 -1
- package/dist/foundations/referral/referral.module.js.map +1 -1
- package/dist/foundations/referral/repositories/index.d.ts +1 -0
- package/dist/foundations/referral/repositories/index.d.ts.map +1 -1
- package/dist/foundations/referral/repositories/index.js +1 -0
- package/dist/foundations/referral/repositories/index.js.map +1 -1
- package/dist/foundations/referral/repositories/referral.admin.repository.d.ts +106 -0
- package/dist/foundations/referral/repositories/referral.admin.repository.d.ts.map +1 -0
- package/dist/foundations/referral/repositories/referral.admin.repository.js +380 -0
- package/dist/foundations/referral/repositories/referral.admin.repository.js.map +1 -0
- package/dist/foundations/referral/repositories/referral.repository.d.ts +34 -0
- package/dist/foundations/referral/repositories/referral.repository.d.ts.map +1 -1
- package/dist/foundations/referral/repositories/referral.repository.js +82 -0
- package/dist/foundations/referral/repositories/referral.repository.js.map +1 -1
- package/dist/foundations/referral/services/index.d.ts +1 -0
- package/dist/foundations/referral/services/index.d.ts.map +1 -1
- package/dist/foundations/referral/services/index.js +1 -0
- package/dist/foundations/referral/services/index.js.map +1 -1
- package/dist/foundations/referral/services/referral.admin.service.d.ts +53 -0
- package/dist/foundations/referral/services/referral.admin.service.d.ts.map +1 -0
- package/dist/foundations/referral/services/referral.admin.service.js +94 -0
- package/dist/foundations/referral/services/referral.admin.service.js.map +1 -0
- package/dist/foundations/referral/services/referral.service.d.ts +10 -2
- package/dist/foundations/referral/services/referral.service.d.ts.map +1 -1
- package/dist/foundations/referral/services/referral.service.js +34 -4
- package/dist/foundations/referral/services/referral.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,380 @@
|
|
|
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.ReferralAdminRepository = exports.REFERRAL_ADMIN_SORTS = exports.REFERRAL_ADMIN_PERIODS = void 0;
|
|
13
|
+
// nja-lint-ignore-file: cross-tenant administrative read repository.
|
|
14
|
+
//
|
|
15
|
+
// Every query here deliberately omits buildDefaultMatch(): that helper scopes to
|
|
16
|
+
// the CALLER's company via CLS, which is exactly wrong for a platform-wide
|
|
17
|
+
// referral report that reads every company's invites, visits and referrals at
|
|
18
|
+
// once. Access is gated instead by the controller's JwtAuthGuard +
|
|
19
|
+
// @Roles(Administrator) (see referral.admin.controller.ts). The RETURNs are
|
|
20
|
+
// scalar columns (counts, sums, owner names), not graph nodes, so
|
|
21
|
+
// readOne()/readMany() cannot map them: entityFactory.createGraphList expects
|
|
22
|
+
// nodes. Same shape and same rationale as
|
|
23
|
+
// foundations/analytics/repositories/analytics.admin.repository.ts.
|
|
24
|
+
//
|
|
25
|
+
// For the same reason it also does NOT call Neo4jService.initQuery(): that
|
|
26
|
+
// helper prepends its own CLS-scoped company MATCH whenever the caller's CLS
|
|
27
|
+
// carries a companyId, and a platform administrator who also owns a company
|
|
28
|
+
// does. That would reduce every count to the administrator's own company.
|
|
29
|
+
// Every query here seeds itself from _adminQuery() instead. No query here binds
|
|
30
|
+
// a parameter named companyId.
|
|
31
|
+
//
|
|
32
|
+
// The architecture gate raises a FILE-LEVEL manual-query-no-company-scope finding
|
|
33
|
+
// on this shape; per-line ignores do not clear it, so this header note is the
|
|
34
|
+
// documented resolution.
|
|
35
|
+
const common_1 = require("@nestjs/common");
|
|
36
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
37
|
+
const define_entity_1 = require("../../../common/helpers/define-entity");
|
|
38
|
+
const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
|
|
39
|
+
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
40
|
+
const security_service_1 = require("../../../core/security/services/security.service");
|
|
41
|
+
const company_meta_1 = require("../../company/entities/company.meta");
|
|
42
|
+
const user_meta_1 = require("../../user/entities/user.meta");
|
|
43
|
+
const referral_1 = require("../entities/referral");
|
|
44
|
+
const referral_admin_referral_1 = require("../entities/referral-admin-referral");
|
|
45
|
+
const referral_admin_referrer_1 = require("../entities/referral-admin-referrer");
|
|
46
|
+
const referral_invite_meta_1 = require("../entities/referral-invite.meta");
|
|
47
|
+
const referral_source_1 = require("../entities/referral-source");
|
|
48
|
+
const referral_visit_meta_1 = require("../entities/referral-visit.meta");
|
|
49
|
+
const referral_meta_1 = require("../entities/referral.meta");
|
|
50
|
+
/** The periods the admin endpoints accept, in days back from now (`all` has no start). */
|
|
51
|
+
exports.REFERRAL_ADMIN_PERIODS = { "30d": 30, "90d": 90, all: null };
|
|
52
|
+
/**
|
|
53
|
+
* The ORDER BY clauses the referrers list may emit, keyed by the sort it accepts.
|
|
54
|
+
* A lookup rather than an interpolation of the caller's string: nothing that did
|
|
55
|
+
* not come from this table can ever reach the query text.
|
|
56
|
+
*/
|
|
57
|
+
exports.REFERRAL_ADMIN_SORTS = {
|
|
58
|
+
paying: "paying DESC, signups DESC",
|
|
59
|
+
signups: "signups DESC, paying DESC",
|
|
60
|
+
invites: "invitesSent DESC, paying DESC",
|
|
61
|
+
conversion: "conversion DESC, paying DESC",
|
|
62
|
+
credits: "creditsEarned DESC, paying DESC",
|
|
63
|
+
};
|
|
64
|
+
const COMPANY = company_meta_1.companyMeta.labelName;
|
|
65
|
+
const USER = user_meta_1.userMeta.labelName;
|
|
66
|
+
const REFERRAL = referral_meta_1.referralMeta.labelName;
|
|
67
|
+
const INVITE = referral_invite_meta_1.referralInviteMeta.labelName;
|
|
68
|
+
const VISIT = referral_visit_meta_1.referralVisitMeta.labelName;
|
|
69
|
+
/** Driver Integers arrive as { toNumber() }. */
|
|
70
|
+
const int = (value) => (value?.toNumber ? value.toNumber() : Number(value ?? 0) || 0);
|
|
71
|
+
/**
|
|
72
|
+
* Platform-wide reads behind /referrals/administration/*. The Referral
|
|
73
|
+
* descriptor is only there to satisfy the base class; nothing here goes through
|
|
74
|
+
* the inherited CRUD.
|
|
75
|
+
*
|
|
76
|
+
* Counting rules:
|
|
77
|
+
* - every window is [from, to): an inclusive start, so a record created exactly
|
|
78
|
+
* at the period start counts; `from = null` ("all") has no start;
|
|
79
|
+
* - visits and invites count by their createdAt; sign-ups are Referrals created
|
|
80
|
+
* in the window (both sources); paying are Referrals with status completed
|
|
81
|
+
* and completedAt in the window; credits given are twice the sum of their
|
|
82
|
+
* tokensAwarded (both sides are rewarded);
|
|
83
|
+
* - companies with a user in $excludeUserIds (platform administrators) are left
|
|
84
|
+
* out on both sides; demo companies (isDemo) are left out on the referred side.
|
|
85
|
+
*/
|
|
86
|
+
let ReferralAdminRepository = class ReferralAdminRepository extends abstract_repository_1.AbstractRepository {
|
|
87
|
+
constructor(neo4j, securityService, clsService) {
|
|
88
|
+
super(neo4j, securityService, clsService);
|
|
89
|
+
this.descriptor = referral_1.ReferralDescriptor;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* One row per window: "current" = [from, to), plus "previous" =
|
|
93
|
+
* [previousFrom, from) when previousFrom is not null.
|
|
94
|
+
*/
|
|
95
|
+
async findSummary(params) {
|
|
96
|
+
const windows = [
|
|
97
|
+
this._summaryWindow({
|
|
98
|
+
window: "current",
|
|
99
|
+
from: params.from,
|
|
100
|
+
to: params.to,
|
|
101
|
+
excludeUserIds: params.excludeUserIds,
|
|
102
|
+
}),
|
|
103
|
+
];
|
|
104
|
+
if (params.previousFrom !== null && params.from !== null)
|
|
105
|
+
windows.push(this._summaryWindow({
|
|
106
|
+
window: "previous",
|
|
107
|
+
from: params.previousFrom,
|
|
108
|
+
to: params.from,
|
|
109
|
+
excludeUserIds: params.excludeUserIds,
|
|
110
|
+
}));
|
|
111
|
+
return Promise.all(windows);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* One row per referrer company with at least one visit, invite or referral in
|
|
115
|
+
* the period, so a company with only visits still appears with zeros
|
|
116
|
+
* elsewhere. lastInviteAt is the company's most recent invite, in or before
|
|
117
|
+
* the period.
|
|
118
|
+
*/
|
|
119
|
+
async findReferrers(params) {
|
|
120
|
+
const orderBy = Object.prototype.hasOwnProperty.call(exports.REFERRAL_ADMIN_SORTS, params.sort)
|
|
121
|
+
? exports.REFERRAL_ADMIN_SORTS[params.sort]
|
|
122
|
+
: exports.REFERRAL_ADMIN_SORTS.paying;
|
|
123
|
+
const seed = this._adminQuery({
|
|
124
|
+
from: params.from,
|
|
125
|
+
to: new Date().toISOString(),
|
|
126
|
+
excludeUserIds: params.excludeUserIds,
|
|
127
|
+
});
|
|
128
|
+
seed.query = `
|
|
129
|
+
CALL {
|
|
130
|
+
MATCH (active_visit:${VISIT})-[:VISITED]->(active_company:${COMPANY})
|
|
131
|
+
WHERE ${this._inWindow("active_visit.createdAt")}
|
|
132
|
+
RETURN active_company
|
|
133
|
+
UNION
|
|
134
|
+
MATCH (active_invite:${INVITE})-[:SENT_BY]->(active_company:${COMPANY})
|
|
135
|
+
WHERE ${this._inWindow("active_invite.createdAt")}
|
|
136
|
+
RETURN active_company
|
|
137
|
+
UNION
|
|
138
|
+
MATCH (active_referral:${REFERRAL})-[:REFERRED_BY]->(active_company:${COMPANY})
|
|
139
|
+
MATCH (active_referral)-[:REFERS_TO]->(active_referred:${COMPANY})
|
|
140
|
+
WHERE ${this._inWindow("active_referral.createdAt")}
|
|
141
|
+
AND ${this._referredAllowed("active_referred")}
|
|
142
|
+
RETURN active_company
|
|
143
|
+
}
|
|
144
|
+
WITH DISTINCT active_company AS referrer
|
|
145
|
+
WHERE ${this._notAdministrators("referrer")}
|
|
146
|
+
CALL {
|
|
147
|
+
WITH referrer
|
|
148
|
+
OPTIONAL MATCH (referrer_member:${USER})-[:BELONGS_TO]->(referrer)
|
|
149
|
+
WITH referrer_member
|
|
150
|
+
ORDER BY referrer_member.createdAt ASC
|
|
151
|
+
RETURN head(collect(referrer_member)) AS referrer_owner
|
|
152
|
+
}
|
|
153
|
+
CALL {
|
|
154
|
+
WITH referrer
|
|
155
|
+
OPTIONAL MATCH (referrer_visit:${VISIT})-[:VISITED]->(referrer)
|
|
156
|
+
WHERE ${this._inWindow("referrer_visit.createdAt")}
|
|
157
|
+
RETURN count(referrer_visit) AS visits
|
|
158
|
+
}
|
|
159
|
+
CALL {
|
|
160
|
+
WITH referrer
|
|
161
|
+
OPTIONAL MATCH (referrer_invite:${INVITE})-[:SENT_BY]->(referrer)
|
|
162
|
+
WHERE referrer_invite.createdAt < datetime($to)
|
|
163
|
+
RETURN count(CASE WHEN ${this._inWindow("referrer_invite.createdAt")} THEN 1 END) AS invitesSent,
|
|
164
|
+
max(referrer_invite.createdAt) AS lastInviteAt
|
|
165
|
+
}
|
|
166
|
+
CALL {
|
|
167
|
+
WITH referrer
|
|
168
|
+
OPTIONAL MATCH (referrer)<-[:REFERRED_BY]-(signup:${REFERRAL})-[:REFERS_TO]->(signup_referred:${COMPANY})
|
|
169
|
+
WHERE ${this._inWindow("signup.createdAt")}
|
|
170
|
+
AND ${this._referredAllowed("signup_referred")}
|
|
171
|
+
RETURN count(CASE WHEN signup.source = $linkSource THEN 1 END) AS signupsLink,
|
|
172
|
+
count(CASE WHEN signup.source = $directSource THEN 1 END) AS signupsDirect
|
|
173
|
+
}
|
|
174
|
+
CALL {
|
|
175
|
+
WITH referrer
|
|
176
|
+
OPTIONAL MATCH (referrer)<-[:REFERRED_BY]-(completed:${REFERRAL})-[:REFERS_TO]->(completed_referred:${COMPANY})
|
|
177
|
+
WHERE completed.status = 'completed'
|
|
178
|
+
AND ${this._inWindow("completed.completedAt")}
|
|
179
|
+
AND ${this._referredAllowed("completed_referred")}
|
|
180
|
+
RETURN count(completed) AS paying,
|
|
181
|
+
sum(coalesce(completed.tokensAwarded, 0)) AS creditsEarned
|
|
182
|
+
}
|
|
183
|
+
WITH referrer, referrer_owner, visits, invitesSent, lastInviteAt, signupsLink, signupsDirect, paying, creditsEarned,
|
|
184
|
+
signupsLink + signupsDirect AS signups,
|
|
185
|
+
CASE WHEN invitesSent = 0 THEN 0.0 ELSE toFloat(paying) / invitesSent END AS conversion
|
|
186
|
+
ORDER BY ${orderBy}, referrer.id ASC
|
|
187
|
+
RETURN referrer.id AS id,
|
|
188
|
+
coalesce(referrer_owner.name, '') AS name,
|
|
189
|
+
coalesce(referrer_owner.email, '') AS email,
|
|
190
|
+
visits AS visits,
|
|
191
|
+
invitesSent AS invitesSent,
|
|
192
|
+
signupsLink AS signupsLink,
|
|
193
|
+
signupsDirect AS signupsDirect,
|
|
194
|
+
paying AS paying,
|
|
195
|
+
creditsEarned AS creditsEarned,
|
|
196
|
+
lastInviteAt AS lastInviteAt
|
|
197
|
+
`;
|
|
198
|
+
const result = await this.neo4j.read(seed.query, seed.queryParams);
|
|
199
|
+
// The driver hands back a native Neo4j DateTime. convertFieldValue is the
|
|
200
|
+
// framework's single read-path conversion, the one the generated mapper
|
|
201
|
+
// uses; the type is read off the descriptor so the two never drift.
|
|
202
|
+
const lastInviteType = referral_admin_referrer_1.ReferralAdminReferrerDescriptor.fields.lastInviteAt?.type ?? "datetime";
|
|
203
|
+
return result.records.map((r) => {
|
|
204
|
+
const lastInviteAt = r.get("lastInviteAt");
|
|
205
|
+
return {
|
|
206
|
+
id: String(r.get("id")),
|
|
207
|
+
name: r.get("name") ?? "",
|
|
208
|
+
email: r.get("email") ?? "",
|
|
209
|
+
visits: int(r.get("visits")),
|
|
210
|
+
invitesSent: int(r.get("invitesSent")),
|
|
211
|
+
signupsLink: int(r.get("signupsLink")),
|
|
212
|
+
signupsDirect: int(r.get("signupsDirect")),
|
|
213
|
+
paying: int(r.get("paying")),
|
|
214
|
+
creditsEarned: int(r.get("creditsEarned")),
|
|
215
|
+
lastInviteAt: lastInviteAt == null ? undefined : (0, define_entity_1.convertFieldValue)(lastInviteAt, lastInviteType),
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Every Referral created in the period, newest first, unpaginated (like the
|
|
221
|
+
* library's other cross-tenant admin lists). Owners are each company's
|
|
222
|
+
* earliest-created user. A Referral written before sources existed has an
|
|
223
|
+
* unknown source and comes back as an empty string.
|
|
224
|
+
*/
|
|
225
|
+
async findReferrals(params) {
|
|
226
|
+
const seed = this._adminQuery({
|
|
227
|
+
from: params.from,
|
|
228
|
+
to: new Date().toISOString(),
|
|
229
|
+
excludeUserIds: params.excludeUserIds,
|
|
230
|
+
});
|
|
231
|
+
seed.query = `
|
|
232
|
+
MATCH (referral:${REFERRAL})-[:REFERS_TO]->(referral_referred:${COMPANY})
|
|
233
|
+
MATCH (referral)-[:REFERRED_BY]->(referral_referrer:${COMPANY})
|
|
234
|
+
WHERE ${this._inWindow("referral.createdAt")}
|
|
235
|
+
AND ${this._referredAllowed("referral_referred")}
|
|
236
|
+
AND ${this._notAdministrators("referral_referrer")}
|
|
237
|
+
CALL {
|
|
238
|
+
WITH referral_referred
|
|
239
|
+
OPTIONAL MATCH (referred_member:${USER})-[:BELONGS_TO]->(referral_referred)
|
|
240
|
+
WITH referred_member
|
|
241
|
+
ORDER BY referred_member.createdAt ASC
|
|
242
|
+
RETURN head(collect(referred_member)) AS referred_owner
|
|
243
|
+
}
|
|
244
|
+
CALL {
|
|
245
|
+
WITH referral_referrer
|
|
246
|
+
OPTIONAL MATCH (referrer_member:${USER})-[:BELONGS_TO]->(referral_referrer)
|
|
247
|
+
WITH referrer_member
|
|
248
|
+
ORDER BY referrer_member.createdAt ASC
|
|
249
|
+
RETURN head(collect(referrer_member)) AS referrer_owner
|
|
250
|
+
}
|
|
251
|
+
RETURN referral.id AS id,
|
|
252
|
+
coalesce(referred_owner.name, '') AS name,
|
|
253
|
+
coalesce(referred_owner.email, '') AS email,
|
|
254
|
+
coalesce(referrer_owner.name, '') AS referrerName,
|
|
255
|
+
coalesce(referrer_owner.email, '') AS referrerEmail,
|
|
256
|
+
coalesce(referral.source, '') AS source,
|
|
257
|
+
referral.status AS status,
|
|
258
|
+
referral.createdAt AS referredAt,
|
|
259
|
+
referral.completedAt AS completedAt,
|
|
260
|
+
referral.tokensAwarded AS tokensAwarded
|
|
261
|
+
ORDER BY referral.createdAt DESC
|
|
262
|
+
`;
|
|
263
|
+
const result = await this.neo4j.read(seed.query, seed.queryParams);
|
|
264
|
+
// Same read-path conversion as findReferrers: the types come off the descriptor.
|
|
265
|
+
const referredAtType = referral_admin_referral_1.ReferralAdminReferralDescriptor.fields.referredAt?.type ?? "datetime";
|
|
266
|
+
const completedAtType = referral_admin_referral_1.ReferralAdminReferralDescriptor.fields.completedAt?.type ?? "datetime";
|
|
267
|
+
return result.records.map((r) => {
|
|
268
|
+
const completedAt = r.get("completedAt");
|
|
269
|
+
const tokensAwarded = r.get("tokensAwarded");
|
|
270
|
+
return {
|
|
271
|
+
id: String(r.get("id")),
|
|
272
|
+
name: r.get("name") ?? "",
|
|
273
|
+
email: r.get("email") ?? "",
|
|
274
|
+
referrerName: r.get("referrerName") ?? "",
|
|
275
|
+
referrerEmail: r.get("referrerEmail") ?? "",
|
|
276
|
+
source: r.get("source") ?? "",
|
|
277
|
+
status: r.get("status") ?? "",
|
|
278
|
+
referredAt: (0, define_entity_1.convertFieldValue)(r.get("referredAt"), referredAtType),
|
|
279
|
+
completedAt: completedAt == null ? undefined : (0, define_entity_1.convertFieldValue)(completedAt, completedAtType),
|
|
280
|
+
tokensAwarded: tokensAwarded == null ? undefined : int(tokensAwarded),
|
|
281
|
+
};
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/** One window of the summary, [from, to). */
|
|
285
|
+
async _summaryWindow(params) {
|
|
286
|
+
const seed = this._adminQuery({ from: params.from, to: params.to, excludeUserIds: params.excludeUserIds });
|
|
287
|
+
seed.query = `
|
|
288
|
+
CALL {
|
|
289
|
+
OPTIONAL MATCH (summary_visit:${VISIT})-[:VISITED]->(summary_visit_company:${COMPANY})
|
|
290
|
+
WHERE ${this._inWindow("summary_visit.createdAt")}
|
|
291
|
+
AND ${this._notAdministrators("summary_visit_company")}
|
|
292
|
+
RETURN count(summary_visit) AS visits,
|
|
293
|
+
collect(DISTINCT summary_visit_company.id) AS visitCompanyIds
|
|
294
|
+
}
|
|
295
|
+
CALL {
|
|
296
|
+
OPTIONAL MATCH (summary_invite:${INVITE})-[:SENT_BY]->(summary_invite_company:${COMPANY})
|
|
297
|
+
WHERE ${this._inWindow("summary_invite.createdAt")}
|
|
298
|
+
AND ${this._notAdministrators("summary_invite_company")}
|
|
299
|
+
RETURN count(summary_invite) AS invitesSent,
|
|
300
|
+
collect(DISTINCT summary_invite_company.id) AS inviteCompanyIds
|
|
301
|
+
}
|
|
302
|
+
CALL {
|
|
303
|
+
OPTIONAL MATCH (summary_signup_referrer:${COMPANY})<-[:REFERRED_BY]-(summary_signup:${REFERRAL})-[:REFERS_TO]->(summary_signup_referred:${COMPANY})
|
|
304
|
+
WHERE ${this._inWindow("summary_signup.createdAt")}
|
|
305
|
+
AND ${this._notAdministrators("summary_signup_referrer")}
|
|
306
|
+
AND ${this._referredAllowed("summary_signup_referred")}
|
|
307
|
+
RETURN count(summary_signup) AS signups
|
|
308
|
+
}
|
|
309
|
+
CALL {
|
|
310
|
+
OPTIONAL MATCH (summary_paid_referrer:${COMPANY})<-[:REFERRED_BY]-(summary_paid:${REFERRAL})-[:REFERS_TO]->(summary_paid_referred:${COMPANY})
|
|
311
|
+
WHERE summary_paid.status = 'completed'
|
|
312
|
+
AND ${this._inWindow("summary_paid.completedAt")}
|
|
313
|
+
AND ${this._notAdministrators("summary_paid_referrer")}
|
|
314
|
+
AND ${this._referredAllowed("summary_paid_referred")}
|
|
315
|
+
RETURN count(summary_paid) AS paying,
|
|
316
|
+
2 * sum(coalesce(summary_paid.tokensAwarded, 0)) AS creditsGiven
|
|
317
|
+
}
|
|
318
|
+
CALL {
|
|
319
|
+
OPTIONAL MATCH (summary_eligible:${COMPANY})
|
|
320
|
+
WHERE summary_eligible.isActiveSubscription = true
|
|
321
|
+
AND ${this._notAdministrators("summary_eligible")}
|
|
322
|
+
RETURN count(summary_eligible) AS eligibleCompanies
|
|
323
|
+
}
|
|
324
|
+
RETURN visits, invitesSent, signups, paying, creditsGiven, eligibleCompanies,
|
|
325
|
+
size(inviteCompanyIds) + size([visitCompanyId IN visitCompanyIds WHERE NOT visitCompanyId IN inviteCompanyIds]) AS sharingCompanies
|
|
326
|
+
`;
|
|
327
|
+
const result = await this.neo4j.read(seed.query, seed.queryParams);
|
|
328
|
+
const r = result.records[0];
|
|
329
|
+
return {
|
|
330
|
+
id: params.window,
|
|
331
|
+
window: params.window,
|
|
332
|
+
visits: int(r?.get("visits")),
|
|
333
|
+
invitesSent: int(r?.get("invitesSent")),
|
|
334
|
+
signups: int(r?.get("signups")),
|
|
335
|
+
paying: int(r?.get("paying")),
|
|
336
|
+
creditsGiven: int(r?.get("creditsGiven")),
|
|
337
|
+
sharingCompanies: int(r?.get("sharingCompanies")),
|
|
338
|
+
eligibleCompanies: int(r?.get("eligibleCompanies")),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/** [from, to) on a datetime property; `$from = null` means no start. */
|
|
342
|
+
_inWindow(property) {
|
|
343
|
+
return `($from IS NULL OR ${property} >= datetime($from)) AND ${property} < datetime($to)`;
|
|
344
|
+
}
|
|
345
|
+
/** The company has no user among $excludeUserIds (platform administrators). */
|
|
346
|
+
_notAdministrators(company) {
|
|
347
|
+
return `NOT EXISTS {
|
|
348
|
+
MATCH (${company}_admin:${USER})-[:BELONGS_TO]->(${company})
|
|
349
|
+
WHERE ${company}_admin.id IN $excludeUserIds
|
|
350
|
+
}`;
|
|
351
|
+
}
|
|
352
|
+
/** A referred company counts unless it is a demo account or an administrator's. */
|
|
353
|
+
_referredAllowed(company) {
|
|
354
|
+
return `coalesce(${company}.isDemo, false) = false
|
|
355
|
+
AND ${this._notAdministrators(company)}`;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The seed every query starts from, in place of initQuery(). It binds only the
|
|
359
|
+
* report's parameters, never the caller's companyId; the source values come
|
|
360
|
+
* from REFERRAL_SOURCE.
|
|
361
|
+
*/
|
|
362
|
+
_adminQuery(params) {
|
|
363
|
+
return {
|
|
364
|
+
query: "",
|
|
365
|
+
queryParams: {
|
|
366
|
+
from: params.from,
|
|
367
|
+
to: params.to,
|
|
368
|
+
excludeUserIds: params.excludeUserIds,
|
|
369
|
+
linkSource: referral_source_1.REFERRAL_SOURCE.link,
|
|
370
|
+
directSource: referral_source_1.REFERRAL_SOURCE.direct,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
exports.ReferralAdminRepository = ReferralAdminRepository;
|
|
376
|
+
exports.ReferralAdminRepository = ReferralAdminRepository = __decorate([
|
|
377
|
+
(0, common_1.Injectable)(),
|
|
378
|
+
__metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
|
|
379
|
+
], ReferralAdminRepository);
|
|
380
|
+
//# sourceMappingURL=referral.admin.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referral.admin.repository.js","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.admin.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repos
|
|
|
3
3
|
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
4
4
|
import { SecurityService } from "../../../core/security/services/security.service";
|
|
5
5
|
import { Referral, ReferralDescriptor } from "../entities/referral";
|
|
6
|
+
import type { ReferralSource } from "../entities/referral-source";
|
|
6
7
|
export declare class ReferralRepository extends AbstractRepository<Referral, typeof ReferralDescriptor.relationships> {
|
|
7
8
|
protected readonly descriptor: import("../../..").EntityDescriptor<Referral, {
|
|
8
9
|
referrer: {
|
|
@@ -25,15 +26,23 @@ export declare class ReferralRepository extends AbstractRepository<Referral, typ
|
|
|
25
26
|
protected buildReturnStatement(): string;
|
|
26
27
|
/**
|
|
27
28
|
* Create a new referral with REFERRED_BY and REFERS_TO relationships.
|
|
29
|
+
*
|
|
30
|
+
* Company check: the referred company (the caller's own) goes through
|
|
31
|
+
* validateRelatedNodes. The REFERRED_BY link to the referrer company skips that
|
|
32
|
+
* check, because a link to another company is the point of the record.
|
|
33
|
+
* Owner-approved exception (Carlo, 2026-10-30, D18), the same scope as the
|
|
34
|
+
* 2026-10-26 exception on createReferralIfAbsent.
|
|
28
35
|
* @param params.id - The referral ID
|
|
29
36
|
* @param params.referrerCompanyId - The company that made the referral
|
|
30
37
|
* @param params.referredCompanyId - The company that was referred
|
|
38
|
+
* @param params.source - How the referral came about (link or direct)
|
|
31
39
|
* @returns true if the referral was created, false if one or both companies don't exist
|
|
32
40
|
*/
|
|
33
41
|
createReferral(params: {
|
|
34
42
|
id: string;
|
|
35
43
|
referrerCompanyId: string;
|
|
36
44
|
referredCompanyId: string;
|
|
45
|
+
source: ReferralSource;
|
|
37
46
|
}): Promise<boolean>;
|
|
38
47
|
/**
|
|
39
48
|
* Create a pending referral unless the referred company already has one.
|
|
@@ -49,11 +58,36 @@ export declare class ReferralRepository extends AbstractRepository<Referral, typ
|
|
|
49
58
|
* @param params.id - The referral ID
|
|
50
59
|
* @param params.referrerCompanyId - The company that made the referral
|
|
51
60
|
* @param params.referredCompanyId - The company that was referred
|
|
61
|
+
* @param params.source - How the referral came about (link or direct)
|
|
52
62
|
*/
|
|
53
63
|
createReferralIfAbsent(params: {
|
|
54
64
|
id: string;
|
|
55
65
|
referrerCompanyId: string;
|
|
56
66
|
referredCompanyId: string;
|
|
67
|
+
source: ReferralSource;
|
|
68
|
+
}): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Record one referral invite email sent by a user of a company. The invitee
|
|
71
|
+
* address is never stored. Both ids must be server-derived (CLS).
|
|
72
|
+
* @param params.id - The invite ID
|
|
73
|
+
* @param params.companyId - The sender's company
|
|
74
|
+
* @param params.userId - The sender
|
|
75
|
+
*/
|
|
76
|
+
createInvite(params: {
|
|
77
|
+
id: string;
|
|
78
|
+
companyId: string;
|
|
79
|
+
userId: string;
|
|
80
|
+
}): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Record one visit to a company's referral link. Runs on a public route with no
|
|
83
|
+
* company in CLS, so the company check is existence only. The company id comes
|
|
84
|
+
* from the referral code lookup, never from the request.
|
|
85
|
+
* @param params.id - The visit ID
|
|
86
|
+
* @param params.referrerCompanyId - The company owning the referral code
|
|
87
|
+
*/
|
|
88
|
+
createVisit(params: {
|
|
89
|
+
id: string;
|
|
90
|
+
referrerCompanyId: string;
|
|
57
91
|
}): Promise<void>;
|
|
58
92
|
/**
|
|
59
93
|
* Find a pending referral by the referred company ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referral.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;
|
|
1
|
+
{"version":3,"file":"referral.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AAInF,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAKlE,qBACa,kBAAmB,SAAQ,kBAAkB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,CAAC,aAAa,CAAC;IAC3G,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;OAAsB;gBAEvC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;OAEG;IACH,SAAS,CAAC,oBAAoB,IAAI,MAAM;IAUxC;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE;QAC3B,EAAE,EAAE,MAAM,CAAC;QACX,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,cAAc,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCpB;;;;;;;;;;;;;;;OAeG;IACG,sBAAsB,CAAC,MAAM,EAAE;QACnC,EAAE,EAAE,MAAM,CAAC;QACX,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,cAAc,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjB;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5F;;;;;;OAMG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnF;;;;;;OAMG;IACG,8BAA8B,CAAC,MAAM,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAuCrG;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB5F;;;;OAIG;IACG,iCAAiC,CAAC,MAAM,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBhG"}
|
|
@@ -16,7 +16,12 @@ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.re
|
|
|
16
16
|
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
17
17
|
const security_service_1 = require("../../../core/security/services/security.service");
|
|
18
18
|
const company_meta_1 = require("../../company/entities/company.meta");
|
|
19
|
+
const user_meta_1 = require("../../user/entities/user.meta");
|
|
19
20
|
const referral_1 = require("../entities/referral");
|
|
21
|
+
const referral_invite_1 = require("../entities/referral-invite");
|
|
22
|
+
const referral_invite_meta_1 = require("../entities/referral-invite.meta");
|
|
23
|
+
const referral_visit_1 = require("../entities/referral-visit");
|
|
24
|
+
const referral_visit_meta_1 = require("../entities/referral-visit.meta");
|
|
20
25
|
const referral_meta_1 = require("../entities/referral.meta");
|
|
21
26
|
let ReferralRepository = class ReferralRepository extends abstract_repository_1.AbstractRepository {
|
|
22
27
|
constructor(neo4j, securityService, clsService) {
|
|
@@ -37,12 +42,22 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
37
42
|
}
|
|
38
43
|
/**
|
|
39
44
|
* Create a new referral with REFERRED_BY and REFERS_TO relationships.
|
|
45
|
+
*
|
|
46
|
+
* Company check: the referred company (the caller's own) goes through
|
|
47
|
+
* validateRelatedNodes. The REFERRED_BY link to the referrer company skips that
|
|
48
|
+
* check, because a link to another company is the point of the record.
|
|
49
|
+
* Owner-approved exception (Carlo, 2026-10-30, D18), the same scope as the
|
|
50
|
+
* 2026-10-26 exception on createReferralIfAbsent.
|
|
40
51
|
* @param params.id - The referral ID
|
|
41
52
|
* @param params.referrerCompanyId - The company that made the referral
|
|
42
53
|
* @param params.referredCompanyId - The company that was referred
|
|
54
|
+
* @param params.source - How the referral came about (link or direct)
|
|
43
55
|
* @returns true if the referral was created, false if one or both companies don't exist
|
|
44
56
|
*/
|
|
45
57
|
async createReferral(params) {
|
|
58
|
+
await this.neo4j.validateRelatedNodes({
|
|
59
|
+
nodes: [{ id: params.referredCompanyId, label: company_meta_1.companyMeta.labelName }],
|
|
60
|
+
});
|
|
46
61
|
const results = await this.neo4j.executeInTransaction([
|
|
47
62
|
{
|
|
48
63
|
query: `
|
|
@@ -51,6 +66,7 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
51
66
|
CREATE (${referral_meta_1.referralMeta.nodeName}:${referral_meta_1.referralMeta.labelName} {
|
|
52
67
|
id: $id,
|
|
53
68
|
status: $status,
|
|
69
|
+
source: $source,
|
|
54
70
|
createdAt: datetime(),
|
|
55
71
|
updatedAt: datetime()
|
|
56
72
|
})
|
|
@@ -63,6 +79,7 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
63
79
|
referrerCompanyId: params.referrerCompanyId,
|
|
64
80
|
referredCompanyId: params.referredCompanyId,
|
|
65
81
|
status: "pending",
|
|
82
|
+
source: params.source,
|
|
66
83
|
},
|
|
67
84
|
},
|
|
68
85
|
]);
|
|
@@ -83,6 +100,7 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
83
100
|
* @param params.id - The referral ID
|
|
84
101
|
* @param params.referrerCompanyId - The company that made the referral
|
|
85
102
|
* @param params.referredCompanyId - The company that was referred
|
|
103
|
+
* @param params.source - How the referral came about (link or direct)
|
|
86
104
|
*/
|
|
87
105
|
async createReferralIfAbsent(params) {
|
|
88
106
|
await this.neo4j.validateRelatedNodes({
|
|
@@ -95,6 +113,7 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
95
113
|
referrerCompanyId: params.referrerCompanyId,
|
|
96
114
|
referredCompanyId: params.referredCompanyId,
|
|
97
115
|
status: "pending",
|
|
116
|
+
source: params.source,
|
|
98
117
|
};
|
|
99
118
|
query.query += `
|
|
100
119
|
MATCH (referrer:${company_meta_1.companyMeta.labelName} {id: $referrerCompanyId})
|
|
@@ -103,6 +122,7 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
103
122
|
CREATE (${referral_meta_1.referralMeta.nodeName}:${referral_meta_1.referralMeta.labelName} {
|
|
104
123
|
id: $id,
|
|
105
124
|
status: $status,
|
|
125
|
+
source: $source,
|
|
106
126
|
createdAt: datetime(),
|
|
107
127
|
updatedAt: datetime()
|
|
108
128
|
})
|
|
@@ -111,6 +131,68 @@ let ReferralRepository = class ReferralRepository extends abstract_repository_1.
|
|
|
111
131
|
`;
|
|
112
132
|
await this.neo4j.writeOne(query);
|
|
113
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Record one referral invite email sent by a user of a company. The invitee
|
|
136
|
+
* address is never stored. Both ids must be server-derived (CLS).
|
|
137
|
+
* @param params.id - The invite ID
|
|
138
|
+
* @param params.companyId - The sender's company
|
|
139
|
+
* @param params.userId - The sender
|
|
140
|
+
*/
|
|
141
|
+
async createInvite(params) {
|
|
142
|
+
await this.neo4j.validateRelatedNodes({
|
|
143
|
+
nodes: [
|
|
144
|
+
{ id: params.companyId, label: company_meta_1.companyMeta.labelName },
|
|
145
|
+
{ id: params.userId, label: user_meta_1.userMeta.labelName },
|
|
146
|
+
],
|
|
147
|
+
});
|
|
148
|
+
const query = this.neo4j.initQuery({ serialiser: referral_invite_1.ReferralInviteDescriptor.model });
|
|
149
|
+
query.queryParams = {
|
|
150
|
+
...query.queryParams,
|
|
151
|
+
id: params.id,
|
|
152
|
+
companyId: params.companyId,
|
|
153
|
+
userId: params.userId,
|
|
154
|
+
};
|
|
155
|
+
query.query += `
|
|
156
|
+
MATCH (company:${company_meta_1.companyMeta.labelName} {id: $companyId})
|
|
157
|
+
MATCH (sender:${user_meta_1.userMeta.labelName} {id: $userId})
|
|
158
|
+
CREATE (${referral_invite_meta_1.referralInviteMeta.nodeName}:${referral_invite_meta_1.referralInviteMeta.labelName} {
|
|
159
|
+
id: $id,
|
|
160
|
+
createdAt: datetime(),
|
|
161
|
+
updatedAt: datetime()
|
|
162
|
+
})
|
|
163
|
+
CREATE (${referral_invite_meta_1.referralInviteMeta.nodeName})-[:SENT_BY]->(company)
|
|
164
|
+
CREATE (${referral_invite_meta_1.referralInviteMeta.nodeName})-[:SENT_BY_USER]->(sender)
|
|
165
|
+
`;
|
|
166
|
+
await this.neo4j.writeOne(query);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Record one visit to a company's referral link. Runs on a public route with no
|
|
170
|
+
* company in CLS, so the company check is existence only. The company id comes
|
|
171
|
+
* from the referral code lookup, never from the request.
|
|
172
|
+
* @param params.id - The visit ID
|
|
173
|
+
* @param params.referrerCompanyId - The company owning the referral code
|
|
174
|
+
*/
|
|
175
|
+
async createVisit(params) {
|
|
176
|
+
await this.neo4j.validateRelatedNodes({
|
|
177
|
+
nodes: [{ id: params.referrerCompanyId, label: company_meta_1.companyMeta.labelName }],
|
|
178
|
+
});
|
|
179
|
+
const query = this.neo4j.initQuery({ serialiser: referral_visit_1.ReferralVisitDescriptor.model });
|
|
180
|
+
query.queryParams = {
|
|
181
|
+
...query.queryParams,
|
|
182
|
+
id: params.id,
|
|
183
|
+
referrerCompanyId: params.referrerCompanyId,
|
|
184
|
+
};
|
|
185
|
+
query.query += `
|
|
186
|
+
MATCH (referrer:${company_meta_1.companyMeta.labelName} {id: $referrerCompanyId})
|
|
187
|
+
CREATE (${referral_visit_meta_1.referralVisitMeta.nodeName}:${referral_visit_meta_1.referralVisitMeta.labelName} {
|
|
188
|
+
id: $id,
|
|
189
|
+
createdAt: datetime(),
|
|
190
|
+
updatedAt: datetime()
|
|
191
|
+
})
|
|
192
|
+
CREATE (${referral_visit_meta_1.referralVisitMeta.nodeName})-[:VISITED]->(referrer)
|
|
193
|
+
`;
|
|
194
|
+
await this.neo4j.writeOne(query);
|
|
195
|
+
}
|
|
114
196
|
/**
|
|
115
197
|
* Find a pending referral by the referred company ID.
|
|
116
198
|
* Uses custom result processing to properly load both referrer and referred relationships
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referral.repository.js","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAwC;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AAEnF,sEAAkE;AAClE,mDAAoE;AACpE,6DAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,wCAAqE;IAG3G,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,6BAAkB,CAAC;IAInD,CAAC;IAED;;OAEG;IACO,oBAAoB;QAC5B,OAAO;eACI,4BAAY,CAAC,QAAQ,sBAAsB,4BAAY,CAAC,QAAQ,aAAa,0BAAW,CAAC,SAAS;eAClG,4BAAY,CAAC,QAAQ,oBAAoB,4BAAY,CAAC,QAAQ,aAAa,0BAAW,CAAC,SAAS;eAChG,4BAAY,CAAC,QAAQ;UAC1B,4BAAY,CAAC,QAAQ;UACrB,4BAAY,CAAC,QAAQ;KAC1B,CAAC;IACJ,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"referral.repository.js","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/foundations/referral/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/foundations/referral/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
|