@etohq/user 1.5.1-alpha.3 → 1.5.1-alpha.5
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/services/user-module.d.ts +17 -7
- package/dist/services/user-module.d.ts.map +1 -1
- package/dist/services/user-module.js +46 -19
- package/dist/services/user-module.js.map +1 -1
- package/dist/services/user-validation-service.d.ts +2 -0
- package/dist/services/user-validation-service.d.ts.map +1 -0
- package/dist/services/user-validation-service.js +457 -0
- package/dist/services/user-validation-service.js.map +1 -0
- package/dist/services/user-validation.service.d.ts +2 -0
- package/dist/services/user-validation.service.d.ts.map +1 -0
- package/dist/services/user-validation.service.js +207 -0
- package/dist/services/user-validation.service.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Context, DAL, InferEntityType, InternalModuleDeclaration, ModulesSdkTypes, ProjectConfigOptions, UserTypes } from "@etohq/framework/types";
|
|
2
|
+
import { ModulesSdkUtils } from "@etohq/framework/utils";
|
|
2
3
|
import { Invite, User } from "../models";
|
|
3
4
|
type InjectedDependencies = {
|
|
4
5
|
baseRepository: DAL.RepositoryService;
|
|
5
6
|
userService: ModulesSdkTypes.IEtoInternalService<any>;
|
|
6
7
|
inviteService: ModulesSdkTypes.IEtoInternalService<any>;
|
|
7
8
|
};
|
|
8
|
-
declare const UserModuleService_base:
|
|
9
|
+
declare const UserModuleService_base: ModulesSdkUtils.EtoServiceReturnType<{
|
|
9
10
|
User: {
|
|
10
11
|
dto: UserTypes.UserDTO;
|
|
11
12
|
};
|
|
@@ -14,9 +15,10 @@ declare const UserModuleService_base: import("@etohq/framework/utils").EtoServic
|
|
|
14
15
|
};
|
|
15
16
|
}>;
|
|
16
17
|
export default class UserModuleService extends UserModuleService_base implements UserTypes.IUserModuleService {
|
|
18
|
+
protected readonly moduleDeclaration: InternalModuleDeclaration;
|
|
17
19
|
protected baseRepository_: DAL.RepositoryService;
|
|
18
|
-
protected
|
|
19
|
-
protected
|
|
20
|
+
protected userService_: ModulesSdkTypes.IEtoInternalService<InferEntityType<typeof User>>;
|
|
21
|
+
protected inviteService_: ModulesSdkTypes.IEtoInternalService<InferEntityType<typeof Invite>>;
|
|
20
22
|
protected readonly config: {
|
|
21
23
|
jwtSecret: string;
|
|
22
24
|
jwtPublicKey?: string;
|
|
@@ -25,10 +27,18 @@ export default class UserModuleService extends UserModuleService_base implements
|
|
|
25
27
|
expiresIn: number;
|
|
26
28
|
};
|
|
27
29
|
};
|
|
28
|
-
constructor({ userService, inviteService
|
|
30
|
+
constructor({ baseRepository, userService, inviteService }: InjectedDependencies, moduleDeclaration: InternalModuleDeclaration);
|
|
31
|
+
/**
|
|
32
|
+
* Get user attributes for ABAC permission checks
|
|
33
|
+
*/
|
|
34
|
+
getUserAttributes(userId: string, sharedContext?: Context): Promise<Record<string, any>>;
|
|
35
|
+
/**
|
|
36
|
+
* Get multiple user attributes (batch operation)
|
|
37
|
+
*/
|
|
38
|
+
getUserAttributesBatch(userIds: string[], sharedContext?: Context): Promise<Record<string, Record<string, any>>>;
|
|
29
39
|
validateInviteToken(token: string, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
|
|
30
40
|
refreshInviteTokens(inviteIds: string[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
|
|
31
|
-
refreshInviteTokens_(inviteIds: string[], sharedContext?: Context): Promise<{
|
|
41
|
+
protected refreshInviteTokens_(inviteIds: string[], sharedContext?: Context): Promise<{
|
|
32
42
|
id: string;
|
|
33
43
|
email: string;
|
|
34
44
|
accepted: boolean;
|
|
@@ -45,10 +55,10 @@ export default class UserModuleService extends UserModuleService_base implements
|
|
|
45
55
|
updateUsers(data: UserTypes.UpdateUserDTO, sharedContext?: Context): Promise<UserTypes.UserDTO>;
|
|
46
56
|
createInvites(data: UserTypes.CreateInviteDTO[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
|
|
47
57
|
createInvites(data: UserTypes.CreateInviteDTO, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
|
|
48
|
-
|
|
58
|
+
protected createInvites_(data: UserTypes.CreateInviteDTO[], sharedContext?: Context): Promise<InferEntityType<typeof Invite>[]>;
|
|
49
59
|
updateInvites(data: UserTypes.UpdateInviteDTO[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
|
|
50
60
|
updateInvites(data: UserTypes.UpdateInviteDTO, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
|
|
51
|
-
|
|
61
|
+
protected generateToken(data: any): string;
|
|
52
62
|
}
|
|
53
63
|
export {};
|
|
54
64
|
//# sourceMappingURL=user-module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-module.d.ts","sourceRoot":"","sources":["../../src/services/user-module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,GAAG,EACH,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,oBAAoB,EACpB,SAAS,EACV,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"user-module.d.ts","sourceRoot":"","sources":["../../src/services/user-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,11 @@ const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
|
21
21
|
const _models_1 = require("../models");
|
|
22
22
|
const utils_2 = require("../utils/utils");
|
|
23
23
|
const DEFAULT_VALID_INVITE_DURATION_SECONDS = 60 * 60 * 24;
|
|
24
|
-
class UserModuleService extends
|
|
25
|
-
constructor({ userService, inviteService
|
|
24
|
+
class UserModuleService extends utils_1.ModulesSdkUtils.EtoService({ User: _models_1.User, Invite: _models_1.Invite }) {
|
|
25
|
+
constructor({ baseRepository, userService, inviteService }, moduleDeclaration) {
|
|
26
26
|
// @ts-ignore
|
|
27
27
|
super(...arguments);
|
|
28
|
+
this.moduleDeclaration = moduleDeclaration;
|
|
28
29
|
this.baseRepository_ = baseRepository;
|
|
29
30
|
this.userService_ = userService;
|
|
30
31
|
this.inviteService_ = inviteService;
|
|
@@ -43,6 +44,42 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
43
44
|
throw new utils_1.EtoError(utils_1.EtoError.Types.INVALID_DATA, "No jwt_secret was provided in the UserModule's options. Please add one.");
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
// ----------------- User Attribute Methods
|
|
48
|
+
/**
|
|
49
|
+
* Get user attributes for ABAC permission checks
|
|
50
|
+
*/
|
|
51
|
+
async getUserAttributes(userId, sharedContext) {
|
|
52
|
+
const user = await this.userService_.retrieve(userId, {}, sharedContext);
|
|
53
|
+
return {
|
|
54
|
+
ownerId: user.id,
|
|
55
|
+
email: user.email,
|
|
56
|
+
firstName: user.first_name,
|
|
57
|
+
lastName: user.last_name,
|
|
58
|
+
isActive: true,
|
|
59
|
+
createdAt: user.created_at,
|
|
60
|
+
metadata: user.metadata || {},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get multiple user attributes (batch operation)
|
|
65
|
+
*/
|
|
66
|
+
async getUserAttributesBatch(userIds, sharedContext) {
|
|
67
|
+
const users = await this.userService_.list({ id: userIds }, {}, sharedContext);
|
|
68
|
+
const attributesMap = {};
|
|
69
|
+
users.forEach(user => {
|
|
70
|
+
attributesMap[user.id] = {
|
|
71
|
+
ownerId: user.id,
|
|
72
|
+
email: user.email,
|
|
73
|
+
firstName: user.first_name,
|
|
74
|
+
lastName: user.last_name,
|
|
75
|
+
isActive: true,
|
|
76
|
+
createdAt: user.created_at,
|
|
77
|
+
metadata: user.metadata || {},
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return attributesMap;
|
|
81
|
+
}
|
|
82
|
+
// =========== Invite Token Methods
|
|
46
83
|
async validateInviteToken(token, sharedContext = {}) {
|
|
47
84
|
const options = {
|
|
48
85
|
...(this.config.jwt_verify_options ?? this.config.jwtOptions),
|
|
@@ -98,9 +135,7 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
98
135
|
async createUsers(data, sharedContext = {}) {
|
|
99
136
|
const input = Array.isArray(data) ? data : [data];
|
|
100
137
|
const users = await this.userService_.create(input, sharedContext);
|
|
101
|
-
const serializedUsers = await this.baseRepository_.serialize(users, {
|
|
102
|
-
populate: true,
|
|
103
|
-
});
|
|
138
|
+
const serializedUsers = await this.baseRepository_.serialize(users, { populate: true });
|
|
104
139
|
(0, utils_1.moduleEventBuilderFactory)({
|
|
105
140
|
eventName: utils_1.UserEvents.USER_CREATED,
|
|
106
141
|
source: utils_1.Modules.USER,
|
|
@@ -116,9 +151,7 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
116
151
|
async updateUsers(data, sharedContext = {}) {
|
|
117
152
|
const input = Array.isArray(data) ? data : [data];
|
|
118
153
|
const updatedUsers = await this.userService_.update(input, sharedContext);
|
|
119
|
-
const serializedUsers = await this.baseRepository_.serialize(updatedUsers, {
|
|
120
|
-
populate: true,
|
|
121
|
-
});
|
|
154
|
+
const serializedUsers = await this.baseRepository_.serialize(updatedUsers, { populate: true });
|
|
122
155
|
(0, utils_1.moduleEventBuilderFactory)({
|
|
123
156
|
eventName: utils_1.UserEvents.USER_UPDATED,
|
|
124
157
|
source: utils_1.Modules.USER,
|
|
@@ -134,9 +167,7 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
134
167
|
async createInvites(data, sharedContext = {}) {
|
|
135
168
|
const input = Array.isArray(data) ? data : [data];
|
|
136
169
|
const invites = await this.createInvites_(input, sharedContext);
|
|
137
|
-
const serializedInvites = await this.baseRepository_.serialize(invites, {
|
|
138
|
-
populate: true,
|
|
139
|
-
});
|
|
170
|
+
const serializedInvites = await this.baseRepository_.serialize(invites, { populate: true });
|
|
140
171
|
(0, utils_1.moduleEventBuilderFactory)({
|
|
141
172
|
eventName: utils_1.UserEvents.INVITE_CREATED,
|
|
142
173
|
source: utils_1.Modules.USER,
|
|
@@ -158,9 +189,7 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
158
189
|
return Array.isArray(data) ? serializedInvites : serializedInvites[0];
|
|
159
190
|
}
|
|
160
191
|
async createInvites_(data, sharedContext = {}) {
|
|
161
|
-
const alreadyExistingUsers = await this.
|
|
162
|
-
email: data.map((d) => d.email),
|
|
163
|
-
});
|
|
192
|
+
const alreadyExistingUsers = await this.userService_.list({ email: data.map((d) => d.email) }, {}, sharedContext);
|
|
164
193
|
if (alreadyExistingUsers.length) {
|
|
165
194
|
throw new utils_1.EtoError(utils_1.EtoError.Types.INVALID_DATA, `User account for following email(s) already exist: ${alreadyExistingUsers
|
|
166
195
|
.map((u) => u.email)
|
|
@@ -182,9 +211,7 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
182
211
|
async updateInvites(data, sharedContext = {}) {
|
|
183
212
|
const input = Array.isArray(data) ? data : [data];
|
|
184
213
|
const updatedInvites = await this.inviteService_.update(input, sharedContext);
|
|
185
|
-
const serializedInvites = await this.baseRepository_.serialize(updatedInvites, {
|
|
186
|
-
populate: true,
|
|
187
|
-
});
|
|
214
|
+
const serializedInvites = await this.baseRepository_.serialize(updatedInvites, { populate: true });
|
|
188
215
|
(0, utils_1.moduleEventBuilderFactory)({
|
|
189
216
|
eventName: utils_1.UserEvents.INVITE_UPDATED,
|
|
190
217
|
source: utils_1.Modules.USER,
|
|
@@ -196,16 +223,16 @@ class UserModuleService extends (0, utils_1.EtoService)({ User: _models_1.User,
|
|
|
196
223
|
});
|
|
197
224
|
return Array.isArray(data) ? serializedInvites : serializedInvites[0];
|
|
198
225
|
}
|
|
226
|
+
// =========== Helpers
|
|
199
227
|
generateToken(data) {
|
|
200
228
|
const jwtId = this.config.jwtOptions.jwtid ?? node_crypto_1.default.randomUUID();
|
|
201
|
-
|
|
229
|
+
return (0, utils_1.generateJwtToken)(data, {
|
|
202
230
|
secret: this.config.jwtSecret,
|
|
203
231
|
jwtOptions: {
|
|
204
232
|
...this.config.jwtOptions,
|
|
205
233
|
jwtid: jwtId,
|
|
206
234
|
},
|
|
207
235
|
});
|
|
208
|
-
return token;
|
|
209
236
|
}
|
|
210
237
|
}
|
|
211
238
|
exports.default = UserModuleService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-module.js","sourceRoot":"","sources":["../../src/services/user-module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASA,kDAc+B;AAC/B,gEAA0E;AAC1E,8DAAgC;AAEhC,qCAAsC;AACtC,0CAA6C;AAQ7C,MAAM,qCAAqC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"user-module.js","sourceRoot":"","sources":["../../src/services/user-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-validation-service.d.ts","sourceRoot":"","sources":["../../src/services/user-validation-service.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { ModulesSdkUtils, buildQuery } from "@etohq/framework/utils";
|
|
3
|
+
// import { ETO, Context, FindConfig } from "@etohq/framework/types";
|
|
4
|
+
// import { InjectManager, EtoContext, EtoError } from "@etohq/framework/utils";
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// // Import email blocking validation utility
|
|
7
|
+
// import {
|
|
8
|
+
// checkIfBookerEmailIsBlocked,
|
|
9
|
+
// validateBookerEmailNotBlocked,
|
|
10
|
+
// type EmailBlockingService,
|
|
11
|
+
// type UserRecord,
|
|
12
|
+
// type EmailBlockingQuery,
|
|
13
|
+
// type EmailBlockingResult
|
|
14
|
+
// } from "@etohq/jo-utils/validate-email-blocking";
|
|
15
|
+
// type InjectedDependencies = ETO.Application.Services;
|
|
16
|
+
// /**
|
|
17
|
+
// * UserValidationService - Core User Module Service
|
|
18
|
+
// * Handles user-domain validations including email blocking
|
|
19
|
+
// * Part of core platform modules, used across the platform
|
|
20
|
+
// */
|
|
21
|
+
// export default class UserValidationService extends ModulesSdkUtils.EtoInternalService<
|
|
22
|
+
// InjectedDependencies,
|
|
23
|
+
// any // User entity type would be defined in core
|
|
24
|
+
// > implements EmailBlockingService {
|
|
25
|
+
// protected readonly __userRepository__: any;
|
|
26
|
+
// protected readonly __organizationRepository__: any;
|
|
27
|
+
// constructor(container: InjectedDependencies) {
|
|
28
|
+
// // @ts-ignore - Standard ETO pattern
|
|
29
|
+
// super(...arguments);
|
|
30
|
+
// this.__userRepository__ = container.userRepository;
|
|
31
|
+
// this.__organizationRepository__ = container.organizationRepository;
|
|
32
|
+
// }
|
|
33
|
+
// // ===== EMAIL BLOCKING SERVICE IMPLEMENTATION =====
|
|
34
|
+
// @InjectManager("__userRepository__")
|
|
35
|
+
// async findUserByEmail(
|
|
36
|
+
// filters: Record<string, any>,
|
|
37
|
+
// config?: FindConfig<any>,
|
|
38
|
+
// @EtoContext() sharedContext: Context = {}
|
|
39
|
+
// ): Promise<UserRecord | null> {
|
|
40
|
+
// const queryOptions = buildQuery(filters, config);
|
|
41
|
+
// const [user] = await this.__userRepository__.find(queryOptions, sharedContext);
|
|
42
|
+
// if (!user) return null;
|
|
43
|
+
// return {
|
|
44
|
+
// id: user.id,
|
|
45
|
+
// email: user.email,
|
|
46
|
+
// emailVerified: user.email_verified,
|
|
47
|
+
// secondaryEmails: user.secondary_emails?.map((se: any) => ({
|
|
48
|
+
// email: se.email,
|
|
49
|
+
// emailVerified: se.email_verified
|
|
50
|
+
// })) || []
|
|
51
|
+
// };
|
|
52
|
+
// }
|
|
53
|
+
// async getBlacklistedEmails(organizationId?: string): Promise<string[]> {
|
|
54
|
+
// // Global blacklist from environment
|
|
55
|
+
// const globalBlacklist = process.env.BLACKLISTED_GUEST_EMAILS
|
|
56
|
+
// ? process.env.BLACKLISTED_GUEST_EMAILS.split(",").map(email => email.trim())
|
|
57
|
+
// : [];
|
|
58
|
+
// // Organization-specific blacklist
|
|
59
|
+
// if (organizationId) {
|
|
60
|
+
// try {
|
|
61
|
+
// const orgBlacklist = await this.getOrganizationBlacklist(organizationId);
|
|
62
|
+
// return [...globalBlacklist, ...orgBlacklist];
|
|
63
|
+
// } catch (error) {
|
|
64
|
+
// console.warn(`Failed to get organization blacklist for ${organizationId}:`, error);
|
|
65
|
+
// }
|
|
66
|
+
// }
|
|
67
|
+
// return globalBlacklist;
|
|
68
|
+
// }
|
|
69
|
+
// async getResourceTypeBlockedEmails(resourceTypeId: string): Promise<string[]> {
|
|
70
|
+
// // Resource-type specific blocked emails would be handled by the resource module
|
|
71
|
+
// // This is a cross-module concern that should be handled by workflows
|
|
72
|
+
// return [];
|
|
73
|
+
// }
|
|
74
|
+
// // ===== USER-DOMAIN VALIDATION METHODS =====
|
|
75
|
+
// /**
|
|
76
|
+
// * Validate user email is not blocked
|
|
77
|
+
// */
|
|
78
|
+
// async validateUserEmailNotBlocked(
|
|
79
|
+
// query: EmailBlockingQuery
|
|
80
|
+
// ): Promise<EmailBlockingResult> {
|
|
81
|
+
// return await checkIfBookerEmailIsBlocked(query, this);
|
|
82
|
+
// }
|
|
83
|
+
// /**
|
|
84
|
+
// * Validate user email and throw if blocked
|
|
85
|
+
// */
|
|
86
|
+
// async validateUserEmailAllowed(
|
|
87
|
+
// query: EmailBlockingQuery
|
|
88
|
+
// ): Promise<void> {
|
|
89
|
+
// await validateBookerEmailNotBlocked(query, this);
|
|
90
|
+
// }
|
|
91
|
+
// /**
|
|
92
|
+
// * Check if user exists and is verified
|
|
93
|
+
// */
|
|
94
|
+
// @InjectManager("__userRepository__")
|
|
95
|
+
// async checkUserVerificationStatus(
|
|
96
|
+
// email: string,
|
|
97
|
+
// @EtoContext() sharedContext: Context = {}
|
|
98
|
+
// ): Promise<{
|
|
99
|
+
// exists: boolean;
|
|
100
|
+
// isVerified: boolean;
|
|
101
|
+
// userId?: string;
|
|
102
|
+
// }> {
|
|
103
|
+
// const filters = {
|
|
104
|
+
// $or: [
|
|
105
|
+
// { email: email.toLowerCase() },
|
|
106
|
+
// {
|
|
107
|
+
// secondary_emails: {
|
|
108
|
+
// $elemMatch: { email: email.toLowerCase() }
|
|
109
|
+
// }
|
|
110
|
+
// }
|
|
111
|
+
// ]
|
|
112
|
+
// };
|
|
113
|
+
// const config = {
|
|
114
|
+
// select: ['id', 'email', 'email_verified'],
|
|
115
|
+
// relations: ['secondary_emails'],
|
|
116
|
+
// take: 1
|
|
117
|
+
// };
|
|
118
|
+
// const user = await this.findUserByEmail(filters, config, sharedContext);
|
|
119
|
+
// if (!user) {
|
|
120
|
+
// return { exists: false, isVerified: false };
|
|
121
|
+
// }
|
|
122
|
+
// const isVerified = (user.email === email.toLowerCase() && user.emailVerified) ||
|
|
123
|
+
// (user.secondaryEmails?.some(se => se.email === email.toLowerCase() && se.emailVerified)) ||
|
|
124
|
+
// false;
|
|
125
|
+
// return {
|
|
126
|
+
// exists: true,
|
|
127
|
+
// isVerified,
|
|
128
|
+
// userId: user.id
|
|
129
|
+
// };
|
|
130
|
+
// }
|
|
131
|
+
// /**
|
|
132
|
+
// * Get user by email with verification status
|
|
133
|
+
// */
|
|
134
|
+
// @InjectManager("__userRepository__")
|
|
135
|
+
// async getUserByEmailWithVerification(
|
|
136
|
+
// email: string,
|
|
137
|
+
// @EtoContext() sharedContext: Context = {}
|
|
138
|
+
// ): Promise<UserRecord | null> {
|
|
139
|
+
// const filters = {
|
|
140
|
+
// $or: [
|
|
141
|
+
// {
|
|
142
|
+
// email: email.toLowerCase(),
|
|
143
|
+
// email_verified: { $ne: null }
|
|
144
|
+
// },
|
|
145
|
+
// {
|
|
146
|
+
// secondary_emails: {
|
|
147
|
+
// $elemMatch: {
|
|
148
|
+
// email: email.toLowerCase(),
|
|
149
|
+
// email_verified: { $ne: null }
|
|
150
|
+
// }
|
|
151
|
+
// }
|
|
152
|
+
// }
|
|
153
|
+
// ]
|
|
154
|
+
// };
|
|
155
|
+
// const config = {
|
|
156
|
+
// select: ['id', 'email', 'email_verified'],
|
|
157
|
+
// relations: ['secondary_emails'],
|
|
158
|
+
// take: 1
|
|
159
|
+
// };
|
|
160
|
+
// return await this.findUserByEmail(filters, config, sharedContext);
|
|
161
|
+
// }
|
|
162
|
+
// // ===== ORGANIZATION BLACKLIST METHODS =====
|
|
163
|
+
// /**
|
|
164
|
+
// * Load and validate users for booking (Cal.com loadAndValidateUsers pattern)
|
|
165
|
+
// */
|
|
166
|
+
// async loadAndValidateUsers(
|
|
167
|
+
// params: {
|
|
168
|
+
// resourceType: {
|
|
169
|
+
// id: string;
|
|
170
|
+
// user_id?: string;
|
|
171
|
+
// team_id?: string;
|
|
172
|
+
// scheduling_type?: 'COLLECTIVE' | 'ROUND_ROBIN';
|
|
173
|
+
// assign_all_team_members?: boolean;
|
|
174
|
+
// };
|
|
175
|
+
// bookingStartTime: Date;
|
|
176
|
+
// bookingEndTime: Date;
|
|
177
|
+
// bookerEmail: string;
|
|
178
|
+
// organizationId?: string;
|
|
179
|
+
// },
|
|
180
|
+
// @EtoContext() sharedContext: Context = {}
|
|
181
|
+
// ): Promise<{
|
|
182
|
+
// users: Array<{
|
|
183
|
+
// id: string;
|
|
184
|
+
// email: string;
|
|
185
|
+
// name: string;
|
|
186
|
+
// timeZone: string;
|
|
187
|
+
// isFixed: boolean;
|
|
188
|
+
// available: boolean;
|
|
189
|
+
// credentials?: Array<{ type: string; key: string }>;
|
|
190
|
+
// }>;
|
|
191
|
+
// validationResults: {
|
|
192
|
+
// allUsersValid: boolean;
|
|
193
|
+
// blockedUsers: string[];
|
|
194
|
+
// unavailableUsers: string[];
|
|
195
|
+
// validationErrors: string[];
|
|
196
|
+
// };
|
|
197
|
+
// }> {
|
|
198
|
+
// // 1. Load users based on resource type configuration
|
|
199
|
+
// const users = await this.loadUsersForResourceType(params.resourceType, sharedContext);
|
|
200
|
+
// // 2. Validate users are not blocked
|
|
201
|
+
// const blockedUsers = await this.checkIfUsersAreBlocked(
|
|
202
|
+
// users.map(u => u.email),
|
|
203
|
+
// params.bookerEmail,
|
|
204
|
+
// sharedContext
|
|
205
|
+
// );
|
|
206
|
+
// // 3. Check user availability for the booking time
|
|
207
|
+
// const availabilityResults = await this.checkUsersAvailability(
|
|
208
|
+
// users,
|
|
209
|
+
// params.bookingStartTime,
|
|
210
|
+
// params.bookingEndTime,
|
|
211
|
+
// sharedContext
|
|
212
|
+
// );
|
|
213
|
+
// // 4. Enrich users with credentials and metadata
|
|
214
|
+
// const enrichedUsers = await this.enrichUsersWithCredentials(users, sharedContext);
|
|
215
|
+
// // 5. Apply scheduling type logic
|
|
216
|
+
// const finalUsers = this.applySchedulingTypeLogic(
|
|
217
|
+
// enrichedUsers,
|
|
218
|
+
// params.resourceType.scheduling_type,
|
|
219
|
+
// availabilityResults
|
|
220
|
+
// );
|
|
221
|
+
// const validationErrors: string[] = [];
|
|
222
|
+
// if (blockedUsers.length > 0) {
|
|
223
|
+
// validationErrors.push(`Blocked users detected: ${blockedUsers.join(', ')}`);
|
|
224
|
+
// }
|
|
225
|
+
// const unavailableUsers = finalUsers.filter(u => !u.available).map(u => u.email);
|
|
226
|
+
// if (unavailableUsers.length > 0 && params.resourceType.scheduling_type === 'COLLECTIVE') {
|
|
227
|
+
// validationErrors.push(`All users must be available for collective booking: ${unavailableUsers.join(', ')}`);
|
|
228
|
+
// }
|
|
229
|
+
// return {
|
|
230
|
+
// users: finalUsers,
|
|
231
|
+
// validationResults: {
|
|
232
|
+
// allUsersValid: validationErrors.length === 0,
|
|
233
|
+
// blockedUsers,
|
|
234
|
+
// unavailableUsers,
|
|
235
|
+
// validationErrors
|
|
236
|
+
// }
|
|
237
|
+
// };
|
|
238
|
+
// }
|
|
239
|
+
// /**
|
|
240
|
+
// * Load users for resource type (Cal.com pattern)
|
|
241
|
+
// */
|
|
242
|
+
// private async loadUsersForResourceType(
|
|
243
|
+
// resourceType: {
|
|
244
|
+
// id: string;
|
|
245
|
+
// user_id?: string;
|
|
246
|
+
// team_id?: string;
|
|
247
|
+
// assign_all_team_members?: boolean;
|
|
248
|
+
// },
|
|
249
|
+
// @EtoContext() sharedContext: Context = {}
|
|
250
|
+
// ): Promise<Array<{
|
|
251
|
+
// id: string;
|
|
252
|
+
// email: string;
|
|
253
|
+
// name: string;
|
|
254
|
+
// timeZone: string;
|
|
255
|
+
// isFixed: boolean;
|
|
256
|
+
// }>> {
|
|
257
|
+
// const users: Array<{
|
|
258
|
+
// id: string;
|
|
259
|
+
// email: string;
|
|
260
|
+
// name: string;
|
|
261
|
+
// timeZone: string;
|
|
262
|
+
// isFixed: boolean;
|
|
263
|
+
// }> = [];
|
|
264
|
+
// // 1. Load owner user if specified
|
|
265
|
+
// if (resourceType.user_id) {
|
|
266
|
+
// const ownerUser = await this.loadUserById(resourceType.user_id, sharedContext);
|
|
267
|
+
// if (ownerUser) {
|
|
268
|
+
// users.push({
|
|
269
|
+
// ...ownerUser,
|
|
270
|
+
// isFixed: true // Owner is always fixed
|
|
271
|
+
// });
|
|
272
|
+
// }
|
|
273
|
+
// }
|
|
274
|
+
// // 2. Load team users if team resource type
|
|
275
|
+
// if (resourceType.team_id) {
|
|
276
|
+
// const teamUsers = await this.loadTeamUsers(
|
|
277
|
+
// resourceType.team_id,
|
|
278
|
+
// resourceType.assign_all_team_members || false,
|
|
279
|
+
// sharedContext
|
|
280
|
+
// );
|
|
281
|
+
// users.push(...teamUsers.map(user => ({
|
|
282
|
+
// ...user,
|
|
283
|
+
// isFixed: false // Team members are not fixed (can be round-robin)
|
|
284
|
+
// })));
|
|
285
|
+
// }
|
|
286
|
+
// return users;
|
|
287
|
+
// }
|
|
288
|
+
// /**
|
|
289
|
+
// * Load user by ID
|
|
290
|
+
// */
|
|
291
|
+
// private async loadUserById(
|
|
292
|
+
// userId: string,
|
|
293
|
+
// @EtoContext() sharedContext: Context = {}
|
|
294
|
+
// ): Promise<{
|
|
295
|
+
// id: string;
|
|
296
|
+
// email: string;
|
|
297
|
+
// name: string;
|
|
298
|
+
// timeZone: string;
|
|
299
|
+
// } | null> {
|
|
300
|
+
// // This would query the user repository
|
|
301
|
+
// // For now, return mock data
|
|
302
|
+
// return {
|
|
303
|
+
// id: userId,
|
|
304
|
+
// email: 'user@example.com',
|
|
305
|
+
// name: 'User Name',
|
|
306
|
+
// timeZone: 'UTC'
|
|
307
|
+
// };
|
|
308
|
+
// }
|
|
309
|
+
// /**
|
|
310
|
+
// * Load team users
|
|
311
|
+
// */
|
|
312
|
+
// private async loadTeamUsers(
|
|
313
|
+
// teamId: string,
|
|
314
|
+
// assignAllMembers: boolean,
|
|
315
|
+
// @EtoContext() sharedContext: Context = {}
|
|
316
|
+
// ): Promise<Array<{
|
|
317
|
+
// id: string;
|
|
318
|
+
// email: string;
|
|
319
|
+
// name: string;
|
|
320
|
+
// timeZone: string;
|
|
321
|
+
// }>> {
|
|
322
|
+
// // This would query team members
|
|
323
|
+
// // For now, return empty array
|
|
324
|
+
// return [];
|
|
325
|
+
// }
|
|
326
|
+
// /**
|
|
327
|
+
// * Check if users are blocked (Cal.com pattern)
|
|
328
|
+
// */
|
|
329
|
+
// private async checkIfUsersAreBlocked(
|
|
330
|
+
// userEmails: string[],
|
|
331
|
+
// bookerEmail: string,
|
|
332
|
+
// @EtoContext() sharedContext: Context = {}
|
|
333
|
+
// ): Promise<string[]> {
|
|
334
|
+
// // This would check against watchlist/blocked users
|
|
335
|
+
// // For now, return no blocked users
|
|
336
|
+
// return [];
|
|
337
|
+
// }
|
|
338
|
+
// /**
|
|
339
|
+
// * Check users availability for booking time
|
|
340
|
+
// */
|
|
341
|
+
// private async checkUsersAvailability(
|
|
342
|
+
// users: Array<{ id: string; email: string }>,
|
|
343
|
+
// startTime: Date,
|
|
344
|
+
// endTime: Date,
|
|
345
|
+
// @EtoContext() sharedContext: Context = {}
|
|
346
|
+
// ): Promise<Record<string, boolean>> {
|
|
347
|
+
// const availability: Record<string, boolean> = {};
|
|
348
|
+
// // Check each user's availability
|
|
349
|
+
// for (const user of users) {
|
|
350
|
+
// // This would integrate with AvailabilityService
|
|
351
|
+
// // For now, assume all users are available
|
|
352
|
+
// availability[user.id] = true;
|
|
353
|
+
// }
|
|
354
|
+
// return availability;
|
|
355
|
+
// }
|
|
356
|
+
// /**
|
|
357
|
+
// * Enrich users with credentials
|
|
358
|
+
// */
|
|
359
|
+
// private async enrichUsersWithCredentials(
|
|
360
|
+
// users: Array<{
|
|
361
|
+
// id: string;
|
|
362
|
+
// email: string;
|
|
363
|
+
// name: string;
|
|
364
|
+
// timeZone: string;
|
|
365
|
+
// isFixed: boolean;
|
|
366
|
+
// }>,
|
|
367
|
+
// @EtoContext() sharedContext: Context = {}
|
|
368
|
+
// ): Promise<Array<{
|
|
369
|
+
// id: string;
|
|
370
|
+
// email: string;
|
|
371
|
+
// name: string;
|
|
372
|
+
// timeZone: string;
|
|
373
|
+
// isFixed: boolean;
|
|
374
|
+
// credentials: Array<{ type: string; key: string }>;
|
|
375
|
+
// }>> {
|
|
376
|
+
// // This would load user credentials (calendar, video, etc.)
|
|
377
|
+
// return users.map(user => ({
|
|
378
|
+
// ...user,
|
|
379
|
+
// credentials: [] // For now, empty credentials
|
|
380
|
+
// }));
|
|
381
|
+
// }
|
|
382
|
+
// /**
|
|
383
|
+
// * Apply scheduling type logic (Cal.com pattern)
|
|
384
|
+
// */
|
|
385
|
+
// private applySchedulingTypeLogic(
|
|
386
|
+
// users: Array<{
|
|
387
|
+
// id: string;
|
|
388
|
+
// email: string;
|
|
389
|
+
// name: string;
|
|
390
|
+
// timeZone: string;
|
|
391
|
+
// isFixed: boolean;
|
|
392
|
+
// credentials: Array<{ type: string; key: string }>;
|
|
393
|
+
// }>,
|
|
394
|
+
// schedulingType?: 'COLLECTIVE' | 'ROUND_ROBIN',
|
|
395
|
+
// availabilityResults?: Record<string, boolean>
|
|
396
|
+
// ): Array<{
|
|
397
|
+
// id: string;
|
|
398
|
+
// email: string;
|
|
399
|
+
// name: string;
|
|
400
|
+
// timeZone: string;
|
|
401
|
+
// isFixed: boolean;
|
|
402
|
+
// available: boolean;
|
|
403
|
+
// credentials: Array<{ type: string; key: string }>;
|
|
404
|
+
// }> {
|
|
405
|
+
// return users.map(user => ({
|
|
406
|
+
// ...user,
|
|
407
|
+
// available: availabilityResults?.[user.id] ?? true
|
|
408
|
+
// }));
|
|
409
|
+
// }
|
|
410
|
+
// /**
|
|
411
|
+
// * Validate user permissions for resource type
|
|
412
|
+
// */
|
|
413
|
+
// async validateUserCanBookResourceType(
|
|
414
|
+
// params: {
|
|
415
|
+
// userId?: string;
|
|
416
|
+
// userEmail: string;
|
|
417
|
+
// resourceTypeId: string;
|
|
418
|
+
// organizationId?: string;
|
|
419
|
+
// },
|
|
420
|
+
// @EtoContext() sharedContext: Context = {}
|
|
421
|
+
// ): Promise<{
|
|
422
|
+
// canBook: boolean;
|
|
423
|
+
// reason?: string;
|
|
424
|
+
// permissions: {
|
|
425
|
+
// canView: boolean;
|
|
426
|
+
// canBook: boolean;
|
|
427
|
+
// canManage: boolean;
|
|
428
|
+
// };
|
|
429
|
+
// }> {
|
|
430
|
+
// // This would check user permissions against resource type
|
|
431
|
+
// // For now, allow all bookings
|
|
432
|
+
// return {
|
|
433
|
+
// canBook: true,
|
|
434
|
+
// permissions: {
|
|
435
|
+
// canView: true,
|
|
436
|
+
// canBook: true,
|
|
437
|
+
// canManage: false
|
|
438
|
+
// }
|
|
439
|
+
// };
|
|
440
|
+
// }
|
|
441
|
+
// /**
|
|
442
|
+
// * Get module capabilities
|
|
443
|
+
// */
|
|
444
|
+
// getModuleCapabilities() {
|
|
445
|
+
// return {
|
|
446
|
+
// module: 'user-validation',
|
|
447
|
+
// capabilities: [
|
|
448
|
+
// 'email_blocking_validation',
|
|
449
|
+
// 'user_verification_checking',
|
|
450
|
+
// 'organization_blacklist_management',
|
|
451
|
+
// 'global_blacklist_support',
|
|
452
|
+
// 'secondary_email_support'
|
|
453
|
+
// ]
|
|
454
|
+
// };
|
|
455
|
+
// }
|
|
456
|
+
// }
|
|
457
|
+
//# sourceMappingURL=user-validation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-validation-service.js","sourceRoot":"","sources":["../../src/services/user-validation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-validation.service.d.ts","sourceRoot":"","sources":["../../src/services/user-validation.service.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { ModulesSdkUtils, buildQuery } from "@etohq/framework/utils";
|
|
3
|
+
// import { ETO, Context, FindConfig, InferEntityType } from "@etohq/framework/types";
|
|
4
|
+
// import { InjectManager, InjectTransactionManager, EtoContext, EtoError } from "@etohq/framework/utils";
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// // Import email blocking validation utility
|
|
7
|
+
// import {
|
|
8
|
+
// checkIfBookerEmailIsBlocked,
|
|
9
|
+
// validateBookerEmailNotBlocked,
|
|
10
|
+
// type EmailBlockingService,
|
|
11
|
+
// type UserRecord,
|
|
12
|
+
// type EmailBlockingQuery,
|
|
13
|
+
// type EmailBlockingResult
|
|
14
|
+
// } from "@etohq/jo-utils/validate-email-blocking";
|
|
15
|
+
// type InjectedDependencies = ETO.Application.Services;
|
|
16
|
+
// /**
|
|
17
|
+
// * UserValidationService - CORE USER MODULE
|
|
18
|
+
// * Handles user-domain validations including email blocking
|
|
19
|
+
// * Part of core platform modules, used across the platform
|
|
20
|
+
// */
|
|
21
|
+
// export default class UserValidationService extends ModulesSdkUtils.EtoInternalService<
|
|
22
|
+
// InjectedDependencies,
|
|
23
|
+
// any // User entity type would be defined in core
|
|
24
|
+
// > implements EmailBlockingService {
|
|
25
|
+
// protected readonly __userRepository__: any;
|
|
26
|
+
// protected readonly __organizationRepository__: any;
|
|
27
|
+
// constructor(container: InjectedDependencies) {
|
|
28
|
+
// // @ts-ignore - Standard ETO pattern
|
|
29
|
+
// super(...arguments);
|
|
30
|
+
// this.__userRepository__ = container.userRepository;
|
|
31
|
+
// this.__organizationRepository__ = container.organizationRepository;
|
|
32
|
+
// }
|
|
33
|
+
// // ===== EMAIL BLOCKING SERVICE IMPLEMENTATION =====
|
|
34
|
+
// @InjectManager("__userRepository__")
|
|
35
|
+
// async findUserByEmail(
|
|
36
|
+
// filters: Record<string, any>,
|
|
37
|
+
// config?: FindConfig<any>,
|
|
38
|
+
// @EtoContext() sharedContext: Context = {}
|
|
39
|
+
// ): Promise<UserRecord | null> {
|
|
40
|
+
// const queryOptions = buildQuery(filters, config);
|
|
41
|
+
// const [user] = await this.__userRepository__.find(queryOptions, sharedContext);
|
|
42
|
+
// if (!user) return null;
|
|
43
|
+
// return {
|
|
44
|
+
// id: user.id,
|
|
45
|
+
// email: user.email,
|
|
46
|
+
// emailVerified: user.email_verified,
|
|
47
|
+
// secondaryEmails: user.secondary_emails?.map((se: any) => ({
|
|
48
|
+
// email: se.email,
|
|
49
|
+
// emailVerified: se.email_verified
|
|
50
|
+
// })) || []
|
|
51
|
+
// };
|
|
52
|
+
// }
|
|
53
|
+
// async getBlacklistedEmails(organizationId?: string): Promise<string[]> {
|
|
54
|
+
// // Global blacklist from environment
|
|
55
|
+
// const globalBlacklist = process.env.BLACKLISTED_GUEST_EMAILS
|
|
56
|
+
// ? process.env.BLACKLISTED_GUEST_EMAILS.split(",").map(email => email.trim())
|
|
57
|
+
// : [];
|
|
58
|
+
// // Organization-specific blacklist
|
|
59
|
+
// if (organizationId) {
|
|
60
|
+
// try {
|
|
61
|
+
// // TODO: Implement organization blacklist lookup
|
|
62
|
+
// // const orgBlacklist = await this.getOrganizationBlacklist(organizationId);
|
|
63
|
+
// // return [...globalBlacklist, ...orgBlacklist];
|
|
64
|
+
// } catch (error) {
|
|
65
|
+
// console.warn(`Failed to get organization blacklist for ${organizationId}:`, error);
|
|
66
|
+
// }
|
|
67
|
+
// }
|
|
68
|
+
// return globalBlacklist;
|
|
69
|
+
// }
|
|
70
|
+
// async getResourceTypeBlockedEmails(resourceTypeId: string): Promise<string[]> {
|
|
71
|
+
// // Resource-type specific blocked emails would be handled by the resource module
|
|
72
|
+
// // This is a cross-module concern that should be handled by workflows
|
|
73
|
+
// return [];
|
|
74
|
+
// }
|
|
75
|
+
// // ===== USER-DOMAIN VALIDATION METHODS =====
|
|
76
|
+
// /**
|
|
77
|
+
// * Validate user email is not blocked
|
|
78
|
+
// */
|
|
79
|
+
// async validateUserEmailNotBlocked(
|
|
80
|
+
// query: EmailBlockingQuery
|
|
81
|
+
// ): Promise<EmailBlockingResult> {
|
|
82
|
+
// return await checkIfBookerEmailIsBlocked(query, this);
|
|
83
|
+
// }
|
|
84
|
+
// /**
|
|
85
|
+
// * Validate user email and throw if blocked
|
|
86
|
+
// */
|
|
87
|
+
// async validateUserEmailAllowed(
|
|
88
|
+
// query: EmailBlockingQuery
|
|
89
|
+
// ): Promise<void> {
|
|
90
|
+
// await validateBookerEmailNotBlocked(query, this);
|
|
91
|
+
// }
|
|
92
|
+
// /**
|
|
93
|
+
// * Check if user exists and is verified
|
|
94
|
+
// */
|
|
95
|
+
// @InjectManager("__userRepository__")
|
|
96
|
+
// async checkUserVerificationStatus(
|
|
97
|
+
// email: string,
|
|
98
|
+
// @EtoContext() sharedContext: Context = {}
|
|
99
|
+
// ): Promise<{
|
|
100
|
+
// exists: boolean;
|
|
101
|
+
// isVerified: boolean;
|
|
102
|
+
// userId?: string;
|
|
103
|
+
// }> {
|
|
104
|
+
// const filters = {
|
|
105
|
+
// $or: [
|
|
106
|
+
// { email: email.toLowerCase() },
|
|
107
|
+
// {
|
|
108
|
+
// secondary_emails: {
|
|
109
|
+
// $elemMatch: { email: email.toLowerCase() }
|
|
110
|
+
// }
|
|
111
|
+
// }
|
|
112
|
+
// ]
|
|
113
|
+
// };
|
|
114
|
+
// const config = {
|
|
115
|
+
// select: ['id', 'email', 'email_verified'],
|
|
116
|
+
// relations: ['secondary_emails'],
|
|
117
|
+
// take: 1
|
|
118
|
+
// };
|
|
119
|
+
// const user = await this.findUserByEmail(filters, config, sharedContext);
|
|
120
|
+
// if (!user) {
|
|
121
|
+
// return { exists: false, isVerified: false };
|
|
122
|
+
// }
|
|
123
|
+
// const isVerified = (user.email === email.toLowerCase() && user.emailVerified) ||
|
|
124
|
+
// (user.secondaryEmails?.some(se => se.email === email.toLowerCase() && se.emailVerified)) ||
|
|
125
|
+
// false;
|
|
126
|
+
// return {
|
|
127
|
+
// exists: true,
|
|
128
|
+
// isVerified,
|
|
129
|
+
// userId: user.id
|
|
130
|
+
// };
|
|
131
|
+
// }
|
|
132
|
+
// /**
|
|
133
|
+
// * Get user by email with verification status
|
|
134
|
+
// */
|
|
135
|
+
// @InjectManager("__userRepository__")
|
|
136
|
+
// async getUserByEmailWithVerification(
|
|
137
|
+
// email: string,
|
|
138
|
+
// @EtoContext() sharedContext: Context = {}
|
|
139
|
+
// ): Promise<UserRecord | null> {
|
|
140
|
+
// const filters = {
|
|
141
|
+
// $or: [
|
|
142
|
+
// {
|
|
143
|
+
// email: email.toLowerCase(),
|
|
144
|
+
// email_verified: { $ne: null }
|
|
145
|
+
// },
|
|
146
|
+
// {
|
|
147
|
+
// secondary_emails: {
|
|
148
|
+
// $elemMatch: {
|
|
149
|
+
// email: email.toLowerCase(),
|
|
150
|
+
// email_verified: { $ne: null }
|
|
151
|
+
// }
|
|
152
|
+
// }
|
|
153
|
+
// }
|
|
154
|
+
// ]
|
|
155
|
+
// };
|
|
156
|
+
// const config = {
|
|
157
|
+
// select: ['id', 'email', 'email_verified'],
|
|
158
|
+
// relations: ['secondary_emails'],
|
|
159
|
+
// take: 1
|
|
160
|
+
// };
|
|
161
|
+
// return await this.findUserByEmail(filters, config, sharedContext);
|
|
162
|
+
// }
|
|
163
|
+
// // ===== ORGANIZATION BLACKLIST METHODS =====
|
|
164
|
+
// /**
|
|
165
|
+
// * Get organization-specific email blacklist
|
|
166
|
+
// */
|
|
167
|
+
// @InjectManager("__organizationRepository__")
|
|
168
|
+
// async getOrganizationBlacklist(
|
|
169
|
+
// organizationId: string,
|
|
170
|
+
// @EtoContext() sharedContext: Context = {}
|
|
171
|
+
// ): Promise<string[]> {
|
|
172
|
+
// // TODO: Implement organization blacklist lookup
|
|
173
|
+
// // This would query organization settings for blocked emails
|
|
174
|
+
// return [];
|
|
175
|
+
// }
|
|
176
|
+
// /**
|
|
177
|
+
// * Add email to organization blacklist
|
|
178
|
+
// */
|
|
179
|
+
// @InjectManager("__organizationRepository__")
|
|
180
|
+
// async addToOrganizationBlacklist(
|
|
181
|
+
// organizationId: string,
|
|
182
|
+
// email: string,
|
|
183
|
+
// @EtoContext() sharedContext: Context = {}
|
|
184
|
+
// ): Promise<void> {
|
|
185
|
+
// // TODO: Implement organization blacklist management
|
|
186
|
+
// throw new EtoError(
|
|
187
|
+
// EtoError.Types.NOT_IMPLEMENTED,
|
|
188
|
+
// 'Organization blacklist management not yet implemented'
|
|
189
|
+
// );
|
|
190
|
+
// }
|
|
191
|
+
// /**
|
|
192
|
+
// * Remove email from organization blacklist
|
|
193
|
+
// */
|
|
194
|
+
// @InjectManager("__organizationRepository__")
|
|
195
|
+
// async removeFromOrganizationBlacklist(
|
|
196
|
+
// organizationId: string,
|
|
197
|
+
// email: string,
|
|
198
|
+
// @EtoContext() sharedContext: Context = {}
|
|
199
|
+
// ): Promise<void> {
|
|
200
|
+
// // TODO: Implement organization blacklist management
|
|
201
|
+
// throw new EtoError(
|
|
202
|
+
// EtoError.Types.NOT_IMPLEMENTED,
|
|
203
|
+
// 'Organization blacklist management not yet implemented'
|
|
204
|
+
// );
|
|
205
|
+
// }
|
|
206
|
+
// }
|
|
207
|
+
//# sourceMappingURL=user-validation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-validation.service.js","sourceRoot":"","sources":["../../src/services/user-validation.service.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,sFAAsF;AACtF,0GAA0G;;AAE1G,8CAA8C;AAC9C,WAAW;AACX,iCAAiC;AACjC,mCAAmC;AACnC,+BAA+B;AAC/B,qBAAqB;AACrB,6BAA6B;AAC7B,6BAA6B;AAC7B,oDAAoD;AAEpD,wDAAwD;AAExD,MAAM;AACN,8CAA8C;AAC9C,8DAA8D;AAC9D,6DAA6D;AAC7D,MAAM;AACN,yFAAyF;AACzF,0BAA0B;AAC1B,qDAAqD;AACrD,sCAAsC;AAEtC,gDAAgD;AAChD,wDAAwD;AAExD,mDAAmD;AACnD,2CAA2C;AAC3C,2BAA2B;AAC3B,0DAA0D;AAC1D,0EAA0E;AAC1E,MAAM;AAEN,yDAAyD;AAEzD,yCAAyC;AACzC,2BAA2B;AAC3B,oCAAoC;AACpC,gCAAgC;AAChC,gDAAgD;AAChD,oCAAoC;AACpC,wDAAwD;AACxD,sFAAsF;AAEtF,8BAA8B;AAE9B,eAAe;AACf,qBAAqB;AACrB,2BAA2B;AAC3B,4CAA4C;AAC5C,oEAAoE;AACpE,2BAA2B;AAC3B,2CAA2C;AAC3C,kBAAkB;AAClB,SAAS;AACT,MAAM;AAEN,6EAA6E;AAC7E,2CAA2C;AAC3C,mEAAmE;AACnE,qFAAqF;AACrF,cAAc;AAEd,yCAAyC;AACzC,4BAA4B;AAC5B,cAAc;AACd,2DAA2D;AAC3D,uFAAuF;AACvF,2DAA2D;AAC3D,0BAA0B;AAC1B,8FAA8F;AAC9F,UAAU;AACV,QAAQ;AAER,8BAA8B;AAC9B,MAAM;AAEN,oFAAoF;AACpF,uFAAuF;AACvF,4EAA4E;AAC5E,iBAAiB;AACjB,MAAM;AAEN,kDAAkD;AAElD,QAAQ;AACR,0CAA0C;AAC1C,QAAQ;AACR,uCAAuC;AACvC,gCAAgC;AAChC,sCAAsC;AACtC,6DAA6D;AAC7D,MAAM;AAEN,QAAQ;AACR,gDAAgD;AAChD,QAAQ;AACR,oCAAoC;AACpC,gCAAgC;AAChC,uBAAuB;AACvB,wDAAwD;AACxD,MAAM;AAEN,QAAQ;AACR,4CAA4C;AAC5C,QAAQ;AACR,yCAAyC;AACzC,uCAAuC;AACvC,qBAAqB;AACrB,gDAAgD;AAChD,iBAAiB;AACjB,uBAAuB;AACvB,2BAA2B;AAC3B,uBAAuB;AACvB,SAAS;AACT,wBAAwB;AACxB,eAAe;AACf,0CAA0C;AAC1C,YAAY;AACZ,gCAAgC;AAChC,yDAAyD;AACzD,cAAc;AACd,YAAY;AACZ,UAAU;AACV,SAAS;AAET,uBAAuB;AACvB,mDAAmD;AACnD,yCAAyC;AACzC,gBAAgB;AAChB,SAAS;AAET,+EAA+E;AAE/E,mBAAmB;AACnB,qDAAqD;AACrD,QAAQ;AAER,uFAAuF;AACvF,oGAAoG;AACpG,eAAe;AAEf,eAAe;AACf,sBAAsB;AACtB,oBAAoB;AACpB,wBAAwB;AACxB,SAAS;AACT,MAAM;AAEN,QAAQ;AACR,kDAAkD;AAClD,QAAQ;AACR,yCAAyC;AACzC,0CAA0C;AAC1C,qBAAqB;AACrB,gDAAgD;AAChD,oCAAoC;AACpC,wBAAwB;AACxB,eAAe;AACf,YAAY;AACZ,wCAAwC;AACxC,0CAA0C;AAC1C,aAAa;AACb,YAAY;AACZ,gCAAgC;AAChC,4BAA4B;AAC5B,4CAA4C;AAC5C,8CAA8C;AAC9C,gBAAgB;AAChB,cAAc;AACd,YAAY;AACZ,UAAU;AACV,SAAS;AAET,uBAAuB;AACvB,mDAAmD;AACnD,yCAAyC;AACzC,gBAAgB;AAChB,SAAS;AAET,yEAAyE;AACzE,MAAM;AAEN,kDAAkD;AAElD,QAAQ;AACR,iDAAiD;AACjD,QAAQ;AACR,iDAAiD;AACjD,oCAAoC;AACpC,8BAA8B;AAC9B,gDAAgD;AAChD,2BAA2B;AAC3B,uDAAuD;AACvD,mEAAmE;AACnE,iBAAiB;AACjB,MAAM;AAEN,QAAQ;AACR,2CAA2C;AAC3C,QAAQ;AACR,iDAAiD;AACjD,sCAAsC;AACtC,8BAA8B;AAC9B,qBAAqB;AACrB,gDAAgD;AAChD,uBAAuB;AACvB,2DAA2D;AAC3D,0BAA0B;AAC1B,wCAAwC;AACxC,gEAAgE;AAChE,SAAS;AACT,MAAM;AAEN,QAAQ;AACR,gDAAgD;AAChD,QAAQ;AACR,iDAAiD;AACjD,2CAA2C;AAC3C,8BAA8B;AAC9B,qBAAqB;AACrB,gDAAgD;AAChD,uBAAuB;AACvB,2DAA2D;AAC3D,0BAA0B;AAC1B,wCAAwC;AACxC,gEAAgE;AAChE,SAAS;AACT,MAAM;AACN,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts","../src/migrations/migration20240214033943.ts","../src/migrations/migration20240703095850.ts","../src/migrations/migration20241202103352.ts","../src/models/index.ts","../src/models/invite.ts","../src/models/role.ts","../src/models/user-term-of-service.ts","../src/models/user.ts","../src/services/index.ts","../src/services/user-module.ts","../src/types/index.ts","../src/types/services/index.ts","../src/types/services/invite.ts","../src/utils/utils.ts"],"version":"5.8.3"}
|
|
1
|
+
{"root":["../src/index.ts","../src/migrations/migration20240214033943.ts","../src/migrations/migration20240703095850.ts","../src/migrations/migration20241202103352.ts","../src/models/index.ts","../src/models/invite.ts","../src/models/role.ts","../src/models/user-term-of-service.ts","../src/models/user.ts","../src/services/index.ts","../src/services/user-module.ts","../src/services/user-validation-service.ts","../src/services/user-validation.service.ts","../src/types/index.ts","../src/types/services/index.ts","../src/types/services/invite.ts","../src/utils/utils.ts"],"version":"5.8.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etohq/user",
|
|
3
|
-
"version": "1.5.1-alpha.
|
|
3
|
+
"version": "1.5.1-alpha.5",
|
|
4
4
|
"description": "Eto Users module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"rimraf": "5.0.2",
|
|
37
37
|
"tsc-alias": "1.8.6",
|
|
38
38
|
"typescript": "5.8.3",
|
|
39
|
-
"@etohq/framework": "1.5.1-alpha.
|
|
40
|
-
"@etohq/test-utils": "1.5.1-alpha.
|
|
39
|
+
"@etohq/framework": "1.5.1-alpha.5",
|
|
40
|
+
"@etohq/test-utils": "1.5.1-alpha.5"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"jsonwebtoken": "9.0.2"
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@mikro-orm/migrations": "6.4.3",
|
|
48
48
|
"@mikro-orm/postgresql": "6.4.3",
|
|
49
49
|
"awilix": "8.0.1",
|
|
50
|
-
"@etohq/framework": "1.5.1-alpha.
|
|
50
|
+
"@etohq/framework": "1.5.1-alpha.5"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"watch": "tsc --build --watch",
|