@unchainedshop/core-users 4.0.0-rc.9 → 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.
Files changed (48) hide show
  1. package/lib/db/UsersCollection.d.ts +2 -2
  2. package/lib/db/UsersCollection.d.ts.map +1 -1
  3. package/lib/db/UsersCollection.js +30 -26
  4. package/lib/db/UsersCollection.js.map +1 -1
  5. package/lib/module/addMigrations.d.ts +3 -0
  6. package/lib/module/addMigrations.d.ts.map +1 -0
  7. package/lib/module/addMigrations.js +57 -0
  8. package/lib/module/addMigrations.js.map +1 -0
  9. package/lib/module/configureUsersModule.d.ts +32 -31
  10. package/lib/module/configureUsersModule.d.ts.map +1 -1
  11. package/lib/module/configureUsersModule.js +74 -34
  12. package/lib/module/configureUsersModule.js.map +1 -1
  13. package/lib/module/configureUsersWebAuthnModule.d.ts +5 -5
  14. package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -1
  15. package/lib/module/configureUsersWebAuthnModule.js +9 -3
  16. package/lib/module/configureUsersWebAuthnModule.js.map +1 -1
  17. package/lib/module/pbkdf2.d.ts.map +1 -1
  18. package/lib/module/pbkdf2.js +9 -2
  19. package/lib/module/pbkdf2.js.map +1 -1
  20. package/lib/services/getUserCountryService.d.ts +3 -0
  21. package/lib/services/getUserCountryService.d.ts.map +1 -0
  22. package/lib/services/getUserCountryService.js +7 -0
  23. package/lib/services/getUserCountryService.js.map +1 -0
  24. package/lib/services/getUserLanguageService.d.ts +3 -0
  25. package/lib/services/getUserLanguageService.d.ts.map +1 -0
  26. package/lib/services/getUserLanguageService.js +7 -0
  27. package/lib/services/getUserLanguageService.js.map +1 -0
  28. package/lib/services/updateUserAvatarAfterUploadService.d.ts +3 -0
  29. package/lib/services/updateUserAvatarAfterUploadService.d.ts.map +1 -0
  30. package/lib/services/updateUserAvatarAfterUploadService.js +24 -0
  31. package/lib/services/updateUserAvatarAfterUploadService.js.map +1 -0
  32. package/lib/services/userServices.d.ts +3 -0
  33. package/lib/services/userServices.d.ts.map +1 -0
  34. package/lib/services/userServices.js +9 -0
  35. package/lib/services/userServices.js.map +1 -0
  36. package/lib/users-settings.d.ts +1 -14
  37. package/lib/users-settings.d.ts.map +1 -1
  38. package/lib/users-settings.js +24 -24
  39. package/lib/users-settings.js.map +1 -1
  40. package/package.json +8 -8
  41. package/src/db/UsersCollection.ts +33 -29
  42. package/src/module/buildFindSelector.test.ts +5 -2
  43. package/src/module/configureUsersModule.ts +114 -78
  44. package/src/module/configureUsersWebAuthnModule.ts +8 -8
  45. package/src/module/pbkdf2.ts +9 -2
  46. package/src/module/removeConfidentialServiceHashes.test.ts +1 -2
  47. package/src/users-settings.ts +31 -45
  48. 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?: number;
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?: string;
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,CAAC,EAAE,MAAM,CAAC;IACxB,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,CAAC,EAAE,MAAM,CAAC;IACb,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,sCAqGnD,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;QAED,CAAC,6BAA6B,EAAE,IAAI;YAClC,KAAK,EAAE;gBACL,GAAG,EAAE,MAAM;gBACX,QAAQ,EAAE,MAAM;gBAChB,gBAAgB,EAAE,MAAM;gBACxB,qBAAqB,EAAE,MAAM;gBAC7B,8BAA8B,EAAE,MAAM;gBACtC,6BAA6B,EAAE,MAAM;gBACrC,4BAA4B,EAAE,MAAM;gBACpC,gCAAgC,EAAE,MAAM;gBACxC,iCAAiC,EAAE,MAAM;aACnC;YACR,OAAO,EAAE;gBACP,OAAO,EAAE;oBACP,GAAG,EAAE,CAAC;oBACN,gBAAgB,EAAE,CAAC;oBACnB,qBAAqB,EAAE,CAAC;oBACxB,8BAA8B,EAAE,CAAC;oBACjC,6BAA6B,EAAE,CAAC;oBAChC,4BAA4B,EAAE,CAAC;oBAC/B,gCAAgC,EAAE,CAAC;oBACnC,iCAAiC,EAAE,CAAC;iBACrC;gBACD,IAAI,EAAE,sBAAsB;aAC7B;SACF;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
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,3 @@
1
+ import { Migration, MigrationRepository } from '@unchainedshop/types/core.js';
2
+ export default function addMigrations(repository: MigrationRepository<Migration>): void;
3
+ //# sourceMappingURL=addMigrations.d.ts.map
@@ -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":"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"}
@@ -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: ({ db, options }: ModuleInput<UserSettingsOptions>) => Promise<{
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?: string, extensionOptions?: any) => Promise<Omit<import("fido2-lib").PublicKeyCredentialRequestOptions, "challenge" | "requestId"> & {
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<number>;
75
- setUsername(userId: string, username: string): Promise<void>;
76
- setPassword(userId: string, plainPassword: string): Promise<User>;
77
- resetPassword(token: string, newPassword: string): Promise<User>;
78
- updateAvatar: (_id: string, fileId: string) => Promise<User>;
79
- updateGuest: (user: User, guest: boolean) => Promise<void>;
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":"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"}
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 '@node-rs/bcrypt';
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 = { $in: [false, null] };
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 ({ db, options }) => {
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({ db, options });
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: null }, { limit: 1 });
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 updateResult = await Users.updateOne(selector, {
337
+ const user = await Users.findOneAndUpdate(selector, {
334
338
  $addToSet: { roles: { $each: roles } },
335
- });
336
- const user = await Users.findOne(selector, {});
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 updateResult.modifiedCount;
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.updateOne({ _id: userId }, {
351
+ const user = await Users.findOneAndUpdate({ _id: userId }, {
347
352
  $set: {
348
353
  username: username.trim(),
349
354
  },
350
- });
351
- const user = await Users.findOne({ _id: userId }, {});
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 modifier = { $set: { guest } };
414
- await Users.updateOne(generateDbFilterById(user._id), modifier);
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
- ...user,
431
+ ...updatedUser,
418
432
  guest,
419
433
  }),
420
434
  });
435
+ return updatedUser;
421
436
  },
422
437
  updateHeartbeat: async (userId, lastLogin) => {
423
- const modifier = {
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
- lastContact: null,
456
- lastLogin: null,
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
- await emit('USER_UPDATE_BILLING_ADDRESS', {
521
- user: removeConfidentialServiceHashes(updatedUser),
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 modifier = {
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