@solidxai/core 0.1.9-beta.8 → 0.1.9
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/.claude/settings.local.json +15 -0
- package/LICENSE +89 -0
- package/README.md +3 -1
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts +5 -3
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts.map +1 -1
- package/dist/passport-strategies/facebook-oauth.strategy.js +41 -18
- package/dist/passport-strategies/facebook-oauth.strategy.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +1 -1
- package/dist/services/authentication.service.d.ts +12 -13
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +40 -16
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +16 -0
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +75 -12
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/user.service.d.ts +10 -8
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +85 -46
- package/dist/services/user.service.js.map +1 -1
- package/package.json +2 -2
- package/src/passport-strategies/facebook-oauth.strategy.ts +82 -31
- package/src/seeders/seed-data/solid-core-metadata.json +1 -1
- package/src/services/1.js +6 -0
- package/src/services/authentication.service.ts +217 -141
- package/src/services/settings/default-settings-provider.service.ts +80 -17
- package/src/services/user.service.ts +149 -77
- package/dev-grooming-docs/ozzy-prompts.txt +0 -70
- package/dist-tests/api/authenticate.spec.js +0 -119
- package/dist-tests/api/authenticate.spec.js.map +0 -1
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
- package/dist-tests/api/ping.spec.js +0 -21
- package/dist-tests/api/ping.spec.js.map +0 -1
- package/dist-tests/helpers/auth.js +0 -41
- package/dist-tests/helpers/auth.js.map +0 -1
- package/dist-tests/helpers/env.js +0 -11
- package/dist-tests/helpers/env.js.map +0 -1
- package/docs/grouping-enhancements.md +0 -89
- package/docs/java-spring/README.md +0 -3
- package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
- package/docs/seed-changes.md +0 -65
- package/docs/test-data-workflow.md +0 -200
- package/docs/type-declaration-import-issue.md +0 -24
|
@@ -24,8 +24,27 @@ const user_repository_1 = require("../repository/user.repository");
|
|
|
24
24
|
const role_metadata_repository_1 = require("../repository/role-metadata.repository");
|
|
25
25
|
const hashing_service_1 = require("./hashing.service");
|
|
26
26
|
let UserService = class UserService extends crud_service_1.CRUDService {
|
|
27
|
+
buildFacebookUsernameBase(name) {
|
|
28
|
+
const normalized = (name || "")
|
|
29
|
+
.trim()
|
|
30
|
+
.toLowerCase()
|
|
31
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
32
|
+
.replace(/^_+|_+$/g, "");
|
|
33
|
+
return normalized || "facebook_user";
|
|
34
|
+
}
|
|
35
|
+
async resolveUniqueUsername(preferredUsername) {
|
|
36
|
+
let candidate = preferredUsername;
|
|
37
|
+
let suffix = 0;
|
|
38
|
+
while (await this.repo.findOne({ where: { username: candidate } })) {
|
|
39
|
+
suffix += 1;
|
|
40
|
+
candidate = `${preferredUsername}_${suffix}`;
|
|
41
|
+
}
|
|
42
|
+
if (candidate) {
|
|
43
|
+
return candidate;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
27
46
|
constructor(hashingService, entityManager, repo, nonSecurityRuleAwareRepo, roleRepository, moduleRef) {
|
|
28
|
-
super(entityManager, repo,
|
|
47
|
+
super(entityManager, repo, "user", "solid-core", moduleRef);
|
|
29
48
|
this.hashingService = hashingService;
|
|
30
49
|
this.entityManager = entityManager;
|
|
31
50
|
this.repo = repo;
|
|
@@ -43,7 +62,8 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
43
62
|
if (!ids || ids.length === 0) {
|
|
44
63
|
throw new Error(error_messages_1.ERROR_MESSAGES.DELETE_IDS_REQUIRED);
|
|
45
64
|
}
|
|
46
|
-
if (solidRequestContext?.activeUser?.sub &&
|
|
65
|
+
if (solidRequestContext?.activeUser?.sub &&
|
|
66
|
+
ids.includes(solidRequestContext.activeUser.id)) {
|
|
47
67
|
throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);
|
|
48
68
|
}
|
|
49
69
|
return super.deleteMany(ids, solidRequestContext);
|
|
@@ -51,33 +71,33 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
51
71
|
async findOneByEmail(email) {
|
|
52
72
|
return await this.repo.findOne({
|
|
53
73
|
where: {
|
|
54
|
-
email: email
|
|
74
|
+
email: email,
|
|
55
75
|
},
|
|
56
|
-
relations: {}
|
|
76
|
+
relations: {},
|
|
57
77
|
});
|
|
58
78
|
}
|
|
59
79
|
async findOneByAccessCode(accessCode) {
|
|
60
80
|
return await this.repo.findOne({
|
|
61
81
|
where: {
|
|
62
|
-
accessCode: accessCode
|
|
82
|
+
accessCode: accessCode,
|
|
63
83
|
},
|
|
64
|
-
relations: {}
|
|
84
|
+
relations: {},
|
|
65
85
|
});
|
|
66
86
|
}
|
|
67
87
|
async findOneByUsername(username) {
|
|
68
88
|
return await this.repo.findOne({
|
|
69
89
|
where: {
|
|
70
|
-
username: username
|
|
90
|
+
username: username,
|
|
71
91
|
},
|
|
72
|
-
relations: {}
|
|
92
|
+
relations: {},
|
|
73
93
|
});
|
|
74
94
|
}
|
|
75
95
|
async updateUser(id, updateDto, files, solidRequestContext = {}) {
|
|
76
96
|
const user = await this.repo.findOne({
|
|
77
97
|
where: { id: id },
|
|
78
98
|
relations: {
|
|
79
|
-
roles: true
|
|
80
|
-
}
|
|
99
|
+
roles: true,
|
|
100
|
+
},
|
|
81
101
|
});
|
|
82
102
|
if (!user) {
|
|
83
103
|
throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND);
|
|
@@ -91,13 +111,15 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
91
111
|
const user = await this.repo.findOne({
|
|
92
112
|
where: { username: username },
|
|
93
113
|
relations: {
|
|
94
|
-
roles: true
|
|
95
|
-
}
|
|
114
|
+
roles: true,
|
|
115
|
+
},
|
|
96
116
|
});
|
|
97
117
|
if (!user) {
|
|
98
118
|
throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
|
|
99
119
|
}
|
|
100
|
-
const role = await this.roleRepository.findOne({
|
|
120
|
+
const role = await this.roleRepository.findOne({
|
|
121
|
+
where: { name: roleName },
|
|
122
|
+
});
|
|
101
123
|
if (!role) {
|
|
102
124
|
throw new Error(error_messages_1.ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));
|
|
103
125
|
}
|
|
@@ -112,43 +134,43 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
112
134
|
async addRolesToUser(username, roleNames) {
|
|
113
135
|
const user = await this.nonSecurityRuleAwareRepo.findOne({
|
|
114
136
|
where: { username: username },
|
|
115
|
-
relations: { roles: true }
|
|
137
|
+
relations: { roles: true },
|
|
116
138
|
});
|
|
117
139
|
if (!user) {
|
|
118
140
|
throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
|
|
119
141
|
}
|
|
120
142
|
const roles = await this.roleRepository.find({
|
|
121
|
-
where: roleNames.map(roleName => ({ name: roleName }))
|
|
143
|
+
where: roleNames.map((roleName) => ({ name: roleName })),
|
|
122
144
|
});
|
|
123
145
|
if (roles.length !== roleNames.length) {
|
|
124
|
-
const foundRoleNames = roles.map(role => role.name);
|
|
125
|
-
const missingRoles = roleNames.filter(roleName => !foundRoleNames.includes(roleName));
|
|
146
|
+
const foundRoleNames = roles.map((role) => role.name);
|
|
147
|
+
const missingRoles = roleNames.filter((roleName) => !foundRoleNames.includes(roleName));
|
|
126
148
|
throw new Error(error_messages_1.ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));
|
|
127
149
|
}
|
|
128
|
-
const currentRoles = user.roles.map(role => role.name);
|
|
129
|
-
const rolesToAdd = roles.filter(role => !currentRoles.includes(role.name));
|
|
130
|
-
const rolesToRemove = user.roles.filter(role => !roleNames.includes(role.name));
|
|
150
|
+
const currentRoles = user.roles.map((role) => role.name);
|
|
151
|
+
const rolesToAdd = roles.filter((role) => !currentRoles.includes(role.name));
|
|
152
|
+
const rolesToRemove = user.roles.filter((role) => !roleNames.includes(role.name));
|
|
131
153
|
if (rolesToAdd.length > 0) {
|
|
132
154
|
user.roles.push(...rolesToAdd);
|
|
133
155
|
}
|
|
134
156
|
if (rolesToRemove.length > 0) {
|
|
135
|
-
user.roles = user.roles.filter(role => !rolesToRemove.includes(role));
|
|
157
|
+
user.roles = user.roles.filter((role) => !rolesToRemove.includes(role));
|
|
136
158
|
}
|
|
137
159
|
return await this.nonSecurityRuleAwareRepo.save(user);
|
|
138
160
|
}
|
|
139
161
|
async removeRoleFromUser(username, roleName) {
|
|
140
162
|
const user = await this.repo.findOne({
|
|
141
163
|
where: {
|
|
142
|
-
username: username
|
|
164
|
+
username: username,
|
|
143
165
|
},
|
|
144
166
|
relations: {
|
|
145
|
-
roles: true
|
|
146
|
-
}
|
|
167
|
+
roles: true,
|
|
168
|
+
},
|
|
147
169
|
});
|
|
148
170
|
if (!user) {
|
|
149
171
|
throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
|
|
150
172
|
}
|
|
151
|
-
user.roles = user.roles.filter(role => role.name !== roleName);
|
|
173
|
+
user.roles = user.roles.filter((role) => role.name !== roleName);
|
|
152
174
|
return await this.repo.save(user);
|
|
153
175
|
}
|
|
154
176
|
async resolveUserOnOauthGoogle(oauthUserDto) {
|
|
@@ -157,8 +179,8 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
157
179
|
email: oauthUserDto.email,
|
|
158
180
|
},
|
|
159
181
|
relations: {
|
|
160
|
-
roles: true
|
|
161
|
-
}
|
|
182
|
+
roles: true,
|
|
183
|
+
},
|
|
162
184
|
});
|
|
163
185
|
if (!user) {
|
|
164
186
|
const user = new user_entity_1.User();
|
|
@@ -171,7 +193,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
171
193
|
user.googleId = oauthUserDto.providerId;
|
|
172
194
|
user.googleProfilePicture = oauthUserDto.picture;
|
|
173
195
|
const savedUser = await this.repo.save(user);
|
|
174
|
-
await this.initializeRolesForNewUser([this.settingService.getConfigValue(
|
|
196
|
+
await this.initializeRolesForNewUser([this.settingService.getConfigValue("defaultRole")], savedUser);
|
|
175
197
|
}
|
|
176
198
|
else {
|
|
177
199
|
const entity = await this.repo.preload({
|
|
@@ -187,18 +209,36 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
187
209
|
return user;
|
|
188
210
|
}
|
|
189
211
|
async resolveUserOnOauthFacebook(oauthUserDto) {
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
212
|
+
const normalizedEmail = oauthUserDto.email?.trim().toLowerCase() || null;
|
|
213
|
+
let user = null;
|
|
214
|
+
if (oauthUserDto.providerId) {
|
|
215
|
+
user = await this.repo.findOne({
|
|
216
|
+
where: {
|
|
217
|
+
facebookId: oauthUserDto.providerId,
|
|
218
|
+
},
|
|
219
|
+
relations: {
|
|
220
|
+
roles: true,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
}
|
|
198
224
|
if (!user) {
|
|
225
|
+
const facebookProviderFallback = `facebook_${oauthUserDto.providerId}`;
|
|
226
|
+
const facebookNameUsername = this.buildFacebookUsernameBase(oauthUserDto.name);
|
|
227
|
+
let username = facebookNameUsername;
|
|
228
|
+
let email = normalizedEmail;
|
|
229
|
+
if (normalizedEmail) {
|
|
230
|
+
const existingByEmail = await this.repo.findOne({
|
|
231
|
+
where: { email: normalizedEmail },
|
|
232
|
+
});
|
|
233
|
+
if (existingByEmail) {
|
|
234
|
+
username = facebookNameUsername;
|
|
235
|
+
email = null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
username = await this.resolveUniqueUsername(username);
|
|
199
239
|
const newUser = new user_entity_1.User();
|
|
200
|
-
newUser.username =
|
|
201
|
-
newUser.email =
|
|
240
|
+
newUser.username = username;
|
|
241
|
+
newUser.email = email;
|
|
202
242
|
newUser.fullName = oauthUserDto.name;
|
|
203
243
|
newUser.lastLoginProvider = oauthUserDto.provider;
|
|
204
244
|
newUser.accessCode = oauthUserDto.accessCode;
|
|
@@ -206,7 +246,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
206
246
|
newUser.facebookId = oauthUserDto.providerId;
|
|
207
247
|
newUser.facebookProfilePicture = oauthUserDto.picture;
|
|
208
248
|
const savedUser = await this.repo.save(newUser);
|
|
209
|
-
await this.initializeRolesForNewUser([this.settingService.getConfigValue(
|
|
249
|
+
await this.initializeRolesForNewUser([this.settingService.getConfigValue("defaultRole")], savedUser);
|
|
210
250
|
return savedUser;
|
|
211
251
|
}
|
|
212
252
|
else {
|
|
@@ -242,8 +282,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
242
282
|
newUser.microsoftId = oauthUserDto.providerId;
|
|
243
283
|
newUser.microsoftProfilePicture = oauthUserDto.picture;
|
|
244
284
|
const savedUser = await this.repo.save(newUser);
|
|
245
|
-
await this.initializeRolesForNewUser([this.settingService.getConfigValue(
|
|
246
|
-
return savedUser;
|
|
285
|
+
await this.initializeRolesForNewUser([this.settingService.getConfigValue("defaultRole")], savedUser);
|
|
247
286
|
}
|
|
248
287
|
else {
|
|
249
288
|
const entity = await this.repo.preload({
|
|
@@ -255,17 +294,17 @@ let UserService = class UserService extends crud_service_1.CRUDService {
|
|
|
255
294
|
microsoftProfilePicture: oauthUserDto.picture,
|
|
256
295
|
});
|
|
257
296
|
await this.repo.save(entity);
|
|
258
|
-
return entity;
|
|
259
297
|
}
|
|
298
|
+
return user;
|
|
260
299
|
}
|
|
261
300
|
async findUsersByRole(roleName, relations = {}) {
|
|
262
301
|
return await this.repo.find({
|
|
263
302
|
where: {
|
|
264
303
|
roles: {
|
|
265
|
-
name: roleName
|
|
266
|
-
}
|
|
304
|
+
name: roleName,
|
|
305
|
+
},
|
|
267
306
|
},
|
|
268
|
-
relations: relations
|
|
307
|
+
relations: relations,
|
|
269
308
|
});
|
|
270
309
|
}
|
|
271
310
|
async checkIfPermissionExists(query, activeUser) {
|
|
@@ -299,7 +338,7 @@ exports.UserService = UserService;
|
|
|
299
338
|
exports.UserService = UserService = __decorate([
|
|
300
339
|
(0, common_1.Injectable)(),
|
|
301
340
|
__param(1, (0, typeorm_1.InjectEntityManager)()),
|
|
302
|
-
__param(3, (0, typeorm_1.InjectRepository)(user_entity_1.User,
|
|
341
|
+
__param(3, (0, typeorm_1.InjectRepository)(user_entity_1.User, "default")),
|
|
303
342
|
__metadata("design:paramtypes", [hashing_service_1.HashingService,
|
|
304
343
|
typeorm_2.EntityManager,
|
|
305
344
|
user_repository_1.UserRepository,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager, Repository } from 'typeorm';\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\n\nimport { OauthUserDto } from '../dtos/oauth-user-dto';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { User } from '../entities/user.entity';\nimport { ActiveUserData } from '../interfaces/active-user-data.interface';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { UserRepository } from 'src/repository/user.repository';\nimport { RoleMetadataRepository } from 'src/repository/role-metadata.repository';\nimport { HashingService } from './hashing.service';\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n constructor(\n readonly hashingService: HashingService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(User, 'default')\n readonly repo: UserRepository,\n @InjectRepository(User, 'default')\n readonly nonSecurityRuleAwareRepo: Repository<User>,\n // @InjectRepository(RoleMetadata)\n // private readonly roleRepository: Repository<RoleMetadata>,\n private readonly roleRepository: RoleMetadataRepository,\n readonly moduleRef: ModuleRef,\n\n ) {\n super(entityManager, repo, 'user', 'solid-core', moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // ❌ If the active user is trying to delete themselves\n if (solidRequestContext?.activeUser?.sub && ids.includes(solidRequestContext.activeUser.id)) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode\n },\n relations: {}\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (updateDto.roles != null) {\n await this.addRolesToUser(user.username, updateDto.roles);\n }\n await this.update(id, updateDto, files, true);\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n const role = await this.roleRepository.findOne({ where: { name: roleName } });\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n }\n else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.nonSecurityRuleAwareRepo.findOne({\n where: { username: username },\n relations: { roles: true }\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map(roleName => ({ name: roleName }))\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map(role => role.name);\n const missingRoles = roleNames.filter(roleName => !foundRoleNames.includes(roleName));\n throw new Error(ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));\n }\n\n const currentRoles = user.roles.map(role => role.name);\n\n const rolesToAdd = roles.filter(role => !currentRoles.includes(role.name));\n\n const rolesToRemove = user.roles.filter(role => !roleNames.includes(role.name));\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter(role => !rolesToRemove.includes(role));\n }\n\n return await this.nonSecurityRuleAwareRepo.save(user);\n }\n\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username\n },\n relations: {\n roles: true\n }\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter(role => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true\n }\n });\n\n // if we are unable to find a user then we need to create one. \n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.fullName = oauthUserDto.name;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n await this.initializeRolesForNewUser([this.settingService.getConfigValue<SolidCoreSetting>('defaultRole')], savedUser);\n }\n // else we update the user and store the generated code & access token. \n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async resolveUserOnOauthFacebook(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.facebookAccessToken = oauthUserDto.accessToken;\n newUser.facebookId = oauthUserDto.providerId;\n newUser.facebookProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>('defaultRole')],\n savedUser,\n );\n return savedUser;\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n facebookAccessToken: oauthUserDto.accessToken,\n facebookId: oauthUserDto.providerId,\n facebookProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n return entity;\n }\n }\n\n\n async resolveUserOnOauthMicrosoft(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftAccessToken = oauthUserDto.accessToken;\n newUser.microsoftId = oauthUserDto.providerId;\n newUser.microsoftProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>('defaultRole')],\n savedUser,\n );\n return savedUser;\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftAccessToken: oauthUserDto.accessToken,\n microsoftId: oauthUserDto.providerId,\n microsoftProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n return entity;\n }\n }\n\n async findUsersByRole(roleName: string, relations: any = {}): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName\n }\n },\n relations: relations\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n\n const matchingPermssions = activeUser.permissions.filter((p) => query.permissionNames.includes(p));\n return matchingPermssions\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException(ERROR_MESSAGES.USER_MISSING_ID);\n }\n let userRoles = [];\n // Default Internal user role assigned \n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n async hashPassword(password: string): Promise<{\n password: string;\n passwordScheme: string;\n passwordSchemeVersion: number;\n }> {\n const hashedPassword = await this.hashingService.hash(password);\n\n return {\n password: hashedPassword,\n passwordScheme: this.hashingService.name(),\n passwordSchemeVersion: this.hashingService.currentVersion(),\n };\n }\n\n\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BadRequestException,\n forwardRef,\n Inject,\n Injectable,\n} from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from \"@nestjs/typeorm\";\nimport { CRUDService } from \"src/services/crud.service\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { OauthUserDto } from \"../dtos/oauth-user-dto\";\nimport { RoleMetadata } from \"../entities/role-metadata.entity\";\nimport { User } from \"../entities/user.entity\";\nimport { ActiveUserData } from \"../interfaces/active-user-data.interface\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { UserRepository } from \"src/repository/user.repository\";\nimport { RoleMetadataRepository } from \"src/repository/role-metadata.repository\";\nimport { HashingService } from \"./hashing.service\";\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n private buildFacebookUsernameBase(name?: string): string {\n const normalized = (name || \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized || \"facebook_user\";\n }\n\n private async resolveUniqueUsername(\n preferredUsername: string,\n // fallbackUsername: string,\n ): Promise<string> {\n let candidate = preferredUsername;\n let suffix = 0;\n\n while (await this.repo.findOne({ where: { username: candidate } })) {\n suffix += 1;\n candidate = `${preferredUsername}_${suffix}`;\n }\n\n if (candidate) {\n return candidate;\n }\n\n // return fallbackUsername;\n }\n\n constructor(\n readonly hashingService: HashingService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(User, 'default')\n readonly repo: UserRepository,\n @InjectRepository(User, \"default\")\n readonly nonSecurityRuleAwareRepo: Repository<User>,\n // @InjectRepository(RoleMetadata)\n // private readonly roleRepository: Repository<RoleMetadata>,\n private readonly roleRepository: RoleMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, \"user\", \"solid-core\", moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(\n ids: number[],\n solidRequestContext: any = {},\n ): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // ❌ If the active user is trying to delete themselves\n if (\n solidRequestContext?.activeUser?.sub &&\n ids.includes(solidRequestContext.activeUser.id)\n ) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode,\n },\n relations: {},\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (updateDto.roles != null) {\n await this.addRolesToUser(user.username, updateDto.roles);\n }\n await this.update(id, updateDto, files, true);\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n const role = await this.roleRepository.findOne({\n where: { name: roleName },\n });\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n } else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.nonSecurityRuleAwareRepo.findOne({\n where: { username: username },\n relations: { roles: true },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map((roleName) => ({ name: roleName })),\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map((role) => role.name);\n const missingRoles = roleNames.filter(\n (roleName) => !foundRoleNames.includes(roleName),\n );\n throw new Error(ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));\n }\n\n const currentRoles = user.roles.map((role) => role.name);\n\n const rolesToAdd = roles.filter(\n (role) => !currentRoles.includes(role.name),\n );\n\n const rolesToRemove = user.roles.filter(\n (role) => !roleNames.includes(role.name),\n );\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter((role) => !rolesToRemove.includes(role));\n }\n\n return await this.nonSecurityRuleAwareRepo.save(user);\n }\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter((role) => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n // if we are unable to find a user then we need to create one.\n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.fullName = oauthUserDto.name;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n }\n // else we update the user and store the generated code & access token.\n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async resolveUserOnOauthFacebook(oauthUserDto: OauthUserDto): Promise<User> {\n const normalizedEmail = oauthUserDto.email?.trim().toLowerCase() || null;\n let user: User | null = null;\n\n if (oauthUserDto.providerId) {\n user = await this.repo.findOne({\n where: {\n facebookId: oauthUserDto.providerId,\n },\n relations: {\n roles: true,\n },\n });\n }\n\n if (!user) {\n const facebookProviderFallback = `facebook_${oauthUserDto.providerId}`;\n const facebookNameUsername = this.buildFacebookUsernameBase(\n oauthUserDto.name,\n );\n // let username = normalizedEmail || facebookNameUsername;\n let username = facebookNameUsername;\n\n let email = normalizedEmail;\n\n // Avoid clashing with local users that already own the same email/username.\n if (normalizedEmail) {\n const existingByEmail = await this.repo.findOne({\n where: { email: normalizedEmail },\n });\n if (existingByEmail) {\n username = facebookNameUsername;\n email = null;\n }\n }\n username = await this.resolveUniqueUsername(\n username,\n // facebookProviderFallback,\n );\n\n const newUser = new User();\n newUser.username = username;\n newUser.email = email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.facebookAccessToken = oauthUserDto.accessToken;\n newUser.facebookId = oauthUserDto.providerId;\n newUser.facebookProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n return savedUser;\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n facebookAccessToken: oauthUserDto.accessToken,\n facebookId: oauthUserDto.providerId,\n facebookProfilePicture: oauthUserDto.picture,\n });\n await this.repo.save(entity);\n return entity;\n }\n }\n\n async resolveUserOnOauthMicrosoft(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftAccessToken = oauthUserDto.accessToken;\n newUser.microsoftId = oauthUserDto.providerId;\n newUser.microsoftProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftAccessToken: oauthUserDto.accessToken,\n microsoftId: oauthUserDto.providerId,\n microsoftProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n return user;\n }\n\n async findUsersByRole(\n roleName: string,\n relations: any = {},\n ): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName,\n },\n },\n relations: relations,\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n const matchingPermssions = activeUser.permissions.filter((p) =>\n query.permissionNames.includes(p),\n );\n return matchingPermssions;\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException(ERROR_MESSAGES.USER_MISSING_ID);\n }\n let userRoles = [];\n // Default Internal user role assigned\n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n async hashPassword(password: string): Promise<{\n password: string;\n passwordScheme: string;\n passwordSchemeVersion: number;\n }> {\n const hashedPassword = await this.hashingService.hash(password);\n\n return {\n password: hashedPassword,\n passwordScheme: this.hashingService.name(),\n passwordSchemeVersion: this.hashingService.currentVersion(),\n };\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidxai/core",
|
|
3
|
-
"version": "0.1.9
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"prepack": "npm run build"
|
|
29
29
|
},
|
|
30
30
|
"author": "Oswald Rodrigues <oswald@logicloop.io>",
|
|
31
|
-
"license": "
|
|
31
|
+
"license": "BUSL-1.1",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@aws-sdk/client-s3": "^3.637.0",
|
|
34
34
|
"@aws-sdk/client-textract": "^3.873.0",
|
|
@@ -1,64 +1,115 @@
|
|
|
1
|
-
import { Injectable, Logger } from
|
|
2
|
-
import { AuthGuard, PassportStrategy } from
|
|
3
|
-
import { Strategy } from
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
2
|
+
import { AuthGuard, PassportStrategy } from "@nestjs/passport";
|
|
3
|
+
import { Strategy } from "passport-facebook";
|
|
4
|
+
import {
|
|
5
|
+
FacebookAuthConfiguration,
|
|
6
|
+
isFacebookOAuthConfigured,
|
|
7
|
+
} from "src/helpers/facebook-oauth.helper";
|
|
8
|
+
import { v4 as uuid } from "uuid";
|
|
9
|
+
import type { SolidCoreSetting } from "../services/settings/default-settings-provider.service";
|
|
10
|
+
import { SettingService } from "../services/setting.service";
|
|
11
|
+
import { UserService } from "../services/user.service";
|
|
7
12
|
|
|
8
|
-
const DUMMY_CLIENT_ID =
|
|
9
|
-
const DUMMY_CLIENT_SECRET =
|
|
10
|
-
const DUMMY_CALLBACK_URL =
|
|
13
|
+
const DUMMY_CLIENT_ID = "DUMMY_CLIENT_ID";
|
|
14
|
+
const DUMMY_CLIENT_SECRET = "DUMMY_CLIENT_SECRET";
|
|
15
|
+
const DUMMY_CALLBACK_URL = "DUMMY_CALLBACK_URL";
|
|
11
16
|
|
|
12
17
|
@Injectable()
|
|
13
|
-
export class FacebookOauthGuard extends AuthGuard(
|
|
18
|
+
export class FacebookOauthGuard extends AuthGuard("facebook") {}
|
|
14
19
|
|
|
15
20
|
@Injectable()
|
|
16
|
-
export class FacebookOAuthStrategy extends PassportStrategy(
|
|
21
|
+
export class FacebookOAuthStrategy extends PassportStrategy(
|
|
22
|
+
Strategy,
|
|
23
|
+
"facebook",
|
|
24
|
+
) {
|
|
17
25
|
private readonly logger = new Logger(FacebookOAuthStrategy.name);
|
|
18
26
|
|
|
19
|
-
constructor(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
27
|
+
constructor(
|
|
28
|
+
private readonly userService: UserService,
|
|
29
|
+
private readonly settingService: SettingService,
|
|
30
|
+
) {
|
|
31
|
+
// Prefer settings cache (same source used by controller validation), fall back to env.
|
|
32
|
+
const clientID =
|
|
33
|
+
settingService.getConfigValue<SolidCoreSetting>("FACEBOOK_CLIENT_ID") ??
|
|
34
|
+
process.env.IAM_FACEBOOK_OAUTH_CLIENT_ID ??
|
|
35
|
+
DUMMY_CLIENT_ID;
|
|
36
|
+
const clientSecret =
|
|
37
|
+
settingService.getConfigValue<SolidCoreSetting>(
|
|
38
|
+
"FACEBOOK_CLIENT_SECRET",
|
|
39
|
+
) ??
|
|
40
|
+
process.env.IAM_FACEBOOK_OAUTH_CLIENT_SECRET ??
|
|
41
|
+
DUMMY_CLIENT_SECRET;
|
|
42
|
+
const callbackURL =
|
|
43
|
+
settingService.getConfigValue<SolidCoreSetting>(
|
|
44
|
+
"FACEBOOK_CALLBACK_URL",
|
|
45
|
+
) ??
|
|
46
|
+
process.env.IAM_FACEBOOK_OAUTH_CALLBACK_URL ??
|
|
47
|
+
DUMMY_CALLBACK_URL;
|
|
48
|
+
const redirectURL =
|
|
49
|
+
settingService.getConfigValue<SolidCoreSetting>(
|
|
50
|
+
"FACEBOOK_REDIRECT_URL",
|
|
51
|
+
) ?? process.env.IAM_FACEBOOK_OAUTH_REDIRECT_URL;
|
|
25
52
|
|
|
26
53
|
super({
|
|
27
54
|
clientID,
|
|
28
55
|
clientSecret,
|
|
29
56
|
callbackURL,
|
|
30
|
-
scope: [
|
|
31
|
-
|
|
57
|
+
scope: ["email"],
|
|
58
|
+
// Facebook Graph API expects "email" and "picture", not "emails"/"photos".
|
|
59
|
+
profileFields: ["id", "name", "email", "picture.type(large)"],
|
|
32
60
|
});
|
|
33
61
|
|
|
34
|
-
const facebookOauth: FacebookAuthConfiguration = {
|
|
62
|
+
const facebookOauth: FacebookAuthConfiguration = {
|
|
63
|
+
clientID,
|
|
64
|
+
clientSecret,
|
|
65
|
+
callbackURL,
|
|
66
|
+
redirectURL,
|
|
67
|
+
};
|
|
35
68
|
if (!isFacebookOAuthConfigured(facebookOauth)) {
|
|
36
|
-
this.logger.debug(
|
|
69
|
+
this.logger.debug("Facebook OAuth strategy is not configured");
|
|
70
|
+
} else {
|
|
71
|
+
this.logger.debug(
|
|
72
|
+
`Facebook OAuth configured with callbackURL=${callbackURL}`,
|
|
73
|
+
);
|
|
37
74
|
}
|
|
38
75
|
}
|
|
39
76
|
|
|
40
|
-
async validate(
|
|
77
|
+
async validate(
|
|
78
|
+
_accessToken: string,
|
|
79
|
+
_refreshToken: string,
|
|
80
|
+
profile: any,
|
|
81
|
+
done: any,
|
|
82
|
+
): Promise<any> {
|
|
41
83
|
const { id, name, emails, photos } = profile;
|
|
42
84
|
|
|
43
|
-
// generate a unique access code.
|
|
85
|
+
// generate a unique access code.
|
|
44
86
|
const loginAccessCode: string = uuid();
|
|
45
87
|
|
|
88
|
+
const email = emails && emails.length > 0 ? emails[0].value : null;
|
|
89
|
+
|
|
90
|
+
const firstName = name?.givenName || "";
|
|
91
|
+
const lastName = name?.familyName || "";
|
|
92
|
+
const fullName =
|
|
93
|
+
firstName || lastName
|
|
94
|
+
? `${firstName} ${lastName}`.trim()
|
|
95
|
+
: profile.displayName;
|
|
96
|
+
|
|
46
97
|
const user = {
|
|
47
|
-
provider:
|
|
98
|
+
provider: "facebook",
|
|
48
99
|
providerId: id,
|
|
49
|
-
email:
|
|
100
|
+
email: email,
|
|
50
101
|
name: `${name.givenName} ${name.familyName}`,
|
|
51
102
|
picture: photos?.[0]?.value,
|
|
52
103
|
accessCode: loginAccessCode,
|
|
53
104
|
};
|
|
54
105
|
|
|
55
|
-
// store the access code and the access token in the database.
|
|
56
|
-
await this.userService.resolveUserOnOauthFacebook({
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
106
|
+
// store the access code and the access token in the database.
|
|
107
|
+
await this.userService.resolveUserOnOauthFacebook({
|
|
108
|
+
...user,
|
|
109
|
+
accessToken: _accessToken,
|
|
110
|
+
refreshToken: null,
|
|
60
111
|
});
|
|
61
112
|
|
|
62
113
|
done(null, user);
|
|
63
114
|
}
|
|
64
|
-
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
1. Do i need to create a storeStreams method for aws service too?
|
|
2
|
+
- Handle later
|
|
3
|
+
2. queues handling -> if queues is enabled by default, i.e triggerExport(exportTransactionEntity.id).
|
|
4
|
+
- startExport should either return the data or return the transaction id
|
|
5
|
+
3. How to handle scenarios wherein, nested related exist.(do i need to only get the userkey)
|
|
6
|
+
- show the userKey
|