json-rest-api 1.0.22 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1 -2
- package/JSKIT_BACKEND_MIGRATION_TRACKER.txt +180 -0
- package/README.md +22 -1
- package/SINGLE_VALIDATION_CONTRACT_TODO.txt +172 -0
- package/docs/API.md +196 -38
- package/docs/COMPARISON.md +2 -2
- package/docs/GUIDE/GUIDE_1_Initial_Setup.md +111 -5
- package/docs/GUIDE/GUIDE_2_2_Manipulating_And_Searching_Tables.md +5 -1
- package/docs/GUIDE/GUIDE_2_7_Pagination_And_Ordering.md +3 -1
- package/docs/GUIDE/GUIDE_2_8_Effects_of_PUT_and_PATCH.md +12 -60
- package/docs/GUIDE/GUIDE_2_Data_And_Relations.md +2 -2
- package/docs/GUIDE/GUIDE_3_Field_Transformations.md +5 -1
- package/docs/GUIDE/GUIDE_7_Hooks_Data_Management_And_Plugins.md +2 -0
- package/docs/GUIDE/GUIDE_X_Autofiltering.md +355 -0
- package/docs/GUIDE/GUIDE_X_Fastify.md +78 -0
- package/docs/GUIDE/GUIDE_X_Knex_Schema_And_Migrations.md +370 -0
- package/docs/GUIDE/GUIDE_X_Query_Projections.md +159 -0
- package/docs/GUIDE/GUIDE_X_Writing_Plugins.md +199 -0
- package/docs/GUIDE/index.md +18 -9
- package/docs/QUICKSTART.md +5 -1
- package/docs/index.md +1 -1
- package/index.js +3 -2
- package/lib/enhanced-logger.js +1 -1
- package/package.json +6 -2
- package/plugins/core/bulk-operations-plugin.js +26 -34
- package/plugins/core/connectors/express-plugin.js +97 -190
- package/plugins/core/connectors/fastify-plugin.js +206 -0
- package/plugins/core/connectors/lib/busboy-detector.js +4 -4
- package/plugins/core/connectors/lib/connector-core.js +195 -0
- package/plugins/core/connectors/lib/transport-http-helpers.js +122 -0
- package/plugins/core/connectors/lib/transport-route-schemas.js +92 -0
- package/plugins/core/lib/anyapi/schema-utils.js +43 -4
- package/plugins/core/lib/anyapi/utils/descriptor-helpers.js +4 -1
- package/plugins/core/lib/dbIntrospection.js +1078 -0
- package/plugins/core/lib/dbTablesOperations.js +1111 -160
- package/plugins/core/lib/querying/knex-cross-table-search.js +0 -7
- package/plugins/core/lib/querying/knex-json-api-transformers-querying.js +5 -3
- package/plugins/core/lib/querying/knex-process-includes.js +3 -4
- package/plugins/core/lib/querying/knex-query-helpers.js +21 -76
- package/plugins/core/lib/querying/knex-relationship-includes.js +468 -215
- package/plugins/core/lib/querying/query-builder-utils.js +19 -0
- package/plugins/core/lib/querying/query-field-sort-helpers.js +135 -0
- package/plugins/core/lib/querying/sort-helpers.js +33 -0
- package/plugins/core/lib/querying/storage-adapter-utils.js +51 -0
- package/plugins/core/lib/querying/url-helpers.js +8 -2
- package/plugins/core/lib/querying-writing/compile-schemas.js +20 -5
- package/plugins/core/lib/querying-writing/knex-field-helpers.js +83 -14
- package/plugins/core/lib/querying-writing/knex-json-api-transformers.js +13 -12
- package/plugins/core/lib/querying-writing/query-field-helpers.js +88 -0
- package/plugins/core/lib/querying-writing/request-contracts.js +590 -0
- package/plugins/core/lib/querying-writing/resource-id-normalization.js +131 -0
- package/plugins/core/lib/querying-writing/schema-helpers.js +0 -2
- package/plugins/core/lib/querying-writing/simplified-helpers.js +4 -11
- package/plugins/core/lib/storage/canonical-storage-mapping.js +133 -0
- package/plugins/core/lib/storage/storage-adapter.js +82 -4
- package/plugins/core/lib/storage/storage-mapping.js +274 -0
- package/plugins/core/lib/writing/many-to-many-manipulations.js +4 -2
- package/plugins/core/rest-api-anyapi-knex-plugin.js +531 -312
- package/plugins/core/rest-api-autofilter-plugin.js +414 -0
- package/plugins/core/rest-api-knex-plugin.js +271 -226
- package/plugins/core/rest-api-plugin-hooks/register-relationship-routes.js +10 -5
- package/plugins/core/rest-api-plugin-hooks/register-scope-routes.js +12 -6
- package/plugins/core/rest-api-plugin-hooks/turn-scope-init-into-vars.js +1 -0
- package/plugins/core/rest-api-plugin-methods/apply-query-filters.js +41 -0
- package/plugins/core/rest-api-plugin-methods/common.js +148 -92
- package/plugins/core/rest-api-plugin-methods/delete-relationship.js +11 -2
- package/plugins/core/rest-api-plugin-methods/delete.js +6 -1
- package/plugins/core/rest-api-plugin-methods/enrich-attributes.js +6 -1
- package/plugins/core/rest-api-plugin-methods/get-related.js +7 -2
- package/plugins/core/rest-api-plugin-methods/get-relationship.js +7 -2
- package/plugins/core/rest-api-plugin-methods/get.js +29 -14
- package/plugins/core/rest-api-plugin-methods/patch-relationship.js +10 -3
- package/plugins/core/rest-api-plugin-methods/patch.js +56 -12
- package/plugins/core/rest-api-plugin-methods/post-relationship.js +11 -2
- package/plugins/core/rest-api-plugin-methods/post.js +21 -8
- package/plugins/core/rest-api-plugin-methods/put.js +73 -21
- package/plugins/core/rest-api-plugin-methods/query.js +15 -53
- package/plugins/core/rest-api-plugin-methods/release.js +0 -2
- package/plugins/core/rest-api-plugin.js +6 -0
- package/plugins/core/rest-api-positioning-plugin.js +2 -5
- package/plugins/core/rest-api-query-projections-plugin.js +130 -0
- package/plugins/core/socketio-plugin.js +1 -4
- package/plugins/storage/local-storage.js +1 -1
- package/plugins/storage/s3-storage.js +5 -2
- package/quickTest.js +1 -0
- package/scripts/run-docs.js +80 -84
- package/test-debug.js +1 -1
- package/tests/README.md +7 -0
- package/tests/anyapi-basic.test.js +3 -0
- package/tests/autofilter.test.js +463 -0
- package/tests/custom-id-mysql-returning-fallback.test.js +128 -0
- package/tests/custom-id-simplified-post.test.js +75 -0
- package/tests/custom-idproperty-relationships.test.js +33 -0
- package/tests/db-introspection.test.js +521 -0
- package/tests/db-table-operations.test.js +786 -0
- package/tests/fastify-plugin.test.js +156 -0
- package/tests/field-getters.test.js +1 -2
- package/tests/field-setters.test.js +0 -4
- package/tests/fixtures/api-configs.js +278 -176
- package/tests/helpers/fake-fastify.js +99 -0
- package/tests/http-connectors-parity.test.js +235 -0
- package/tests/id-normalization.test.js +444 -0
- package/tests/logical-id-write-validation.test.js +151 -0
- package/tests/pagination-cursor-multifield.test.js +11 -11
- package/tests/projected-fields.test.js +319 -0
- package/tests/relationships.test.js +3 -3
- package/tests/searchschema-knex-behavior.test.js +187 -0
- package/tests/searchschema-merge.test.js +21 -69
- package/tests/storage-mapping.test.js +259 -0
- package/audit/00-charter.md +0 -103
- package/audit/01-scope-map.md +0 -84
- package/audit/02-coverage-matrix.csv +0 -174
- package/audit/03-invariants.md +0 -123
- package/audit/04-standards-rubric.md +0 -56
- package/audit/05-competitor-rubric.md +0 -77
- package/audit/06-findings.md +0 -160
- package/audit/07-risk-register.csv +0 -10
- package/audit/08-remediation-roadmap.md +0 -177
- package/audit/09-signoff-check.md +0 -23
- package/audit/10-final-synthesis.md +0 -29
- package/audit/evidence/code/all-files-json-rest-api.txt +0 -168
- package/audit/evidence/code/all-files-json-rest-schema.txt +0 -12
- package/audit/evidence/code/boundary-leak-checks.txt +0 -72
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__bulk-operations-plugin.js.txt +0 -480
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__express-plugin.js.txt +0 -532
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__busboy-detector.js.txt +0 -175
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__formidable-detector.js.txt +0 -138
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__request-helpers.js.txt +0 -222
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__file-handling-plugin.js.txt +0 -342
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__dbTablesOperations.js.txt +0 -304
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__fractional-positioning.js.txt +0 -188
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__compile-schemas.js.txt +0 -336
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__connectors-query-parser.js.txt +0 -165
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-capabilities.js.txt +0 -265
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-value-normalizers.js.txt +0 -369
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__default-data-helpers.js.txt +0 -72
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__field-utils.js.txt +0 -139
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-constants.js.txt +0 -45
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-field-helpers.js.txt +0 -396
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-json-api-transformers.js.txt +0 -162
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__payload-validators.js.txt +0 -1314
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__schema-helpers.js.txt +0 -488
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__scope-validations.js.txt +0 -484
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__simplified-helpers.js.txt +0 -857
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-cross-table-search.js.txt +0 -565
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-json-api-transformers-querying.js.txt +0 -485
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-pagination-helpers.js.txt +0 -560
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-process-includes.js.txt +0 -167
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers-base.js.txt +0 -109
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers.js.txt +0 -1064
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-relationship-includes.js.txt +0 -1983
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-window-queries.js.txt +0 -328
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__url-helpers.js.txt +0 -119
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__storage__storage-adapter.js.txt +0 -160
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__many-to-many-manipulations.js.txt +0 -300
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__relationship-processor.js.txt +0 -245
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-access.js.txt +0 -459
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-cors-plugin.js.txt +0 -237
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-knex-plugin.js.txt +0 -1135
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-multihome-plugin.js.txt +0 -314
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__compile-resource-schemas.js.txt +0 -7
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-relationship-routes.js.txt +0 -71
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-scope-routes.js.txt +0 -102
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__turn-scope-init-into-vars.js.txt +0 -49
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__validate-include-configurations.js.txt +0 -39
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__add-route.js.txt +0 -23
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__check-permissions.js.txt +0 -13
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__common.js.txt +0 -639
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete-relationship.js.txt +0 -117
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete.js.txt +0 -104
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__enrich-attributes.js.txt +0 -199
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-related.js.txt +0 -353
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-relationship.js.txt +0 -61
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get.js.txt +0 -184
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch-relationship.js.txt +0 -55
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch.js.txt +0 -191
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post-relationship.js.txt +0 -110
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post.js.txt +0 -168
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__put.js.txt +0 -253
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__query.js.txt +0 -207
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__release.js.txt +0 -12
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin.js.txt +0 -165
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-positioning-plugin.js.txt +0 -668
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__socketio-plugin.js.txt +0 -621
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__local-storage.js.txt +0 -218
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__s3-storage.js.txt +0 -124
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__CorePlugin.js.txt +0 -269
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__Schema.js.txt +0 -242
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__index.js.txt +0 -77
- package/audit/evidence/code/critical-pass1-risk-keywords.txt +0 -238
- package/audit/evidence/code/critical-pass1-summary.csv +0 -67
- package/audit/evidence/code/critical-pass2-summary.csv +0 -67
- package/audit/evidence/code/early-silent-zones-no-test-token.txt +0 -57
- package/audit/evidence/code/error-model-signals.txt +0 -98
- package/audit/evidence/code/git-files-json-rest-api.txt +0 -171
- package/audit/evidence/code/git-files-json-rest-schema.txt +0 -27
- package/audit/evidence/code/hook-flow-signals.txt +0 -282
- package/audit/evidence/code/idproperty-signals.txt +0 -157
- package/audit/evidence/code/import-cycles-non-anyapi.txt +0 -3
- package/audit/evidence/code/import-hotspots-non-anyapi.txt +0 -96
- package/audit/evidence/code/imports-json-rest-api.txt +0 -354
- package/audit/evidence/code/imports-json-rest-schema.txt +0 -15
- package/audit/evidence/code/in-scope-files-json-rest-api.txt +0 -160
- package/audit/evidence/code/in-scope-files-json-rest-schema.txt +0 -13
- package/audit/evidence/code/non-anyapi-core-files.txt +0 -101
- package/audit/evidence/code/permission-signals.txt +0 -193
- package/audit/evidence/code/query-include-signals.txt +0 -687
- package/audit/evidence/code/transaction-signals.txt +0 -28
- package/audit/evidence/code/validation-signals.txt +0 -650
- package/audit/evidence/code/write-path-signals.txt +0 -61
- package/audit/evidence/docs/docs-claims-signals.txt +0 -1075
- package/audit/evidence/docs/schema-docs-claims-signals.txt +0 -179
- package/audit/evidence/external/corpus-freeze.md +0 -21
- package/audit/evidence/external/npm-competitor-metadata.txt +0 -70
- package/audit/evidence/external/npm-download-signals.txt +0 -23
- package/audit/evidence/external/npm-jsonapi-server.txt +0 -8
- package/audit/evidence/external/npm-modern-jsonapi-metadata.txt +0 -38
- package/audit/evidence/external/readme-fortune-signals.txt +0 -26
- package/audit/evidence/external/readme-fortune.md +0 -165
- package/audit/evidence/external/readme-json-api-serializer-signals.txt +0 -80
- package/audit/evidence/external/readme-json-api-serializer.md +0 -690
- package/audit/evidence/external/readme-jsonapi-serde-server-signals.txt +0 -0
- package/audit/evidence/external/readme-jsonapi-serde-server.md +0 -22
- package/audit/evidence/external/readme-jsonapi-serializer-signals.txt +0 -63
- package/audit/evidence/external/readme-jsonapi-serializer.md +0 -315
- package/audit/evidence/external/readme-jsonapi-server-signals.txt +0 -19
- package/audit/evidence/external/readme-jsonapi-server.md +0 -104
- package/audit/evidence/external/readme-nestjs-json-api-signals.txt +0 -4
- package/audit/evidence/external/readme-nestjs-json-api.md +0 -94
- package/audit/evidence/external/readme-yaser-json-api-nestjs-signals.txt +0 -47
- package/audit/evidence/external/readme-yaser-json-api-nestjs.md +0 -447
- package/audit/evidence/external/standard-jsonapi-snippets.txt +0 -84
- package/audit/evidence/external/standard-rfc-snippets.txt +0 -168
- package/audit/evidence/external/standards-sources.txt +0 -6
- package/audit/evidence/runtime/baseline-commits.txt +0 -2
- package/audit/evidence/runtime/db-adapter-assumptions.txt +0 -3
- package/audit/evidence/runtime/environment.txt +0 -4
- package/audit/evidence/runtime/invariant-runtime-mapping.md +0 -38
- package/audit/evidence/runtime/probe-patch-relationship-error.exitcode +0 -1
- package/audit/evidence/runtime/probe-patch-relationship-error.log +0 -76
- package/audit/evidence/runtime/probe-patch-relationship-error.mjs +0 -67
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.exitcode +0 -1
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.log +0 -62
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.mjs +0 -47
- package/audit/evidence/runtime/test-exitcodes.txt +0 -4
- package/audit/evidence/runtime/test-summary.md +0 -107
- package/audit/evidence/runtime/trace-anchors.txt +0 -61
- package/audit/evidence/tests/access-multitenancy-test-signals.txt +0 -125
- package/audit/evidence/tests/failing-tests-summary.txt +0 -25
- package/audit/evidence/tests/npm-test-json-rest-api.exitcode +0 -1
- package/audit/evidence/tests/npm-test-json-rest-api.log +0 -5885
- package/audit/evidence/tests/npm-test-json-rest-schema.exitcode +0 -1
- package/audit/evidence/tests/npm-test-json-rest-schema.log +0 -356
- package/audit/evidence/tests/query-include-test-signals.txt +0 -948
- package/audit/evidence/tests/relationship-test-signals.txt +0 -223
- package/audit/evidence/tests/skipped-tests.txt +0 -10
- package/audit/evidence/tests/test-suite-list-non-anyapi.txt +0 -30
- package/audit/evidence/tests/test-suite-list.txt +0 -32
- package/audit/subsystems/docs-drift.md +0 -49
- package/audit/subsystems/pass2-cross-review.md +0 -131
- package/audit/subsystems/plugins-access.md +0 -51
- package/audit/subsystems/plugins-bulk.md +0 -50
- package/audit/subsystems/plugins-cors.md +0 -48
- package/audit/subsystems/plugins-file.md +0 -53
- package/audit/subsystems/plugins-multihome.md +0 -50
- package/audit/subsystems/plugins-positioning.md +0 -54
- package/audit/subsystems/plugins-socketio.md +0 -50
- package/audit/subsystems/query-engine.md +0 -61
- package/audit/subsystems/relationships.md +0 -55
- package/audit/subsystems/rest-orchestration.md +0 -66
- package/audit/subsystems/schema-core.md +0 -64
- package/audit/subsystems/storage-knex.md +0 -57
- package/audit/subsystems/tests.md +0 -48
- package/audit/subsystems/transport-express.md +0 -55
- package/audit/traces/trace-read-get.md +0 -22
- package/audit/traces/trace-read-query.md +0 -25
- package/audit/traces/trace-relationship-endpoints.md +0 -31
- package/audit/traces/trace-write-delete.md +0 -17
- package/audit/traces/trace-write-patch.md +0 -26
- package/audit/traces/trace-write-post.md +0 -22
- package/audit/traces/trace-write-put.md +0 -23
- package/docs/GUIDE/GUIDE_4_Authentication_And_Permissions.md +0 -707
- package/docs/GUIDE/GUIDE_X_Multihome.md +0 -666
- package/plugins/core/lib/querying-writing/payload-validators.js +0 -1314
- package/plugins/core/rest-api-access.js +0 -459
- package/plugins/core/rest-api-multihome-plugin.js +0 -314
- package/tests/multihome.test.js +0 -553
- package/tests/multihome.test.js.bak +0 -550
- package/tests/ownership-optout.test.js +0 -76
- package/tests/rest-api-access.test.js +0 -206
|
@@ -208,7 +208,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
208
208
|
let foundRelationship = null
|
|
209
209
|
let relationshipType = null
|
|
210
210
|
let relationshipField = null
|
|
211
|
-
let relationshipDef = null
|
|
212
211
|
|
|
213
212
|
if (currentRelationships) {
|
|
214
213
|
for (const [relName, relDef] of Object.entries(currentRelationships)) {
|
|
@@ -222,7 +221,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
222
221
|
foundRelationship = targetScope
|
|
223
222
|
relationshipType = 'hasManyPolymorphic'
|
|
224
223
|
relationshipField = { typeField, idField, via: relDef.via }
|
|
225
|
-
relationshipDef = relDef
|
|
226
224
|
log.trace('[BUILD-JOIN] Found polymorphic hasMany relationship:', {
|
|
227
225
|
relName, targetScope, via: relDef.via, typeField, idField
|
|
228
226
|
})
|
|
@@ -238,7 +236,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
238
236
|
foreignKey: relDef.foreignKey,
|
|
239
237
|
otherKey: relDef.otherKey
|
|
240
238
|
}
|
|
241
|
-
relationshipDef = relDef
|
|
242
239
|
log.trace('[BUILD-JOIN] Found many-to-many relationship:', {
|
|
243
240
|
relName,
|
|
244
241
|
targetScope,
|
|
@@ -256,7 +253,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
256
253
|
log.error('[BUILD-JOIN] Missing foreignKey in hasMany relationship:', { relName, currentScope })
|
|
257
254
|
throw new Error(`Missing foreignKey in hasMany relationship '${relName}' for scope '${currentScope}'`)
|
|
258
255
|
}
|
|
259
|
-
relationshipDef = relDef
|
|
260
256
|
log.trace('[BUILD-JOIN] Found hasMany relationship:', { relName, targetScope, foreignKey: relationshipField })
|
|
261
257
|
break
|
|
262
258
|
}
|
|
@@ -269,7 +265,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
269
265
|
foundRelationship = targetScope
|
|
270
266
|
relationshipType = 'belongsTo'
|
|
271
267
|
relationshipField = fieldName
|
|
272
|
-
relationshipDef = fieldDef
|
|
273
268
|
log.trace('[BUILD-JOIN] Found belongsTo relationship:', { fieldName, targetScope })
|
|
274
269
|
break
|
|
275
270
|
}
|
|
@@ -282,9 +277,7 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
|
|
|
282
277
|
)
|
|
283
278
|
}
|
|
284
279
|
|
|
285
|
-
const sourceSchema = scopes[currentScope].vars.schemaInfo.schemaInstance
|
|
286
280
|
const sourceTableName = scopes[currentScope].vars.schemaInfo.tableName
|
|
287
|
-
const targetSchemaInstance = scopes[targetScope].vars.schemaInfo.schemaInstance
|
|
288
281
|
const targetTableName = scopes[targetScope].vars.schemaInfo.tableName
|
|
289
282
|
|
|
290
283
|
if (relationshipType === 'manyToMany') {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getForeignKeyFields as getForeignKeyFieldsFromUtils } from '../querying-writing/field-utils.js'
|
|
2
2
|
import { RELATIONSHIPS_KEY, RELATIONSHIP_METADATA_KEY, ROW_NUMBER_KEY, COMPUTED_DEPENDENCIES_KEY, getSchemaStructure } from '../querying-writing/knex-constants.js'
|
|
3
3
|
import { getUrlPrefix, buildResourceUrl, buildRelationshipUrl } from './url-helpers.js'
|
|
4
|
+
import { translateRecordFromStorage } from '../storage/storage-mapping.js'
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Transforms a flat database record into JSON:API resource format
|
|
@@ -75,14 +76,16 @@ import { getUrlPrefix, buildResourceUrl, buildRelationshipUrl } from './url-help
|
|
|
75
76
|
const toJsonApi = (scope, record, deps) => {
|
|
76
77
|
if (!record) return null
|
|
77
78
|
|
|
78
|
-
const
|
|
79
|
+
const schemaInfo = scope.vars.schemaInfo
|
|
80
|
+
const schemaInstance = schemaInfo.schemaInstance
|
|
81
|
+
const logicalRecord = translateRecordFromStorage(record, schemaInfo)
|
|
79
82
|
|
|
80
83
|
const { context } = deps
|
|
81
84
|
const scopeName = context.scopeName
|
|
82
85
|
const idProperty = context.schemaInfo?.idProperty || 'id'
|
|
83
86
|
const polymorphicFields = context.polymorphicFields || new Set()
|
|
84
87
|
|
|
85
|
-
const { id, ...allAttributes } =
|
|
88
|
+
const { id, ...allAttributes } = logicalRecord
|
|
86
89
|
|
|
87
90
|
const foreignKeys = schemaInstance ? getForeignKeyFieldsFromUtils(schemaInstance) : new Set()
|
|
88
91
|
|
|
@@ -436,7 +439,6 @@ export const buildJsonApiResponse = async (scope, records, included = [], isSing
|
|
|
436
439
|
return jsonApiRecord
|
|
437
440
|
})
|
|
438
441
|
|
|
439
|
-
const urlPrefix = context.urlPrefix || scope.vars.transport?.mountPath || ''
|
|
440
442
|
const normalizedData = isSingle ? processedRecords[0] : processedRecords
|
|
441
443
|
|
|
442
444
|
if (normalizedData) {
|
|
@@ -111,7 +111,6 @@ export const processIncludes = async (scope, records, deps) => {
|
|
|
111
111
|
|
|
112
112
|
const db = context.transaction || knex
|
|
113
113
|
const queryParams = context.queryParams
|
|
114
|
-
const idProperty = context.schemaInfo.idProperty
|
|
115
114
|
|
|
116
115
|
if (!queryParams.include) {
|
|
117
116
|
return []
|
|
@@ -124,15 +123,15 @@ export const processIncludes = async (scope, records, deps) => {
|
|
|
124
123
|
records,
|
|
125
124
|
scopeName,
|
|
126
125
|
includeParam: queryParams.include,
|
|
127
|
-
fields: queryParams.fields || {}
|
|
128
|
-
idProperty
|
|
126
|
+
fields: queryParams.fields || {}
|
|
129
127
|
},
|
|
130
128
|
{
|
|
131
129
|
context: {
|
|
132
130
|
scopes,
|
|
133
131
|
log,
|
|
134
132
|
knex: db,
|
|
135
|
-
capabilities: api?.knex?.capabilities
|
|
133
|
+
capabilities: api?.knex?.capabilities,
|
|
134
|
+
requestContext: context
|
|
136
135
|
}
|
|
137
136
|
}
|
|
138
137
|
)
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { analyzeRequiredIndexes, buildJoinChain } from './knex-cross-table-search.js'
|
|
2
|
+
import { createStorageAdapterUtilities } from './storage-adapter-utils.js'
|
|
2
3
|
|
|
3
4
|
// Resolve operator with sensible defaults for fields declared in searchSchema.
|
|
4
5
|
// - If filterOperator is provided, use it as-is
|
|
5
|
-
// - If
|
|
6
|
-
// - Otherwise default to '='
|
|
6
|
+
// - If no operator is provided, default to '='
|
|
7
7
|
export function resolveSearchOperator (fieldDef) {
|
|
8
8
|
if (fieldDef && fieldDef.filterOperator) return String(fieldDef.filterOperator)
|
|
9
|
-
if (fieldDef && fieldDef.type === 'string') return 'like'
|
|
10
9
|
return '='
|
|
11
10
|
}
|
|
12
11
|
|
|
@@ -74,58 +73,6 @@ export function applyWhereForOperator ({ builder, columnRef, operator, value, kn
|
|
|
74
73
|
builder[method](columnRef, operator || '=', firstVal)
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
const createAdapterUtilities = (hookParams, { getStorageAdapter } = {}) => {
|
|
78
|
-
const context = hookParams.context || {}
|
|
79
|
-
const storageCache = new Map()
|
|
80
|
-
|
|
81
|
-
const fetchStorageAdapter = (scopeName) => {
|
|
82
|
-
if (!scopeName) return null
|
|
83
|
-
if (storageCache.has(scopeName)) return storageCache.get(scopeName)
|
|
84
|
-
|
|
85
|
-
let adapter = null
|
|
86
|
-
if (scopeName === context?.knexQuery?.scopeName) {
|
|
87
|
-
adapter = context.storageAdapter ||
|
|
88
|
-
context.knexQuery?.storageAdapter ||
|
|
89
|
-
(typeof getStorageAdapter === 'function' ? getStorageAdapter(scopeName) : null)
|
|
90
|
-
if (adapter && !context.storageAdapter) {
|
|
91
|
-
context.storageAdapter = adapter
|
|
92
|
-
}
|
|
93
|
-
} else {
|
|
94
|
-
adapter = typeof getStorageAdapter === 'function' ? getStorageAdapter(scopeName) : null
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
storageCache.set(scopeName, adapter)
|
|
98
|
-
return adapter
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const defaultAliasForScope = (scopeName) => {
|
|
102
|
-
if (scopeName === context?.knexQuery?.scopeName) {
|
|
103
|
-
return context.knexQuery?.tableName || scopeName
|
|
104
|
-
}
|
|
105
|
-
return scopeName
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const translateColumn = (scopeName, field, alias = defaultAliasForScope(scopeName)) => {
|
|
109
|
-
const adapter = fetchStorageAdapter(scopeName)
|
|
110
|
-
const translated = adapter?.translateColumn?.(field) ?? field
|
|
111
|
-
if (!alias) return translated
|
|
112
|
-
return `${alias}.${translated}`
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const translateFilterValue = (scopeName, field, value) => {
|
|
116
|
-
const adapter = fetchStorageAdapter(scopeName)
|
|
117
|
-
if (!adapter?.translateFilterValue) return value
|
|
118
|
-
return adapter.translateFilterValue(field, value)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return {
|
|
122
|
-
fetchStorageAdapter,
|
|
123
|
-
defaultAliasForScope,
|
|
124
|
-
translateColumn,
|
|
125
|
-
translateFilterValue,
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
76
|
/**
|
|
130
77
|
* Processes filters that target polymorphic relationships where a single relationship can point to different types of resources
|
|
131
78
|
*
|
|
@@ -201,7 +148,7 @@ const createAdapterUtilities = (hookParams, { getStorageAdapter } = {}) => {
|
|
|
201
148
|
*/
|
|
202
149
|
export const polymorphicFiltersHook = async (hookParams, dependencies) => {
|
|
203
150
|
const { log, scopes, knex } = dependencies
|
|
204
|
-
const adapterUtils =
|
|
151
|
+
const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
|
|
205
152
|
|
|
206
153
|
// Extract context
|
|
207
154
|
const scopeName = hookParams.context?.knexQuery?.scopeName
|
|
@@ -209,13 +156,13 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
|
|
|
209
156
|
const query = hookParams.context?.knexQuery?.query
|
|
210
157
|
const db = hookParams.context?.knexQuery?.db || knex
|
|
211
158
|
|
|
212
|
-
|
|
213
|
-
const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
|
|
214
|
-
|
|
215
|
-
if (!filters) {
|
|
159
|
+
if (!scopeName || !filters || !scopes[scopeName]) {
|
|
216
160
|
return
|
|
217
161
|
}
|
|
218
162
|
|
|
163
|
+
const schemaInfo = scopes[scopeName].vars.schemaInfo
|
|
164
|
+
const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
|
|
165
|
+
|
|
219
166
|
// Step 1: Identify polymorphic searches
|
|
220
167
|
const polymorphicSearches = new Map()
|
|
221
168
|
const polymorphicJoins = new Map()
|
|
@@ -244,7 +191,7 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
|
|
|
244
191
|
// Step 2: Build polymorphic JOINs
|
|
245
192
|
log.trace('[POLYMORPHIC-SEARCH] Building JOINs for polymorphic searches')
|
|
246
193
|
|
|
247
|
-
for (const [
|
|
194
|
+
for (const [, searchInfo] of polymorphicSearches) {
|
|
248
195
|
const { fieldDef, polymorphicField } = searchInfo
|
|
249
196
|
|
|
250
197
|
// Get the relationship definition
|
|
@@ -525,7 +472,7 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
|
|
|
525
472
|
*/
|
|
526
473
|
export const crossTableFiltersHook = async (hookParams, dependencies) => {
|
|
527
474
|
const { log, scopes, knex } = dependencies
|
|
528
|
-
const adapterUtils =
|
|
475
|
+
const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
|
|
529
476
|
|
|
530
477
|
// Extract context
|
|
531
478
|
const scopeName = hookParams.context?.knexQuery?.scopeName
|
|
@@ -533,16 +480,15 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
|
|
|
533
480
|
const query = hookParams.context?.knexQuery?.query
|
|
534
481
|
const db = hookParams.context?.knexQuery?.db || knex
|
|
535
482
|
|
|
483
|
+
if (!scopeName || !filters || !scopes[scopeName]) {
|
|
484
|
+
return
|
|
485
|
+
}
|
|
486
|
+
|
|
536
487
|
const schemaInfo = scopes[scopeName].vars.schemaInfo
|
|
537
|
-
const tableName = schemaInfo.tableName
|
|
538
488
|
const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
|
|
539
489
|
const aliasScopeMap = new Map()
|
|
540
490
|
aliasScopeMap.set(tableAlias, scopeName)
|
|
541
491
|
|
|
542
|
-
if (!filters) {
|
|
543
|
-
return
|
|
544
|
-
}
|
|
545
|
-
|
|
546
492
|
// Step 1: Analyze indexes
|
|
547
493
|
const requiredIndexes = analyzeRequiredIndexes(scopes, log, scopeName, schemaInfo)
|
|
548
494
|
if (requiredIndexes.length > 0) {
|
|
@@ -783,7 +729,7 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
|
|
|
783
729
|
fieldDef.applyFilter.call(this, this, filterValue)
|
|
784
730
|
break
|
|
785
731
|
|
|
786
|
-
default:
|
|
732
|
+
default: {
|
|
787
733
|
const targetField = fieldDef.actualField || filterKey
|
|
788
734
|
const columnRef = resolveFieldColumn(targetField)
|
|
789
735
|
const operator = resolveSearchOperator(fieldDef)
|
|
@@ -791,6 +737,7 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
|
|
|
791
737
|
applyWhereForOperator({ builder: this, columnRef, operator, value: normalized, knex })
|
|
792
738
|
break
|
|
793
739
|
}
|
|
740
|
+
}
|
|
794
741
|
}
|
|
795
742
|
})
|
|
796
743
|
}
|
|
@@ -938,13 +885,15 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
|
|
|
938
885
|
*/
|
|
939
886
|
export const basicFiltersHook = async (hookParams, dependencies) => {
|
|
940
887
|
const { log, scopes, knex } = dependencies
|
|
941
|
-
const adapterUtils =
|
|
888
|
+
const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
|
|
942
889
|
|
|
943
890
|
// Extract context
|
|
944
891
|
const scopeName = hookParams.context?.knexQuery?.scopeName
|
|
945
892
|
const filters = hookParams.context?.knexQuery?.filters
|
|
946
893
|
const query = hookParams.context?.knexQuery?.query
|
|
947
|
-
|
|
894
|
+
if (!scopeName || !filters || !scopes[scopeName]) {
|
|
895
|
+
return
|
|
896
|
+
}
|
|
948
897
|
|
|
949
898
|
const schemaInfo = scopes[scopeName].vars.schemaInfo
|
|
950
899
|
const tableName = schemaInfo.tableName
|
|
@@ -958,11 +907,6 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
|
|
|
958
907
|
tableName
|
|
959
908
|
})
|
|
960
909
|
|
|
961
|
-
if (!filters) {
|
|
962
|
-
log.trace('[DEBUG basicFiltersHook] Returning early - no filters')
|
|
963
|
-
return
|
|
964
|
-
}
|
|
965
|
-
|
|
966
910
|
// Check if we have any JOINs applied (to know if we need to qualify fields)
|
|
967
911
|
// Instead of relying on hasJoins flag, always qualify fields for safety
|
|
968
912
|
const qualifyField = (field) => adapterUtils.translateColumn(scopeName, field, tableAlias)
|
|
@@ -1047,7 +991,7 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
|
|
|
1047
991
|
fieldDef.applyFilter.call(this, this, filterValue)
|
|
1048
992
|
break
|
|
1049
993
|
|
|
1050
|
-
default:
|
|
994
|
+
default: {
|
|
1051
995
|
// Standard filtering
|
|
1052
996
|
const actualField = fieldDef.actualField || filterKey
|
|
1053
997
|
// Always qualify field names
|
|
@@ -1059,6 +1003,7 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
|
|
|
1059
1003
|
applyWhereForOperator({ builder: this, columnRef: dbField, operator, value: normalized, knex })
|
|
1060
1004
|
break
|
|
1061
1005
|
}
|
|
1006
|
+
}
|
|
1062
1007
|
}
|
|
1063
1008
|
})
|
|
1064
1009
|
}
|