@solidxai/core 0.1.11-beta.4 → 0.1.11-beta.6

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 (104) hide show
  1. package/dist/commands/migrate-removed-fields.command.d.ts +19 -0
  2. package/dist/commands/migrate-removed-fields.command.d.ts.map +1 -0
  3. package/dist/commands/migrate-removed-fields.command.js +77 -0
  4. package/dist/commands/migrate-removed-fields.command.js.map +1 -0
  5. package/dist/dtos/datasource-introspection-mapping.dto.d.ts +1 -0
  6. package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -1
  7. package/dist/dtos/datasource-introspection-mapping.dto.js +7 -1
  8. package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -1
  9. package/dist/helpers/command.service.d.ts +2 -0
  10. package/dist/helpers/command.service.d.ts.map +1 -1
  11. package/dist/helpers/command.service.js +6 -2
  12. package/dist/helpers/command.service.js.map +1 -1
  13. package/dist/helpers/nodemon-heartbeat.d.ts +5 -0
  14. package/dist/helpers/nodemon-heartbeat.d.ts.map +1 -0
  15. package/dist/helpers/nodemon-heartbeat.js +67 -0
  16. package/dist/helpers/nodemon-heartbeat.js.map +1 -0
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/seeders/module-metadata-seeder.service.d.ts +7 -1
  22. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  23. package/dist/seeders/module-metadata-seeder.service.js +102 -1
  24. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  25. package/dist/seeders/seed-data/solid-core-metadata.json +109 -31
  26. package/dist/services/api-key.service.d.ts.map +1 -1
  27. package/dist/services/api-key.service.js.map +1 -1
  28. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +4 -0
  29. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  30. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +18 -1
  31. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  32. package/dist/services/crud.service.d.ts +1 -0
  33. package/dist/services/crud.service.d.ts.map +1 -1
  34. package/dist/services/crud.service.js +27 -0
  35. package/dist/services/crud.service.js.map +1 -1
  36. package/dist/services/datasource-introspection.service.d.ts +1 -0
  37. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  38. package/dist/services/datasource-introspection.service.js +27 -16
  39. package/dist/services/datasource-introspection.service.js.map +1 -1
  40. package/dist/services/import-transaction.service.d.ts.map +1 -1
  41. package/dist/services/import-transaction.service.js +3 -0
  42. package/dist/services/import-transaction.service.js.map +1 -1
  43. package/dist/services/model-metadata.service.d.ts +1 -0
  44. package/dist/services/model-metadata.service.d.ts.map +1 -1
  45. package/dist/services/model-metadata.service.js +28 -0
  46. package/dist/services/model-metadata.service.js.map +1 -1
  47. package/dist/services/module-metadata.service.d.ts.map +1 -1
  48. package/dist/services/module-metadata.service.js +27 -0
  49. package/dist/services/module-metadata.service.js.map +1 -1
  50. package/dist/services/removed-field-migration.service.d.ts +30 -0
  51. package/dist/services/removed-field-migration.service.d.ts.map +1 -0
  52. package/dist/services/removed-field-migration.service.js +319 -0
  53. package/dist/services/removed-field-migration.service.js.map +1 -0
  54. package/dist/solid-core.module.d.ts.map +1 -1
  55. package/dist/solid-core.module.js +4 -0
  56. package/dist/solid-core.module.js.map +1 -1
  57. package/dist/subscribers/audit.subscriber.d.ts +4 -1
  58. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  59. package/dist/subscribers/audit.subscriber.js +54 -6
  60. package/dist/subscribers/audit.subscriber.js.map +1 -1
  61. package/dist-tests/api/authenticate.spec.js +119 -0
  62. package/dist-tests/api/authenticate.spec.js.map +1 -0
  63. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  64. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  65. package/dist-tests/api/ping.spec.js +21 -0
  66. package/dist-tests/api/ping.spec.js.map +1 -0
  67. package/dist-tests/helpers/auth.js +41 -0
  68. package/dist-tests/helpers/auth.js.map +1 -0
  69. package/dist-tests/helpers/env.js +11 -0
  70. package/dist-tests/helpers/env.js.map +1 -0
  71. package/docs/agent-hub-grooming.md +301 -0
  72. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
  73. package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
  74. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
  75. package/docs/datasource-introspection-ddl-analysis.md +326 -0
  76. package/docs/datasource-introspection-implementation-plan.md +306 -0
  77. package/docs/grouping-enhancements.md +89 -0
  78. package/docs/java-spring/README.md +3 -0
  79. package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
  80. package/docs/module-package-import-handoff.md +691 -0
  81. package/docs/seed-changes.md +65 -0
  82. package/docs/test-data-workflow.md +200 -0
  83. package/docs/type-declaration-import-issue.md +24 -0
  84. package/package.json +1 -1
  85. package/src/commands/migrate-removed-fields.command.ts +81 -0
  86. package/src/dtos/datasource-introspection-mapping.dto.ts +5 -0
  87. package/src/helpers/command.service.ts +10 -2
  88. package/src/helpers/nodemon-heartbeat.ts +59 -0
  89. package/src/index.ts +1 -0
  90. package/src/seeders/module-metadata-seeder.service.ts +119 -0
  91. package/src/seeders/seed-data/solid-core-metadata.json +109 -31
  92. package/src/services/api-key.service.ts +36 -36
  93. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +15 -1
  94. package/src/services/crud.service.ts +36 -11
  95. package/src/services/datasource-introspection.service.ts +29 -16
  96. package/src/services/import-transaction.service.ts +5 -0
  97. package/src/services/model-metadata.service.ts +45 -1
  98. package/src/services/module-metadata.service.ts +35 -0
  99. package/src/services/removed-field-migration.service.ts +334 -0
  100. package/src/solid-core.module.ts +4 -0
  101. package/src/subscribers/audit.subscriber.ts +70 -5
  102. package/.claude/settings.local.json +0 -16
  103. package/CLAUDE.md +0 -26
  104. package/src/services/1.js +0 -6
@@ -8746,12 +8746,15 @@
8746
8746
  48
8747
8747
  ],
8748
8748
  "enableGlobalSearch": true,
8749
- "create": true,
8750
- "edit": true,
8749
+ "create": false,
8750
+ "edit": false,
8751
8751
  "delete": true,
8752
+ "import": false,
8753
+ "export": false,
8752
8754
  "allowedViews": [
8753
8755
  "list",
8754
- "card"
8756
+ "card",
8757
+ "tree"
8755
8758
  ]
8756
8759
  },
8757
8760
  "children": [
@@ -9012,7 +9015,13 @@
9012
9015
  "enableGlobalSearch": true,
9013
9016
  "create": false,
9014
9017
  "edit": false,
9015
- "delete": false
9018
+ "delete": false,
9019
+ "import": false,
9020
+ "export": false,
9021
+ "allowedViews": [
9022
+ "list",
9023
+ "tree"
9024
+ ]
9016
9025
  },
9017
9026
  "children": [
9018
9027
  {
@@ -10104,15 +10113,11 @@
10104
10113
  "swimlanesCount": 5,
10105
10114
  "recordsInSwimlane": 10,
10106
10115
  "enableGlobalSearch": true,
10107
- "create": true,
10108
- "edit": true,
10109
- "delete": true,
10116
+ "create": false,
10117
+ "edit": false,
10118
+ "delete": false,
10110
10119
  "groupBy": "stage",
10111
- "draggable": false,
10112
- "allowedViews": [
10113
- "list",
10114
- "kanban"
10115
- ]
10120
+ "draggable": false
10116
10121
  },
10117
10122
  "children": [
10118
10123
  {
@@ -11938,7 +11943,11 @@
11938
11943
  "edit": false,
11939
11944
  "delete": false,
11940
11945
  "import": false,
11941
- "export": false
11946
+ "export": false,
11947
+ "allowedViews": [
11948
+ "list",
11949
+ "tree"
11950
+ ]
11942
11951
  },
11943
11952
  "children": [
11944
11953
  {
@@ -13433,7 +13442,13 @@
13433
13442
  "enableGlobalSearch": true,
13434
13443
  "create": false,
13435
13444
  "edit": true,
13436
- "delete": false
13445
+ "delete": false,
13446
+ "import": false,
13447
+ "export": false,
13448
+ "allowedViews": [
13449
+ "list",
13450
+ "tree"
13451
+ ]
13437
13452
  },
13438
13453
  "children": [
13439
13454
  {
@@ -13508,7 +13523,13 @@
13508
13523
  "enableGlobalSearch": true,
13509
13524
  "create": false,
13510
13525
  "edit": false,
13511
- "delete": false
13526
+ "delete": false,
13527
+ "import": false,
13528
+ "export": false,
13529
+ "allowedViews": [
13530
+ "list",
13531
+ "tree"
13532
+ ]
13512
13533
  },
13513
13534
  "children": [
13514
13535
  {
@@ -13592,7 +13613,13 @@
13592
13613
  "enableGlobalSearch": true,
13593
13614
  "create": false,
13594
13615
  "edit": false,
13595
- "delete": false
13616
+ "delete": false,
13617
+ "import": false,
13618
+ "export": false,
13619
+ "allowedViews": [
13620
+ "list",
13621
+ "tree"
13622
+ ]
13596
13623
  },
13597
13624
  "children": [
13598
13625
  {
@@ -13654,7 +13681,13 @@
13654
13681
  "enableGlobalSearch": true,
13655
13682
  "create": false,
13656
13683
  "edit": false,
13657
- "delete": false
13684
+ "delete": false,
13685
+ "import": false,
13686
+ "export": false,
13687
+ "allowedViews": [
13688
+ "list",
13689
+ "tree"
13690
+ ]
13658
13691
  },
13659
13692
  "children": [
13660
13693
  {
@@ -13723,7 +13756,13 @@
13723
13756
  "enableGlobalSearch": true,
13724
13757
  "create": false,
13725
13758
  "edit": false,
13726
- "delete": false
13759
+ "delete": true,
13760
+ "import": false,
13761
+ "export": false,
13762
+ "allowedViews": [
13763
+ "list",
13764
+ "tree"
13765
+ ]
13727
13766
  },
13728
13767
  "children": [
13729
13768
  {
@@ -13793,7 +13832,14 @@
13793
13832
  "enableGlobalSearch": true,
13794
13833
  "create": false,
13795
13834
  "edit": false,
13796
- "delete": false
13835
+ "delete": true,
13836
+ "import": false,
13837
+ "export": false,
13838
+ "allowedViews": [
13839
+ "list",
13840
+ "card",
13841
+ "tree"
13842
+ ]
13797
13843
  },
13798
13844
  "children": [
13799
13845
  {
@@ -13859,11 +13905,14 @@
13859
13905
  50
13860
13906
  ],
13861
13907
  "enableGlobalSearch": true,
13862
- "create": false,
13863
- "edit": false,
13864
- "delete": false,
13865
- "import": false,
13866
- "export": false
13908
+ "create": true,
13909
+ "edit": true,
13910
+ "delete": true,
13911
+ "import": true,
13912
+ "export": true,
13913
+ "allowedViews": [
13914
+ "list"
13915
+ ]
13867
13916
  },
13868
13917
  "children": [
13869
13918
  {
@@ -13898,7 +13947,11 @@
13898
13947
  "edit": false,
13899
13948
  "delete": false,
13900
13949
  "import": false,
13901
- "export": false
13950
+ "export": false,
13951
+ "allowedViews": [
13952
+ "list",
13953
+ "tree"
13954
+ ]
13902
13955
  },
13903
13956
  "children": [
13904
13957
  {
@@ -13960,7 +14013,11 @@
13960
14013
  "edit": false,
13961
14014
  "delete": false,
13962
14015
  "import": false,
13963
- "export": false
14016
+ "export": false,
14017
+ "allowedViews": [
14018
+ "list",
14019
+ "tree"
14020
+ ]
13964
14021
  },
13965
14022
  "children": [
13966
14023
  {
@@ -14029,7 +14086,11 @@
14029
14086
  "edit": true,
14030
14087
  "delete": true,
14031
14088
  "import": true,
14032
- "export": true
14089
+ "export": true,
14090
+ "allowedViews": [
14091
+ "list",
14092
+ "tree"
14093
+ ]
14033
14094
  },
14034
14095
  "children": [
14035
14096
  {
@@ -14089,7 +14150,11 @@
14089
14150
  "edit": false,
14090
14151
  "delete": false,
14091
14152
  "import": false,
14092
- "export": false
14153
+ "export": false,
14154
+ "allowedViews": [
14155
+ "list",
14156
+ "tree"
14157
+ ]
14093
14158
  },
14094
14159
  "children": [
14095
14160
  {
@@ -14149,7 +14214,11 @@
14149
14214
  "edit": false,
14150
14215
  "delete": false,
14151
14216
  "import": false,
14152
- "export": false
14217
+ "export": false,
14218
+ "allowedViews": [
14219
+ "list",
14220
+ "tree"
14221
+ ]
14153
14222
  },
14154
14223
  "children": [
14155
14224
  {
@@ -14219,7 +14288,11 @@
14219
14288
  "edit": false,
14220
14289
  "delete": false,
14221
14290
  "import": false,
14222
- "export": false
14291
+ "export": false,
14292
+ "allowedViews": [
14293
+ "list",
14294
+ "tree"
14295
+ ]
14223
14296
  },
14224
14297
  "children": [
14225
14298
  {
@@ -14288,7 +14361,12 @@
14288
14361
  "enableGlobalSearch": true,
14289
14362
  "create": true,
14290
14363
  "edit": true,
14291
- "delete": true
14364
+ "delete": true,
14365
+ "import": true,
14366
+ "export": true,
14367
+ "allowedViews": [
14368
+ "list"
14369
+ ]
14292
14370
  },
14293
14371
  "children": [
14294
14372
  {
@@ -1 +1 @@
1
- {"version":3,"file":"api-key.service.d.ts","sourceRoot":"","sources":["../../src/services/api-key.service.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,qBACa,aAAa;IAIlB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAGpC,gBAAgB,EAAE,oBAAoB,EACtC,yBAAyB,EAAE,yBAAyB,EACpD,qBAAqB,EAAE,qBAAqB,EAC5C,cAAc,EAAE,cAAc;IAG7C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAE;IA+BlG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAG,cAAc,CAAE;IAkCpD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1E,QAAQ,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;IAoC7B,OAAO,CAAC,IAAI;CAGf"}
1
+ {"version":3,"file":"api-key.service.d.ts","sourceRoot":"","sources":["../../src/services/api-key.service.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,qBACa,aAAa;IAIlB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAGpC,gBAAgB,EAAE,oBAAoB,EACtC,yBAAyB,EAAE,yBAAyB,EACpD,qBAAqB,EAAE,qBAAqB,EAC5C,cAAc,EAAE,cAAc;IAG7C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;IA+B/F,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkCjD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1E,QAAQ,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;IAoC7B,OAAO,CAAC,IAAI;CAGf"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-key.service.js","sourceRoot":"","sources":["../../src/services/api-key.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAMwB;AACxB,mCAAiD;AACjD,gEAA8D;AAG9D,yEAA8D;AAC9D,yDAAgD;AAEhD,mFAA8E;AAC9E,+EAAqF;AACrF,qEAAiE;AACjE,mEAAgE;AAGzD,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAGtB,YACqB,gBAAsC,EACtC,yBAAoD,EACpD,qBAA4C,EAC5C,cAA8B;QAH9B,qBAAgB,GAAhB,gBAAgB,CAAsB;QACtC,8BAAyB,GAAzB,yBAAyB,CAA2B;QACpD,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,mBAAc,GAAd,cAAc,CAAgB;QANlC,WAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;IAOtD,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,GAAoB;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAI,EAAE;YAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;YACrB,MAAM,EAAE,CAAC,IAAI,EAAE,4BAA4B,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAG,CAAC,IAAI,EAAE,0BAA0B,EAAE,CAAC;YACnC,MAAM,IAAI,2BAAkB,CAAC,0CAA0C,CAAC,CAAC;QAC7E,CAAC;QAEL,MAAM,MAAM,GAAG,OAAO,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS;YACT,SAAS;YACT,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;YACzD,IAAI;SACP,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAGzC,OAAO,MAAc,CAAC,SAAS,CAAC;QAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAEL,KAAK,CAAC,QAAQ,CAAC,MAAc;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAGpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpC,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACpC,CAAC,CAAC;QAEH,IAAG,CAAC,SAAS,EAAE,CAAC;YACZ,MAAM,IAAI,8BAAqB,EAAE,CAAC;QACtC,CAAC;QAEL,IAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC;QAGD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;YACtB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ;YACjC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK;YAC3B,KAAK;YACL,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC9C,CAAC;IACN,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,MAAc,EAAE,GAAoB;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO;aAC9B,kBAAkB,EAAE;aACpB,MAAM,CAAC,gCAAU,CAAC;aAClB,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aAC/B,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;aACzB,OAAO,EAAE,CAAC;IACnB,CAAC;IAGD,KAAK,CAAC,QAAQ,CAAC,MAAc;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACrD,KAAK,EAAE;gBACH,SAAS,EAAE,QAAQ;aACtB;YACD,SAAS,EAAE;gBACP,IAAI,EAAE;oBACF,KAAK,EAAE,IAAI;iBACd;aACJ;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,8BAAqB,CAAC,+BAAc,CAAC,mBAAmB,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAGrE,OAAO;YACH,IAAI,EAAE;gBACF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7C;YACD,GAAG,MAAM;SACZ,CAAA;IACL,CAAC;IAEO,IAAI,CAAC,MAAc;QACvB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;CACJ,CAAA;AApIY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAK8B,8CAAoB;QACX,uDAAyB;QAC7B,8CAAqB;QAC5B,gCAAc;GAP1C,aAAa,CAoIzB","sourcesContent":["import {\n ForbiddenException,\n Injectable,\n Logger,\n NotFoundException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport { createHash, randomBytes } from 'crypto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { CreateApiKeyDto } from 'src/dtos/create-api-key.dto';\nimport { UpdateApiKeyDto } from 'src/dtos/update-api-key.dto';\nimport { UserApiKey } from 'src/entities/user-api-key.entity';\nimport { User } from 'src/entities/user.entity';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { UserApiKeyRepository } from 'src/repository/user-api-key.repository';\nimport { PermissionMetadataService } from 'src/services/permission-metadata.service';\nimport { AuthenticationService } from './authentication.service';\nimport { UserRepository } from 'src/repository/user.repository';\n\n@Injectable()\nexport class ApiKeyService {\n private readonly logger = new Logger(ApiKeyService.name);\n\n constructor(\n private readonly apiKeyRepository: UserApiKeyRepository,\n private readonly permissionMetadataService: PermissionMetadataService,\n private readonly authenticationService: AuthenticationService,\n private readonly userRepository: UserRepository,\n ) {}\n\n async generate(userId: number, dto: CreateApiKeyDto): Promise < { apiKey: string; record: UserApiKey } > {\n const user = await this.apiKeyRepository.manager.findOne(User, {\n where: { id: userId },\n select: ['id', 'isAllowedToGenerateApiKeys'],\n });\n\n if(!user?.isAllowedToGenerateApiKeys) {\n throw new ForbiddenException('You are not allowed to generate API keys');\n }\n\n const rawKey = 'sldx_' + randomBytes(32).toString('hex');\n const hashedKey = this.hash(rawKey);\n const maskedKey = 'sldx_****' + rawKey.slice(-4);\n\n const record = this.apiKeyRepository.create({\n name: dto.name,\n hashedKey,\n maskedKey,\n isActive: true,\n expiresAt: dto.expiresAt ? new Date(dto.expiresAt) : null,\n user,\n });\n\n await this.apiKeyRepository.save(record);\n\n // Strip hashedKey from the returned record — maskedKey is all the UI needs\n delete(record as any).hashedKey;\n\n return { apiKey: rawKey, record };\n }\n\n async validate(rawKey: string): Promise < ActiveUserData > {\n const hashedKey = this.hash(rawKey);\n\n // Bypass security rules for auth validation — must find the key regardless of caller context\n const keyRecord = await this.apiKeyRepository.findOne({\n where: { hashedKey, isActive: true },\n relations: ['user', 'user.roles'],\n });\n\n if(!keyRecord) {\n throw new UnauthorizedException();\n }\n\n if(keyRecord.expiresAt && keyRecord.expiresAt < new Date()) {\n throw new UnauthorizedException('API key expired');\n }\n\n // Fire-and-forget — does not need security rule context\n this.apiKeyRepository.update(keyRecord.id, { lastUsedAt: new Date() }).catch((err) => {\n this.logger.warn(`Failed to update lastUsedAt for key ${keyRecord.id}: ${err.message}`);\n });\n\n const roles = (keyRecord.user.roles ?? []).map((r) => r.name);\n const permissions = await this.permissionMetadataService.findAllUsingRoles(roles);\n\n return {\n sub: keyRecord.user.id,\n username: keyRecord.user.username,\n email: keyRecord.user.email,\n roles,\n permissions: permissions.map((p) => p.name),\n };\n }\n\n async updateKey(id: number, userId: number, dto: UpdateApiKeyDto): Promise<void> {\n const keyRecord = await this.apiKeyRepository.findOne({\n where: { id, user: { id: userId } },\n });\n\n if (!keyRecord) {\n throw new NotFoundException('API key not found');\n }\n\n await this.apiKeyRepository.manager\n .createQueryBuilder()\n .update(UserApiKey)\n .set({ isActive: dto.isActive })\n .where('id = :id', { id })\n .execute();\n }\n\n\n async apiKeyMe(apiKey: string) {\n\n const hasedKey = this.hash(apiKey);\n const apiKeyRecord = await this.apiKeyRepository.findOne({\n where: {\n hashedKey: hasedKey,\n },\n relations: {\n user: {\n roles: true\n }\n }\n });\n\n if (!apiKeyRecord) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n const user = apiKeyRecord.user;\n\n const tokens = await this.authenticationService.generateTokens(user);\n\n\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private hash(rawKey: string): string {\n return createHash('sha256').update(rawKey).digest('hex');\n }\n}\n"]}
1
+ {"version":3,"file":"api-key.service.js","sourceRoot":"","sources":["../../src/services/api-key.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAMwB;AACxB,mCAAiD;AACjD,gEAA8D;AAG9D,yEAA8D;AAC9D,yDAAgD;AAEhD,mFAA8E;AAC9E,+EAAqF;AACrF,qEAAiE;AACjE,mEAAgE;AAGzD,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAGtB,YACqB,gBAAsC,EACtC,yBAAoD,EACpD,qBAA4C,EAC5C,cAA8B;QAH9B,qBAAgB,GAAhB,gBAAgB,CAAsB;QACtC,8BAAyB,GAAzB,yBAAyB,CAA2B;QACpD,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,mBAAc,GAAd,cAAc,CAAgB;QANlC,WAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;IAOrD,CAAC;IAEL,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,GAAoB;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAI,EAAE;YAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;YACrB,MAAM,EAAE,CAAC,IAAI,EAAE,4BAA4B,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAAE,CAAC;YACpC,MAAM,IAAI,2BAAkB,CAAC,0CAA0C,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS;YACT,SAAS;YACT,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;YACzD,IAAI;SACP,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAGzC,OAAQ,MAAc,CAAC,SAAS,CAAC;QAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAGpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpC,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,8BAAqB,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC1D,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC;QAGD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;YACtB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ;YACjC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK;YAC3B,KAAK;YACL,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC9C,CAAC;IACN,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,MAAc,EAAE,GAAoB;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO;aAC9B,kBAAkB,EAAE;aACpB,MAAM,CAAC,gCAAU,CAAC;aAClB,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aAC/B,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;aACzB,OAAO,EAAE,CAAC;IACnB,CAAC;IAGD,KAAK,CAAC,QAAQ,CAAC,MAAc;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACrD,KAAK,EAAE;gBACH,SAAS,EAAE,QAAQ;aACtB;YACD,SAAS,EAAE;gBACP,IAAI,EAAE;oBACF,KAAK,EAAE,IAAI;iBACd;aACJ;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,8BAAqB,CAAC,+BAAc,CAAC,mBAAmB,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAGrE,OAAO;YACH,IAAI,EAAE;gBACF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7C;YACD,GAAG,MAAM;SACZ,CAAA;IACL,CAAC;IAEO,IAAI,CAAC,MAAc;QACvB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;CACJ,CAAA;AApIY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAK8B,8CAAoB;QACX,uDAAyB;QAC7B,8CAAqB;QAC5B,gCAAc;GAP1C,aAAa,CAoIzB","sourcesContent":["import {\n ForbiddenException,\n Injectable,\n Logger,\n NotFoundException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport { createHash, randomBytes } from 'crypto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { CreateApiKeyDto } from 'src/dtos/create-api-key.dto';\nimport { UpdateApiKeyDto } from 'src/dtos/update-api-key.dto';\nimport { UserApiKey } from 'src/entities/user-api-key.entity';\nimport { User } from 'src/entities/user.entity';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { UserApiKeyRepository } from 'src/repository/user-api-key.repository';\nimport { PermissionMetadataService } from 'src/services/permission-metadata.service';\nimport { AuthenticationService } from './authentication.service';\nimport { UserRepository } from 'src/repository/user.repository';\n\n@Injectable()\nexport class ApiKeyService {\n private readonly logger = new Logger(ApiKeyService.name);\n\n constructor(\n private readonly apiKeyRepository: UserApiKeyRepository,\n private readonly permissionMetadataService: PermissionMetadataService,\n private readonly authenticationService: AuthenticationService,\n private readonly userRepository: UserRepository,\n ) { }\n\n async generate(userId: number, dto: CreateApiKeyDto): Promise<{ apiKey: string; record: UserApiKey }> {\n const user = await this.apiKeyRepository.manager.findOne(User, {\n where: { id: userId },\n select: ['id', 'isAllowedToGenerateApiKeys'],\n });\n\n if (!user?.isAllowedToGenerateApiKeys) {\n throw new ForbiddenException('You are not allowed to generate API keys');\n }\n\n const rawKey = 'sldx_' + randomBytes(32).toString('hex');\n const hashedKey = this.hash(rawKey);\n const maskedKey = 'sldx_****' + rawKey.slice(-4);\n\n const record = this.apiKeyRepository.create({\n name: dto.name,\n hashedKey,\n maskedKey,\n isActive: true,\n expiresAt: dto.expiresAt ? new Date(dto.expiresAt) : null,\n user,\n });\n\n await this.apiKeyRepository.save(record);\n\n // Strip hashedKey from the returned record — maskedKey is all the UI needs\n delete (record as any).hashedKey;\n\n return { apiKey: rawKey, record };\n }\n\n async validate(rawKey: string): Promise<ActiveUserData> {\n const hashedKey = this.hash(rawKey);\n\n // Bypass security rules for auth validation — must find the key regardless of caller context\n const keyRecord = await this.apiKeyRepository.findOne({\n where: { hashedKey, isActive: true },\n relations: ['user', 'user.roles'],\n });\n\n if (!keyRecord) {\n throw new UnauthorizedException();\n }\n\n if (keyRecord.expiresAt && keyRecord.expiresAt < new Date()) {\n throw new UnauthorizedException('API key expired');\n }\n\n // Fire-and-forget — does not need security rule context\n this.apiKeyRepository.update(keyRecord.id, { lastUsedAt: new Date() }).catch((err) => {\n this.logger.warn(`Failed to update lastUsedAt for key ${keyRecord.id}: ${err.message}`);\n });\n\n const roles = (keyRecord.user.roles ?? []).map((r) => r.name);\n const permissions = await this.permissionMetadataService.findAllUsingRoles(roles);\n\n return {\n sub: keyRecord.user.id,\n username: keyRecord.user.username,\n email: keyRecord.user.email,\n roles,\n permissions: permissions.map((p) => p.name),\n };\n }\n\n async updateKey(id: number, userId: number, dto: UpdateApiKeyDto): Promise<void> {\n const keyRecord = await this.apiKeyRepository.findOne({\n where: { id, user: { id: userId } },\n });\n\n if (!keyRecord) {\n throw new NotFoundException('API key not found');\n }\n\n await this.apiKeyRepository.manager\n .createQueryBuilder()\n .update(UserApiKey)\n .set({ isActive: dto.isActive })\n .where('id = :id', { id })\n .execute();\n }\n\n\n async apiKeyMe(apiKey: string) {\n\n const hasedKey = this.hash(apiKey);\n const apiKeyRecord = await this.apiKeyRepository.findOne({\n where: {\n hashedKey: hasedKey,\n },\n relations: {\n user: {\n roles: true\n }\n }\n });\n\n if (!apiKeyRecord) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n const user = apiKeyRecord.user;\n\n const tokens = await this.authenticationService.generateTokens(user);\n\n\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private hash(rawKey: string): string {\n return createHash('sha256').update(rawKey).digest('hex');\n }\n}\n"]}
@@ -1,12 +1,16 @@
1
1
  import { CommonEntity } from "../../../entities/common.entity";
2
2
  import { ComputedFieldMetadata } from "../../../helpers/solid-registry";
3
3
  import { IEntityPreComputeFieldProvider } from "../../../interfaces";
4
+ import { SettingService } from "../../../services/setting.service";
4
5
  export interface ConcatComputedFieldContext {
5
6
  separator: string;
6
7
  fields: string[];
7
8
  slugify?: boolean;
9
+ dateFormat?: string;
8
10
  }
9
11
  export declare class ConcatEntityComputedFieldProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, ConcatComputedFieldContext> {
12
+ private readonly settingService;
13
+ constructor(settingService: SettingService);
10
14
  name(): string;
11
15
  help(): string;
12
16
  preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<ConcatComputedFieldContext>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"concat-entity-computed-field-provider.service.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAEa,iCAAiC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,CAAC;IAE3I,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,0BAA0B,CAAC;CAkCnH"}
1
+ {"version":3,"file":"concat-entity-computed-field-provider.service.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9D,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAEa,iCAAiC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,CAAC;IAGvI,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAGnD,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,0BAA0B,CAAC;CAwCnH"}
@@ -5,12 +5,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
8
14
  Object.defineProperty(exports, "__esModule", { value: true });
9
15
  exports.ConcatEntityComputedFieldProvider = void 0;
16
+ const dayjs_1 = __importDefault(require("dayjs"));
10
17
  const common_1 = require("@nestjs/common");
11
18
  const lodash_1 = require("lodash");
12
19
  const computed_field_provider_decorator_1 = require("../../../decorators/computed-field-provider.decorator");
20
+ const setting_service_1 = require("../../setting.service");
13
21
  let ConcatEntityComputedFieldProvider = class ConcatEntityComputedFieldProvider {
22
+ constructor(settingService) {
23
+ this.settingService = settingService;
24
+ }
14
25
  name() {
15
26
  return "ConcatEntityComputedFieldProvider";
16
27
  }
@@ -22,11 +33,16 @@ let ConcatEntityComputedFieldProvider = class ConcatEntityComputedFieldProvider
22
33
  const separator = computedFieldValueProviderCtxt.separator ?? ' ';
23
34
  const fields = computedFieldValueProviderCtxt.fields ?? [];
24
35
  const slugify = computedFieldValueProviderCtxt.slugify ?? false;
36
+ const dateFormat = computedFieldValueProviderCtxt.dateFormat
37
+ ?? this.settingService.getConfigValue("dateFormat");
25
38
  const parts = [];
26
39
  for (const fieldExpr of fields) {
27
40
  let val = (0, lodash_1.get)(triggerEntity, fieldExpr);
28
41
  if (val == null)
29
42
  continue;
43
+ if (val instanceof Date) {
44
+ val = (0, dayjs_1.default)(val).format(dateFormat);
45
+ }
30
46
  if (typeof val !== 'string') {
31
47
  val = String(val);
32
48
  }
@@ -44,6 +60,7 @@ let ConcatEntityComputedFieldProvider = class ConcatEntityComputedFieldProvider
44
60
  exports.ConcatEntityComputedFieldProvider = ConcatEntityComputedFieldProvider;
45
61
  exports.ConcatEntityComputedFieldProvider = ConcatEntityComputedFieldProvider = __decorate([
46
62
  (0, computed_field_provider_decorator_1.ComputedFieldProvider)(),
47
- (0, common_1.Injectable)()
63
+ (0, common_1.Injectable)(),
64
+ __metadata("design:paramtypes", [setting_service_1.SettingService])
48
65
  ], ConcatEntityComputedFieldProvider);
49
66
  //# sourceMappingURL=concat-entity-computed-field-provider.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"concat-entity-computed-field-provider.service.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAwC;AACxC,6GAAyF;AAclF,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAE1C,IAAI;QACA,OAAO,mCAAmC,CAAC;IAC/C,CAAC;IAED,IAAI;QACA,OAAO,iHAAiH,CAAC;IAC7H,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAgB,EAAE,qBAAwE;QAC5G,MAAM,EAAE,8BAA8B,EAAE,GAAG,qBAAqB,CAAC;QACjE,MAAM,SAAS,GAAG,8BAA8B,CAAC,SAAS,IAAI,GAAG,CAAC;QAClE,MAAM,MAAM,GAAa,8BAA8B,CAAC,MAAM,IAAI,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,8BAA8B,CAAC,OAAO,IAAI,KAAK,CAAC;QAEhE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,IAAA,YAAG,EAAC,aAAoB,EAAE,SAAS,CAAC,CAAC;YAG/C,IAAI,GAAG,IAAI,IAAI;gBAAE,SAAS;YAE1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACV,GAAG,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAGhD,aAAqB,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC;IACjF,CAAC;CAEJ,CAAA;AA5CY,8EAAiC;4CAAjC,iCAAiC;IAF7C,IAAA,yDAAqB,GAAE;IACvB,IAAA,mBAAU,GAAE;GACA,iCAAiC,CA4C7C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { kebabCase, get } from \"lodash\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPreComputeFieldProvider } from \"src/interfaces\";\n\n\nexport interface ConcatComputedFieldContext {\n separator: string; // The separator to use between concatenated values\n fields: string[]; // The fields to concatenate\n slugify?: boolean; // Optional: if true, slugify each field value before concatenation\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class ConcatEntityComputedFieldProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, ConcatComputedFieldContext> {\n\n name(): string {\n return \"ConcatEntityComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is a concatenation of other fields in the same model.\";\n }\n\n async preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<ConcatComputedFieldContext>) {\n const { computedFieldValueProviderCtxt } = computedFieldMetadata;\n const separator = computedFieldValueProviderCtxt.separator ?? ' ';\n const fields: string[] = computedFieldValueProviderCtxt.fields ?? [];\n const slugify = computedFieldValueProviderCtxt.slugify ?? false;\n\n const parts: string[] = [];\n\n for (const fieldExpr of fields) {\n let val = get(triggerEntity as any, fieldExpr);\n\n // normalize to string (skip null/undefined)\n if (val == null) continue;\n\n if (typeof val !== 'string') {\n val = String(val);\n }\n\n if (slugify) {\n val = kebabCase(val);\n }\n\n // ignore empty strings so you don't get stray separators\n if (val.length > 0) {\n parts.push(val);\n }\n }\n\n const concatenatedString = parts.join(separator);\n\n // set the computed field on the entity\n (triggerEntity as any)[computedFieldMetadata.fieldName] = concatenatedString;\n }\n\n}"]}
1
+ {"version":3,"file":"concat-entity-computed-field-provider.service.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,2CAA4C;AAC5C,mCAAwC;AACxC,6GAAyF;AAIzF,2DAA8D;AAavD,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAE1C,YACqB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAC/C,CAAC;IAEL,IAAI;QACA,OAAO,mCAAmC,CAAC;IAC/C,CAAC;IAED,IAAI;QACA,OAAO,iHAAiH,CAAC;IAC7H,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAgB,EAAE,qBAAwE;QAC5G,MAAM,EAAE,8BAA8B,EAAE,GAAG,qBAAqB,CAAC;QACjE,MAAM,SAAS,GAAG,8BAA8B,CAAC,SAAS,IAAI,GAAG,CAAC;QAClE,MAAM,MAAM,GAAa,8BAA8B,CAAC,MAAM,IAAI,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,8BAA8B,CAAC,OAAO,IAAI,KAAK,CAAC;QAChE,MAAM,UAAU,GAAG,8BAA8B,CAAC,UAAU;eACrD,IAAI,CAAC,cAAc,CAAC,cAAc,CAAmB,YAAY,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,IAAA,YAAG,EAAC,aAAoB,EAAE,SAAS,CAAC,CAAC;YAG/C,IAAI,GAAG,IAAI,IAAI;gBAAE,SAAS;YAE1B,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;gBACtB,GAAG,GAAG,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACV,GAAG,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAGhD,aAAqB,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC;IACjF,CAAC;CAEJ,CAAA;AAtDY,8EAAiC;4CAAjC,iCAAiC;IAF7C,IAAA,yDAAqB,GAAE;IACvB,IAAA,mBAAU,GAAE;qCAI4B,gCAAc;GAH1C,iCAAiC,CAsD7C","sourcesContent":["import dayjs from \"dayjs\";\nimport { Injectable } from \"@nestjs/common\";\nimport { kebabCase, get } from \"lodash\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPreComputeFieldProvider } from \"src/interfaces\";\nimport { SettingService } from \"src/services/setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\n\nexport interface ConcatComputedFieldContext {\n separator: string; // The separator to use between concatenated values\n fields: string[]; // The fields to concatenate\n slugify?: boolean; // Optional: if true, slugify each field value before concatenation\n dateFormat?: string; // Optional: format to use for Date values. Defaults to the configured dateFormat setting\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class ConcatEntityComputedFieldProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, ConcatComputedFieldContext> {\n\n constructor(\n private readonly settingService: SettingService,\n ) { }\n\n name(): string {\n return \"ConcatEntityComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is a concatenation of other fields in the same model.\";\n }\n\n async preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<ConcatComputedFieldContext>) {\n const { computedFieldValueProviderCtxt } = computedFieldMetadata;\n const separator = computedFieldValueProviderCtxt.separator ?? ' ';\n const fields: string[] = computedFieldValueProviderCtxt.fields ?? [];\n const slugify = computedFieldValueProviderCtxt.slugify ?? false;\n const dateFormat = computedFieldValueProviderCtxt.dateFormat\n ?? this.settingService.getConfigValue<SolidCoreSetting>(\"dateFormat\");\n\n const parts: string[] = [];\n\n for (const fieldExpr of fields) {\n let val = get(triggerEntity as any, fieldExpr);\n\n // normalize to string (skip null/undefined)\n if (val == null) continue;\n\n if (val instanceof Date) {\n val = dayjs(val).format(dateFormat);\n }\n\n if (typeof val !== 'string') {\n val = String(val);\n }\n\n if (slugify) {\n val = kebabCase(val);\n }\n\n // ignore empty strings so you don't get stray separators\n if (val.length > 0) {\n parts.push(val);\n }\n }\n\n const concatenatedString = parts.join(separator);\n\n // set the computed field on the entity\n (triggerEntity as any)[computedFieldMetadata.fieldName] = concatenatedString;\n }\n\n}\n"]}
@@ -30,6 +30,7 @@ export declare class CRUDService<T extends CommonEntity> {
30
30
  private validateAndTransformDto;
31
31
  private saveMedia;
32
32
  update(id: number, updateDto: any, files?: Express.Multer.File[], isPartialUpdate?: boolean, solidRequestContext?: any, isUpdate?: boolean): Promise<T>;
33
+ private prepareManyToManyAuditSnapshot;
33
34
  delete(id: number, solidRequestContext?: any): Promise<T>;
34
35
  private fieldCrudManager;
35
36
  private isSkipComputation;
@@ -1 +1 @@
1
- {"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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"}
@@ -64,12 +64,14 @@ const SelectionDynamicFieldCrudManager_1 = require("../helpers/field-crud-manage
64
64
  const SelectionStaticFieldCrudManager_1 = require("../helpers/field-crud-managers/SelectionStaticFieldCrudManager");
65
65
  const ShortTextFieldCrudManager_1 = require("../helpers/field-crud-managers/ShortTextFieldCrudManager");
66
66
  const UUIDFieldCrudManager_1 = require("../helpers/field-crud-managers/UUIDFieldCrudManager");
67
+ const model_metadata_helper_service_1 = require("../helpers/model-metadata-helper.service");
67
68
  const crud_helper_service_1 = require("./crud-helper.service");
68
69
  const hashing_service_1 = require("./hashing.service");
69
70
  const solid_registry_1 = require("../helpers/solid-registry");
70
71
  const mediaStorageProviders_1 = require("./mediaStorageProviders");
71
72
  const model_metadata_service_1 = require("./model-metadata.service");
72
73
  const request_context_service_1 = require("./request-context.service");
74
+ const AUDIT_BEFORE_SNAPSHOT = '__auditBeforeSnapshot';
73
75
  class CRUDService {
74
76
  constructor(entityManager, repo, modelName, moduleName, moduleRef, defaultDatasourceEntityManager) {
75
77
  this.entityManager = entityManager;
@@ -194,6 +196,7 @@ class CRUDService {
194
196
  if (model.draftPublishWorkflow === true && entity.publishedAt) {
195
197
  throw new common_1.BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`);
196
198
  }
199
+ await this.prepareManyToManyAuditSnapshot(entity, id, model.singularName);
197
200
  let hasMediaFields = false;
198
201
  const fieldsToProcess = [...model.fields];
199
202
  for (const field of fieldsToProcess) {
@@ -208,6 +211,30 @@ class CRUDService {
208
211
  }
209
212
  return savedEntity;
210
213
  }
214
+ async prepareManyToManyAuditSnapshot(entity, id, modelSingularName) {
215
+ const modelMetadataHelperService = this.moduleRef.get(model_metadata_helper_service_1.ModelMetadataHelperService, { strict: false });
216
+ const auditRelationFields = (await modelMetadataHelperService.loadFieldHierarchy(modelSingularName)).filter(field => field.enableAuditTracking &&
217
+ field.type === 'relation' &&
218
+ field.relationType !== 'one-to-many');
219
+ if (auditRelationFields.length > 0) {
220
+ const relations = {};
221
+ auditRelationFields.forEach(field => relations[field.name] = true);
222
+ const auditBeforeEntity = await this.repo.findOne({
223
+ where: {
224
+ id: id,
225
+ },
226
+ relations: relations,
227
+ });
228
+ if (auditBeforeEntity) {
229
+ Object.defineProperty(entity, AUDIT_BEFORE_SNAPSHOT, {
230
+ configurable: true,
231
+ enumerable: false,
232
+ value: auditBeforeEntity,
233
+ writable: true,
234
+ });
235
+ }
236
+ }
237
+ }
211
238
  async delete(id, solidRequestContext = {}) {
212
239
  if (!id) {
213
240
  throw new Error(error_messages_1.ERROR_MESSAGES.ID_REQUIRED_FOR_DELETE);