@webda/core 4.0.0-beta.2 → 4.0.0-beta.3
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/README.md +252 -0
- package/lib/application/application.d.ts +437 -0
- package/lib/application/application.d.ts.map +1 -0
- package/lib/application/application.js +792 -0
- package/lib/application/application.js.map +1 -0
- package/lib/application/hooks.d.ts +34 -0
- package/lib/application/hooks.d.ts.map +1 -0
- package/lib/application/hooks.js +57 -0
- package/lib/application/hooks.js.map +1 -0
- package/lib/application/iapplication.d.ts +43 -0
- package/lib/application/iapplication.d.ts.map +1 -0
- package/lib/application/iapplication.js +2 -0
- package/lib/application/iapplication.js.map +1 -0
- package/lib/application/iconfiguration.d.ts +176 -0
- package/lib/application/iconfiguration.d.ts.map +1 -0
- package/lib/application/iconfiguration.js +8 -0
- package/lib/application/iconfiguration.js.map +1 -0
- package/lib/application/runner.d.ts +8 -0
- package/lib/application/runner.d.ts.map +1 -0
- package/lib/application/runner.js +26 -0
- package/lib/application/runner.js.map +1 -0
- package/lib/{unpackedapplication.d.ts → application/unpackedapplication.d.ts} +43 -23
- package/lib/application/unpackedapplication.d.ts.map +1 -0
- package/lib/application/unpackedapplication.js +492 -0
- package/lib/application/unpackedapplication.js.map +1 -0
- package/lib/bin/cli-phase.d.ts +28 -0
- package/lib/bin/cli-phase.d.ts.map +1 -0
- package/lib/bin/cli-phase.js +44 -0
- package/lib/bin/cli-phase.js.map +1 -0
- package/lib/bin/cli.d.ts +161 -0
- package/lib/bin/cli.d.ts.map +1 -0
- package/lib/bin/cli.js +828 -0
- package/lib/bin/cli.js.map +1 -0
- package/lib/bin/launcher.d.ts +3 -0
- package/lib/bin/launcher.d.ts.map +1 -0
- package/lib/bin/launcher.js +50 -0
- package/lib/bin/launcher.js.map +1 -0
- package/lib/cache/cache.d.ts +33 -0
- package/lib/cache/cache.d.ts.map +1 -0
- package/lib/cache/cache.js +8 -0
- package/lib/cache/cache.js.map +1 -0
- package/lib/{services/configuration.d.ts → configurations/configuration.service.d.ts} +58 -58
- package/lib/configurations/configuration.service.d.ts.map +1 -0
- package/lib/configurations/configuration.service.js +248 -0
- package/lib/configurations/configuration.service.js.map +1 -0
- package/lib/configurations/fileconfiguration.service.d.ts +30 -0
- package/lib/configurations/fileconfiguration.service.d.ts.map +1 -0
- package/lib/configurations/fileconfiguration.service.js +65 -0
- package/lib/configurations/fileconfiguration.service.js.map +1 -0
- package/lib/configurations/kubernetesconfiguration.service.d.ts +43 -0
- package/lib/configurations/kubernetesconfiguration.service.d.ts.map +1 -0
- package/lib/configurations/kubernetesconfiguration.service.js +83 -0
- package/lib/configurations/kubernetesconfiguration.service.js.map +1 -0
- package/lib/contexts/execution.d.ts +33 -0
- package/lib/contexts/execution.d.ts.map +1 -0
- package/lib/contexts/execution.js +73 -0
- package/lib/contexts/execution.js.map +1 -0
- package/lib/contexts/globalcontext.d.ts +29 -0
- package/lib/contexts/globalcontext.d.ts.map +1 -0
- package/lib/contexts/globalcontext.js +38 -0
- package/lib/contexts/globalcontext.js.map +1 -0
- package/lib/{utils → contexts}/httpcontext.d.ts +44 -19
- package/lib/contexts/httpcontext.d.ts.map +1 -0
- package/lib/{utils → contexts}/httpcontext.js +95 -27
- package/lib/contexts/httpcontext.js.map +1 -0
- package/lib/contexts/icontext.d.ts +236 -0
- package/lib/contexts/icontext.d.ts.map +1 -0
- package/lib/contexts/icontext.js +230 -0
- package/lib/contexts/icontext.js.map +1 -0
- package/lib/contexts/operationcontext.d.ts +179 -0
- package/lib/contexts/operationcontext.d.ts.map +1 -0
- package/lib/contexts/operationcontext.js +358 -0
- package/lib/contexts/operationcontext.js.map +1 -0
- package/lib/contexts/simplecontext.d.ts +31 -0
- package/lib/contexts/simplecontext.d.ts.map +1 -0
- package/lib/contexts/simplecontext.js +45 -0
- package/lib/contexts/simplecontext.js.map +1 -0
- package/lib/contexts/webcontext.d.ts +218 -0
- package/lib/contexts/webcontext.d.ts.map +1 -0
- package/lib/contexts/webcontext.js +389 -0
- package/lib/contexts/webcontext.js.map +1 -0
- package/lib/core/authorizer.d.ts +23 -0
- package/lib/core/authorizer.d.ts.map +1 -0
- package/lib/core/authorizer.js +17 -0
- package/lib/core/authorizer.js.map +1 -0
- package/lib/core/core.d.ts +225 -0
- package/lib/core/core.d.ts.map +1 -0
- package/lib/core/core.js +576 -0
- package/lib/core/core.js.map +1 -0
- package/lib/core/hooks.d.ts +72 -0
- package/lib/core/hooks.d.ts.map +1 -0
- package/lib/core/hooks.js +73 -0
- package/lib/core/hooks.js.map +1 -0
- package/lib/core/icore.d.ts +249 -0
- package/lib/core/icore.d.ts.map +1 -0
- package/lib/core/icore.js +15 -0
- package/lib/core/icore.js.map +1 -0
- package/lib/core/instancestorage.d.ts +61 -0
- package/lib/core/instancestorage.d.ts.map +1 -0
- package/lib/core/instancestorage.js +75 -0
- package/lib/core/instancestorage.js.map +1 -0
- package/lib/core/operations.d.ts +181 -0
- package/lib/core/operations.d.ts.map +1 -0
- package/lib/core/operations.js +559 -0
- package/lib/core/operations.js.map +1 -0
- package/lib/errors/errors.d.ts +126 -0
- package/lib/errors/errors.d.ts.map +1 -0
- package/lib/errors/errors.js +165 -0
- package/lib/errors/errors.js.map +1 -0
- package/lib/events/asynceventemitter.d.ts +159 -0
- package/lib/events/asynceventemitter.d.ts.map +1 -0
- package/lib/events/asynceventemitter.js +152 -0
- package/lib/events/asynceventemitter.js.map +1 -0
- package/lib/events/events.d.ts +112 -0
- package/lib/events/events.d.ts.map +1 -0
- package/lib/events/events.js +45 -0
- package/lib/events/events.js.map +1 -0
- package/lib/index.d.ts +82 -53
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +81 -62
- package/lib/index.js.map +1 -1
- package/lib/loggers/console.service.d.ts +24 -0
- package/lib/loggers/console.service.d.ts.map +1 -0
- package/lib/loggers/console.service.js +30 -0
- package/lib/loggers/console.service.js.map +1 -0
- package/lib/loggers/file.service.d.ts +25 -0
- package/lib/loggers/file.service.d.ts.map +1 -0
- package/lib/loggers/file.service.js +33 -0
- package/lib/loggers/file.service.js.map +1 -0
- package/lib/loggers/hooks.d.ts +20 -0
- package/lib/loggers/hooks.d.ts.map +1 -0
- package/lib/loggers/hooks.js +40 -0
- package/lib/loggers/hooks.js.map +1 -0
- package/lib/loggers/ilogger.d.ts +76 -0
- package/lib/loggers/ilogger.d.ts.map +1 -0
- package/lib/loggers/ilogger.js +108 -0
- package/lib/loggers/ilogger.js.map +1 -0
- package/lib/loggers/logger.d.ts +13 -0
- package/lib/loggers/logger.d.ts.map +1 -0
- package/lib/loggers/logger.js +18 -0
- package/lib/loggers/logger.js.map +1 -0
- package/lib/loggers/memory.service.d.ts +18 -0
- package/lib/loggers/memory.service.d.ts.map +1 -0
- package/lib/loggers/memory.service.js +21 -0
- package/lib/loggers/memory.service.js.map +1 -0
- package/lib/loggers/params.d.ts +47 -0
- package/lib/loggers/params.d.ts.map +1 -0
- package/lib/loggers/params.js +56 -0
- package/lib/loggers/params.js.map +1 -0
- package/lib/metrics/metrics.d.ts +25 -0
- package/lib/metrics/metrics.d.ts.map +1 -0
- package/lib/metrics/metrics.js +51 -0
- package/lib/metrics/metrics.js.map +1 -0
- package/lib/models/aclmodel.d.ts +20 -76
- package/lib/models/aclmodel.d.ts.map +1 -1
- package/lib/models/aclmodel.js +27 -203
- package/lib/models/aclmodel.js.map +1 -1
- package/lib/models/coremodel.model.d.ts +5 -0
- package/lib/models/coremodel.model.d.ts.map +1 -0
- package/lib/models/coremodel.model.js +5 -0
- package/lib/models/coremodel.model.js.map +1 -0
- package/lib/models/decorator.d.ts +63 -0
- package/lib/models/decorator.d.ts.map +1 -0
- package/lib/models/decorator.js +63 -0
- package/lib/models/decorator.js.map +1 -0
- package/lib/models/deployment.d.ts +1 -1
- package/lib/models/deployment.d.ts.map +1 -1
- package/lib/models/ident.model.d.ts +89 -0
- package/lib/models/ident.model.d.ts.map +1 -0
- package/lib/models/ident.model.js +115 -0
- package/lib/models/ident.model.js.map +1 -0
- package/lib/models/ownermodel.model.d.ts +68 -0
- package/lib/models/ownermodel.model.d.ts.map +1 -0
- package/lib/models/ownermodel.model.js +112 -0
- package/lib/models/ownermodel.model.js.map +1 -0
- package/lib/models/registry.model.d.ts +76 -0
- package/lib/models/registry.model.d.ts.map +1 -0
- package/lib/models/registry.model.js +104 -0
- package/lib/models/registry.model.js.map +1 -0
- package/lib/models/rolemodel.model.d.ts +28 -0
- package/lib/models/rolemodel.model.d.ts.map +1 -0
- package/lib/models/{rolemodel.js → rolemodel.model.js} +23 -5
- package/lib/models/rolemodel.model.js.map +1 -0
- package/lib/models/simpleuser.model.d.ts +78 -0
- package/lib/models/simpleuser.model.d.ts.map +1 -0
- package/lib/models/simpleuser.model.js +123 -0
- package/lib/models/simpleuser.model.js.map +1 -0
- package/lib/models/types.d.ts +113 -0
- package/lib/models/types.d.ts.map +1 -0
- package/lib/models/types.js +2 -0
- package/lib/models/types.js.map +1 -0
- package/lib/models/user.model.d.ts +103 -0
- package/lib/models/user.model.d.ts.map +1 -0
- package/lib/models/user.model.js +125 -0
- package/lib/models/user.model.js.map +1 -0
- package/lib/queues/{memoryqueue.d.ts → memoryqueue.service.d.ts} +26 -13
- package/lib/queues/memoryqueue.service.d.ts.map +1 -0
- package/lib/queues/{memoryqueue.js → memoryqueue.service.js} +55 -31
- package/lib/queues/memoryqueue.service.js.map +1 -0
- package/lib/queues/pubsubservice.d.ts +8 -6
- package/lib/queues/pubsubservice.d.ts.map +1 -1
- package/lib/queues/pubsubservice.js +5 -4
- package/lib/queues/pubsubservice.js.map +1 -1
- package/lib/queues/queueservice.d.ts +9 -11
- package/lib/queues/queueservice.d.ts.map +1 -1
- package/lib/queues/queueservice.js +41 -13
- package/lib/queues/queueservice.js.map +1 -1
- package/lib/rest/hooks.d.ts +8 -0
- package/lib/rest/hooks.d.ts.map +1 -0
- package/lib/rest/hooks.js +10 -0
- package/lib/rest/hooks.js.map +1 -0
- package/lib/rest/irest.d.ts +212 -0
- package/lib/rest/irest.d.ts.map +1 -0
- package/lib/rest/irest.js +39 -0
- package/lib/rest/irest.js.map +1 -0
- package/lib/rest/originfilter.d.ts +38 -0
- package/lib/rest/originfilter.d.ts.map +1 -0
- package/lib/rest/originfilter.js +61 -0
- package/lib/rest/originfilter.js.map +1 -0
- package/lib/rest/restoperationstransport.service.d.ts +193 -0
- package/lib/rest/restoperationstransport.service.d.ts.map +1 -0
- package/lib/rest/restoperationstransport.service.js +780 -0
- package/lib/rest/restoperationstransport.service.js.map +1 -0
- package/lib/rest/router.service.d.ts +244 -0
- package/lib/rest/router.service.d.ts.map +1 -0
- package/lib/rest/router.service.js +843 -0
- package/lib/rest/router.service.js.map +1 -0
- package/lib/schemas/hooks.d.ts +48 -0
- package/lib/schemas/hooks.d.ts.map +1 -0
- package/lib/schemas/hooks.js +152 -0
- package/lib/schemas/hooks.js.map +1 -0
- package/lib/services/audit.model.d.ts +208 -0
- package/lib/services/audit.model.d.ts.map +1 -0
- package/lib/services/audit.model.js +431 -0
- package/lib/services/audit.model.js.map +1 -0
- package/lib/services/{authentication.d.ts → authentication.service.d.ts} +140 -59
- package/lib/services/authentication.service.d.ts.map +1 -0
- package/lib/services/authentication.service.js +932 -0
- package/lib/services/authentication.service.js.map +1 -0
- package/lib/services/binary.service.d.ts +808 -0
- package/lib/services/binary.service.d.ts.map +1 -0
- package/lib/services/binary.service.js +1365 -0
- package/lib/services/binary.service.js.map +1 -0
- package/lib/services/cloudbinary.d.ts +17 -12
- package/lib/services/cloudbinary.d.ts.map +1 -1
- package/lib/services/cloudbinary.js +23 -17
- package/lib/services/cloudbinary.js.map +1 -1
- package/lib/services/command.d.ts +118 -0
- package/lib/services/command.d.ts.map +1 -0
- package/lib/services/command.js +97 -0
- package/lib/services/command.js.map +1 -0
- package/lib/services/cron.service.d.ts +142 -0
- package/lib/services/cron.service.d.ts.map +1 -0
- package/lib/services/cron.service.js +291 -0
- package/lib/services/cron.service.js.map +1 -0
- package/lib/services/{cryptoservice.d.ts → cryptoservice.service.d.ts} +75 -141
- package/lib/services/cryptoservice.service.d.ts.map +1 -0
- package/lib/services/cryptoservice.service.js +527 -0
- package/lib/services/cryptoservice.service.js.map +1 -0
- package/lib/services/debugmailer.service.d.ts +49 -0
- package/lib/services/debugmailer.service.d.ts.map +1 -0
- package/lib/services/{debugmailer.js → debugmailer.service.js} +25 -10
- package/lib/services/debugmailer.service.js.map +1 -0
- package/lib/services/domainservice.service.d.ts +203 -0
- package/lib/services/domainservice.service.d.ts.map +1 -0
- package/lib/services/domainservice.service.js +600 -0
- package/lib/services/domainservice.service.js.map +1 -0
- package/lib/services/httpserver.service.d.ts +248 -0
- package/lib/services/httpserver.service.d.ts.map +1 -0
- package/lib/services/httpserver.service.js +673 -0
- package/lib/services/httpserver.service.js.map +1 -0
- package/lib/services/iauthentication.d.ts +9 -0
- package/lib/services/iauthentication.d.ts.map +1 -0
- package/lib/services/iauthentication.js +2 -0
- package/lib/services/iauthentication.js.map +1 -0
- package/lib/services/icryptoservice.d.ts +127 -0
- package/lib/services/icryptoservice.d.ts.map +1 -0
- package/lib/services/icryptoservice.js +68 -0
- package/lib/services/icryptoservice.js.map +1 -0
- package/lib/services/imailer.d.ts +17 -0
- package/lib/services/imailer.d.ts.map +1 -0
- package/lib/services/imailer.js +2 -0
- package/lib/services/imailer.js.map +1 -0
- package/lib/services/iservice.d.ts +104 -0
- package/lib/services/iservice.d.ts.map +1 -0
- package/lib/services/iservice.js +63 -0
- package/lib/services/iservice.js.map +1 -0
- package/lib/services/mailer.service.d.ts +220 -0
- package/lib/services/mailer.service.d.ts.map +1 -0
- package/lib/services/mailer.service.js +251 -0
- package/lib/services/mailer.service.js.map +1 -0
- package/lib/services/{notificationservice.d.ts → notificationservice.service.d.ts} +10 -11
- package/lib/services/notificationservice.service.d.ts.map +1 -0
- package/lib/services/{notificationservice.js → notificationservice.service.js} +24 -12
- package/lib/services/notificationservice.service.js.map +1 -0
- package/lib/services/oauth.d.ts +52 -28
- package/lib/services/oauth.d.ts.map +1 -1
- package/lib/services/oauth.js +365 -254
- package/lib/services/oauth.js.map +1 -1
- package/lib/services/operationstransport.d.ts +65 -0
- package/lib/services/operationstransport.d.ts.map +1 -0
- package/lib/services/operationstransport.js +103 -0
- package/lib/services/operationstransport.js.map +1 -0
- package/lib/services/{prometheus.d.ts → prometheus.service.d.ts} +13 -12
- package/lib/services/prometheus.service.d.ts.map +1 -0
- package/lib/services/prometheus.service.js +203 -0
- package/lib/services/prometheus.service.js.map +1 -0
- package/lib/services/{resource.d.ts → resource.service.d.ts} +34 -15
- package/lib/services/resource.service.d.ts.map +1 -0
- package/lib/services/resource.service.js +301 -0
- package/lib/services/resource.service.js.map +1 -0
- package/lib/services/service.d.ts +87 -188
- package/lib/services/service.d.ts.map +1 -1
- package/lib/services/service.js +407 -422
- package/lib/services/service.js.map +1 -1
- package/lib/services/servicecommands.d.ts +99 -0
- package/lib/services/servicecommands.d.ts.map +1 -0
- package/lib/services/servicecommands.js +165 -0
- package/lib/services/servicecommands.js.map +1 -0
- package/lib/services/serviceparameters.d.ts +33 -0
- package/lib/services/serviceparameters.d.ts.map +1 -0
- package/lib/services/serviceparameters.js +79 -0
- package/lib/services/serviceparameters.js.map +1 -0
- package/lib/{utils → session}/cookie.d.ts +32 -19
- package/lib/session/cookie.d.ts.map +1 -0
- package/lib/{utils → session}/cookie.js +76 -23
- package/lib/session/cookie.js.map +1 -0
- package/lib/session/manager.model.d.ts +71 -0
- package/lib/session/manager.model.d.ts.map +1 -0
- package/lib/session/manager.model.js +155 -0
- package/lib/session/manager.model.js.map +1 -0
- package/lib/session/session.d.ts +57 -0
- package/lib/session/session.d.ts.map +1 -0
- package/lib/session/session.js +126 -0
- package/lib/session/session.js.map +1 -0
- package/lib/stores/istore.d.ts +99 -0
- package/lib/stores/istore.d.ts.map +1 -0
- package/lib/stores/istore.js +26 -0
- package/lib/stores/istore.js.map +1 -0
- package/lib/stores/memory.service.d.ts +114 -0
- package/lib/stores/memory.service.d.ts.map +1 -0
- package/lib/stores/memory.service.js +343 -0
- package/lib/stores/memory.service.js.map +1 -0
- package/lib/stores/store.d.ts +126 -626
- package/lib/stores/store.d.ts.map +1 -1
- package/lib/stores/store.js +257 -1117
- package/lib/stores/store.js.map +1 -1
- package/lib/templates/templates.d.ts +39 -0
- package/lib/templates/templates.d.ts.map +1 -0
- package/lib/templates/templates.js +92 -0
- package/lib/templates/templates.js.map +1 -0
- package/lib/test/application.d.ts +174 -0
- package/lib/test/application.d.ts.map +1 -0
- package/lib/test/application.js +288 -0
- package/lib/test/application.js.map +1 -0
- package/lib/test/asyncstorage.d.ts +16 -0
- package/lib/test/asyncstorage.d.ts.map +1 -0
- package/lib/test/asyncstorage.js +32 -0
- package/lib/test/asyncstorage.js.map +1 -0
- package/lib/test/core.d.ts +63 -0
- package/lib/test/core.d.ts.map +1 -0
- package/lib/test/core.js +190 -0
- package/lib/test/core.js.map +1 -0
- package/lib/test/index.d.ts +7 -0
- package/lib/test/index.d.ts.map +1 -0
- package/lib/test/index.js +8 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/internal.d.ts +34 -0
- package/lib/test/internal.d.ts.map +1 -0
- package/lib/test/internal.js +156 -0
- package/lib/test/internal.js.map +1 -0
- package/lib/test/objects.d.ts +318 -0
- package/lib/test/objects.d.ts.map +1 -0
- package/lib/test/objects.js +443 -0
- package/lib/test/objects.js.map +1 -0
- package/lib/utils/abstractdeployer.d.ts +4 -2
- package/lib/utils/abstractdeployer.d.ts.map +1 -1
- package/lib/utils/abstractdeployer.js +3 -0
- package/lib/utils/abstractdeployer.js.map +1 -1
- package/package.json +85 -60
- package/test/cachedapp/webda.config.json +1 -5
- package/test/config-cached.json +1 -5
- package/test/config.json +0 -9
- package/test/my-cnf.json +9 -0
- package/webda.module.json +3463 -2482
- package/lib/application.d.ts +0 -888
- package/lib/application.d.ts.map +0 -1
- package/lib/application.js +0 -768
- package/lib/application.js.map +0 -1
- package/lib/application.spec.d.ts +0 -2
- package/lib/application.spec.d.ts.map +0 -1
- package/lib/application.spec.js +0 -248
- package/lib/application.spec.js.map +0 -1
- package/lib/core.d.ts +0 -743
- package/lib/core.d.ts.map +0 -1
- package/lib/core.js +0 -1334
- package/lib/core.js.map +0 -1
- package/lib/core.spec.d.ts +0 -2
- package/lib/core.spec.d.ts.map +0 -1
- package/lib/core.spec.js +0 -790
- package/lib/core.spec.js.map +0 -1
- package/lib/errors.d.ts +0 -64
- package/lib/errors.d.ts.map +0 -1
- package/lib/errors.js +0 -97
- package/lib/errors.js.map +0 -1
- package/lib/errors.spec.d.ts +0 -2
- package/lib/errors.spec.d.ts.map +0 -1
- package/lib/errors.spec.js +0 -33
- package/lib/errors.spec.js.map +0 -1
- package/lib/models/aclmodel.spec.d.ts +0 -2
- package/lib/models/aclmodel.spec.d.ts.map +0 -1
- package/lib/models/aclmodel.spec.js +0 -187
- package/lib/models/aclmodel.spec.js.map +0 -1
- package/lib/models/coremodel.d.ts +0 -896
- package/lib/models/coremodel.d.ts.map +0 -1
- package/lib/models/coremodel.js +0 -1214
- package/lib/models/coremodel.js.map +0 -1
- package/lib/models/coremodel.spec.d.ts +0 -2
- package/lib/models/coremodel.spec.d.ts.map +0 -1
- package/lib/models/coremodel.spec.js +0 -464
- package/lib/models/coremodel.spec.js.map +0 -1
- package/lib/models/ident.d.ts +0 -68
- package/lib/models/ident.d.ts.map +0 -1
- package/lib/models/ident.js +0 -26
- package/lib/models/ident.js.map +0 -1
- package/lib/models/ident.spec.d.ts +0 -2
- package/lib/models/ident.spec.d.ts.map +0 -1
- package/lib/models/ident.spec.js +0 -24
- package/lib/models/ident.spec.js.map +0 -1
- package/lib/models/ownermodel.d.ts +0 -51
- package/lib/models/ownermodel.d.ts.map +0 -1
- package/lib/models/ownermodel.js +0 -65
- package/lib/models/ownermodel.js.map +0 -1
- package/lib/models/ownermodel.spec.d.ts +0 -2
- package/lib/models/ownermodel.spec.d.ts.map +0 -1
- package/lib/models/ownermodel.spec.js +0 -215
- package/lib/models/ownermodel.spec.js.map +0 -1
- package/lib/models/relations.d.ts +0 -182
- package/lib/models/relations.d.ts.map +0 -1
- package/lib/models/relations.js +0 -157
- package/lib/models/relations.js.map +0 -1
- package/lib/models/relations.spec.d.ts +0 -14
- package/lib/models/relations.spec.d.ts.map +0 -1
- package/lib/models/relations.spec.js +0 -217
- package/lib/models/relations.spec.js.map +0 -1
- package/lib/models/rolemodel.d.ts +0 -11
- package/lib/models/rolemodel.d.ts.map +0 -1
- package/lib/models/rolemodel.js.map +0 -1
- package/lib/models/rolemodel.spec.d.ts +0 -2
- package/lib/models/rolemodel.spec.d.ts.map +0 -1
- package/lib/models/rolemodel.spec.js +0 -90
- package/lib/models/rolemodel.spec.js.map +0 -1
- package/lib/models/simpleuser.d.ts +0 -47
- package/lib/models/simpleuser.d.ts.map +0 -1
- package/lib/models/simpleuser.js +0 -84
- package/lib/models/simpleuser.js.map +0 -1
- package/lib/models/test.d.ts +0 -11
- package/lib/models/test.d.ts.map +0 -1
- package/lib/models/test.js +0 -7
- package/lib/models/test.js.map +0 -1
- package/lib/models/user.d.ts +0 -67
- package/lib/models/user.d.ts.map +0 -1
- package/lib/models/user.js +0 -86
- package/lib/models/user.js.map +0 -1
- package/lib/models/user.spec.d.ts +0 -2
- package/lib/models/user.spec.d.ts.map +0 -1
- package/lib/models/user.spec.js +0 -89
- package/lib/models/user.spec.js.map +0 -1
- package/lib/queues/filequeue.d.ts +0 -59
- package/lib/queues/filequeue.d.ts.map +0 -1
- package/lib/queues/filequeue.js +0 -131
- package/lib/queues/filequeue.js.map +0 -1
- package/lib/queues/filequeue.spec.d.ts +0 -2
- package/lib/queues/filequeue.spec.d.ts.map +0 -1
- package/lib/queues/filequeue.spec.js +0 -84
- package/lib/queues/filequeue.spec.js.map +0 -1
- package/lib/queues/memoryqueue.d.ts.map +0 -1
- package/lib/queues/memoryqueue.js.map +0 -1
- package/lib/queues/memoryqueue.spec.d.ts +0 -2
- package/lib/queues/memoryqueue.spec.d.ts.map +0 -1
- package/lib/queues/memoryqueue.spec.js +0 -203
- package/lib/queues/memoryqueue.spec.js.map +0 -1
- package/lib/queues/queue.spec.d.ts +0 -6
- package/lib/queues/queue.spec.d.ts.map +0 -1
- package/lib/queues/queue.spec.js +0 -55
- package/lib/queues/queue.spec.js.map +0 -1
- package/lib/rest/restdomainservice.d.ts +0 -63
- package/lib/rest/restdomainservice.d.ts.map +0 -1
- package/lib/rest/restdomainservice.js +0 -687
- package/lib/rest/restdomainservice.js.map +0 -1
- package/lib/rest/restdomainservice.spec.d.ts +0 -2
- package/lib/rest/restdomainservice.spec.d.ts.map +0 -1
- package/lib/rest/restdomainservice.spec.js +0 -124
- package/lib/rest/restdomainservice.spec.js.map +0 -1
- package/lib/rest/router.d.ts +0 -174
- package/lib/rest/router.d.ts.map +0 -1
- package/lib/rest/router.js +0 -429
- package/lib/rest/router.js.map +0 -1
- package/lib/rest/router.spec.d.ts +0 -2
- package/lib/rest/router.spec.d.ts.map +0 -1
- package/lib/rest/router.spec.js +0 -255
- package/lib/rest/router.spec.js.map +0 -1
- package/lib/services/asyncevents.d.ts +0 -152
- package/lib/services/asyncevents.d.ts.map +0 -1
- package/lib/services/asyncevents.js +0 -217
- package/lib/services/asyncevents.js.map +0 -1
- package/lib/services/asyncevents.spec.d.ts +0 -2
- package/lib/services/asyncevents.spec.d.ts.map +0 -1
- package/lib/services/asyncevents.spec.js +0 -118
- package/lib/services/asyncevents.spec.js.map +0 -1
- package/lib/services/authentication.d.ts.map +0 -1
- package/lib/services/authentication.js +0 -773
- package/lib/services/authentication.js.map +0 -1
- package/lib/services/authentication.spec.d.ts +0 -2
- package/lib/services/authentication.spec.d.ts.map +0 -1
- package/lib/services/authentication.spec.js +0 -458
- package/lib/services/authentication.spec.js.map +0 -1
- package/lib/services/binary.d.ts +0 -477
- package/lib/services/binary.d.ts.map +0 -1
- package/lib/services/binary.js +0 -617
- package/lib/services/binary.js.map +0 -1
- package/lib/services/binary.spec.d.ts +0 -41
- package/lib/services/binary.spec.d.ts.map +0 -1
- package/lib/services/binary.spec.js +0 -151
- package/lib/services/binary.spec.js.map +0 -1
- package/lib/services/cloudbinary.spec.d.ts +0 -6
- package/lib/services/cloudbinary.spec.d.ts.map +0 -1
- package/lib/services/cloudbinary.spec.js +0 -66
- package/lib/services/cloudbinary.spec.js.map +0 -1
- package/lib/services/configuration.d.ts.map +0 -1
- package/lib/services/configuration.js +0 -193
- package/lib/services/configuration.js.map +0 -1
- package/lib/services/configuration.spec.d.ts +0 -2
- package/lib/services/configuration.spec.d.ts.map +0 -1
- package/lib/services/configuration.spec.js +0 -130
- package/lib/services/configuration.spec.js.map +0 -1
- package/lib/services/cron.d.ts +0 -74
- package/lib/services/cron.d.ts.map +0 -1
- package/lib/services/cron.js +0 -141
- package/lib/services/cron.js.map +0 -1
- package/lib/services/cron.spec.d.ts +0 -2
- package/lib/services/cron.spec.d.ts.map +0 -1
- package/lib/services/cron.spec.js +0 -76
- package/lib/services/cron.spec.js.map +0 -1
- package/lib/services/cryptoservice.d.ts.map +0 -1
- package/lib/services/cryptoservice.js +0 -433
- package/lib/services/cryptoservice.js.map +0 -1
- package/lib/services/cryptoservice.spec.d.ts +0 -2
- package/lib/services/cryptoservice.spec.d.ts.map +0 -1
- package/lib/services/cryptoservice.spec.js +0 -177
- package/lib/services/cryptoservice.spec.js.map +0 -1
- package/lib/services/debugmailer.d.ts +0 -36
- package/lib/services/debugmailer.d.ts.map +0 -1
- package/lib/services/debugmailer.js.map +0 -1
- package/lib/services/debugmailer.spec.d.ts +0 -2
- package/lib/services/debugmailer.spec.d.ts.map +0 -1
- package/lib/services/debugmailer.spec.js +0 -32
- package/lib/services/debugmailer.spec.js.map +0 -1
- package/lib/services/domainservice.d.ts +0 -272
- package/lib/services/domainservice.d.ts.map +0 -1
- package/lib/services/domainservice.js +0 -651
- package/lib/services/domainservice.js.map +0 -1
- package/lib/services/domainservice.spec.d.ts +0 -2
- package/lib/services/domainservice.spec.d.ts.map +0 -1
- package/lib/services/domainservice.spec.js +0 -592
- package/lib/services/domainservice.spec.js.map +0 -1
- package/lib/services/filebinary.d.ts +0 -136
- package/lib/services/filebinary.d.ts.map +0 -1
- package/lib/services/filebinary.js +0 -373
- package/lib/services/filebinary.js.map +0 -1
- package/lib/services/filebinary.spec.d.ts +0 -25
- package/lib/services/filebinary.spec.d.ts.map +0 -1
- package/lib/services/filebinary.spec.js +0 -428
- package/lib/services/filebinary.spec.js.map +0 -1
- package/lib/services/fileconfiguration.d.ts +0 -23
- package/lib/services/fileconfiguration.d.ts.map +0 -1
- package/lib/services/fileconfiguration.js +0 -48
- package/lib/services/fileconfiguration.js.map +0 -1
- package/lib/services/fileconfiguration.spec.d.ts +0 -2
- package/lib/services/fileconfiguration.spec.d.ts.map +0 -1
- package/lib/services/fileconfiguration.spec.js +0 -215
- package/lib/services/fileconfiguration.spec.js.map +0 -1
- package/lib/services/invitationservice.d.ts +0 -223
- package/lib/services/invitationservice.d.ts.map +0 -1
- package/lib/services/invitationservice.js +0 -529
- package/lib/services/invitationservice.js.map +0 -1
- package/lib/services/invitationservice.spec.d.ts +0 -2
- package/lib/services/invitationservice.spec.d.ts.map +0 -1
- package/lib/services/invitationservice.spec.js +0 -567
- package/lib/services/invitationservice.spec.js.map +0 -1
- package/lib/services/kubernetesconfiguration.d.ts +0 -27
- package/lib/services/kubernetesconfiguration.d.ts.map +0 -1
- package/lib/services/kubernetesconfiguration.js +0 -52
- package/lib/services/kubernetesconfiguration.js.map +0 -1
- package/lib/services/kubernetesconfiguration.spec.d.ts +0 -2
- package/lib/services/kubernetesconfiguration.spec.d.ts.map +0 -1
- package/lib/services/kubernetesconfiguration.spec.js +0 -206
- package/lib/services/kubernetesconfiguration.spec.js.map +0 -1
- package/lib/services/mailer.d.ts +0 -166
- package/lib/services/mailer.d.ts.map +0 -1
- package/lib/services/mailer.js +0 -176
- package/lib/services/mailer.js.map +0 -1
- package/lib/services/mailer.spec.d.ts +0 -2
- package/lib/services/mailer.spec.d.ts.map +0 -1
- package/lib/services/mailer.spec.js +0 -158
- package/lib/services/mailer.spec.js.map +0 -1
- package/lib/services/notificationservice.d.ts.map +0 -1
- package/lib/services/notificationservice.js.map +0 -1
- package/lib/services/notificationservice.spec.d.ts +0 -2
- package/lib/services/notificationservice.spec.d.ts.map +0 -1
- package/lib/services/notificationservice.spec.js +0 -83
- package/lib/services/notificationservice.spec.js.map +0 -1
- package/lib/services/oauth.spec.d.ts +0 -2
- package/lib/services/oauth.spec.d.ts.map +0 -1
- package/lib/services/oauth.spec.js +0 -208
- package/lib/services/oauth.spec.js.map +0 -1
- package/lib/services/prometheus.d.ts.map +0 -1
- package/lib/services/prometheus.js +0 -160
- package/lib/services/prometheus.js.map +0 -1
- package/lib/services/prometheus.spec.d.ts +0 -2
- package/lib/services/prometheus.spec.d.ts.map +0 -1
- package/lib/services/prometheus.spec.js +0 -76
- package/lib/services/prometheus.spec.js.map +0 -1
- package/lib/services/resource.d.ts.map +0 -1
- package/lib/services/resource.js +0 -170
- package/lib/services/resource.js.map +0 -1
- package/lib/services/resource.spec.d.ts +0 -2
- package/lib/services/resource.spec.d.ts.map +0 -1
- package/lib/services/resource.spec.js +0 -140
- package/lib/services/resource.spec.js.map +0 -1
- package/lib/services/service.spec.d.ts +0 -2
- package/lib/services/service.spec.d.ts.map +0 -1
- package/lib/services/service.spec.js +0 -286
- package/lib/services/service.spec.js.map +0 -1
- package/lib/stores/aggregator.d.ts +0 -48
- package/lib/stores/aggregator.d.ts.map +0 -1
- package/lib/stores/aggregator.js +0 -80
- package/lib/stores/aggregator.js.map +0 -1
- package/lib/stores/file.d.ts +0 -108
- package/lib/stores/file.d.ts.map +0 -1
- package/lib/stores/file.js +0 -188
- package/lib/stores/file.js.map +0 -1
- package/lib/stores/file.spec.d.ts +0 -13
- package/lib/stores/file.spec.d.ts.map +0 -1
- package/lib/stores/file.spec.js +0 -138
- package/lib/stores/file.spec.js.map +0 -1
- package/lib/stores/mapper.d.ts +0 -150
- package/lib/stores/mapper.d.ts.map +0 -1
- package/lib/stores/mapper.js +0 -293
- package/lib/stores/mapper.js.map +0 -1
- package/lib/stores/mapper.spec.d.ts +0 -2
- package/lib/stores/mapper.spec.d.ts.map +0 -1
- package/lib/stores/mapper.spec.js +0 -167
- package/lib/stores/mapper.spec.js.map +0 -1
- package/lib/stores/memory.d.ts +0 -152
- package/lib/stores/memory.d.ts.map +0 -1
- package/lib/stores/memory.js +0 -371
- package/lib/stores/memory.js.map +0 -1
- package/lib/stores/memory.spec.d.ts +0 -14
- package/lib/stores/memory.spec.d.ts.map +0 -1
- package/lib/stores/memory.spec.js +0 -263
- package/lib/stores/memory.spec.js.map +0 -1
- package/lib/stores/modelmapper.d.ts +0 -62
- package/lib/stores/modelmapper.d.ts.map +0 -1
- package/lib/stores/modelmapper.js +0 -197
- package/lib/stores/modelmapper.js.map +0 -1
- package/lib/stores/store.spec.d.ts +0 -57
- package/lib/stores/store.spec.d.ts.map +0 -1
- package/lib/stores/store.spec.js +0 -737
- package/lib/stores/store.spec.js.map +0 -1
- package/lib/test.d.ts +0 -265
- package/lib/test.d.ts.map +0 -1
- package/lib/test.js +0 -622
- package/lib/test.js.map +0 -1
- package/lib/unpackedapplication.d.ts.map +0 -1
- package/lib/unpackedapplication.js +0 -350
- package/lib/unpackedapplication.js.map +0 -1
- package/lib/utils/abstractdeployer.spec.d.ts +0 -2
- package/lib/utils/abstractdeployer.spec.d.ts.map +0 -1
- package/lib/utils/abstractdeployer.spec.js +0 -21
- package/lib/utils/abstractdeployer.spec.js.map +0 -1
- package/lib/utils/case.d.ts +0 -8
- package/lib/utils/case.d.ts.map +0 -1
- package/lib/utils/case.js +0 -43
- package/lib/utils/case.js.map +0 -1
- package/lib/utils/case.spec.d.ts +0 -2
- package/lib/utils/case.spec.d.ts.map +0 -1
- package/lib/utils/case.spec.js +0 -50
- package/lib/utils/case.spec.js.map +0 -1
- package/lib/utils/context.d.ts +0 -482
- package/lib/utils/context.d.ts.map +0 -1
- package/lib/utils/context.js +0 -739
- package/lib/utils/context.js.map +0 -1
- package/lib/utils/context.spec.d.ts +0 -10
- package/lib/utils/context.spec.d.ts.map +0 -1
- package/lib/utils/context.spec.js +0 -383
- package/lib/utils/context.spec.js.map +0 -1
- package/lib/utils/cookie.d.ts.map +0 -1
- package/lib/utils/cookie.js.map +0 -1
- package/lib/utils/cookie.spec.d.ts +0 -2
- package/lib/utils/cookie.spec.d.ts.map +0 -1
- package/lib/utils/cookie.spec.js +0 -88
- package/lib/utils/cookie.spec.js.map +0 -1
- package/lib/utils/esm.d.ts +0 -14
- package/lib/utils/esm.d.ts.map +0 -1
- package/lib/utils/esm.js +0 -19
- package/lib/utils/esm.js.map +0 -1
- package/lib/utils/httpcontext.d.ts.map +0 -1
- package/lib/utils/httpcontext.js.map +0 -1
- package/lib/utils/httpcontext.spec.d.ts +0 -5
- package/lib/utils/httpcontext.spec.d.ts.map +0 -1
- package/lib/utils/httpcontext.spec.js +0 -77
- package/lib/utils/httpcontext.spec.js.map +0 -1
- package/lib/utils/logger.d.ts +0 -92
- package/lib/utils/logger.d.ts.map +0 -1
- package/lib/utils/logger.js +0 -121
- package/lib/utils/logger.js.map +0 -1
- package/lib/utils/logger.spec.d.ts +0 -2
- package/lib/utils/logger.spec.d.ts.map +0 -1
- package/lib/utils/logger.spec.js +0 -48
- package/lib/utils/logger.spec.js.map +0 -1
- package/lib/utils/serializers.d.ts +0 -162
- package/lib/utils/serializers.d.ts.map +0 -1
- package/lib/utils/serializers.js +0 -420
- package/lib/utils/serializers.js.map +0 -1
- package/lib/utils/serializers.spec.d.ts +0 -2
- package/lib/utils/serializers.spec.d.ts.map +0 -1
- package/lib/utils/serializers.spec.js +0 -311
- package/lib/utils/serializers.spec.js.map +0 -1
- package/lib/utils/session.d.ts +0 -123
- package/lib/utils/session.d.ts.map +0 -1
- package/lib/utils/session.js +0 -156
- package/lib/utils/session.js.map +0 -1
- package/lib/utils/session.spec.d.ts +0 -2
- package/lib/utils/session.spec.d.ts.map +0 -1
- package/lib/utils/session.spec.js +0 -81
- package/lib/utils/session.spec.js.map +0 -1
- package/lib/utils/throttler.d.ts +0 -99
- package/lib/utils/throttler.d.ts.map +0 -1
- package/lib/utils/throttler.js +0 -160
- package/lib/utils/throttler.js.map +0 -1
- package/lib/utils/throttler.spec.d.ts +0 -2
- package/lib/utils/throttler.spec.d.ts.map +0 -1
- package/lib/utils/throttler.spec.js +0 -53
- package/lib/utils/throttler.spec.js.map +0 -1
- package/lib/utils/waiter.d.ts +0 -94
- package/lib/utils/waiter.d.ts.map +0 -1
- package/lib/utils/waiter.js +0 -148
- package/lib/utils/waiter.js.map +0 -1
- package/lib/utils/waiter.spec.d.ts +0 -2
- package/lib/utils/waiter.spec.d.ts.map +0 -1
- package/lib/utils/waiter.spec.js +0 -98
- package/lib/utils/waiter.spec.js.map +0 -1
- package/test/jsonutils/mdocs.yaml +0 -56
- package/test/jsonutils/test.json +0 -3
- package/test/jsonutils/test.yml +0 -5
|
@@ -0,0 +1,780 @@
|
|
|
1
|
+
import { QueryValidator } from "@webda/ql";
|
|
2
|
+
import { TransformCase } from "@webda/utils";
|
|
3
|
+
import { OperationsTransport, OperationsTransportParameters } from "../services/operationstransport.js";
|
|
4
|
+
import * as WebdaError from "../errors/errors.js";
|
|
5
|
+
import { useRouter } from "./hooks.js";
|
|
6
|
+
import { useApplication } from "../application/hooks.js";
|
|
7
|
+
import { useCore, useModelMetadata } from "../core/hooks.js";
|
|
8
|
+
import { useInstanceStorage } from "../core/instancestorage.js";
|
|
9
|
+
import { callOperation } from "../core/operations.js";
|
|
10
|
+
import { hasSchema } from "../schemas/hooks.js";
|
|
11
|
+
/**
|
|
12
|
+
* Swagger static html
|
|
13
|
+
*/
|
|
14
|
+
const SWAGGER_HTML = `
|
|
15
|
+
<html>
|
|
16
|
+
<head>
|
|
17
|
+
<meta charset="UTF-8">
|
|
18
|
+
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/{{VERSION}}/swagger-ui.css" >
|
|
19
|
+
<style>
|
|
20
|
+
.topbar {
|
|
21
|
+
display: none;
|
|
22
|
+
}
|
|
23
|
+
</style>
|
|
24
|
+
</head>
|
|
25
|
+
|
|
26
|
+
<body>
|
|
27
|
+
<div id="swagger-ui"></div>
|
|
28
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/{{VERSION}}/swagger-ui-bundle.js"> </script>
|
|
29
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/{{VERSION}}/swagger-ui-standalone-preset.js"> </script>
|
|
30
|
+
<script>
|
|
31
|
+
const spec = {{OPENAPI}};
|
|
32
|
+
window.onload = function() {
|
|
33
|
+
const ui = SwaggerUIBundle({
|
|
34
|
+
spec: spec,
|
|
35
|
+
dom_id: '#swagger-ui',
|
|
36
|
+
deepLinking: true,
|
|
37
|
+
presets: [
|
|
38
|
+
SwaggerUIBundle.presets.apis,
|
|
39
|
+
SwaggerUIStandalonePreset
|
|
40
|
+
],
|
|
41
|
+
plugins: [
|
|
42
|
+
SwaggerUIBundle.plugins.DownloadUrl
|
|
43
|
+
],
|
|
44
|
+
layout: "StandaloneLayout"
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
window.ui = ui
|
|
48
|
+
}
|
|
49
|
+
</script>
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* Parameters for RESTOperationsTransport
|
|
55
|
+
*/
|
|
56
|
+
export class RESTOperationsTransportParameters extends OperationsTransportParameters {
|
|
57
|
+
/**
|
|
58
|
+
* Expose the OpenAPI
|
|
59
|
+
*
|
|
60
|
+
* @default true if debug false otherwise
|
|
61
|
+
*/
|
|
62
|
+
exposeOpenAPI;
|
|
63
|
+
/**
|
|
64
|
+
* Swagger version to use
|
|
65
|
+
*
|
|
66
|
+
* https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui.css
|
|
67
|
+
* https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-bundle.js
|
|
68
|
+
* https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-standalone-preset.js
|
|
69
|
+
*
|
|
70
|
+
* TODO Add renovatebot regex
|
|
71
|
+
*/
|
|
72
|
+
swaggerVersion = "5.31.0";
|
|
73
|
+
/**
|
|
74
|
+
* Base URL for the REST API
|
|
75
|
+
*/
|
|
76
|
+
url = "/";
|
|
77
|
+
/**
|
|
78
|
+
* Transform the name of the model to be used in the URL
|
|
79
|
+
*
|
|
80
|
+
* @see https://blog.boot.dev/clean-code/casings-in-coding/
|
|
81
|
+
* @default camelCase
|
|
82
|
+
*/
|
|
83
|
+
nameTransformer;
|
|
84
|
+
/**
|
|
85
|
+
* Method used for query objects
|
|
86
|
+
*
|
|
87
|
+
* @default "PUT"
|
|
88
|
+
*/
|
|
89
|
+
queryMethod;
|
|
90
|
+
/**
|
|
91
|
+
* Load parameters with defaults
|
|
92
|
+
* @param params - the service parameters
|
|
93
|
+
* @returns this for chaining
|
|
94
|
+
*/
|
|
95
|
+
load(params = {}) {
|
|
96
|
+
super.load(params);
|
|
97
|
+
this.nameTransformer ??= "camelCase";
|
|
98
|
+
this.queryMethod ??= "PUT";
|
|
99
|
+
// Ensure url ends with /
|
|
100
|
+
if (this.url && !this.url.endsWith("/")) {
|
|
101
|
+
this.url += "/";
|
|
102
|
+
}
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* REST transport that exposes model operations as RESTful HTTP routes.
|
|
108
|
+
*
|
|
109
|
+
* Instead of iterating operations flat, it walks the model tree
|
|
110
|
+
* (parent/child relationships) to build nested URL prefixes like
|
|
111
|
+
* `/companies/{pid.0}/users/{uuid}`.
|
|
112
|
+
*
|
|
113
|
+
* @WebdaModda
|
|
114
|
+
*/
|
|
115
|
+
export class RESTOperationsTransport extends OperationsTransport {
|
|
116
|
+
/**
|
|
117
|
+
* OpenAPI cache
|
|
118
|
+
*/
|
|
119
|
+
openapiContent;
|
|
120
|
+
/**
|
|
121
|
+
* Transform name using configured casing
|
|
122
|
+
* @param name - the name to transform
|
|
123
|
+
* @returns the transformed name
|
|
124
|
+
*/
|
|
125
|
+
transformName(name) {
|
|
126
|
+
return TransformCase(name, this.parameters.nameTransformer);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resolve the service - set up OpenAPI route if configured
|
|
130
|
+
* @returns this for chaining
|
|
131
|
+
*/
|
|
132
|
+
resolve() {
|
|
133
|
+
this.parameters.exposeOpenAPI ??= useCore().isDebug();
|
|
134
|
+
super.resolve();
|
|
135
|
+
if (this.parameters.exposeOpenAPI) {
|
|
136
|
+
this.addRoute(".", ["GET"], this.openapi, { hidden: true });
|
|
137
|
+
}
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Override initTransport to walk the model tree instead of flat iteration.
|
|
142
|
+
* For each model, we look up its operations and register REST routes.
|
|
143
|
+
*/
|
|
144
|
+
initTransport() {
|
|
145
|
+
const app = useApplication();
|
|
146
|
+
const models = app.getModels();
|
|
147
|
+
const operations = this.getOperations();
|
|
148
|
+
// Build a set of models that have parents, and find root models
|
|
149
|
+
const childModels = new Set();
|
|
150
|
+
for (const modelKey in models) {
|
|
151
|
+
const model = models[modelKey];
|
|
152
|
+
if (!model)
|
|
153
|
+
continue;
|
|
154
|
+
const metadata = useModelMetadata(model);
|
|
155
|
+
if (!metadata)
|
|
156
|
+
continue;
|
|
157
|
+
if (!app.isFinalModel(metadata.Identifier))
|
|
158
|
+
continue;
|
|
159
|
+
if (metadata.Relations?.parent) {
|
|
160
|
+
childModels.add(metadata.Identifier);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Walk root models (no parent)
|
|
164
|
+
for (const modelKey in models) {
|
|
165
|
+
const model = models[modelKey];
|
|
166
|
+
if (!model)
|
|
167
|
+
continue;
|
|
168
|
+
const metadata = useModelMetadata(model);
|
|
169
|
+
if (!metadata)
|
|
170
|
+
continue;
|
|
171
|
+
if (!app.isFinalModel(metadata.Identifier))
|
|
172
|
+
continue;
|
|
173
|
+
if (childModels.has(metadata.Identifier))
|
|
174
|
+
continue;
|
|
175
|
+
// This is a root model - walk it
|
|
176
|
+
this.walkModel(model, metadata, operations, this.parameters.url, 0);
|
|
177
|
+
}
|
|
178
|
+
// Expose non-model operations (e.g., bean @Operation methods) that have REST hints
|
|
179
|
+
this.exposeServiceOperations(operations);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Expose service/bean operations that have rest hints but aren't tied to model CRUD.
|
|
183
|
+
* These are operations registered by Service.initOperations() from @Operation decorators.
|
|
184
|
+
* @param operations - the filtered operations map
|
|
185
|
+
*/
|
|
186
|
+
exposeServiceOperations(operations) {
|
|
187
|
+
for (const [opId, op] of Object.entries(operations)) {
|
|
188
|
+
if (op.hidden)
|
|
189
|
+
continue;
|
|
190
|
+
// Skip if this operation was already handled by model tree walk
|
|
191
|
+
if (op.context?.model)
|
|
192
|
+
continue;
|
|
193
|
+
let path;
|
|
194
|
+
let methods;
|
|
195
|
+
if (op.rest) {
|
|
196
|
+
const rest = op.rest;
|
|
197
|
+
path = rest.path.startsWith("/") ? rest.path : `${this.parameters.url}${rest.path}`;
|
|
198
|
+
methods = [rest.method.toUpperCase()];
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Default: expose as operationId.toLowerCase().replace(".", "/")
|
|
202
|
+
path = `${this.parameters.url}${opId.toLowerCase().replace(/\./g, "/")}`;
|
|
203
|
+
methods = ["PUT"];
|
|
204
|
+
}
|
|
205
|
+
const openapi = {
|
|
206
|
+
[methods[0].toLowerCase()]: {
|
|
207
|
+
tags: op.tags || [],
|
|
208
|
+
summary: op.summary || opId,
|
|
209
|
+
operationId: opId
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
this.addRoute(path, methods, async (context) => {
|
|
213
|
+
await callOperation(context, opId);
|
|
214
|
+
}, openapi);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Recursively walk a model and its children, registering routes at each level
|
|
219
|
+
* @param model - the model class
|
|
220
|
+
* @param metadata - model metadata
|
|
221
|
+
* @param operations - filtered operations map
|
|
222
|
+
* @param basePrefix - URL prefix from parent context
|
|
223
|
+
* @param depth - nesting depth for parent id parameters
|
|
224
|
+
*/
|
|
225
|
+
walkModel(model, metadata, operations, basePrefix, depth) {
|
|
226
|
+
const app = useApplication();
|
|
227
|
+
const { Relations: relations, Identifier, Plural: plural, Actions: actions } = metadata;
|
|
228
|
+
const injectAttribute = relations?.parent?.attribute;
|
|
229
|
+
const shortId = Identifier.split("/").pop();
|
|
230
|
+
const name = plural;
|
|
231
|
+
// Build prefix for this model
|
|
232
|
+
const prefix = basePrefix + this.transformName(name);
|
|
233
|
+
// Register the model url with the router
|
|
234
|
+
useRouter()?.registerModelUrl(app.getModelId(model), prefix);
|
|
235
|
+
// Register routes for standard CRUD operations
|
|
236
|
+
this.exposeQueryRoute(prefix, plural, shortId, Identifier, depth, injectAttribute, operations);
|
|
237
|
+
this.exposeCreateRoute(prefix, shortId, Identifier, depth, injectAttribute, operations);
|
|
238
|
+
this.exposeDeleteRoute(prefix, shortId, Identifier, operations);
|
|
239
|
+
this.exposeUpdateRoute(prefix, shortId, Identifier, operations);
|
|
240
|
+
this.exposeGetRoute(prefix, shortId, Identifier, operations);
|
|
241
|
+
// Register action routes
|
|
242
|
+
const actionsName = Object.keys(actions);
|
|
243
|
+
actionsName
|
|
244
|
+
.filter(k => !["create", "update", "delete", "get", "query"].includes(k))
|
|
245
|
+
.forEach(actionName => {
|
|
246
|
+
this.exposeActionRoute(prefix, shortId, Identifier, actionName, actions[actionName], depth, injectAttribute);
|
|
247
|
+
});
|
|
248
|
+
// Register behavior routes
|
|
249
|
+
(relations.behaviors || []).forEach(behavior => {
|
|
250
|
+
this.exposeBehaviorRoutes(prefix, shortId, Identifier, name, behavior);
|
|
251
|
+
});
|
|
252
|
+
// Find children (models whose parent points to this model)
|
|
253
|
+
const childPrefix = prefix + `/{pid.${depth}}/`;
|
|
254
|
+
const models = app.getModels();
|
|
255
|
+
for (const childKey in models) {
|
|
256
|
+
const childModel = models[childKey];
|
|
257
|
+
if (!childModel)
|
|
258
|
+
continue;
|
|
259
|
+
const childMetadata = useModelMetadata(childModel);
|
|
260
|
+
if (!childMetadata)
|
|
261
|
+
continue;
|
|
262
|
+
if (!app.isFinalModel(childMetadata.Identifier))
|
|
263
|
+
continue;
|
|
264
|
+
if (!childMetadata.Relations?.parent)
|
|
265
|
+
continue;
|
|
266
|
+
if (childMetadata.Relations.parent.model !== Identifier)
|
|
267
|
+
continue;
|
|
268
|
+
this.walkModel(childModel, childMetadata, operations, childPrefix, depth + 1);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Register query route for a model
|
|
273
|
+
* @param prefix - the URL prefix for this model
|
|
274
|
+
* @param plural - the pluralized model name
|
|
275
|
+
* @param shortId - the short model identifier
|
|
276
|
+
* @param identifier - the full model identifier
|
|
277
|
+
* @param depth - nesting depth for parent id parameters
|
|
278
|
+
* @param injectAttribute - parent attribute to inject in queries
|
|
279
|
+
* @param operations - the filtered operations map
|
|
280
|
+
*/
|
|
281
|
+
exposeQueryRoute(prefix, plural, shortId, identifier, depth, injectAttribute, operations) {
|
|
282
|
+
const operationId = `${plural}.Query`;
|
|
283
|
+
if (!operations[operationId])
|
|
284
|
+
return;
|
|
285
|
+
const openapi = {
|
|
286
|
+
[this.parameters.queryMethod.toLowerCase()]: {
|
|
287
|
+
tags: [shortId],
|
|
288
|
+
summary: `Query ${shortId}`,
|
|
289
|
+
operationId,
|
|
290
|
+
requestBody: this.parameters.queryMethod === "GET"
|
|
291
|
+
? undefined
|
|
292
|
+
: {
|
|
293
|
+
content: {
|
|
294
|
+
"application/json": {
|
|
295
|
+
schema: {
|
|
296
|
+
properties: {
|
|
297
|
+
q: {
|
|
298
|
+
type: "string"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
parameters: this.parameters.queryMethod === "GET"
|
|
306
|
+
? [
|
|
307
|
+
{
|
|
308
|
+
name: "q",
|
|
309
|
+
in: "query",
|
|
310
|
+
description: "Query to execute",
|
|
311
|
+
schema: {
|
|
312
|
+
type: "string"
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
]
|
|
316
|
+
: [],
|
|
317
|
+
responses: {
|
|
318
|
+
"200": {
|
|
319
|
+
description: "Operation success",
|
|
320
|
+
content: {
|
|
321
|
+
"application/json": {
|
|
322
|
+
schema: {
|
|
323
|
+
properties: {
|
|
324
|
+
continuationToken: {
|
|
325
|
+
type: "string"
|
|
326
|
+
},
|
|
327
|
+
results: {
|
|
328
|
+
type: "array",
|
|
329
|
+
items: {
|
|
330
|
+
$ref: `#/components/schemas/${identifier}`
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"400": {
|
|
339
|
+
description: "Query is invalid"
|
|
340
|
+
},
|
|
341
|
+
"403": {
|
|
342
|
+
description: "You don't have permissions"
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
this.addRoute(`${prefix}${this.parameters.queryMethod === "GET" ? "{?q?}" : ""}`, [this.parameters.queryMethod], async (context) => {
|
|
348
|
+
let queryString = "";
|
|
349
|
+
const parentId = `pid.${depth - 1}`;
|
|
350
|
+
if (context.getHttpContext().getMethod() === "PUT") {
|
|
351
|
+
queryString = (await context.getInput()).q ?? "";
|
|
352
|
+
context.clearInput();
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
queryString = context.parameter("q", "");
|
|
356
|
+
}
|
|
357
|
+
let query;
|
|
358
|
+
try {
|
|
359
|
+
query = new QueryValidator(queryString);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
throw new WebdaError.BadRequest(`Invalid query ${queryString}`);
|
|
363
|
+
}
|
|
364
|
+
// Inject parent attribute
|
|
365
|
+
if (injectAttribute) {
|
|
366
|
+
query.merge(`${injectAttribute} = '${context.parameter(parentId)}'`);
|
|
367
|
+
}
|
|
368
|
+
context.getParameters().query = query.toString();
|
|
369
|
+
return callOperation(context, operationId);
|
|
370
|
+
}, openapi);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Register create route for a model
|
|
374
|
+
* @param prefix - the URL prefix for this model
|
|
375
|
+
* @param shortId - the short model identifier
|
|
376
|
+
* @param identifier - the full model identifier
|
|
377
|
+
* @param depth - nesting depth for parent id parameters
|
|
378
|
+
* @param injectAttribute - parent attribute to inject on create
|
|
379
|
+
* @param operations - the filtered operations map
|
|
380
|
+
*/
|
|
381
|
+
exposeCreateRoute(prefix, shortId, identifier, depth, injectAttribute, operations) {
|
|
382
|
+
const operationId = `${shortId}.Create`;
|
|
383
|
+
if (!operations[operationId])
|
|
384
|
+
return;
|
|
385
|
+
const openapi = {
|
|
386
|
+
post: {
|
|
387
|
+
tags: [shortId],
|
|
388
|
+
summary: `Create ${shortId}`,
|
|
389
|
+
operationId,
|
|
390
|
+
requestBody: {
|
|
391
|
+
content: {
|
|
392
|
+
"application/json": {
|
|
393
|
+
schema: {
|
|
394
|
+
$ref: `#/components/schemas/${identifier}`
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
responses: {
|
|
400
|
+
"201": {
|
|
401
|
+
description: "Operation success",
|
|
402
|
+
content: {
|
|
403
|
+
"application/json": {
|
|
404
|
+
schema: {
|
|
405
|
+
$ref: `#/components/schemas/${identifier}`
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
"400": {
|
|
411
|
+
description: "Invalid input"
|
|
412
|
+
},
|
|
413
|
+
"403": {
|
|
414
|
+
description: "You don't have permissions"
|
|
415
|
+
},
|
|
416
|
+
"409": {
|
|
417
|
+
description: "Object already exists"
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
// Lookup pkFields from the operation context to build a Location header
|
|
423
|
+
// that uses the model's real primary key (slug, uuid, composite, etc.).
|
|
424
|
+
const createCtx = operations[operationId]?.context;
|
|
425
|
+
const pkFields = createCtx?.pkFields ?? ["uuid"];
|
|
426
|
+
this.addRoute(`${prefix}`, ["POST"], async (context) => {
|
|
427
|
+
// Inject the parent attribute
|
|
428
|
+
if (injectAttribute) {
|
|
429
|
+
(await context.getInput())[injectAttribute] = context.parameter(`pid.${depth - 1}`);
|
|
430
|
+
}
|
|
431
|
+
await callOperation(context, operationId);
|
|
432
|
+
// Add Location for successful creates without changing the status code —
|
|
433
|
+
// the rest of the framework (and the shipped tests) assume 2xx without
|
|
434
|
+
// the 200→201 upgrade, so surface the URL via header only.
|
|
435
|
+
if (context.statusCode < 300 || context.statusCode === 204) {
|
|
436
|
+
const output = context.getOutput();
|
|
437
|
+
if (output) {
|
|
438
|
+
try {
|
|
439
|
+
const parsed = typeof output === "string" ? JSON.parse(output) : output;
|
|
440
|
+
const pkParts = pkFields.map(f => parsed?.[f]).filter(v => v !== undefined && v !== null);
|
|
441
|
+
if (pkParts.length === pkFields.length) {
|
|
442
|
+
context.setHeader("Location", `${context.getHttpContext().getAbsoluteUrl()}/${pkParts.join("/")}`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
// Not JSON, skip Location
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}, openapi);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Register delete route for a model
|
|
454
|
+
* @param prefix - the URL prefix for this model
|
|
455
|
+
* @param shortId - the short model identifier
|
|
456
|
+
* @param identifier - the full model identifier
|
|
457
|
+
* @param operations - the filtered operations map
|
|
458
|
+
*/
|
|
459
|
+
exposeDeleteRoute(prefix, shortId, identifier, operations) {
|
|
460
|
+
const operationId = `${shortId}.Delete`;
|
|
461
|
+
if (!operations[operationId])
|
|
462
|
+
return;
|
|
463
|
+
const openapi = {
|
|
464
|
+
delete: {
|
|
465
|
+
tags: [shortId],
|
|
466
|
+
operationId,
|
|
467
|
+
description: `Delete ${shortId} if the permissions allow`,
|
|
468
|
+
summary: `Delete a ${shortId}`,
|
|
469
|
+
responses: {
|
|
470
|
+
"204": {
|
|
471
|
+
description: "Operation success"
|
|
472
|
+
},
|
|
473
|
+
"403": {
|
|
474
|
+
description: "You don't have permissions"
|
|
475
|
+
},
|
|
476
|
+
"404": {
|
|
477
|
+
description: "Unknown object"
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
// Use the operation's declared REST path so the URL params match the model's
|
|
483
|
+
// actual primary-key field names (e.g. {slug} for Tag, {follower}/{following}
|
|
484
|
+
// for UserFollow). Fall back to {uuid} for legacy operations.
|
|
485
|
+
const pathSuffix = typeof operations[operationId].rest === "object"
|
|
486
|
+
? operations[operationId].rest.path || "{uuid}"
|
|
487
|
+
: "{uuid}";
|
|
488
|
+
this.addRoute(`${prefix}/${pathSuffix}`, ["DELETE"], async (context) => {
|
|
489
|
+
await callOperation(context, operationId);
|
|
490
|
+
// Convention: 204 No Content
|
|
491
|
+
if (context.statusCode < 300 || context.statusCode === 204) {
|
|
492
|
+
context.writeHead(204);
|
|
493
|
+
}
|
|
494
|
+
}, openapi);
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Register update (PUT) and patch (PATCH) routes for a model
|
|
498
|
+
* @param prefix - the URL prefix for this model
|
|
499
|
+
* @param shortId - the short model identifier
|
|
500
|
+
* @param identifier - the full model identifier
|
|
501
|
+
* @param operations - the filtered operations map
|
|
502
|
+
*/
|
|
503
|
+
exposeUpdateRoute(prefix, shortId, identifier, operations) {
|
|
504
|
+
const updateOpId = `${shortId}.Update`;
|
|
505
|
+
const patchOpId = `${shortId}.Patch`;
|
|
506
|
+
if (!operations[updateOpId] && !operations[patchOpId])
|
|
507
|
+
return;
|
|
508
|
+
const hasUpdate = operations[updateOpId] !== undefined;
|
|
509
|
+
const hasPatch = operations[patchOpId] !== undefined;
|
|
510
|
+
const describe = (operationId, verb) => ({
|
|
511
|
+
tags: [shortId],
|
|
512
|
+
operationId,
|
|
513
|
+
description: `${verb} ${shortId} if the permissions allow`,
|
|
514
|
+
summary: operations[operationId]?.summary ?? `${verb} a ${shortId}`,
|
|
515
|
+
requestBody: {
|
|
516
|
+
content: {
|
|
517
|
+
"application/json": {
|
|
518
|
+
schema: {
|
|
519
|
+
$ref: `#/components/schemas/${identifier}`
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
responses: {
|
|
525
|
+
"204": {
|
|
526
|
+
description: "Operation success"
|
|
527
|
+
},
|
|
528
|
+
"400": {
|
|
529
|
+
description: "Invalid input"
|
|
530
|
+
},
|
|
531
|
+
"403": {
|
|
532
|
+
description: "You don't have permissions"
|
|
533
|
+
},
|
|
534
|
+
"404": {
|
|
535
|
+
description: "Unknown object"
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
// A verb without its own operation is served by the other one (see the
|
|
540
|
+
// handler below); document it without an operationId, which must be unique
|
|
541
|
+
const servedBy = (info) => {
|
|
542
|
+
const { operationId: _servedBy, ...rest } = info;
|
|
543
|
+
return rest;
|
|
544
|
+
};
|
|
545
|
+
const updateInfo = hasUpdate ? describe(updateOpId, "Update") : undefined;
|
|
546
|
+
const patchInfo = hasPatch ? describe(patchOpId, "Patch") : undefined;
|
|
547
|
+
const openapi = {
|
|
548
|
+
put: updateInfo ?? servedBy(patchInfo),
|
|
549
|
+
patch: patchInfo ?? servedBy(updateInfo)
|
|
550
|
+
};
|
|
551
|
+
// Use the update op's declared REST path so URL params match the PK fields.
|
|
552
|
+
const updateOp = operations[updateOpId] ?? operations[patchOpId];
|
|
553
|
+
const pathSuffix = typeof updateOp?.rest === "object"
|
|
554
|
+
? updateOp.rest.path || "{uuid}"
|
|
555
|
+
: "{uuid}";
|
|
556
|
+
// DomainService registers both `${shortId}.Update` and `${shortId}.Patch`;
|
|
557
|
+
// when an application declares only one of them, route both verbs to it
|
|
558
|
+
// (modelUpdate's load() already merges, which is patch semantics).
|
|
559
|
+
this.addRoute(`${prefix}/${pathSuffix}`, ["PUT", "PATCH"], (context) => {
|
|
560
|
+
const method = context.getHttpContext().getMethod();
|
|
561
|
+
// Fall back to whichever operation is registered so users can override
|
|
562
|
+
// just one of Update/Patch without breaking the other HTTP verb.
|
|
563
|
+
if (method === "PATCH") {
|
|
564
|
+
return callOperation(context, hasPatch ? patchOpId : updateOpId);
|
|
565
|
+
}
|
|
566
|
+
return callOperation(context, hasUpdate ? updateOpId : patchOpId);
|
|
567
|
+
}, openapi);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Register get route for a model
|
|
571
|
+
* @param prefix - the URL prefix for this model
|
|
572
|
+
* @param shortId - the short model identifier
|
|
573
|
+
* @param identifier - the full model identifier
|
|
574
|
+
* @param operations - the filtered operations map
|
|
575
|
+
*/
|
|
576
|
+
exposeGetRoute(prefix, shortId, identifier, operations) {
|
|
577
|
+
const operationId = `${shortId}.Get`;
|
|
578
|
+
if (!operations[operationId])
|
|
579
|
+
return;
|
|
580
|
+
const openapi = {
|
|
581
|
+
get: {
|
|
582
|
+
tags: [shortId],
|
|
583
|
+
description: `Retrieve ${shortId} model if permissions allow`,
|
|
584
|
+
summary: `Retrieve a ${shortId}`,
|
|
585
|
+
operationId,
|
|
586
|
+
responses: {
|
|
587
|
+
"200": {
|
|
588
|
+
content: {
|
|
589
|
+
"application/json": {
|
|
590
|
+
schema: {
|
|
591
|
+
$ref: `#/components/schemas/${identifier}`
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
"400": {
|
|
597
|
+
description: "Object is invalid"
|
|
598
|
+
},
|
|
599
|
+
"403": {
|
|
600
|
+
description: "You don't have permissions"
|
|
601
|
+
},
|
|
602
|
+
"404": {
|
|
603
|
+
description: "Unknown object"
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
};
|
|
608
|
+
const pathSuffix = typeof operations[operationId].rest === "object"
|
|
609
|
+
? operations[operationId].rest.path || "{uuid}"
|
|
610
|
+
: "{uuid}";
|
|
611
|
+
this.addRoute(`${prefix}/${pathSuffix}`, ["GET"], (context) => callOperation(context, operationId), openapi);
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Register action route for a model
|
|
615
|
+
* @param prefix - the URL prefix for this model
|
|
616
|
+
* @param shortId - the short model identifier
|
|
617
|
+
* @param identifier - the full model identifier
|
|
618
|
+
* @param actionName - the name of the action
|
|
619
|
+
* @param action - the action definition
|
|
620
|
+
* @param depth - nesting depth for parent id parameters
|
|
621
|
+
* @param injectAttribute - parent attribute to inject
|
|
622
|
+
*/
|
|
623
|
+
exposeActionRoute(prefix, shortId, identifier, actionName, action, depth, injectAttribute) {
|
|
624
|
+
const actionOperationName = actionName.substring(0, 1).toUpperCase() + actionName.substring(1);
|
|
625
|
+
const operationId = `${shortId}.${actionOperationName}`;
|
|
626
|
+
const openapi = {
|
|
627
|
+
...action.openapi
|
|
628
|
+
};
|
|
629
|
+
(action.methods || ["PUT"]).forEach((method, index) => {
|
|
630
|
+
openapi[method.toLowerCase()] = {
|
|
631
|
+
tags: [shortId],
|
|
632
|
+
// operationIds must be unique: when an action accepts several methods,
|
|
633
|
+
// the first one carries the operation the route dispatches to
|
|
634
|
+
...(index === 0 ? { operationId } : {}),
|
|
635
|
+
...(action.openapi?.[method.toLowerCase()] ?? {})
|
|
636
|
+
};
|
|
637
|
+
});
|
|
638
|
+
if (hasSchema(`${identifier}.${actionName}.input`)) {
|
|
639
|
+
Object.keys(openapi)
|
|
640
|
+
.filter(k => ["get", "post", "put", "patch", "delete"].includes(k))
|
|
641
|
+
.forEach(k => {
|
|
642
|
+
openapi[k].requestBody = {
|
|
643
|
+
content: {
|
|
644
|
+
"application/json": {
|
|
645
|
+
schema: {
|
|
646
|
+
$ref: `#/components/schemas/${identifier}.${actionName}.input`
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
if (hasSchema(`${identifier}.${actionName}.output`)) {
|
|
654
|
+
Object.keys(openapi)
|
|
655
|
+
.filter(k => ["get", "post", "put", "patch", "delete"].includes(k))
|
|
656
|
+
.forEach(k => {
|
|
657
|
+
openapi[k].responses ??= {};
|
|
658
|
+
openapi[k].responses["200"] ??= {};
|
|
659
|
+
openapi[k].responses["200"].content = {
|
|
660
|
+
"application/json": {
|
|
661
|
+
schema: {
|
|
662
|
+
$ref: `#/components/schemas/${identifier}.${actionName}.output`
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
this.addRoute(action.global ? `${prefix}/${actionName}` : `${prefix}/{uuid}/${actionName}`, action.methods || ["PUT"], async (context) => {
|
|
669
|
+
if (injectAttribute) {
|
|
670
|
+
context.getParameters()[injectAttribute] = context.parameter(`pid.${depth - 1}`);
|
|
671
|
+
context.getParameters()[`pid.${depth - 1}`] = undefined;
|
|
672
|
+
}
|
|
673
|
+
await callOperation(context, operationId);
|
|
674
|
+
}, openapi);
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Register routes for every `@Action` on every Behavior attribute of a
|
|
678
|
+
* model. The default URL pattern is `{prefix}/{uuid}/{attribute}.{action}`
|
|
679
|
+
* (PUT) — the dot disambiguates Behavior calls from nested-resource routing.
|
|
680
|
+
*
|
|
681
|
+
* Authors can override the route via `@Action({ rest: { route, method } })`.
|
|
682
|
+
* `addBehaviorOperations` resolves that hint and writes the final
|
|
683
|
+
* `rest.method`/`rest.path` on the registered operation; this method just
|
|
684
|
+
* mirrors what's there, falling back to the dot-notation default if no
|
|
685
|
+
* hint was set.
|
|
686
|
+
*
|
|
687
|
+
* Each route dispatches the registered behavior operation
|
|
688
|
+
* (`{ShortId}.{AttributeCap}.{ActionCap}`). The dispatcher itself
|
|
689
|
+
* (`modelBehaviorAction`) handles model load, `canAct` gating, and method
|
|
690
|
+
* invocation — this method only wires the HTTP surface.
|
|
691
|
+
*
|
|
692
|
+
* Schema decoration on the OpenAPI doc is best-effort — we lean on
|
|
693
|
+
* `hasSchema()` (the AJV registry) to decide whether to emit
|
|
694
|
+
* `requestBody` / `responses` `$ref`s.
|
|
695
|
+
*
|
|
696
|
+
* @param prefix - the URL prefix for this model (e.g. `/api/users`)
|
|
697
|
+
* @param shortId - the short model identifier (e.g. `User`)
|
|
698
|
+
* @param identifier - the full model identifier (e.g. `MyApp/User`) — accepted
|
|
699
|
+
* for symmetry with `walkModel`'s caller signature even though we don't currently use it
|
|
700
|
+
* @param name - the model display name used in OpenAPI tags
|
|
701
|
+
* @param behavior - the Behavior attribute relation to expose
|
|
702
|
+
*/
|
|
703
|
+
exposeBehaviorRoutes(prefix, shortId, identifier, name, behavior) {
|
|
704
|
+
void identifier;
|
|
705
|
+
void name;
|
|
706
|
+
const app = useApplication();
|
|
707
|
+
const behaviorMeta = app.getBehaviorMetadata(behavior.behavior);
|
|
708
|
+
if (!behaviorMeta) {
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
const attributeCap = behavior.attribute.substring(0, 1).toUpperCase() + behavior.attribute.substring(1);
|
|
712
|
+
const ops = useInstanceStorage().operations;
|
|
713
|
+
Object.keys(behaviorMeta.Actions || {}).forEach(actionName => {
|
|
714
|
+
const actionCap = actionName.substring(0, 1).toUpperCase() + actionName.substring(1);
|
|
715
|
+
const operationId = `${shortId}.${attributeCap}.${actionCap}`;
|
|
716
|
+
// Read REST hints from the registered operation. addBehaviorOperations
|
|
717
|
+
// resolves the action's `rest: { route, method }` decorator option (if
|
|
718
|
+
// any) and writes the final method+path here, so we just mirror it.
|
|
719
|
+
const op = ops?.[operationId];
|
|
720
|
+
const restHint = op?.rest && typeof op.rest === "object" ? op.rest : undefined;
|
|
721
|
+
const httpMethod = (restHint?.method ?? "put").toUpperCase();
|
|
722
|
+
const methodKey = httpMethod.toLowerCase();
|
|
723
|
+
// `rest.path` is relative to the model prefix and starts with `{uuid}/`.
|
|
724
|
+
const relativePath = restHint?.path ?? `{uuid}/${behavior.attribute}.${actionName}`;
|
|
725
|
+
const fullPath = `${prefix}/${relativePath}`;
|
|
726
|
+
const openapi = {
|
|
727
|
+
[methodKey]: {
|
|
728
|
+
tags: [shortId],
|
|
729
|
+
summary: `${actionCap} on ${shortId}.${behavior.attribute}`,
|
|
730
|
+
operationId
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
const inputSchema = `${behavior.behavior}.${actionName}.input`;
|
|
734
|
+
const outputSchema = `${behavior.behavior}.${actionName}.output`;
|
|
735
|
+
if (hasSchema(inputSchema)) {
|
|
736
|
+
openapi[methodKey].requestBody = {
|
|
737
|
+
content: {
|
|
738
|
+
"application/json": {
|
|
739
|
+
schema: {
|
|
740
|
+
$ref: `#/components/schemas/${inputSchema}`
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
if (hasSchema(outputSchema)) {
|
|
747
|
+
openapi[methodKey].responses = {
|
|
748
|
+
"200": {
|
|
749
|
+
description: "Operation success",
|
|
750
|
+
content: {
|
|
751
|
+
"application/json": {
|
|
752
|
+
schema: {
|
|
753
|
+
$ref: `#/components/schemas/${outputSchema}`
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
this.addRoute(fullPath, [httpMethod], async (context) => callOperation(context, operationId), openapi);
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* No-op: route exposure is handled entirely by initTransport's tree walk
|
|
765
|
+
* @param _operationId - the operation identifier (unused)
|
|
766
|
+
* @param _definition - the operation definition (unused)
|
|
767
|
+
*/
|
|
768
|
+
exposeOperation(_operationId, _definition) {
|
|
769
|
+
// Handled by initTransport's tree walk
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Serve the openapi with the swagger-ui
|
|
773
|
+
* @param ctx - the web context
|
|
774
|
+
*/
|
|
775
|
+
async openapi(ctx) {
|
|
776
|
+
this.openapiContent ??= SWAGGER_HTML.replace(/\{\{VERSION}}/g, this.parameters.swaggerVersion).replace("{{OPENAPI}}", JSON.stringify(useRouter().exportOpenAPI(true)));
|
|
777
|
+
ctx.write(this.openapiContent);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
//# sourceMappingURL=restoperationstransport.service.js.map
|