@unchainedshop/core-users 3.0.0-alpha7 → 3.0.0-rc.11

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 (63) 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/addMigrations.d.ts.map +1 -1
  8. package/lib/module/addMigrations.js +32 -41
  9. package/lib/module/addMigrations.js.map +1 -1
  10. package/lib/module/configureUsersModule.d.ts +49 -70
  11. package/lib/module/configureUsersModule.d.ts.map +1 -1
  12. package/lib/module/configureUsersModule.js +105 -71
  13. package/lib/module/configureUsersModule.js.map +1 -1
  14. package/lib/module/configureUsersWebAuthnModule.d.ts +21 -8
  15. package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -1
  16. package/lib/module/configureUsersWebAuthnModule.js +32 -11
  17. package/lib/module/configureUsersWebAuthnModule.js.map +1 -1
  18. package/lib/module/pbkdf2.js +1 -1
  19. package/lib/module/pbkdf2.js.map +1 -1
  20. package/lib/users-index.d.ts +3 -2
  21. package/lib/users-index.d.ts.map +1 -1
  22. package/lib/users-index.js +3 -2
  23. package/lib/users-index.js.map +1 -1
  24. package/lib/users-settings.d.ts +1 -1
  25. package/lib/users-settings.d.ts.map +1 -1
  26. package/lib/users-settings.js.map +1 -1
  27. package/package.json +26 -18
  28. package/src/db/UsersCollection.ts +59 -2
  29. package/src/db/WebAuthnCredentialsCreationRequestsCollection.ts +7 -1
  30. package/src/module/addMigrations.ts +40 -53
  31. package/src/module/configureUsersModule.ts +152 -169
  32. package/src/module/configureUsersWebAuthnModule.ts +47 -44
  33. package/src/module/pbkdf2.ts +1 -1
  34. package/src/module/removeConfidentialServiceHashes.test.ts +1 -1
  35. package/src/users-index.ts +3 -2
  36. package/src/users-settings.ts +1 -2
  37. package/tests/mock/user-mock.ts +2 -3
  38. package/tsconfig.json +5 -7
  39. package/lib/module/sha256.d.ts +0 -2
  40. package/lib/module/sha256.d.ts.map +0 -1
  41. package/lib/module/sha256.js +0 -6
  42. package/lib/module/sha256.js.map +0 -1
  43. package/lib/services/migrateUserDataService.d.ts +0 -4
  44. package/lib/services/migrateUserDataService.d.ts.map +0 -1
  45. package/lib/services/migrateUserDataService.js +0 -18
  46. package/lib/services/migrateUserDataService.js.map +0 -1
  47. package/lib/services/updateUserAvatarAfterUploadService.d.ts +0 -15
  48. package/lib/services/updateUserAvatarAfterUploadService.d.ts.map +0 -1
  49. package/lib/services/updateUserAvatarAfterUploadService.js +0 -24
  50. package/lib/services/updateUserAvatarAfterUploadService.js.map +0 -1
  51. package/lib/services/userServices.d.ts +0 -8
  52. package/lib/services/userServices.d.ts.map +0 -1
  53. package/lib/services/userServices.js +0 -7
  54. package/lib/services/userServices.js.map +0 -1
  55. package/lib/types.d.ts +0 -88
  56. package/lib/types.d.ts.map +0 -1
  57. package/lib/types.js +0 -2
  58. package/lib/types.js.map +0 -1
  59. package/src/module/sha256.ts +0 -5
  60. package/src/services/migrateUserDataService.ts +0 -37
  61. package/src/services/updateUserAvatarAfterUploadService.ts +0 -42
  62. package/src/services/userServices.ts +0 -15
  63. package/src/types.ts +0 -101
@@ -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-rc.11",
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"
@@ -24,26 +21,37 @@
24
21
  "ecommerce",
25
22
  "core"
26
23
  ],
27
- "author": "Joël Meiller",
24
+ "authors": [
25
+ "Joël Meiller",
26
+ "Pascal Kaufmann"
27
+ ],
28
28
  "license": "EUPL-1.2",
29
29
  "bugs": {
30
30
  "url": "https://github.com/unchainedshop/unchained/issues"
31
31
  },
32
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
33
  "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"
34
+ "@node-rs/bcrypt": "^1.10.7",
35
+ "@unchainedshop/events": "^3.0.0-rc.11",
36
+ "@unchainedshop/file-upload": "^3.0.0-rc.11",
37
+ "@unchainedshop/logger": "^3.0.0-rc.11",
38
+ "@unchainedshop/mongodb": "^3.0.0-rc.11",
39
+ "@unchainedshop/roles": "^3.0.0-rc.11",
40
+ "@unchainedshop/utils": "^3.0.0-rc.11"
41
+ },
42
+ "peerDependencies": {
43
+ "fido2-lib": ">= 3.5 < 4"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "fido2-lib": {
47
+ "optional": true
48
+ }
42
49
  },
43
50
  "devDependencies": {
44
- "@types/node": "^22.8.1",
51
+ "@types/node": "^22.10.2",
52
+ "fido2-lib": "^3.5.3",
45
53
  "jest": "^29.7.0",
46
54
  "ts-jest": "^29.2.5",
47
- "typescript": "^5.6.3"
55
+ "typescript": "^5.7.2"
48
56
  }
49
57
  }
@@ -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,60 +1,8 @@
1
1
  import { MigrationRepository } from '@unchainedshop/mongodb';
2
2
  import { UsersCollection } from '../db/UsersCollection.js';
3
-
4
- const convertTagsToLowerCase = async (collection: Awaited<ReturnType<typeof UsersCollection>>) => {
5
- let bulk = collection.initializeUnorderedBulkOp();
6
- let count = 0;
7
-
8
- const cursor = await collection.find({ tags: { $regex: '.*[A-Z]' } });
9
- // eslint-disable-next-line no-restricted-syntax
10
- for await (const doc of cursor) {
11
- const transformedTags = doc.tags.map((tag) => tag.toLowerCase());
12
- count += 1;
13
- bulk.find({ _id: doc._id }).updateOne({ $set: { tags: transformedTags } });
14
- if (count % 500 === 0) {
15
- bulk.execute();
16
- bulk = collection.initializeUnorderedBulkOp();
17
- count = 0;
18
- }
19
- }
20
- if (count > 0) bulk.execute();
21
- };
3
+ import { systemLocale } from '@unchainedshop/utils';
22
4
 
23
5
  export default function addMigrations(repository: MigrationRepository) {
24
- repository?.register({
25
- id: 20220603115000,
26
- name: 'Copy user.profile.customFields to user.meta',
27
- up: async () => {
28
- const Users = await UsersCollection(repository.db);
29
- const users = await Users.find(
30
- { meta: { $exists: false }, 'profile.customFields': { $exists: true } },
31
- { projection: { _id: true, profile: true, meta: true } },
32
- ).toArray();
33
-
34
- await Promise.all(
35
- users.map(async (user) => {
36
- await Users.updateOne(
37
- {
38
- _id: user._id,
39
- },
40
- {
41
- $set: { meta: (user.profile as any).customFields },
42
- },
43
- );
44
- }),
45
- );
46
- },
47
- });
48
-
49
- repository?.register({
50
- id: 20220920122500,
51
- name: 'Convert user tags to lower case for easy search',
52
- up: async () => {
53
- const Users = await UsersCollection(repository.db);
54
- await convertTagsToLowerCase(Users);
55
- },
56
- });
57
-
58
6
  repository?.register({
59
7
  id: 20230719105000,
60
8
  name: 'Rename user.lastLogin.countryContext to user.lastLogin.countryCode',
@@ -70,4 +18,43 @@ export default function addMigrations(repository: MigrationRepository) {
70
18
  );
71
19
  },
72
20
  });
21
+
22
+ repository?.register({
23
+ id: 20241218092300,
24
+ name: 'Convert user.lastLogin.locale',
25
+ up: async () => {
26
+ const Users = await UsersCollection(repository.db);
27
+
28
+ const users = await Users.find(
29
+ {
30
+ 'lastLogin.locale': { $exists: true },
31
+ },
32
+ { projection: { _id: true, lastLogin: true } },
33
+ ).toArray();
34
+
35
+ for (const user of users) {
36
+ let newLocale;
37
+ try {
38
+ newLocale = new Intl.Locale(user.lastLogin.locale).baseName;
39
+ } catch {
40
+ /* */
41
+ try {
42
+ newLocale = new Intl.Locale(user.lastLogin.locale.split('_').join('-')).baseName;
43
+ } catch {
44
+ /* */
45
+ newLocale = systemLocale.baseName;
46
+ }
47
+ }
48
+
49
+ await Users.updateOne(
50
+ {
51
+ _id: user._id,
52
+ },
53
+ {
54
+ $set: { 'lastLogin.locale': newLocale },
55
+ },
56
+ );
57
+ }
58
+ },
59
+ });
73
60
  }