@unchainedshop/core-users 3.0.0-alpha7 → 3.0.0-rc2

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 (64) hide show
  1. package/lib/db/UsersCollection.d.ts +54 -2
  2. package/lib/db/UsersCollection.d.ts.map +1 -1
  3. package/lib/db/UsersCollection.js.map +1 -1
  4. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.d.ts +6 -1
  5. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.d.ts.map +1 -1
  6. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.js.map +1 -1
  7. package/lib/module/configureUsersModule.d.ts +22 -70
  8. package/lib/module/configureUsersModule.d.ts.map +1 -1
  9. package/lib/module/configureUsersModule.js +59 -54
  10. package/lib/module/configureUsersModule.js.map +1 -1
  11. package/lib/module/configureUsersModule_BACKUP_57123.d.ts +73 -0
  12. package/lib/module/configureUsersModule_BACKUP_57123.d.ts.map +1 -0
  13. package/lib/module/configureUsersModule_BACKUP_57123.js +567 -0
  14. package/lib/module/configureUsersModule_BACKUP_57123.js.map +1 -0
  15. package/lib/module/configureUsersModule_BASE_57123.d.ts +131 -0
  16. package/lib/module/configureUsersModule_BASE_57123.d.ts.map +1 -0
  17. package/lib/module/configureUsersModule_BASE_57123.js +563 -0
  18. package/lib/module/configureUsersModule_BASE_57123.js.map +1 -0
  19. package/lib/module/configureUsersModule_LOCAL_57123.d.ts +131 -0
  20. package/lib/module/configureUsersModule_LOCAL_57123.d.ts.map +1 -0
  21. package/lib/module/configureUsersModule_LOCAL_57123.js +564 -0
  22. package/lib/module/configureUsersModule_LOCAL_57123.js.map +1 -0
  23. package/lib/module/configureUsersModule_REMOTE_57123.d.ts +74 -0
  24. package/lib/module/configureUsersModule_REMOTE_57123.d.ts.map +1 -0
  25. package/lib/module/configureUsersModule_REMOTE_57123.js +567 -0
  26. package/lib/module/configureUsersModule_REMOTE_57123.js.map +1 -0
  27. package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -1
  28. package/lib/module/configureUsersWebAuthnModule.js.map +1 -1
  29. package/lib/types.d.ts +5 -2
  30. package/lib/types.d.ts.map +1 -1
  31. package/lib/users-index.d.ts +3 -2
  32. package/lib/users-index.d.ts.map +1 -1
  33. package/lib/users-index.js +3 -2
  34. package/lib/users-index.js.map +1 -1
  35. package/lib/users-settings.d.ts +1 -1
  36. package/lib/users-settings.d.ts.map +1 -1
  37. package/lib/users-settings.js.map +1 -1
  38. package/package.json +14 -17
  39. package/src/db/UsersCollection.ts +59 -2
  40. package/src/db/WebAuthnCredentialsCreationRequestsCollection.ts +7 -1
  41. package/src/module/configureUsersModule.ts +100 -75
  42. package/src/module/configureUsersWebAuthnModule.ts +0 -1
  43. package/src/module/removeConfidentialServiceHashes.test.ts +1 -1
  44. package/src/users-index.ts +3 -2
  45. package/src/users-settings.ts +1 -2
  46. package/tests/mock/user-mock.ts +2 -3
  47. package/tsconfig.json +5 -7
  48. package/lib/services/migrateUserDataService.d.ts +0 -4
  49. package/lib/services/migrateUserDataService.d.ts.map +0 -1
  50. package/lib/services/migrateUserDataService.js +0 -18
  51. package/lib/services/migrateUserDataService.js.map +0 -1
  52. package/lib/services/updateUserAvatarAfterUploadService.d.ts +0 -15
  53. package/lib/services/updateUserAvatarAfterUploadService.d.ts.map +0 -1
  54. package/lib/services/updateUserAvatarAfterUploadService.js +0 -24
  55. package/lib/services/updateUserAvatarAfterUploadService.js.map +0 -1
  56. package/lib/services/userServices.d.ts +0 -8
  57. package/lib/services/userServices.d.ts.map +0 -1
  58. package/lib/services/userServices.js +0 -7
  59. package/lib/services/userServices.js.map +0 -1
  60. package/src/module/sha256.ts +0 -5
  61. package/src/services/migrateUserDataService.ts +0 -37
  62. package/src/services/updateUserAvatarAfterUploadService.ts +0 -42
  63. package/src/services/userServices.ts +0 -15
  64. package/src/types.ts +0 -101
package/lib/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { TimestampFields, Address, Contact, mongodb } from '@unchainedshop/mongodb';
1
+ import { TimestampFields, Address, Contact, mongodb } from '@unchainedshop/mongodb';
2
+ import { DateFilterInput } from '@unchainedshop/utils';
2
3
  export interface PushSubscription {
3
4
  _id: string;
4
5
  userAgent: string;
@@ -47,7 +48,7 @@ export interface PushSubscriptionObject {
47
48
  };
48
49
  }
49
50
  export type User = {
50
- _id?: string;
51
+ _id: string;
51
52
  deleted?: Date;
52
53
  avatarId?: string;
53
54
  emails: Array<Email>;
@@ -67,6 +68,8 @@ export type User = {
67
68
  export type UserQuery = mongodb.Filter<User> & {
68
69
  includeGuests?: boolean;
69
70
  queryString?: string;
71
+ emailVerified?: boolean;
72
+ lastLogin?: DateFilterInput;
70
73
  };
71
74
  export interface WebAuthnCredentialsCreationRequest {
72
75
  challenge: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- export * from './types.js';
1
+ export * from './db/UsersCollection.js';
2
+ export * from './db/WebAuthnCredentialsCreationRequestsCollection.js';
2
3
  export * from './module/configureUsersModule.js';
3
- export * from './services/userServices.js';
4
+ export * from './module/configureUsersWebAuthnModule.js';
4
5
  export * from './users-settings.js';
5
6
  //# sourceMappingURL=users-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"users-index.d.ts","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"users-index.d.ts","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qBAAqB,CAAC"}
@@ -1,5 +1,6 @@
1
- export * from './types.js';
1
+ export * from './db/UsersCollection.js';
2
+ export * from './db/WebAuthnCredentialsCreationRequestsCollection.js';
2
3
  export * from './module/configureUsersModule.js';
3
- export * from './services/userServices.js';
4
+ export * from './module/configureUsersWebAuthnModule.js';
4
5
  export * from './users-settings.js';
5
6
  //# sourceMappingURL=users-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"users-index.js","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"users-index.js","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qBAAqB,CAAC"}
@@ -1,5 +1,5 @@
1
- import { User } from './types.js';
2
1
  import { mongodb } from '@unchainedshop/mongodb';
2
+ import { User } from './db/UsersCollection.js';
3
3
  export interface UserSettingsOptions {
4
4
  mergeUserCartsOnLogin?: boolean;
5
5
  autoMessagingAfterUserCreation?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"users-settings.d.ts","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AACD,MAAM,WAAW,YAAY;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,8BAA8B,EAAE,OAAO,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC3E;AAED,eAAO,MAAM,YAAY,EAAE,YAwD1B,CAAC"}
1
+ {"version":3,"file":"users-settings.d.ts","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AACD,MAAM,WAAW,YAAY;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,8BAA8B,EAAE,OAAO,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC3E;AAED,eAAO,MAAM,YAAY,EAAE,YAwD1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"users-settings.js","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,8BAA8B,EAAE,IAAI;IACpC,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,IAAI;IAEtB,iBAAiB,EAAE,CACjB,EACE,qBAAqB,EACrB,8BAA8B,EAC9B,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACI,EACtB,EAAc,EACd,EAAE;QACF,MAAM,qCAAqC,GAAG,IAAI,CAAC;QACnD,MAAM,4BAA4B,GAAG,IAAI,CAAC;QAE1C,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1C,MAAM,kBAAkB,GAAG,MAAM,EAAE;iBAChC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,IAAI,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;YAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,QAAQ,EAAE,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,MAAM,qBAAqB,GAAG,MAAM,EAAE;iBACnC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnF,IAAI,qBAAqB;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,sBAAsB,GAAG,KAAK,EAAE,IAAU,EAAE,EAAE;YAClD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACzD,OAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,YAAY,CAAC,qBAAqB,GAAG,qBAAqB,IAAI,4BAA4B,CAAC;QAC3F,YAAY,CAAC,8BAA8B;YACzC,8BAA8B,IAAI,qCAAqC,CAAC;QAC1E,YAAY,CAAC,aAAa,GAAG,aAAa,IAAI,oBAAoB,CAAC;QACnE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;QAC5E,YAAY,CAAC,eAAe,GAAG,eAAe,IAAI,sBAAsB,CAAC;QACzE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;IAC9E,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"users-settings.js","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,8BAA8B,EAAE,IAAI;IACpC,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,IAAI;IAEtB,iBAAiB,EAAE,CACjB,EACE,qBAAqB,EACrB,8BAA8B,EAC9B,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACI,EACtB,EAAc,EACd,EAAE;QACF,MAAM,qCAAqC,GAAG,IAAI,CAAC;QACnD,MAAM,4BAA4B,GAAG,IAAI,CAAC;QAE1C,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1C,MAAM,kBAAkB,GAAG,MAAM,EAAE;iBAChC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,IAAI,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;YAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,QAAQ,EAAE,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,MAAM,qBAAqB,GAAG,MAAM,EAAE;iBACnC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnF,IAAI,qBAAqB;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,sBAAsB,GAAG,KAAK,EAAE,IAAU,EAAE,EAAE;YAClD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACzD,OAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,YAAY,CAAC,qBAAqB,GAAG,qBAAqB,IAAI,4BAA4B,CAAC;QAC3F,YAAY,CAAC,8BAA8B;YACzC,8BAA8B,IAAI,qCAAqC,CAAC;QAC1E,YAAY,CAAC,aAAa,GAAG,aAAa,IAAI,oBAAoB,CAAC;QACnE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;QAC5E,YAAY,CAAC,eAAe,GAAG,eAAe,IAAI,sBAAsB,CAAC;QACzE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;IAC9E,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,16 +1,13 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-users",
3
- "version": "3.0.0-alpha7",
3
+ "version": "3.0.0-rc2",
4
4
  "main": "lib/users-index.js",
5
- "exports": {
6
- ".": "./lib/users-index.js",
7
- "./*": "./lib/*"
8
- },
9
5
  "types": "lib/users-index.d.ts",
10
6
  "type": "module",
11
7
  "scripts": {
12
- "clean": "rm -rf lib",
13
- "prepublishOnly": "npm run clean && tsc",
8
+ "clean": "tsc -b --clean",
9
+ "build": "tsc -b",
10
+ "prepublishOnly": "npm run clean && npm run build",
14
11
  "watch": "tsc -w",
15
12
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
16
13
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
@@ -31,19 +28,19 @@
31
28
  },
32
29
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
30
  "dependencies": {
34
- "@unchainedshop/events": "^3.0.0-alpha4",
35
- "@unchainedshop/file-upload": "^3.0.0-alpha4",
36
- "@unchainedshop/logger": "^3.0.0-alpha4",
37
- "@unchainedshop/roles": "^3.0.0-alpha4",
38
- "@unchainedshop/utils": "^3.0.0-alpha4",
39
- "bcryptjs": "^2.4.3",
40
- "fido2-lib": "^3.5.3",
41
- "uuid": "^10.0.0"
31
+ "@node-rs/bcrypt": "^1.10.7",
32
+ "@unchainedshop/events": "^3.0.0-rc2",
33
+ "@unchainedshop/file-upload": "^3.0.0-rc2",
34
+ "@unchainedshop/logger": "^3.0.0-rc2",
35
+ "@unchainedshop/mongodb": "^3.0.0-rc2",
36
+ "@unchainedshop/roles": "^3.0.0-rc2",
37
+ "@unchainedshop/utils": "^3.0.0-rc2",
38
+ "fido2-lib": "^3.5.3"
42
39
  },
43
40
  "devDependencies": {
44
- "@types/node": "^22.8.1",
41
+ "@types/node": "^22.10.2",
45
42
  "jest": "^29.7.0",
46
43
  "ts-jest": "^29.2.5",
47
- "typescript": "^5.6.3"
44
+ "typescript": "^5.7.2"
48
45
  }
49
46
  }
@@ -1,5 +1,62 @@
1
- import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
- import { User } from '../types.js';
1
+ import { TimestampFields, Address, Contact, mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
+ import { DateFilterInput } from '@unchainedshop/utils';
3
+
4
+ export interface UserProfile {
5
+ displayName?: string;
6
+ birthday?: Date;
7
+ phoneMobile?: string;
8
+ gender?: string;
9
+ address?: Address;
10
+ }
11
+ export interface UserLastLogin {
12
+ timestamp?: Date;
13
+ locale?: string;
14
+ countryCode?: string;
15
+ remoteAddress?: string;
16
+ remotePort?: string;
17
+ userAgent?: string;
18
+ }
19
+
20
+ export interface PushSubscriptionObject {
21
+ userAgent: string;
22
+ endpoint: string;
23
+ expirationTime?: number;
24
+ keys: {
25
+ auth: string;
26
+ p256dh: string;
27
+ };
28
+ }
29
+
30
+ export interface Email {
31
+ address: string;
32
+ verified: boolean;
33
+ }
34
+
35
+ export type User = {
36
+ _id: string;
37
+ deleted?: Date;
38
+ avatarId?: string;
39
+ emails: Array<Email>;
40
+ guest: boolean;
41
+ initialPassword: boolean;
42
+ lastBillingAddress?: Address;
43
+ lastContact?: Contact;
44
+ lastLogin?: UserLastLogin;
45
+ profile?: UserProfile;
46
+ roles: Array<string>;
47
+ services: any;
48
+ tags?: Array<string>;
49
+ pushSubscriptions: Array<PushSubscriptionObject>;
50
+ username?: string;
51
+ meta?: any;
52
+ } & TimestampFields;
53
+
54
+ export type UserQuery = mongodb.Filter<User> & {
55
+ includeGuests?: boolean;
56
+ queryString?: string;
57
+ emailVerified?: boolean;
58
+ lastLogin?: DateFilterInput;
59
+ };
3
60
 
4
61
  export const UsersCollection = async (db: mongodb.Db) => {
5
62
  const Users = db.collection<User>('users');
@@ -1,6 +1,12 @@
1
- import { WebAuthnCredentialsCreationRequest } from '../types.js';
2
1
  import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
3
2
 
3
+ export interface WebAuthnCredentialsCreationRequest {
4
+ challenge: string;
5
+ username: string;
6
+ origin: string;
7
+ factor: 'first' | 'second' | 'either';
8
+ }
9
+
4
10
  type Collection = WebAuthnCredentialsCreationRequest & { _id: number };
5
11
 
6
12
  export const WebAuthnCredentialsCreationRequestsCollection = async (db: mongodb.Db) => {
@@ -1,25 +1,39 @@
1
- import bcrypt from 'bcryptjs';
2
- import { ModuleInput } from '@unchainedshop/mongodb';
3
- import { User, UserQuery, Email, UserLastLogin, UserProfile, UserData } from '../types.js';
4
- import { emit, registerEvents } from '@unchainedshop/events';
1
+ import bcrypt from '@node-rs/bcrypt';
5
2
  import {
3
+ ModuleInput,
4
+ Address,
5
+ Contact,
6
6
  generateDbFilterById,
7
7
  buildSortOptions,
8
8
  mongodb,
9
9
  generateDbObjectId,
10
10
  } from '@unchainedshop/mongodb';
11
- import { systemLocale } from '@unchainedshop/utils';
12
- import { FileDirector } from '@unchainedshop/file-upload';
13
- import { SortDirection, SortOption } from '@unchainedshop/utils';
14
- import { UsersCollection } from '../db/UsersCollection.js';
11
+ import {
12
+ User,
13
+ UserQuery,
14
+ Email,
15
+ UserLastLogin,
16
+ UserProfile,
17
+ UsersCollection,
18
+ } from '../db/UsersCollection.js';
19
+ import { emit, registerEvents } from '@unchainedshop/events';
20
+ import { systemLocale, SortDirection, SortOption, sha256 } from '@unchainedshop/utils';
15
21
  import addMigrations from './addMigrations.js';
16
22
  import { userSettings, UserSettingsOptions } from '../users-settings.js';
17
23
  import { configureUsersWebAuthnModule, UsersWebAuthnModule } from './configureUsersWebAuthnModule.js';
18
24
  import * as pbkdf2 from './pbkdf2.js';
19
- import * as sha256 from './sha256.js';
20
- import type { Address, Contact } from '@unchainedshop/mongodb';
21
- import { UserServices } from '../services/userServices.js';
22
- import { FileServices, FilesModule } from '@unchainedshop/core-files';
25
+
26
+ export interface UserData {
27
+ email?: string;
28
+ guest?: boolean;
29
+ initialPassword?: boolean;
30
+ lastBillingAddress?: User['lastBillingAddress'];
31
+ password: string | null;
32
+ webAuthnPublicKeyCredentials?: any;
33
+ profile?: UserProfile;
34
+ roles?: Array<string>;
35
+ username?: string;
36
+ }
23
37
 
24
38
  export type UsersModule = {
25
39
  // Submodules
@@ -76,7 +90,8 @@ export type UsersModule = {
76
90
  _id: string,
77
91
  { profile, meta }: { profile?: UserProfile; meta?: any },
78
92
  ) => Promise<User>;
79
- delete: (userId: string) => Promise<User>;
93
+ markDeleted: (userId: string) => Promise<User>;
94
+ deletePermanently: (params: { userId: string }) => Promise<User>;
80
95
  updateRoles: (_id: string, roles: Array<string>) => Promise<User>;
81
96
  updateTags: (_id: string, tags: Array<string>) => Promise<User>;
82
97
  updateUser: (
@@ -93,6 +108,9 @@ export type UsersModule = {
93
108
  },
94
109
  ) => Promise<void>;
95
110
  removePushSubscription: (userId: string, p256dh: string) => Promise<void>;
111
+ hashPassword(password: string): Promise<{
112
+ pbkdf2: string;
113
+ }>;
96
114
  };
97
115
 
98
116
  const USER_EVENTS = [
@@ -118,36 +136,44 @@ export const removeConfidentialServiceHashes = (rawUser: User): User => {
118
136
  return user;
119
137
  };
120
138
 
121
- export const buildFindSelector = ({ includeGuests, queryString, ...rest }: UserQuery) => {
139
+ export const buildFindSelector = ({
140
+ includeGuests,
141
+ queryString,
142
+ emailVerified,
143
+ lastLogin,
144
+ ...rest
145
+ }: UserQuery) => {
122
146
  const selector: mongodb.Filter<User> = { ...rest, deleted: null };
123
147
  if (!includeGuests) selector.guest = { $in: [false, null] };
148
+ if (emailVerified === true) {
149
+ selector['emails.verified'] = true;
150
+ }
151
+ if (emailVerified === false) {
152
+ // We need to use $ne here else we'd also find users with many emails where one is
153
+ // unverified
154
+ selector['emails.verified'] = { $ne: true };
155
+ }
156
+ if (lastLogin?.start) {
157
+ selector['lastLogin.timestamp'] = { $exists: true };
158
+ }
159
+ if (lastLogin?.end) {
160
+ selector['lastLogin.timestamp'].$lte = new Date(lastLogin.end);
161
+ }
162
+ if (lastLogin?.start) {
163
+ selector['lastLogin.timestamp'].$gte = new Date(lastLogin.start);
164
+ }
124
165
  if (queryString) {
125
166
  (selector as any).$text = { $search: queryString };
126
167
  }
127
168
  return selector;
128
169
  };
129
170
 
130
- FileDirector.registerFileUploadCallback<{
131
- services: {
132
- users: UserServices;
133
- files: FileServices;
134
- };
135
- modules: {
136
- users: UsersModule;
137
- files: FilesModule;
138
- };
139
- }>('user-avatars', async (file, context) => {
140
- const { services } = context;
141
- return services.users.updateUserAvatarAfterUpload({ file }, context);
142
- });
143
-
144
171
  export const configureUsersModule = async ({
145
172
  db,
146
173
  options,
147
174
  migrationRepository,
148
- }: ModuleInput<UserSettingsOptions>) => {
175
+ }: ModuleInput<UserSettingsOptions>): Promise<UsersModule> => {
149
176
  userSettings.configureSettings(options || {}, db);
150
-
151
177
  registerEvents(USER_EVENTS);
152
178
  const Users = await UsersCollection(db);
153
179
 
@@ -185,13 +211,13 @@ export const configureUsersModule = async ({
185
211
  when: Date;
186
212
  }> {
187
213
  if (!plainToken) return null;
188
- const token = await sha256.hash(plainToken);
214
+ const token = await sha256(plainToken);
189
215
  const user = await Users.findOne(
190
216
  {
191
217
  'services.email.verificationTokens': {
192
218
  $elemMatch: {
193
219
  token,
194
- when: { $gt: new Date().getTime() },
220
+ when: { $gt: new Date(new Date().getTime() - 1000 * 60 * 60) },
195
221
  },
196
222
  },
197
223
  },
@@ -231,13 +257,13 @@ export const configureUsersModule = async ({
231
257
  },
232
258
 
233
259
  async findUserByResetToken(plainToken: string): Promise<User> {
234
- const token = await sha256.hash(plainToken);
260
+ const token = await sha256(plainToken);
235
261
  const user = await Users.findOne(
236
262
  {
237
263
  'services.password.reset': {
238
264
  $elemMatch: {
239
265
  token,
240
- when: { $gt: new Date().getTime() },
266
+ when: { $gt: new Date(new Date().getTime() - 1000 * 60 * 60) },
241
267
  },
242
268
  },
243
269
  },
@@ -247,7 +273,7 @@ export const configureUsersModule = async ({
247
273
  },
248
274
 
249
275
  async findUserByToken(plainToken?: string): Promise<User> {
250
- const token = await sha256.hash(plainToken);
276
+ const token = await sha256(plainToken);
251
277
 
252
278
  if (token) {
253
279
  return Users.findOne({
@@ -276,7 +302,7 @@ export const configureUsersModule = async ({
276
302
  offset?: number;
277
303
  }): Promise<Array<User>> {
278
304
  const defaultSort = [{ key: 'created', value: SortDirection.ASC }] as SortOption[];
279
- const selector = buildFindSelector(query);
305
+ const selector = buildFindSelector({ ...query });
280
306
 
281
307
  if (query.queryString) {
282
308
  return Users.find(selector, {
@@ -295,9 +321,7 @@ export const configureUsersModule = async ({
295
321
  },
296
322
 
297
323
  async userExists({ userId }: { userId: string }): Promise<boolean> {
298
- const selector = generateDbFilterById<User>(userId);
299
- selector.deleted = null; // skip deleted users when checked for existance!
300
- const userCount = await Users.countDocuments(selector, { limit: 1 });
324
+ const userCount = await Users.countDocuments({ _id: userId, deleted: null }, { limit: 1 });
301
325
  return userCount === 1;
302
326
  },
303
327
 
@@ -410,7 +434,7 @@ export const configureUsersModule = async ({
410
434
  plainPassword: string,
411
435
  ): Promise<boolean> {
412
436
  if (bcryptHash) {
413
- const password = await sha256.hash(plainPassword);
437
+ const password = await sha256(plainPassword);
414
438
  return bcrypt.compare(password, bcryptHash);
415
439
  }
416
440
  if (pbkdf2SaltAndHash) {
@@ -451,9 +475,9 @@ export const configureUsersModule = async ({
451
475
  async sendResetPasswordEmail(userId: string, email: string, isEnrollment?: boolean): Promise<void> {
452
476
  const plainToken = crypto.randomUUID();
453
477
  const resetToken = {
454
- token: await sha256.hash(plainToken),
478
+ token: await sha256(plainToken),
455
479
  address: email,
456
- when: new Date().getTime() + 1000 * 60 * 60, // 1 hour
480
+ when: new Date(),
457
481
  };
458
482
 
459
483
  await Users.updateOne(
@@ -476,9 +500,9 @@ export const configureUsersModule = async ({
476
500
  async sendVerificationEmail(userId: string, email: string): Promise<void> {
477
501
  const plainToken = crypto.randomUUID();
478
502
  const verificationToken = {
479
- token: await sha256.hash(plainToken),
503
+ token: await sha256(plainToken),
480
504
  address: email,
481
- when: new Date().getTime() + 1000 * 60 * 60, // 1 hour
505
+ when: new Date(),
482
506
  };
483
507
 
484
508
  await Users.updateOne(
@@ -602,42 +626,38 @@ export const configureUsersModule = async ({
602
626
  return user;
603
627
  },
604
628
 
605
- delete: async (userId: string): Promise<User> => {
606
- const userFilter = generateDbFilterById(userId);
607
-
608
- const existingUser = await Users.findOne(userFilter, {
609
- projection: { emails: true, username: true },
610
- });
611
- if (!existingUser) return null;
612
-
613
- const uuid = crypto.randomUUID();
614
- const obfuscatedEmails = existingUser.emails?.flatMap(({ address, verified }) => {
615
- if (!verified) return [];
616
- return [
617
- {
618
- address: `${address}@${uuid}.unchained.local`,
619
- verified: true,
629
+ markDeleted: async (userId: string): Promise<User> => {
630
+ const user = await Users.findOneAndUpdate(
631
+ { _id: userId },
632
+ {
633
+ $set: {
634
+ username: `deleted-${Date.now()}`,
635
+ deleted: new Date(),
636
+ emails: [],
637
+ roles: [],
638
+ profile: null,
639
+ lastBillingAddress: null,
640
+ services: {},
641
+ pushSubscriptions: [],
642
+ avatarId: null,
643
+ initialPassword: false,
644
+ lastContact: null,
645
+ lastLogin: null,
620
646
  },
621
- ];
622
- });
623
-
624
- const obfuscatedUsername = existingUser.username ? `${existingUser.username}-${uuid}` : null;
625
-
626
- Users.updateOne(userFilter, {
627
- $set: {
628
- emails: obfuscatedEmails,
629
- username: obfuscatedUsername,
630
- services: {},
631
647
  },
632
- });
648
+ { returnDocument: 'after' },
649
+ );
633
650
 
634
- const user = await Users.findOneAndDelete(userFilter);
635
651
  await emit('USER_REMOVE', {
636
- user: removeConfidentialServiceHashes(user),
652
+ user,
637
653
  });
638
654
  return user;
639
655
  },
640
656
 
657
+ deletePermanently: async ({ userId }: { userId: string }): Promise<User> => {
658
+ return Users.findOneAndDelete({ _id: userId });
659
+ },
660
+
641
661
  updateProfile: async (
642
662
  userId: string,
643
663
  updatedData: { profile?: UserProfile; meta?: any },
@@ -680,6 +700,8 @@ export const configureUsersModule = async ({
680
700
  const userFilter = generateDbFilterById(_id);
681
701
  const user = await Users.findOne(userFilter, {});
682
702
 
703
+ if (!lastBillingAddress) return user;
704
+
683
705
  const modifier = {
684
706
  $set: {
685
707
  lastBillingAddress,
@@ -702,9 +724,12 @@ export const configureUsersModule = async ({
702
724
  returnDocument: 'after',
703
725
  });
704
726
 
705
- await emit('USER_UPDATE_BILLING_ADDRESS', {
706
- user: removeConfidentialServiceHashes(user),
707
- });
727
+ if (updatedUser) {
728
+ await emit('USER_UPDATE_BILLING_ADDRESS', {
729
+ user: removeConfidentialServiceHashes(updatedUser),
730
+ });
731
+ }
732
+
708
733
  return updatedUser;
709
734
  },
710
735
 
@@ -1,4 +1,3 @@
1
- /// <reference lib="dom" />
2
1
  import { ModuleInput } from '@unchainedshop/mongodb';
3
2
  import {
4
3
  Fido2Lib,
@@ -1,6 +1,6 @@
1
- import { User } from '../types.js';
2
1
  import { removeConfidentialServiceHashes } from './configureUsersModule.js';
3
2
  import user from '../../tests/mock/user-mock.js';
3
+ import { User } from '../db/UsersCollection.js';
4
4
 
5
5
  describe('removeConfidentialServiceHashes', () => {
6
6
  it('Should remove sensitive user credentials ', () => {
@@ -1,4 +1,5 @@
1
- export * from './types.js';
1
+ export * from './db/UsersCollection.js';
2
+ export * from './db/WebAuthnCredentialsCreationRequestsCollection.js';
2
3
  export * from './module/configureUsersModule.js';
3
- export * from './services/userServices.js';
4
+ export * from './module/configureUsersWebAuthnModule.js';
4
5
  export * from './users-settings.js';
@@ -1,6 +1,5 @@
1
- import { User } from './types.js';
2
1
  import { mongodb } from '@unchainedshop/mongodb';
3
-
2
+ import { User } from './db/UsersCollection.js';
4
3
  export interface UserSettingsOptions {
5
4
  mergeUserCartsOnLogin?: boolean;
6
5
  autoMessagingAfterUserCreation?: boolean;
@@ -2,7 +2,7 @@ export default {
2
2
  _id: 'PKve0k9fLCUzn2EUi',
3
3
  guest: false,
4
4
  initialPassword: false,
5
- lastBillingAddress: {},
5
+ lastBillingAddress: null,
6
6
  profile: {
7
7
  address: {
8
8
  firstName: null,
@@ -65,9 +65,8 @@ export default {
65
65
  remotePort: '42978',
66
66
  userAgent:
67
67
  'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
68
- locale: 'de_CH',
68
+ locale: 'de-CH',
69
69
  countryCode: 'CH',
70
70
  },
71
71
  updated: new Date('2022-11-30T11:02:19.624Z'),
72
- updatedBy: 'PKve0k9fLCUzn2EUi',
73
72
  };
package/tsconfig.json CHANGED
@@ -1,11 +1,9 @@
1
1
  {
2
2
  "extends": "../shared/base.tsconfig.json",
3
3
  "compilerOptions": {
4
- "rootDir": "src",
5
- "outDir": "lib",
4
+ "declarationDir": "./lib",
5
+ "rootDir": "./src",
6
+ "outDir": "./lib"
6
7
  },
7
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests"],
8
- "include": [
9
- "./src"
10
- ]
11
- }
8
+ "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
9
+ }
@@ -1,4 +0,0 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
- export type MigrateUserDataService = (userIdBeforeLogin: any, userId: any, unchainedAPI: UnchainedCore) => Promise<void>;
3
- export declare const migrateUserDataService: MigrateUserDataService;
4
- //# sourceMappingURL=migrateUserDataService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrateUserDataService.d.ts","sourceRoot":"","sources":["../../src/services/migrateUserDataService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,MAAM,sBAAsB,GAAG,CACnC,iBAAiB,KAAA,EACjB,MAAM,KAAA,EACN,YAAY,EAAE,aAAa,KACxB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,eAAO,MAAM,sBAAsB,EAAE,sBA2BpC,CAAC"}
@@ -1,18 +0,0 @@
1
- import { userSettings } from '../users-settings.js';
2
- export const migrateUserDataService = async (userIdBeforeLogin, userId, unchainedAPI) => {
3
- const user = await unchainedAPI.modules.users.findUserById(userId);
4
- const userBeforeLogin = await unchainedAPI.modules.users.findUserById(userIdBeforeLogin);
5
- await unchainedAPI.services.orders.migrateOrderCarts({
6
- fromUserId: userIdBeforeLogin,
7
- toUserId: userId,
8
- shouldMerge: userSettings.mergeUserCartsOnLogin,
9
- countryContext: userBeforeLogin.lastLogin?.countryCode || user.lastLogin?.countryCode,
10
- }, unchainedAPI);
11
- await unchainedAPI.services.bookmarks.migrateBookmarks({
12
- fromUserId: userIdBeforeLogin,
13
- toUserId: userId,
14
- shouldMerge: userSettings.mergeUserCartsOnLogin,
15
- countryContext: userBeforeLogin.lastLogin?.countryCode || user.lastLogin?.countryCode,
16
- }, unchainedAPI);
17
- };
18
- //# sourceMappingURL=migrateUserDataService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrateUserDataService.js","sourceRoot":"","sources":["../../src/services/migrateUserDataService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQpD,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EACjE,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,EAAE;IACF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAEzF,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAClD;QACE,UAAU,EAAE,iBAAiB;QAC7B,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,YAAY,CAAC,qBAAqB;QAC/C,cAAc,EAAE,eAAe,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW;KACtF,EACD,YAAY,CACb,CAAC;IAEF,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CACpD;QACE,UAAU,EAAE,iBAAiB;QAC7B,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,YAAY,CAAC,qBAAqB;QAC/C,cAAc,EAAE,eAAe,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW;KACtF,EACD,YAAY,CACb,CAAC;AACJ,CAAC,CAAC"}