@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.
Files changed (120) hide show
  1. package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.d.ts +2 -1
  2. package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.d.ts.map +1 -1
  3. package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.js +8 -1
  4. package/dist/foundations/account-deletion/repositories/account-deletion.wipe.repository.js.map +1 -1
  5. package/dist/foundations/chunker/services/chunker.service.d.ts +32 -0
  6. package/dist/foundations/chunker/services/chunker.service.d.ts.map +1 -1
  7. package/dist/foundations/chunker/services/chunker.service.js +129 -0
  8. package/dist/foundations/chunker/services/chunker.service.js.map +1 -1
  9. package/dist/foundations/chunker/utils/zip-limits.d.ts +9 -0
  10. package/dist/foundations/chunker/utils/zip-limits.d.ts.map +1 -1
  11. package/dist/foundations/chunker/utils/zip-limits.js +5 -2
  12. package/dist/foundations/chunker/utils/zip-limits.js.map +1 -1
  13. package/dist/foundations/company/repositories/company.repository.d.ts +2 -2
  14. package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
  15. package/dist/foundations/company/repositories/company.repository.js +10 -2
  16. package/dist/foundations/company/repositories/company.repository.js.map +1 -1
  17. package/dist/foundations/referral/controllers/index.d.ts +2 -0
  18. package/dist/foundations/referral/controllers/index.d.ts.map +1 -1
  19. package/dist/foundations/referral/controllers/index.js +2 -0
  20. package/dist/foundations/referral/controllers/index.js.map +1 -1
  21. package/dist/foundations/referral/controllers/referral.admin.controller.d.ts +24 -0
  22. package/dist/foundations/referral/controllers/referral.admin.controller.d.ts.map +1 -0
  23. package/dist/foundations/referral/controllers/referral.admin.controller.js +100 -0
  24. package/dist/foundations/referral/controllers/referral.admin.controller.js.map +1 -0
  25. package/dist/foundations/referral/controllers/referral.public.controller.d.ts +19 -0
  26. package/dist/foundations/referral/controllers/referral.public.controller.d.ts.map +1 -0
  27. package/dist/foundations/referral/controllers/referral.public.controller.js +57 -0
  28. package/dist/foundations/referral/controllers/referral.public.controller.js.map +1 -0
  29. package/dist/foundations/referral/dtos/index.d.ts +1 -0
  30. package/dist/foundations/referral/dtos/index.d.ts.map +1 -1
  31. package/dist/foundations/referral/dtos/index.js +1 -0
  32. package/dist/foundations/referral/dtos/index.js.map +1 -1
  33. package/dist/foundations/referral/dtos/referral-visit.post.dto.d.ts +11 -0
  34. package/dist/foundations/referral/dtos/referral-visit.post.dto.d.ts.map +1 -0
  35. package/dist/foundations/referral/dtos/referral-visit.post.dto.js +48 -0
  36. package/dist/foundations/referral/dtos/referral-visit.post.dto.js.map +1 -0
  37. package/dist/foundations/referral/entities/index.d.ts +11 -0
  38. package/dist/foundations/referral/entities/index.d.ts.map +1 -1
  39. package/dist/foundations/referral/entities/index.js +11 -0
  40. package/dist/foundations/referral/entities/index.js.map +1 -1
  41. package/dist/foundations/referral/entities/referral-admin-referral.d.ts +23 -0
  42. package/dist/foundations/referral/entities/referral-admin-referral.d.ts.map +1 -0
  43. package/dist/foundations/referral/entities/referral-admin-referral.js +23 -0
  44. package/dist/foundations/referral/entities/referral-admin-referral.js.map +1 -0
  45. package/dist/foundations/referral/entities/referral-admin-referral.meta.d.ts +3 -0
  46. package/dist/foundations/referral/entities/referral-admin-referral.meta.d.ts.map +1 -0
  47. package/dist/foundations/referral/entities/referral-admin-referral.meta.js +10 -0
  48. package/dist/foundations/referral/entities/referral-admin-referral.meta.js.map +1 -0
  49. package/dist/foundations/referral/entities/referral-admin-referrer.d.ts +22 -0
  50. package/dist/foundations/referral/entities/referral-admin-referrer.d.ts.map +1 -0
  51. package/dist/foundations/referral/entities/referral-admin-referrer.js +23 -0
  52. package/dist/foundations/referral/entities/referral-admin-referrer.js.map +1 -0
  53. package/dist/foundations/referral/entities/referral-admin-referrer.meta.d.ts +3 -0
  54. package/dist/foundations/referral/entities/referral-admin-referrer.meta.d.ts.map +1 -0
  55. package/dist/foundations/referral/entities/referral-admin-referrer.meta.js +10 -0
  56. package/dist/foundations/referral/entities/referral-admin-referrer.meta.js.map +1 -0
  57. package/dist/foundations/referral/entities/referral-admin-summary.d.ts +23 -0
  58. package/dist/foundations/referral/entities/referral-admin-summary.d.ts.map +1 -0
  59. package/dist/foundations/referral/entities/referral-admin-summary.js +22 -0
  60. package/dist/foundations/referral/entities/referral-admin-summary.js.map +1 -0
  61. package/dist/foundations/referral/entities/referral-admin-summary.meta.d.ts +3 -0
  62. package/dist/foundations/referral/entities/referral-admin-summary.meta.d.ts.map +1 -0
  63. package/dist/foundations/referral/entities/referral-admin-summary.meta.js +10 -0
  64. package/dist/foundations/referral/entities/referral-admin-summary.meta.js.map +1 -0
  65. package/dist/foundations/referral/entities/referral-invite.d.ts +27 -0
  66. package/dist/foundations/referral/entities/referral-invite.d.ts.map +1 -0
  67. package/dist/foundations/referral/entities/referral-invite.js +28 -0
  68. package/dist/foundations/referral/entities/referral-invite.js.map +1 -0
  69. package/dist/foundations/referral/entities/referral-invite.meta.d.ts +3 -0
  70. package/dist/foundations/referral/entities/referral-invite.meta.d.ts.map +1 -0
  71. package/dist/foundations/referral/entities/referral-invite.meta.js +10 -0
  72. package/dist/foundations/referral/entities/referral-invite.meta.js.map +1 -0
  73. package/dist/foundations/referral/entities/referral-source.d.ts +10 -0
  74. package/dist/foundations/referral/entities/referral-source.d.ts.map +1 -0
  75. package/dist/foundations/referral/entities/referral-source.js +9 -0
  76. package/dist/foundations/referral/entities/referral-source.js.map +1 -0
  77. package/dist/foundations/referral/entities/referral-visit.d.ts +19 -0
  78. package/dist/foundations/referral/entities/referral-visit.d.ts.map +1 -0
  79. package/dist/foundations/referral/entities/referral-visit.js +21 -0
  80. package/dist/foundations/referral/entities/referral-visit.js.map +1 -0
  81. package/dist/foundations/referral/entities/referral-visit.meta.d.ts +7 -0
  82. package/dist/foundations/referral/entities/referral-visit.meta.d.ts.map +1 -0
  83. package/dist/foundations/referral/entities/referral-visit.meta.js +14 -0
  84. package/dist/foundations/referral/entities/referral-visit.meta.js.map +1 -0
  85. package/dist/foundations/referral/entities/referral.d.ts +3 -0
  86. package/dist/foundations/referral/entities/referral.d.ts.map +1 -1
  87. package/dist/foundations/referral/entities/referral.js +1 -0
  88. package/dist/foundations/referral/entities/referral.js.map +1 -1
  89. package/dist/foundations/referral/index.d.ts +1 -0
  90. package/dist/foundations/referral/index.d.ts.map +1 -1
  91. package/dist/foundations/referral/index.js +1 -0
  92. package/dist/foundations/referral/index.js.map +1 -1
  93. package/dist/foundations/referral/referral.module.d.ts.map +1 -1
  94. package/dist/foundations/referral/referral.module.js +20 -1
  95. package/dist/foundations/referral/referral.module.js.map +1 -1
  96. package/dist/foundations/referral/repositories/index.d.ts +1 -0
  97. package/dist/foundations/referral/repositories/index.d.ts.map +1 -1
  98. package/dist/foundations/referral/repositories/index.js +1 -0
  99. package/dist/foundations/referral/repositories/index.js.map +1 -1
  100. package/dist/foundations/referral/repositories/referral.admin.repository.d.ts +106 -0
  101. package/dist/foundations/referral/repositories/referral.admin.repository.d.ts.map +1 -0
  102. package/dist/foundations/referral/repositories/referral.admin.repository.js +380 -0
  103. package/dist/foundations/referral/repositories/referral.admin.repository.js.map +1 -0
  104. package/dist/foundations/referral/repositories/referral.repository.d.ts +34 -0
  105. package/dist/foundations/referral/repositories/referral.repository.d.ts.map +1 -1
  106. package/dist/foundations/referral/repositories/referral.repository.js +82 -0
  107. package/dist/foundations/referral/repositories/referral.repository.js.map +1 -1
  108. package/dist/foundations/referral/services/index.d.ts +1 -0
  109. package/dist/foundations/referral/services/index.d.ts.map +1 -1
  110. package/dist/foundations/referral/services/index.js +1 -0
  111. package/dist/foundations/referral/services/index.js.map +1 -1
  112. package/dist/foundations/referral/services/referral.admin.service.d.ts +53 -0
  113. package/dist/foundations/referral/services/referral.admin.service.d.ts.map +1 -0
  114. package/dist/foundations/referral/services/referral.admin.service.js +94 -0
  115. package/dist/foundations/referral/services/referral.admin.service.js.map +1 -0
  116. package/dist/foundations/referral/services/referral.service.d.ts +10 -2
  117. package/dist/foundations/referral/services/referral.service.d.ts.map +1 -1
  118. package/dist/foundations/referral/services/referral.service.js +34 -4
  119. package/dist/foundations/referral/services/referral.service.js.map +1 -1
  120. 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;AAGnF,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,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;;;;;;OAMG;IACG,cAAc,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BpH;;;;;;;;;;;;;;OAcG;IACG,sBAAsB,CAAC,MAAM,EAAE;QACnC,EAAE,EAAE,MAAM,CAAC;QACX,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjB;;;;;;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"}
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;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,MAA4E;QAC/F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;YACpD;gBACE,KAAK,EAAE;4BACa,0BAAW,CAAC,SAAS;4BACrB,0BAAW,CAAC,SAAS;oBAC7B,4BAAY,CAAC,QAAQ,IAAI,4BAAY,CAAC,SAAS;;;;;;oBAM/C,4BAAY,CAAC,QAAQ;oBACrB,4BAAY,CAAC,QAAQ;mBACtB,4BAAY,CAAC,QAAQ;SAC/B;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;oBAC3C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;oBAC3C,MAAM,EAAE,SAAS;iBAClB;aACF;SACF,CAAC,CAAC;QAEH,mEAAmE;QACnE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,sBAAsB,CAAC,MAI5B;QACC,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;YACpC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,0BAAW,CAAC,SAAS,EAAE,CAAC;SACxE,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,6BAAkB,CAAC,KAAK,EAAE,CAAC,CAAC;QAE7E,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,MAAM,EAAE,SAAS;SAClB,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI;wBACK,0BAAW,CAAC,SAAS;wBACrB,0BAAW,CAAC,SAAS;mCACV,4BAAY,CAAC,SAAS;gBACzC,4BAAY,CAAC,QAAQ,IAAI,4BAAY,CAAC,SAAS;;;;;;gBAM/C,4BAAY,CAAC,QAAQ;gBACrB,4BAAY,CAAC,QAAQ;KAChC,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,8BAA8B,CAAC,MAAqC;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAClC;eACS,4BAAY,CAAC,QAAQ,IAAI,4BAAY,CAAC,SAAS,6BAA6B,0BAAW,CAAC,SAAS;cAClG,4BAAY,CAAC,QAAQ;eACpB,4BAAY,CAAC,QAAQ,+BAA+B,0BAAW,CAAC,SAAS;eACzE,4BAAY,CAAC,QAAQ;OAC7B,EACD;YACE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,MAAM,EAAE,SAAS;SAClB,CACF,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,4BAAY,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE5C,qDAAqD;QACrD,+DAA+D;QAC/D,0FAA0F;QAC1F,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE;YAC9B,IAAI,EAAE,4BAAY,CAAC,IAAI;YACvB,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM;YACtC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,SAAS;YAC5C,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,SAAS;YAC5C,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,WAAW;YAChD,aAAa,EAAE,YAAY,CAAC,UAAU,CAAC,aAAa;YACpD,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAE,EAAE,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,EAAc,CAAC,CAAC,CAAC,SAAS;YACpF,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAE,EAAE,EAAE,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,EAAc,CAAC,CAAC,CAAC,SAAS;SACrF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAqD;QAC1E,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,WAAW,EAAE;gBACX,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,MAAM,EAAE,WAAW;aACpB;YACD,KAAK,EAAE;iBACI,4BAAY,CAAC,QAAQ,IAAI,4BAAY,CAAC,SAAS;cAClD,4BAAY,CAAC,QAAQ;cACrB,4BAAY,CAAC,QAAQ;cACrB,4BAAY,CAAC,QAAQ;cACrB,4BAAY,CAAC,QAAQ;OAC5B;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iCAAiC,CAAC,MAAqC;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAClC;eACS,4BAAY,CAAC,QAAQ,IAAI,4BAAY,CAAC,SAAS,+BAA+B,0BAAW,CAAC,SAAS;cACpG,4BAAY,CAAC,QAAQ;qBACd,4BAAY,CAAC,QAAQ;OACnC,EACD;YACE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,MAAM,EAAE,WAAW;SACpB,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AApMY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAIQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAH9E,kBAAkB,CAoM9B"}
1
+ {"version":3,"file":"referral.repository.js","sourceRoot":"","sources":["../../../../src/foundations/referral/repositories/referral.repository.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from "./referral.service";
2
2
  export * from "./registration-referral.hook";
3
+ export * from "./referral.admin.service";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -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"}