@unchainedshop/core-users 4.0.0-rc.8 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/db/UsersCollection.d.ts +2 -2
- package/lib/db/UsersCollection.d.ts.map +1 -1
- package/lib/db/UsersCollection.js +30 -26
- package/lib/db/UsersCollection.js.map +1 -1
- package/lib/module/addMigrations.d.ts +3 -0
- package/lib/module/addMigrations.d.ts.map +1 -0
- package/lib/module/addMigrations.js +57 -0
- package/lib/module/addMigrations.js.map +1 -0
- package/lib/module/configureUsersModule.d.ts +32 -31
- package/lib/module/configureUsersModule.d.ts.map +1 -1
- package/lib/module/configureUsersModule.js +74 -34
- package/lib/module/configureUsersModule.js.map +1 -1
- package/lib/module/configureUsersWebAuthnModule.d.ts +5 -5
- package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -1
- package/lib/module/configureUsersWebAuthnModule.js +9 -3
- package/lib/module/configureUsersWebAuthnModule.js.map +1 -1
- package/lib/module/pbkdf2.d.ts.map +1 -1
- package/lib/module/pbkdf2.js +9 -2
- package/lib/module/pbkdf2.js.map +1 -1
- package/lib/services/getUserCountryService.d.ts +3 -0
- package/lib/services/getUserCountryService.d.ts.map +1 -0
- package/lib/services/getUserCountryService.js +7 -0
- package/lib/services/getUserCountryService.js.map +1 -0
- package/lib/services/getUserLanguageService.d.ts +3 -0
- package/lib/services/getUserLanguageService.d.ts.map +1 -0
- package/lib/services/getUserLanguageService.js +7 -0
- package/lib/services/getUserLanguageService.js.map +1 -0
- package/lib/services/updateUserAvatarAfterUploadService.d.ts +3 -0
- package/lib/services/updateUserAvatarAfterUploadService.d.ts.map +1 -0
- package/lib/services/updateUserAvatarAfterUploadService.js +24 -0
- package/lib/services/updateUserAvatarAfterUploadService.js.map +1 -0
- package/lib/services/userServices.d.ts +3 -0
- package/lib/services/userServices.d.ts.map +1 -0
- package/lib/services/userServices.js +9 -0
- package/lib/services/userServices.js.map +1 -0
- package/lib/users-settings.d.ts +1 -14
- package/lib/users-settings.d.ts.map +1 -1
- package/lib/users-settings.js +24 -24
- package/lib/users-settings.js.map +1 -1
- package/package.json +8 -8
- package/src/db/UsersCollection.ts +33 -29
- package/src/module/buildFindSelector.test.ts +5 -2
- package/src/module/configureUsersModule.ts +114 -78
- package/src/module/configureUsersWebAuthnModule.ts +8 -8
- package/src/module/pbkdf2.ts +9 -2
- package/src/module/removeConfidentialServiceHashes.test.ts +1 -2
- package/src/users-settings.ts +31 -45
- package/tsconfig.json +2 -1
|
@@ -18,7 +18,7 @@ export interface UserLastLogin {
|
|
|
18
18
|
export interface PushSubscriptionObject {
|
|
19
19
|
userAgent: string;
|
|
20
20
|
endpoint: string;
|
|
21
|
-
expirationTime
|
|
21
|
+
expirationTime: number;
|
|
22
22
|
keys: {
|
|
23
23
|
auth: string;
|
|
24
24
|
p256dh: string;
|
|
@@ -29,7 +29,7 @@ export interface Email {
|
|
|
29
29
|
verified: boolean;
|
|
30
30
|
}
|
|
31
31
|
export type User = {
|
|
32
|
-
_id
|
|
32
|
+
_id: string;
|
|
33
33
|
deleted?: Date;
|
|
34
34
|
avatarId?: string;
|
|
35
35
|
emails: Email[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersCollection.d.ts","sourceRoot":"","sources":["../../src/db/UsersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,OAAO,EACP,OAAO,EACP,OAAO,EAGR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AACD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,
|
|
1
|
+
{"version":3,"file":"UsersCollection.d.ts","sourceRoot":"","sources":["../../src/db/UsersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,OAAO,EACP,OAAO,EACP,OAAO,EAGR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AACD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,GAAG,eAAe,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,IAAI,OAAO,CAAC,EAAE,sCAyGnD,CAAC"}
|
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { buildDbIndexes, isDocumentDBCompatModeEnabled, } from '@unchainedshop/mongodb';
|
|
2
2
|
export const UsersCollection = async (db) => {
|
|
3
3
|
const Users = db.collection('users');
|
|
4
|
+
if (!isDocumentDBCompatModeEnabled()) {
|
|
5
|
+
await buildDbIndexes(Users, [
|
|
6
|
+
{
|
|
7
|
+
index: {
|
|
8
|
+
_id: 'text',
|
|
9
|
+
username: 'text',
|
|
10
|
+
'emails.address': 'text',
|
|
11
|
+
'profile.displayName': 'text',
|
|
12
|
+
'lastBillingAddress.firstName': 'text',
|
|
13
|
+
'lastBillingAddress.lastName': 'text',
|
|
14
|
+
'lastBillingAddress.company': 'text',
|
|
15
|
+
'lastBillingAddress.addressLine': 'text',
|
|
16
|
+
'lastBillingAddress.addressLine2': 'text',
|
|
17
|
+
},
|
|
18
|
+
options: {
|
|
19
|
+
weights: {
|
|
20
|
+
_id: 9,
|
|
21
|
+
'emails.address': 7,
|
|
22
|
+
'profile.displayName': 5,
|
|
23
|
+
'lastBillingAddress.firstName': 3,
|
|
24
|
+
'lastBillingAddress.lastName': 3,
|
|
25
|
+
'lastBillingAddress.company': 1,
|
|
26
|
+
'lastBillingAddress.addressLine': 1,
|
|
27
|
+
'lastBillingAddress.addressLine2': 1,
|
|
28
|
+
},
|
|
29
|
+
name: 'user_fulltext_search',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
4
34
|
await buildDbIndexes(Users, [
|
|
5
35
|
{
|
|
6
36
|
index: {
|
|
@@ -66,32 +96,6 @@ export const UsersCollection = async (db) => {
|
|
|
66
96
|
sparse: true,
|
|
67
97
|
},
|
|
68
98
|
},
|
|
69
|
-
!isDocumentDBCompatModeEnabled() && {
|
|
70
|
-
index: {
|
|
71
|
-
_id: 'text',
|
|
72
|
-
username: 'text',
|
|
73
|
-
'emails.address': 'text',
|
|
74
|
-
'profile.displayName': 'text',
|
|
75
|
-
'lastBillingAddress.firstName': 'text',
|
|
76
|
-
'lastBillingAddress.lastName': 'text',
|
|
77
|
-
'lastBillingAddress.company': 'text',
|
|
78
|
-
'lastBillingAddress.addressLine': 'text',
|
|
79
|
-
'lastBillingAddress.addressLine2': 'text',
|
|
80
|
-
},
|
|
81
|
-
options: {
|
|
82
|
-
weights: {
|
|
83
|
-
_id: 9,
|
|
84
|
-
'emails.address': 7,
|
|
85
|
-
'profile.displayName': 5,
|
|
86
|
-
'lastBillingAddress.firstName': 3,
|
|
87
|
-
'lastBillingAddress.lastName': 3,
|
|
88
|
-
'lastBillingAddress.company': 1,
|
|
89
|
-
'lastBillingAddress.addressLine': 1,
|
|
90
|
-
'lastBillingAddress.addressLine2': 1,
|
|
91
|
-
},
|
|
92
|
-
name: 'user_fulltext_search',
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
99
|
]);
|
|
96
100
|
return Users;
|
|
97
101
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersCollection.js","sourceRoot":"","sources":["../../src/db/UsersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,cAAc,EACd,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AA6DhC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAO,OAAO,CAAC,CAAC;IAE3C,MAAM,cAAc,CAAO,KAAK,EAAE;QAChC;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC;aACT;YACD,OAAO,EAAE,EAAE;SACZ;QACD;YACE,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC;aACT;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QACD;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;aACX;YACD,OAAO,EAAE,EAAE;SACZ;QACD;YACE,KAAK,EAAE;gBACL,QAAQ,EAAE,CAAC;aACZ;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;aACb;SACF;QACD;YACE,KAAK,EAAE;gBACL,gBAAgB,EAAE,CAAC;aACb;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,yCAAyC,EAAE,CAAC;aACtC;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,+BAA+B,EAAE,CAAC;aAC5B;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,uBAAuB,EAAE,CAAC;aAC3B;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;
|
|
1
|
+
{"version":3,"file":"UsersCollection.js","sourceRoot":"","sources":["../../src/db/UsersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,cAAc,EACd,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AA6DhC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAO,OAAO,CAAC,CAAC;IAE3C,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,MAAM,cAAc,CAAO,KAAK,EAAE;YAChC;gBACE,KAAK,EAAE;oBACL,GAAG,EAAE,MAAM;oBACX,QAAQ,EAAE,MAAM;oBAChB,gBAAgB,EAAE,MAAM;oBACxB,qBAAqB,EAAE,MAAM;oBAC7B,8BAA8B,EAAE,MAAM;oBACtC,6BAA6B,EAAE,MAAM;oBACrC,4BAA4B,EAAE,MAAM;oBACpC,gCAAgC,EAAE,MAAM;oBACxC,iCAAiC,EAAE,MAAM;iBACnC;gBACR,OAAO,EAAE;oBACP,OAAO,EAAE;wBACP,GAAG,EAAE,CAAC;wBACN,gBAAgB,EAAE,CAAC;wBACnB,qBAAqB,EAAE,CAAC;wBACxB,8BAA8B,EAAE,CAAC;wBACjC,6BAA6B,EAAE,CAAC;wBAChC,4BAA4B,EAAE,CAAC;wBAC/B,gCAAgC,EAAE,CAAC;wBACnC,iCAAiC,EAAE,CAAC;qBACrC;oBACD,IAAI,EAAE,sBAAsB;iBAC7B;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,CAAO,KAAK,EAAE;QAChC;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC;aACT;YACD,OAAO,EAAE,EAAE;SACZ;QACD;YACE,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC;aACT;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QACD;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;aACX;YACD,OAAO,EAAE,EAAE;SACZ;QACD;YACE,KAAK,EAAE;gBACL,QAAQ,EAAE,CAAC;aACZ;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;aACb;SACF;QACD;YACE,KAAK,EAAE;gBACL,gBAAgB,EAAE,CAAC;aACb;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,yCAAyC,EAAE,CAAC;aACtC;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,+BAA+B,EAAE,CAAC;aAC5B;YACR,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;QAED;YACE,KAAK,EAAE;gBACL,uBAAuB,EAAE,CAAC;aAC3B;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addMigrations.d.ts","sourceRoot":"","sources":["../../src/module/addMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAsB9E,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC,QAkD/E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { UsersCollection } from '../db/UsersCollection.js';
|
|
2
|
+
const convertTagsToLowerCase = async (collection) => {
|
|
3
|
+
let bulk = collection.initializeUnorderedBulkOp();
|
|
4
|
+
let count = 0;
|
|
5
|
+
const cursor = await collection.find({ tags: { $regex: '.*[A-Z]' } });
|
|
6
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
7
|
+
for await (const doc of cursor) {
|
|
8
|
+
const transformedTags = doc.tags.map((tag) => tag.toLowerCase());
|
|
9
|
+
count += 1;
|
|
10
|
+
bulk.find({ _id: doc._id }).updateOne({ $set: { tags: transformedTags } });
|
|
11
|
+
if (count % 500 === 0) {
|
|
12
|
+
bulk.execute();
|
|
13
|
+
bulk = collection.initializeUnorderedBulkOp();
|
|
14
|
+
count = 0;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (count > 0)
|
|
18
|
+
bulk.execute();
|
|
19
|
+
};
|
|
20
|
+
export default function addMigrations(repository) {
|
|
21
|
+
repository?.register({
|
|
22
|
+
id: 20220603115000,
|
|
23
|
+
name: 'Copy user.profile.customFields to user.meta',
|
|
24
|
+
up: async () => {
|
|
25
|
+
const Users = await UsersCollection(repository.db);
|
|
26
|
+
const users = await Users.find({ meta: { $exists: false }, 'profile.customFields': { $exists: true } }, { projection: { _id: true, profile: true, meta: true } }).toArray();
|
|
27
|
+
await Promise.all(users.map(async (user) => {
|
|
28
|
+
await Users.updateOne({
|
|
29
|
+
_id: user._id,
|
|
30
|
+
}, {
|
|
31
|
+
$set: { meta: user.profile.customFields },
|
|
32
|
+
});
|
|
33
|
+
}));
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
repository?.register({
|
|
37
|
+
id: 20220920122500,
|
|
38
|
+
name: 'Convert user tags to lower case for easy search',
|
|
39
|
+
up: async () => {
|
|
40
|
+
const Users = await UsersCollection(repository.db);
|
|
41
|
+
await convertTagsToLowerCase(Users);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
repository?.register({
|
|
45
|
+
id: 20230719105000,
|
|
46
|
+
name: 'Rename user.lastLogin.countryContext to user.lastLogin.countryCode',
|
|
47
|
+
up: async () => {
|
|
48
|
+
const Users = await UsersCollection(repository.db);
|
|
49
|
+
await Users.updateMany({
|
|
50
|
+
'lastLogin.countryContext': { $exists: true },
|
|
51
|
+
}, {
|
|
52
|
+
$rename: { 'lastLogin.countryContext': 'lastLogin.countryCode' },
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=addMigrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addMigrations.js","sourceRoot":"","sources":["../../src/module/addMigrations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,sBAAsB,GAAG,KAAK,EAAE,UAAuD,EAAE,EAAE;IAC/F,IAAI,IAAI,GAAG,UAAU,CAAC,yBAAyB,EAAE,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACtE,gDAAgD;IAChD,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACjE,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,KAAK,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,GAAG,UAAU,CAAC,yBAAyB,EAAE,CAAC;YAC9C,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAG,CAAC;QAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,UAA0C;IAC9E,UAAU,EAAE,QAAQ,CAAC;QACnB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,6CAA6C;QACnD,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAC5B,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,sBAAsB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EACvE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CACzD,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,KAAK,CAAC,SAAS,CACnB;oBACE,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd,EACD;oBACE,IAAI,EAAE,EAAE,IAAI,EAAG,IAAI,CAAC,OAAe,CAAC,YAAY,EAAE;iBACnD,CACF,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,UAAU,EAAE,QAAQ,CAAC;QACnB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,iDAAiD;QACvD,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;KACF,CAAC,CAAC;IAEH,UAAU,EAAE,QAAQ,CAAC;QACnB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,oEAAoE;QAC1E,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC,UAAU,CACpB;gBACE,0BAA0B,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAC9C,EACD;gBACE,OAAO,EAAE,EAAE,0BAA0B,EAAE,uBAAuB,EAAE;aACjE,CACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,49 +3,49 @@ import { User, UserQuery, Email, UserLastLogin, UserProfile } from '../db/UsersC
|
|
|
3
3
|
import { SortOption } from '@unchainedshop/utils';
|
|
4
4
|
import { UserRegistrationData, UserSettingsOptions } from '../users-settings.js';
|
|
5
5
|
export declare const removeConfidentialServiceHashes: (rawUser: User) => User;
|
|
6
|
-
export declare const buildFindSelector: ({ includeGuests, includeDeleted, queryString, emailVerified, lastLogin, ...rest }: UserQuery) => mongodb.Filter<User>;
|
|
7
|
-
export declare const configureUsersModule: (
|
|
6
|
+
export declare const buildFindSelector: ({ includeGuests, includeDeleted, queryString, emailVerified, lastLogin, tags, ...rest }: UserQuery) => mongodb.Filter<User>;
|
|
7
|
+
export declare const configureUsersModule: (moduleInput: ModuleInput<UserSettingsOptions>) => Promise<{
|
|
8
8
|
webAuthn: {
|
|
9
9
|
findMDSMetadataForAAGUID: (aaguid: string) => Promise<any>;
|
|
10
|
-
createCredentialCreationOptions: (origin: string, username: string, extensionOptions?: any) => Promise<Omit<import("fido2-lib").PublicKeyCredentialCreationOptions, "challenge" | "requestId"> & {
|
|
10
|
+
createCredentialCreationOptions: (origin: string, username: string, extensionOptions?: any) => Promise<(Omit<import("fido2-lib").PublicKeyCredentialCreationOptions, "challenge" | "requestId"> & {
|
|
11
11
|
challenge: string;
|
|
12
12
|
requestId: number;
|
|
13
|
-
}>;
|
|
14
|
-
createCredentialRequestOptions: (origin: string, username
|
|
13
|
+
}) | null>;
|
|
14
|
+
createCredentialRequestOptions: (origin: string, username: string, extensionOptions?: any) => Promise<(Omit<import("fido2-lib").PublicKeyCredentialRequestOptions, "challenge" | "requestId"> & {
|
|
15
15
|
challenge: string;
|
|
16
16
|
requestId: number;
|
|
17
|
-
}>;
|
|
17
|
+
}) | null>;
|
|
18
18
|
verifyCredentialCreation: (username: string, credentials: any) => Promise<{
|
|
19
19
|
publicKey: any;
|
|
20
20
|
counter: any;
|
|
21
21
|
id: any;
|
|
22
22
|
aaguid: string;
|
|
23
23
|
created: Date;
|
|
24
|
-
}>;
|
|
24
|
+
} | null>;
|
|
25
25
|
verifyCredentialRequest: (userPublicKeys: any[], username: string, credentials: any) => Promise<{
|
|
26
26
|
userHandle: any;
|
|
27
|
-
}>;
|
|
27
|
+
} | null>;
|
|
28
28
|
deleteUserWebAuthnCredentials: (username: string) => Promise<number>;
|
|
29
29
|
};
|
|
30
30
|
count(query: UserQuery): Promise<number>;
|
|
31
|
-
findUserById(userId: string): Promise<User>;
|
|
32
|
-
findUserByUsername(username: string): Promise<User>;
|
|
33
|
-
findUserByEmail(email: string): Promise<User>;
|
|
31
|
+
findUserById(userId: string): Promise<mongodb.WithId<User> | null>;
|
|
32
|
+
findUserByUsername(username: string): Promise<mongodb.WithId<User> | null>;
|
|
33
|
+
findUserByEmail(email: string): Promise<mongodb.WithId<User> | null>;
|
|
34
34
|
findUnverifiedEmailToken(plainToken: string): Promise<{
|
|
35
35
|
userId: string;
|
|
36
36
|
address: string;
|
|
37
37
|
when: Date;
|
|
38
|
-
}>;
|
|
38
|
+
} | null>;
|
|
39
39
|
verifyEmail(userId: string, address: string): Promise<void>;
|
|
40
40
|
findResetToken(plainToken: string): Promise<{
|
|
41
41
|
userId: string;
|
|
42
42
|
address: string;
|
|
43
43
|
when: Date;
|
|
44
|
-
}>;
|
|
45
|
-
findUserByToken(plainToken: string): Promise<User>;
|
|
44
|
+
} | null>;
|
|
45
|
+
findUserByToken(plainToken: string): Promise<mongodb.WithId<User> | null>;
|
|
46
46
|
findUser(query: UserQuery & {
|
|
47
47
|
sort?: SortOption[];
|
|
48
|
-
}, findOptions?: mongodb.FindOptions): Promise<User>;
|
|
48
|
+
}, findOptions?: mongodb.FindOptions): Promise<User | null>;
|
|
49
49
|
findUsers({ limit, offset, ...query }: UserQuery & {
|
|
50
50
|
sort?: SortOption[];
|
|
51
51
|
limit?: number;
|
|
@@ -55,7 +55,7 @@ export declare const configureUsersModule: ({ db, options }: ModuleInput<UserSet
|
|
|
55
55
|
userId: string;
|
|
56
56
|
}): Promise<boolean>;
|
|
57
57
|
primaryEmail(user: User): Email;
|
|
58
|
-
userLocale(user: User): Intl.Locale;
|
|
58
|
+
userLocale(user: User | null): Intl.Locale;
|
|
59
59
|
createUser(rawUserData: UserRegistrationData, { skipMessaging, skipPasswordEnrollment, }?: {
|
|
60
60
|
skipMessaging?: boolean;
|
|
61
61
|
skipPasswordEnrollment?: boolean;
|
|
@@ -71,31 +71,32 @@ export declare const configureUsersModule: ({ db, options }: ModuleInput<UserSet
|
|
|
71
71
|
removeEmail(userId: string, address: string): Promise<void>;
|
|
72
72
|
sendResetPasswordEmail(userId: string, email: string, isEnrollment?: boolean): Promise<void>;
|
|
73
73
|
sendVerificationEmail(userId: string, email: string): Promise<void>;
|
|
74
|
-
addRoles: (userId: string, roles: string[]) => Promise<
|
|
75
|
-
setUsername(userId: string, username: string): Promise<
|
|
76
|
-
setPassword(userId: string, plainPassword: string): Promise<User>;
|
|
77
|
-
resetPassword(token: string, newPassword: string): Promise<
|
|
78
|
-
updateAvatar: (_id: string, fileId: string) => Promise<User>;
|
|
79
|
-
updateGuest: (user: User, guest: boolean) => Promise<
|
|
80
|
-
updateHeartbeat: (userId: string, lastLogin: UserLastLogin) => Promise<User>;
|
|
81
|
-
markDeleted: (userId: string) => Promise<User>;
|
|
74
|
+
addRoles: (userId: string, roles: string[]) => Promise<mongodb.WithId<User> | null>;
|
|
75
|
+
setUsername(userId: string, username: string): Promise<mongodb.WithId<User> | null>;
|
|
76
|
+
setPassword(userId: string, plainPassword: string): Promise<mongodb.WithId<User> | null>;
|
|
77
|
+
resetPassword(token: string, newPassword: string): Promise<any>;
|
|
78
|
+
updateAvatar: (_id: string, fileId: string) => Promise<mongodb.WithId<User> | null>;
|
|
79
|
+
updateGuest: (user: User, guest: boolean) => Promise<mongodb.WithId<User> | null>;
|
|
80
|
+
updateHeartbeat: (userId: string, lastLogin: UserLastLogin) => Promise<mongodb.WithId<User> | null>;
|
|
81
|
+
markDeleted: (userId: string) => Promise<mongodb.WithId<User> | null>;
|
|
82
82
|
deletePermanently: ({ userId }: {
|
|
83
83
|
userId: string;
|
|
84
|
-
}) => Promise<User>;
|
|
84
|
+
}) => Promise<mongodb.WithId<User> | null>;
|
|
85
85
|
updateProfile: (userId: string, updatedData: {
|
|
86
86
|
profile?: UserProfile;
|
|
87
87
|
meta?: any;
|
|
88
|
-
}) => Promise<User>;
|
|
89
|
-
updateLastBillingAddress: (_id: string, lastBillingAddress: Address) => Promise<User>;
|
|
90
|
-
updateLastContact: (_id: string, lastContact: Contact) => Promise<User>;
|
|
91
|
-
updateRoles: (_id: string, roles: string[]) => Promise<User>;
|
|
92
|
-
updateTags: (_id: string, tags: string[]) => Promise<User>;
|
|
93
|
-
updateUser: (selector: mongodb.Filter<User>, modifier: mongodb.UpdateFilter<User>, updateOptions?: mongodb.FindOneAndUpdateOptions) => Promise<User>;
|
|
88
|
+
}) => Promise<mongodb.WithId<User> | null>;
|
|
89
|
+
updateLastBillingAddress: (_id: string, lastBillingAddress: Address) => Promise<mongodb.WithId<User> | null>;
|
|
90
|
+
updateLastContact: (_id: string, lastContact: Contact) => Promise<mongodb.WithId<User> | null>;
|
|
91
|
+
updateRoles: (_id: string, roles: string[]) => Promise<mongodb.WithId<User> | null>;
|
|
92
|
+
updateTags: (_id: string, tags: string[]) => Promise<mongodb.WithId<User> | null>;
|
|
93
|
+
updateUser: (selector: mongodb.Filter<User>, modifier: mongodb.UpdateFilter<User>, updateOptions?: mongodb.FindOneAndUpdateOptions) => Promise<mongodb.WithId<User> | null>;
|
|
94
94
|
addPushSubscription: (userId: string, subscription: any, subscriptionOptions?: {
|
|
95
95
|
userAgent: string;
|
|
96
96
|
unsubscribeFromOtherUsers: boolean;
|
|
97
97
|
}) => Promise<void>;
|
|
98
98
|
removePushSubscription: (userId: string, p256dh: string) => Promise<void>;
|
|
99
|
+
existingTags: () => Promise<string[]>;
|
|
99
100
|
}>;
|
|
100
101
|
export type UsersModule = Awaited<ReturnType<typeof configureUsersModule>>;
|
|
101
102
|
//# sourceMappingURL=configureUsersModule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configureUsersModule.d.ts","sourceRoot":"","sources":["../../src/module/configureUsersModule.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,OAAO,EACP,OAAO,EAGP,OAAO,EAIR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,SAAS,EACT,KAAK,EACL,aAAa,EACb,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAA+B,UAAU,EAAU,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAEL,oBAAoB,EAEpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAqB9B,eAAO,MAAM,+BAA+B,GAAI,SAAS,IAAI,KAAG,IAI/D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,
|
|
1
|
+
{"version":3,"file":"configureUsersModule.d.ts","sourceRoot":"","sources":["../../src/module/configureUsersModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as bcrypt from '
|
|
1
|
+
import * as bcrypt from 'bcryptjs';
|
|
2
2
|
import { generateDbFilterById, buildSortOptions, generateDbObjectId, insensitiveTrimmedRegexOperator, assertDocumentDBCompatMode, } from '@unchainedshop/mongodb';
|
|
3
3
|
import { UsersCollection, } from '../db/UsersCollection.js';
|
|
4
4
|
import { emit, registerEvents } from '@unchainedshop/events';
|
|
@@ -24,19 +24,22 @@ const USER_EVENTS = [
|
|
|
24
24
|
'USER_REMOVE',
|
|
25
25
|
];
|
|
26
26
|
export const removeConfidentialServiceHashes = (rawUser) => {
|
|
27
|
-
const user = rawUser;
|
|
27
|
+
const user = { ...rawUser };
|
|
28
28
|
delete user?.services;
|
|
29
29
|
return user;
|
|
30
30
|
};
|
|
31
|
-
export const buildFindSelector = ({ includeGuests, includeDeleted, queryString, emailVerified, lastLogin, ...rest }) => {
|
|
31
|
+
export const buildFindSelector = ({ includeGuests, includeDeleted, queryString, emailVerified, lastLogin, tags, ...rest }) => {
|
|
32
32
|
const selector = { ...rest };
|
|
33
33
|
if (!includeDeleted)
|
|
34
34
|
selector.deleted = null;
|
|
35
35
|
if (!includeGuests)
|
|
36
|
-
selector.guest = { $
|
|
36
|
+
selector.guest = { $ne: true };
|
|
37
37
|
if (emailVerified === true) {
|
|
38
38
|
selector['emails.verified'] = true;
|
|
39
39
|
}
|
|
40
|
+
if (Array.isArray(tags) && tags?.length) {
|
|
41
|
+
selector.tags = { $in: tags };
|
|
42
|
+
}
|
|
40
43
|
if (emailVerified === false) {
|
|
41
44
|
// We need to use $ne here else we'd also find users with many emails where one is
|
|
42
45
|
// unverified
|
|
@@ -57,11 +60,12 @@ export const buildFindSelector = ({ includeGuests, includeDeleted, queryString,
|
|
|
57
60
|
}
|
|
58
61
|
return selector;
|
|
59
62
|
};
|
|
60
|
-
export const configureUsersModule = async (
|
|
63
|
+
export const configureUsersModule = async (moduleInput) => {
|
|
64
|
+
const { db, options } = moduleInput;
|
|
61
65
|
userSettings.configureSettings(options || {}, db);
|
|
62
66
|
registerEvents(USER_EVENTS);
|
|
63
67
|
const Users = await UsersCollection(db);
|
|
64
|
-
const webAuthn = await configureUsersWebAuthnModule(
|
|
68
|
+
const webAuthn = await configureUsersWebAuthnModule(moduleInput);
|
|
65
69
|
return {
|
|
66
70
|
// Queries
|
|
67
71
|
webAuthn,
|
|
@@ -175,7 +179,7 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
175
179
|
}).toArray();
|
|
176
180
|
},
|
|
177
181
|
async userExists({ userId }) {
|
|
178
|
-
const userCount = await Users.countDocuments({ _id: userId, deleted:
|
|
182
|
+
const userCount = await Users.countDocuments({ _id: userId, deleted: { $exists: false } }, { limit: 1 });
|
|
179
183
|
return userCount === 1;
|
|
180
184
|
},
|
|
181
185
|
// Transformations
|
|
@@ -248,7 +252,7 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
248
252
|
catch {
|
|
249
253
|
/* */
|
|
250
254
|
}
|
|
251
|
-
const user = await Users.findOne({ _id: userId }, {});
|
|
255
|
+
const user = (await Users.findOne({ _id: userId }, {}));
|
|
252
256
|
await emit('USER_CREATE', {
|
|
253
257
|
user: removeConfidentialServiceHashes(user),
|
|
254
258
|
});
|
|
@@ -330,28 +334,31 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
330
334
|
},
|
|
331
335
|
addRoles: async (userId, roles) => {
|
|
332
336
|
const selector = generateDbFilterById(userId);
|
|
333
|
-
const
|
|
337
|
+
const user = await Users.findOneAndUpdate(selector, {
|
|
334
338
|
$addToSet: { roles: { $each: roles } },
|
|
335
|
-
});
|
|
336
|
-
|
|
339
|
+
}, { returnDocument: 'after' });
|
|
340
|
+
if (!user)
|
|
341
|
+
return null;
|
|
337
342
|
await emit('USER_ADD_ROLES', {
|
|
338
343
|
user: removeConfidentialServiceHashes(user),
|
|
339
344
|
});
|
|
340
|
-
return
|
|
345
|
+
return user;
|
|
341
346
|
},
|
|
342
347
|
async setUsername(userId, username) {
|
|
343
348
|
if (!(await userSettings.validateUsername(username))) {
|
|
344
349
|
throw new Error(`Username ${username} is invalid`, { cause: 'USERNAME_INVALID' });
|
|
345
350
|
}
|
|
346
|
-
await Users.
|
|
351
|
+
const user = await Users.findOneAndUpdate({ _id: userId }, {
|
|
347
352
|
$set: {
|
|
348
353
|
username: username.trim(),
|
|
349
354
|
},
|
|
350
|
-
});
|
|
351
|
-
|
|
355
|
+
}, { returnDocument: 'after' });
|
|
356
|
+
if (!user)
|
|
357
|
+
return null;
|
|
352
358
|
await emit('USER_UPDATE_USERNAME', {
|
|
353
359
|
user: removeConfidentialServiceHashes(user),
|
|
354
360
|
});
|
|
361
|
+
return user;
|
|
355
362
|
},
|
|
356
363
|
async setPassword(userId, plainPassword) {
|
|
357
364
|
if (!(await userSettings.validatePassword(plainPassword))) {
|
|
@@ -364,6 +371,8 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
364
371
|
'services.password': await this.hashPassword(password || crypto.randomUUID().split('-').pop()),
|
|
365
372
|
},
|
|
366
373
|
}, { returnDocument: 'after' });
|
|
374
|
+
if (!user)
|
|
375
|
+
return null;
|
|
367
376
|
await emit('USER_UPDATE_PASSWORD', {
|
|
368
377
|
user: removeConfidentialServiceHashes(user),
|
|
369
378
|
});
|
|
@@ -404,33 +413,40 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
404
413
|
const user = await Users.findOneAndUpdate(userFilter, modifier, {
|
|
405
414
|
returnDocument: 'after',
|
|
406
415
|
});
|
|
416
|
+
if (!user)
|
|
417
|
+
return null;
|
|
407
418
|
await emit('USER_UPDATE_AVATAR', {
|
|
408
419
|
user: removeConfidentialServiceHashes(user),
|
|
409
420
|
});
|
|
410
421
|
return user;
|
|
411
422
|
},
|
|
412
423
|
updateGuest: async (user, guest) => {
|
|
413
|
-
const
|
|
414
|
-
|
|
424
|
+
const updatedUser = await Users.findOneAndUpdate(generateDbFilterById(user._id), {
|
|
425
|
+
$set: { guest },
|
|
426
|
+
}, { returnDocument: 'after' });
|
|
427
|
+
if (!updatedUser)
|
|
428
|
+
return null;
|
|
415
429
|
await emit('USER_UPDATE_GUEST', {
|
|
416
430
|
user: removeConfidentialServiceHashes({
|
|
417
|
-
...
|
|
431
|
+
...updatedUser,
|
|
418
432
|
guest,
|
|
419
433
|
}),
|
|
420
434
|
});
|
|
435
|
+
return updatedUser;
|
|
421
436
|
},
|
|
422
437
|
updateHeartbeat: async (userId, lastLogin) => {
|
|
423
|
-
const
|
|
438
|
+
const user = await Users.findOneAndUpdate(generateDbFilterById(userId), {
|
|
424
439
|
$set: {
|
|
425
440
|
lastLogin: {
|
|
426
441
|
timestamp: new Date(),
|
|
427
442
|
...lastLogin,
|
|
428
443
|
},
|
|
429
444
|
},
|
|
430
|
-
}
|
|
431
|
-
const user = await Users.findOneAndUpdate(generateDbFilterById(userId), modifier, {
|
|
445
|
+
}, {
|
|
432
446
|
returnDocument: 'after',
|
|
433
447
|
});
|
|
448
|
+
if (!user)
|
|
449
|
+
return null;
|
|
434
450
|
await emit('USER_UPDATE_HEARTBEAT', {
|
|
435
451
|
user: removeConfidentialServiceHashes(user),
|
|
436
452
|
});
|
|
@@ -446,16 +462,20 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
446
462
|
deleted: new Date(),
|
|
447
463
|
emails: [],
|
|
448
464
|
roles: [],
|
|
449
|
-
profile: null,
|
|
450
|
-
lastBillingAddress: null,
|
|
451
465
|
services: {},
|
|
452
466
|
pushSubscriptions: [],
|
|
453
|
-
avatarId: null,
|
|
454
467
|
initialPassword: false,
|
|
455
|
-
|
|
456
|
-
|
|
468
|
+
},
|
|
469
|
+
$unset: {
|
|
470
|
+
profile: 1,
|
|
471
|
+
lastBillingAddress: 1,
|
|
472
|
+
lastContact: 1,
|
|
473
|
+
lastLogin: 1,
|
|
474
|
+
avatarId: 1,
|
|
457
475
|
},
|
|
458
476
|
}, { returnDocument: 'after' });
|
|
477
|
+
if (!user)
|
|
478
|
+
return null;
|
|
459
479
|
await emit('USER_REMOVE', {
|
|
460
480
|
user,
|
|
461
481
|
});
|
|
@@ -487,6 +507,8 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
487
507
|
const user = await Users.findOneAndUpdate(userFilter, modifier, {
|
|
488
508
|
returnDocument: 'after',
|
|
489
509
|
});
|
|
510
|
+
if (!user)
|
|
511
|
+
return null;
|
|
490
512
|
await emit('USER_UPDATE_PROFILE', {
|
|
491
513
|
user: removeConfidentialServiceHashes(user),
|
|
492
514
|
});
|
|
@@ -495,6 +517,8 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
495
517
|
updateLastBillingAddress: async (_id, lastBillingAddress) => {
|
|
496
518
|
const userFilter = generateDbFilterById(_id);
|
|
497
519
|
const user = await Users.findOne(userFilter, {});
|
|
520
|
+
if (!user)
|
|
521
|
+
return null;
|
|
498
522
|
if (!lastBillingAddress)
|
|
499
523
|
return user;
|
|
500
524
|
const modifier = {
|
|
@@ -516,16 +540,18 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
516
540
|
const updatedUser = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
|
|
517
541
|
returnDocument: 'after',
|
|
518
542
|
});
|
|
519
|
-
if (updatedUser)
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
}
|
|
543
|
+
if (!updatedUser)
|
|
544
|
+
return null;
|
|
545
|
+
await emit('USER_UPDATE_BILLING_ADDRESS', {
|
|
546
|
+
user: removeConfidentialServiceHashes(updatedUser),
|
|
547
|
+
});
|
|
524
548
|
return updatedUser;
|
|
525
549
|
},
|
|
526
550
|
updateLastContact: async (_id, lastContact) => {
|
|
527
551
|
const userFilter = generateDbFilterById(_id);
|
|
528
552
|
const user = await Users.findOne(userFilter, {});
|
|
553
|
+
if (!user)
|
|
554
|
+
return null;
|
|
529
555
|
const profile = user.profile || {};
|
|
530
556
|
const isGuest = !!user.guest;
|
|
531
557
|
const modifier = {
|
|
@@ -541,6 +567,8 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
541
567
|
const updatedUser = await Users.findOneAndUpdate(userFilter, modifier, {
|
|
542
568
|
returnDocument: 'after',
|
|
543
569
|
});
|
|
570
|
+
if (!updatedUser)
|
|
571
|
+
return null;
|
|
544
572
|
await emit('USER_UPDATE_LAST_CONTACT', {
|
|
545
573
|
user: removeConfidentialServiceHashes(user),
|
|
546
574
|
});
|
|
@@ -556,21 +584,24 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
556
584
|
const user = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
|
|
557
585
|
returnDocument: 'after',
|
|
558
586
|
});
|
|
587
|
+
if (!user)
|
|
588
|
+
return null;
|
|
559
589
|
await emit('USER_UPDATE_ROLE', {
|
|
560
590
|
user: removeConfidentialServiceHashes(user),
|
|
561
591
|
});
|
|
562
592
|
return user;
|
|
563
593
|
},
|
|
564
594
|
updateTags: async (_id, tags) => {
|
|
565
|
-
const
|
|
595
|
+
const user = await Users.findOneAndUpdate(generateDbFilterById(_id), {
|
|
566
596
|
$set: {
|
|
567
597
|
updated: new Date(),
|
|
568
598
|
tags,
|
|
569
599
|
},
|
|
570
|
-
}
|
|
571
|
-
const user = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
|
|
600
|
+
}, {
|
|
572
601
|
returnDocument: 'after',
|
|
573
602
|
});
|
|
603
|
+
if (!user)
|
|
604
|
+
return null;
|
|
574
605
|
await emit('USER_UPDATE_TAGS', {
|
|
575
606
|
user: removeConfidentialServiceHashes(user),
|
|
576
607
|
});
|
|
@@ -581,6 +612,8 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
581
612
|
...updateOptions,
|
|
582
613
|
returnDocument: 'after',
|
|
583
614
|
});
|
|
615
|
+
if (!user)
|
|
616
|
+
return null;
|
|
584
617
|
await emit('USER_UPDATE', {
|
|
585
618
|
user: removeConfidentialServiceHashes(user),
|
|
586
619
|
});
|
|
@@ -610,6 +643,13 @@ export const configureUsersModule = async ({ db, options }) => {
|
|
|
610
643
|
},
|
|
611
644
|
}, {});
|
|
612
645
|
},
|
|
646
|
+
existingTags: async () => {
|
|
647
|
+
const tags = (await Users.distinct('tags', {
|
|
648
|
+
tags: { $exists: true },
|
|
649
|
+
deleted: { $exists: false },
|
|
650
|
+
}));
|
|
651
|
+
return tags.filter(Boolean).toSorted();
|
|
652
|
+
},
|
|
613
653
|
};
|
|
614
654
|
};
|
|
615
655
|
//# sourceMappingURL=configureUsersModule.js.map
|