@redocly/reef 0.133.0-next.0 → 0.133.0-next.2
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/CHANGELOG.md +71 -2
- package/dist/cli/develop.js +1 -1
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/server/api-routes/helpers/enhance-context.js +1 -1
- package/dist/server/constants/plugins/catalog-entities.d.ts +2 -0
- package/dist/server/constants/plugins/catalog-entities.js +1 -1
- package/dist/server/esbuild/esbuild.js +3 -3
- package/dist/server/esbuild/generate.d.ts +3 -0
- package/dist/server/esbuild/generate.js +8 -8
- package/dist/server/esbuild/plugins/api-request-handlers-resolver.js +1 -1
- package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
- package/dist/server/persistence/cache/mappers/create-cache-read-model.d.ts +1 -1
- package/dist/server/persistence/cache/repositories/{cache-local-repository.d.ts → cache-repository.d.ts} +3 -3
- package/dist/server/persistence/cache/repositories/cache-repository.js +1 -0
- package/dist/server/persistence/cache/services/cache-service.d.ts +2 -2
- package/dist/server/persistence/cache/services/cache-service.js +1 -1
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.d.ts +2 -2
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.js +1 -1
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-read-repository.d.ts → file-hashes-read-repository.d.ts} +3 -7
- package/dist/server/persistence/file-hashes/repositories/file-hashes-read-repository.js +1 -0
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-repository.d.ts → file-hashes-repository.d.ts} +4 -3
- package/dist/server/persistence/file-hashes/repositories/file-hashes-repository.js +1 -0
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-write-repository.d.ts → file-hashes-write-repository.d.ts} +2 -2
- package/dist/server/persistence/file-hashes/repositories/file-hashes-write-repository.js +1 -0
- package/dist/server/persistence/file-hashes/services/file-hashes-service.d.ts +3 -5
- package/dist/server/persistence/file-hashes/services/file-hashes-service.js +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-list-entry.d.ts +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-value.d.ts +1 -1
- package/dist/server/persistence/kv/repositories/{kv-remote-repository.d.ts → kv-repository.d.ts} +3 -3
- package/dist/server/persistence/kv/repositories/kv-repository.js +2 -0
- package/dist/server/persistence/kv/services/kv-service.d.ts +2 -2
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/api-functions/index.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.js +12 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +29 -66
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/consts.d.ts +45 -0
- package/dist/server/plugins/catalog-entities/database/consts.js +1 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.d.ts +1 -2
- package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.d.ts +1 -3
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.d.ts +3 -3
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-bff-repository.d.ts → bffEntities/bff-entities-read-repository.d.ts} +4 -4
- package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.js +131 -0
- package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.d.ts +26 -0
- package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.js +82 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +7 -7
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +12 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-relations-repository.d.ts → relations/relations-read-repository.d.ts} +7 -4
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.d.ts +28 -0
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/types.d.ts +39 -0
- package/dist/server/plugins/catalog-entities/database/repositories/types.js +0 -0
- package/dist/server/plugins/catalog-entities/database/types.d.ts +26 -0
- package/dist/server/plugins/catalog-entities/database/types.js +0 -0
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +38 -36
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +1 -3
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.d.ts +15 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/hash-manager.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/utils/hash-manager.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.d.ts +18 -0
- package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.js +1 -0
- package/dist/server/plugins/dev-onboarding/api/adapters/apigee/adapter.js +3 -3
- package/dist/server/plugins/dev-onboarding/api/routes/index.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/routes/meta.d.ts +4 -0
- package/dist/server/plugins/dev-onboarding/api/routes/meta.js +1 -0
- package/dist/server/plugins/dev-onboarding/api/types.d.ts +1 -0
- package/dist/server/plugins/dev-onboarding/template/App.js +5 -5
- package/dist/server/plugins/dev-onboarding/template/CreateAppDialog.js +3 -3
- package/dist/server/plugins/dev-onboarding/template/components/CallbackUrl.d.ts +5 -0
- package/dist/server/plugins/dev-onboarding/template/components/CallbackUrl.js +17 -0
- package/dist/server/plugins/dev-onboarding/template/components/DialogStyledComponents.d.ts +1 -0
- package/dist/server/plugins/dev-onboarding/template/components/DialogStyledComponents.js +6 -2
- package/dist/server/plugins/dev-onboarding/template/components/EditCallbackUrlDialog.d.ts +8 -0
- package/dist/server/plugins/dev-onboarding/template/components/EditCallbackUrlDialog.js +1 -0
- package/dist/server/plugins/entitlements/index.js +1 -1
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.d.ts +0 -1
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +6 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +4 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +4 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +4 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.d.ts +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +23 -5
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -1
- package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +1 -1
- package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
- package/dist/server/plugins/mcp/index.js +1 -1
- package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
- package/dist/server/plugins/mcp/types.d.ts +5 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +1 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
- package/dist/server/plugins/openapi-docs/ast-utils.js +2 -2
- package/dist/server/plugins/scorecards/database/repositories/{local/scorecards-config-local-repository.d.ts → scorecards-config-repository.d.ts} +4 -4
- package/dist/server/plugins/scorecards/database/repositories/scorecards-config-repository.js +1 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -1
- package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +1 -1
- package/dist/server/providers/database/base-repository.js +2 -2
- package/dist/server/providers/database/client.d.ts +1 -1
- package/dist/server/providers/database/client.js +1 -1
- package/dist/server/providers/database/constants.d.ts +4 -9
- package/dist/server/providers/database/constants.js +1 -1
- package/dist/server/providers/database/copy-migrations.js +1 -1
- package/dist/server/providers/database/database-connection-factory.d.ts +2 -2
- package/dist/server/providers/database/database-connection-factory.js +1 -1
- package/dist/server/providers/database/database-connections-manager.d.ts +3 -8
- package/dist/server/providers/database/database-connections-manager.js +1 -1
- package/dist/server/providers/database/database-preconnect-service.js +1 -1
- package/dist/server/providers/database/databases/sqlite-db/drizzle.config.d.ts +12 -0
- package/dist/server/providers/database/databases/sqlite-db/drizzle.config.js +1 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/0009_add-missing-local-tables.sql +41 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/0010_add-last-seen-run-id-to-entities-tables.sql +4 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/0011_update-entities-relations-index.sql +2 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0009_snapshot.json +1141 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0010_snapshot.json +1165 -0
- package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0011_snapshot.json +1165 -0
- package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/_journal.json +21 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.d.ts +19 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.js +1 -1
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.d.ts +19 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.js +1 -1
- package/dist/server/providers/database/pagination/limit.d.ts +5 -0
- package/dist/server/providers/database/pagination/limit.js +1 -1
- package/dist/server/providers/database/transient-sqld-error.d.ts +14 -0
- package/dist/server/providers/database/transient-sqld-error.js +1 -0
- package/dist/server/providers/database/types.d.ts +6 -6
- package/dist/server/providers/database/utils/get-first-row.d.ts +19 -0
- package/dist/server/providers/database/utils/get-first-row.js +1 -0
- package/dist/server/store.d.ts +2 -0
- package/dist/server/store.js +1 -1
- package/dist/server/types/plugins/common.d.ts +2 -0
- package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +0 -147
- package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -1
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +1 -1
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +1 -1
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +1 -1
- package/dist/server/workers/mcp-tool-worker-pool.d.ts +1 -0
- package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
- package/dist/server/workers/mcp-tool-worker.js +1 -1
- package/dist/server/workers/types.d.ts +5 -1
- package/package.json +16 -16
- package/dist/server/persistence/cache/repositories/cache-local-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-read-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-write-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/utils.d.ts +0 -10
- package/dist/server/persistence/file-hashes/repositories/utils.js +0 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +0 -2
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +0 -123
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +0 -98
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +0 -145
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +0 -100
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +0 -43
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +0 -20
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +0 -1
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +0 -1
- package/dist/server/providers/database/database-initialization-strategy.d.ts +0 -17
- package/dist/server/providers/database/database-initialization-strategy.js +0 -1
- package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.d.ts +0 -11
- package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.js +0 -1
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0001_catalog-versions-and-revisions.sql +0 -20
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0002_add-scorecards-status.sql +0 -1
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0003_catalog_versions_and_revisions_relations.sql +0 -46
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0004_normalize_relation_types.sql +0 -147
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +0 -2
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +0 -11
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0001_snapshot.json +0 -378
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0002_snapshot.json +0 -385
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0003_snapshot.json +0 -392
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0004_snapshot.json +0 -392
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +0 -393
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +0 -458
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +0 -55
- package/dist/server/providers/database/databases/main-sqlite/drizzle.config.d.ts +0 -10
- package/dist/server/providers/database/databases/main-sqlite/drizzle.config.js +0 -1
- package/dist/server/providers/database/databases/main-sqlite/migrations/0000_initial_migration.sql +0 -11
- package/dist/server/providers/database/databases/main-sqlite/migrations/0001_update_file_hashes_file_type_values.sql +0 -10
- package/dist/server/providers/database/databases/main-sqlite/migrations/0002_cache-table.sql +0 -11
- package/dist/server/providers/database/databases/main-sqlite/migrations/0003_file-path-added.sql +0 -6
- package/dist/server/providers/database/databases/main-sqlite/migrations/0004_add-scorecards-tables.sql +0 -10
- package/dist/server/providers/database/databases/main-sqlite/migrations/0005_recreate-scorecards-config.sql +0 -25
- package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +0 -19
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0000_snapshot.json +0 -82
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0001_snapshot.json +0 -82
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0002_snapshot.json +0 -146
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0003_snapshot.json +0 -153
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0004_snapshot.json +0 -221
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0005_snapshot.json +0 -263
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +0 -261
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +0 -55
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.d.ts +0 -14
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +0 -1
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0000_initial_migration.sql +0 -46
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0000_snapshot.json +0 -307
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/migrations/0000_initial_migration.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0001_add_kv_table.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0002_catalog-versions-and-revisions.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0003_add-scorecards-tables.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0004_add-scorecards-status.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0005_recreate-scorecards-tables.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0006_catalog-versions-and-revisions-relations.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0007_catalog-relations-constraint-fix.sql +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0008_add-catalog-entitities-attributes-table.sql +0 -0
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/migrations/meta/0000_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0001_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0002_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0003_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0004_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0005_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0006_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0007_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0008_snapshot.json +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.js +0 -0
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.js +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.js +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.js +0 -0
package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import{sql as _}from"drizzle-orm";import{logger as y}from"../../../../../tools/notifiers/logger.js";import{buildRbacFilterRaw as d}from"../utils/build-rbac-filter.js";class A{#e;constructor(i){this.#e=i}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:t=[],rbacTeams:a,excludedTypes:s,excludedEntities:c}){try{const e={},u=t.filter(l=>l.startsWith("metadata.")),f=t.includes("domains")||t.includes("owners"),N=this.#t({entitiesTypes:i,rbacTeams:a,excludedTypes:s,excludedEntities:c,withRelations:f}),r=[];if(t.includes("type")&&r.push(`
|
|
2
|
+
SELECT 'type' AS filter_name, type AS value, COUNT(*) AS count
|
|
3
|
+
FROM filtered_entities
|
|
4
|
+
WHERE type IS NOT NULL
|
|
5
|
+
GROUP BY type
|
|
6
|
+
`),t.includes("tags")&&r.push(`
|
|
7
|
+
SELECT 'tags' AS filter_name, tag.value AS value, COUNT(DISTINCT fe.key) AS count
|
|
8
|
+
FROM filtered_entities fe, json_each(COALESCE(fe.tags, json_array())) AS tag
|
|
9
|
+
WHERE fe.tags IS NOT NULL
|
|
10
|
+
AND fe.tags != ''
|
|
11
|
+
AND tag.value IS NOT NULL
|
|
12
|
+
AND tag.value != ''
|
|
13
|
+
GROUP BY tag.value
|
|
14
|
+
`),t.includes("domains")&&r.push(`
|
|
15
|
+
SELECT 'domains' AS filter_name, cr.source_key AS value, COUNT(DISTINCT fe.key) AS count
|
|
16
|
+
FROM combined_relations cr
|
|
17
|
+
INNER JOIN filtered_entities fe ON fe.key = cr.target_key
|
|
18
|
+
INNER JOIN combined_entities ce ON ce.key = cr.source_key
|
|
19
|
+
WHERE ce.type = 'domain'
|
|
20
|
+
AND cr.source_to_target_relation = 'hasParts'
|
|
21
|
+
GROUP BY cr.source_key
|
|
22
|
+
`),t.includes("owners")&&r.push(`
|
|
23
|
+
SELECT 'owners' AS filter_name, owner_key AS value, COUNT(DISTINCT entity_key) AS count
|
|
24
|
+
FROM (
|
|
25
|
+
SELECT
|
|
26
|
+
fe.key AS entity_key,
|
|
27
|
+
CASE
|
|
28
|
+
WHEN fe.key = cr.target_key AND cr.source_to_target_relation = 'owns'
|
|
29
|
+
THEN cr.source_key
|
|
30
|
+
WHEN fe.key = cr.source_key AND cr.source_to_target_relation = 'ownedBy'
|
|
31
|
+
THEN cr.target_key
|
|
32
|
+
END AS owner_key
|
|
33
|
+
FROM combined_relations cr
|
|
34
|
+
INNER JOIN filtered_entities fe ON (
|
|
35
|
+
(cr.target_key = fe.key AND cr.source_to_target_relation = 'owns') OR
|
|
36
|
+
(cr.source_key = fe.key AND cr.source_to_target_relation = 'ownedBy')
|
|
37
|
+
)
|
|
38
|
+
) AS entity_owners
|
|
39
|
+
INNER JOIN combined_entities ce ON ce.key = owner_key
|
|
40
|
+
WHERE owner_key IS NOT NULL
|
|
41
|
+
GROUP BY owner_key
|
|
42
|
+
`),r.length>0){const l=await this.#e.client.run(_.raw(`
|
|
43
|
+
${N}
|
|
44
|
+
${r.join(" UNION ALL ")}
|
|
45
|
+
`));for(const o of l.rows??[]){const n=o.filter_name,E=o.value,S=Number(o.count)||0;E&&(e[n]||(e[n]=[]),e[n].push({value:E,count:S}))}}if(u.length>0){const l=await this.#e.client.run(_`
|
|
46
|
+
${_.raw(N)}
|
|
47
|
+
${_.join(u.map(o=>{const n=A.#n(o);return _`
|
|
48
|
+
SELECT
|
|
49
|
+
${o} AS filter_name,
|
|
50
|
+
json_extract(metadata, ${n}) AS value,
|
|
51
|
+
COUNT(*) AS count
|
|
52
|
+
FROM filtered_entities
|
|
53
|
+
WHERE metadata IS NOT NULL
|
|
54
|
+
AND metadata != ''
|
|
55
|
+
AND json_extract(metadata, ${n}) IS NOT NULL
|
|
56
|
+
AND json_extract(metadata, ${n}) != ''
|
|
57
|
+
GROUP BY 2
|
|
58
|
+
`}),_`
|
|
59
|
+
UNION ALL
|
|
60
|
+
`)}
|
|
61
|
+
`);for(const o of l.rows??[]){const n=o.filter_name,E=o.value,S=Number(o.count)||0;E&&(e[n]||(e[n]=[]),e[n].push({value:E,count:S}))}}return e}catch(e){return y.error("Error fetching catalog filters: "+e.message),{}}}#t({entitiesTypes:i,rbacTeams:t,excludedTypes:a,excludedEntities:s,withRelations:c=!1}){const e="entity",u="entityAttributes",f=d(t,u),N=this.#i(a,s),r=[`${e}.is_current = 1`,`${e}.is_deleted = 0`];f&&r.push(f),N&&r.push(N.replace(/ENTITY_ALIAS/g,e));const l=i.length?`SELECT * FROM combined_entities WHERE type IN (${i.map(n=>`'${n.replace(/'/g,"''")}'`).join(",")})`:"SELECT * FROM combined_entities",o=c?`,
|
|
62
|
+
combined_relations AS (
|
|
63
|
+
SELECT source_key, target_key, source_to_target_relation
|
|
64
|
+
FROM entities_relations
|
|
65
|
+
WHERE COALESCE(is_deleted, 0) = 0
|
|
66
|
+
)`:"";return`
|
|
67
|
+
WITH
|
|
68
|
+
combined_entities AS (
|
|
69
|
+
SELECT
|
|
70
|
+
${e}.key,
|
|
71
|
+
${e}.type,
|
|
72
|
+
${e}.tags,
|
|
73
|
+
${e}.metadata
|
|
74
|
+
FROM entities ${e}
|
|
75
|
+
LEFT JOIN entities_attributes ${u} ON ${u}.entity_key = ${e}.key
|
|
76
|
+
WHERE ${r.join(" AND ")}
|
|
77
|
+
),
|
|
78
|
+
filtered_entities AS (
|
|
79
|
+
${l}
|
|
80
|
+
)
|
|
81
|
+
${o}
|
|
82
|
+
`}static#n(i){return`$.${i.substring(9).replace(/[^a-zA-Z0-9._-]/g,"")}`}#i(i,t){const a=[];if(i&&i.length>0){const s=i.map(c=>`'${c.replace(/'/g,"''")}'`).join(", ");a.push(`ENTITY_ALIAS.type NOT IN (${s})`)}if(t&&t.length>0){const s=t.map(c=>`'${c.replace(/'/g,"''")}'`).join(", ");a.push(`ENTITY_ALIAS.key NOT IN (${s})`)}return a.length>0?`(${a.join(" AND ")})`:null}}export{A as FiltersRepository};
|
package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
2
|
+
import type { EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
|
|
2
3
|
export declare class RevisionRepository {
|
|
3
4
|
#private;
|
|
4
|
-
private readonly db;
|
|
5
5
|
constructor(db: DatabaseClient);
|
|
6
|
-
|
|
6
|
+
getCurrentRevisionInfo({ key, version, revision, }: {
|
|
7
7
|
key: string;
|
|
8
8
|
version: string | null;
|
|
9
9
|
revision: string | null;
|
|
10
|
-
}): Promise<
|
|
10
|
+
}): Promise<{
|
|
11
|
+
shouldSetNewCurrentRevision: boolean;
|
|
12
|
+
hasCurrentRevision: boolean;
|
|
13
|
+
}>;
|
|
11
14
|
markAllRevisionsAsNotCurrent(key: string): Promise<void>;
|
|
12
|
-
getCurrentEntityRevision(key: string): Promise<{
|
|
13
|
-
version: string;
|
|
14
|
-
revision: string;
|
|
15
|
-
} | null>;
|
|
16
15
|
/**
|
|
17
16
|
* Ensures that the one of the revisions has current and default version.
|
|
18
17
|
*/
|
|
@@ -23,5 +22,6 @@ export declare class RevisionRepository {
|
|
|
23
22
|
* This allows creating new revisions when reverting to previous content states.
|
|
24
23
|
*/
|
|
25
24
|
shouldSkipRevisionCreation(key: string, version: string | null, hash: string, isRootEntity?: boolean, isDeleted?: boolean): Promise<boolean>;
|
|
25
|
+
listEntityRevisions(entityKey: string, version?: string | null): Promise<EntityRevisionSummary[]>;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=revision-repository.d.ts.map
|
package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as u,desc as v,eq as n,isNull as c,sql as d}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as f}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{compareVersions as h}from"../../../utils/version-compare.js";import{VersionRepository as m}from"./version-repository.js";import{buildSemanticVersionSortExpr as C}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as y}from"../utils/normalize-revision-flags.js";class g{#i;#e;constructor(i){this.#e=i,this.#i=new m(i)}async getCurrentRevisionInfo({key:i,version:t,revision:r}){const o=await this.#t(i);if(!o)return{shouldSetNewCurrentRevision:!0,hasCurrentRevision:!1};if(t){const a=await this.#i.doesVersionExist(i,t),s=h(t,o.version)>0,l=o.version===f&&t!==f;if(!a&&(s||l))return{shouldSetNewCurrentRevision:!0,hasCurrentRevision:!0}}return t&&r&&t===o.version&&r>=o.revision?{shouldSetNewCurrentRevision:!0,hasCurrentRevision:!0}:{shouldSetNewCurrentRevision:!1,hasCurrentRevision:!0}}async markAllRevisionsAsNotCurrent(i){await this.#e.client.update(e).set({isCurrent:!1}).where(n(e.key,i)).run()}async ensureDefaultAndCurrentRevisionForKey(i){const t=await this.#i.getOrderedVersionListForKey(i),r=this.#i.getLatestVersion(t);r&&await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(u(n(e.key,i),n(e.revision,r.revision),r.version?n(e.version,r.version):c(e.version))).run()}async shouldSkipRevisionCreation(i,t,r,o,a){if(o||a)return!1;const s=await this.#e.client.select({hash:e.hash,isDeleted:e.isDeleted}).from(e).where(u(n(e.key,i),t?n(e.version,t):c(e.version))).orderBy(v(e.revision)).limit(1).get();return!s||!!s.isDeleted?!1:s.hash===r}async#t(i){return await this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(n(e.key,i),n(e.isCurrent,!0))).orderBy(v(e.revision)).limit(1).get()??null}async listEntityRevisions(i,t){const r=[n(e.key,i),n(e.isDeleted,!1),...t?[n(e.version,t)]:[]],a=(await this.#e.client.select({version:e.version,revision:e.revision,isCurrent:e.isCurrent,createdAt:e.createdAt,updatedAt:e.updatedAt,isDefaultVersion:e.isDefaultVersion}).from(e).where(u(...r)).orderBy(d`${C("version")} DESC`,d.raw("revision DESC")).all()).map(s=>({version:s.version,revision:s.revision??"",isCurrent:s.isCurrent!==null?s.isCurrent:!1,createdAt:s.createdAt,updatedAt:s.updatedAt,isDefaultVersion:s.isDefaultVersion!==null?s.isDefaultVersion:!1}));return y(a),a}}export{g as RevisionRepository};
|
package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq as a,and as
|
|
1
|
+
import{eq as a,and as u,desc as c}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as f}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{compareVersionsDescending as m}from"../../../utils/version-compare.js";class p{db;constructor(t){this.db=t}async markAllVersionsAsNotDefault(t){await this.db.client.update(e).set({isDefaultVersion:!1}).where(u(a(e.key,t),a(e.isDefaultVersion,!0))).run()}async doesVersionExist(t,n){return await this.db.client.select().from(e).where(u(a(e.key,t),a(e.version,n))).get()!==void 0}async getOrderedVersionListForKey(t){return(await this.db.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(u(a(e.key,t))).orderBy(c(e.createdAt)).all()).map(i=>({version:i.version,isDefaultVersion:!!i.isDefaultVersion,revision:i.revision,createdAt:new Date(i.createdAt)}))}getLatestVersion(t){const n=t.find(r=>r.isDefaultVersion);if(n)return n;const{versionedEntities:i,unversionedEntities:d}=t.reduce((r,s)=>(s.version!==null&&s.version!==f?r.versionedEntities.push(s):r.unversionedEntities.push(s),r),{versionedEntities:[],unversionedEntities:[]});if(i.length>0){i.sort((o,l)=>m(o.version,l.version));const r=i[0].version,s=i.filter(o=>o.version===r);return s.sort((o,l)=>l.createdAt.getTime()-o.createdAt.getTime()),s[0]}return d.length>0?(d.sort((r,s)=>s.createdAt.getTime()-r.createdAt.getTime()),d[0]):null}}export{p as VersionRepository};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client';
|
|
2
|
+
import type { ListResult } from '../types';
|
|
3
|
+
import type { EntityReadModelSchema, EntitySource } from '../../../schemas/read-model-schemas';
|
|
4
|
+
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas';
|
|
5
|
+
import type { Filter } from '../../../../../providers/database/pagination/types';
|
|
6
|
+
import type { GetEntityByIdParams } from '../../../types/params';
|
|
7
|
+
export declare class EntitiesReadRepository {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(db: DatabaseClient);
|
|
10
|
+
getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
11
|
+
paginationParams: PaginationParams;
|
|
12
|
+
rbacTeams?: string[];
|
|
13
|
+
excludedTypes?: string[];
|
|
14
|
+
excludedEntities?: string[];
|
|
15
|
+
}): Promise<ListResult<EntityReadModelSchema>>;
|
|
16
|
+
getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
|
|
17
|
+
getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
|
|
18
|
+
getEntitiesCountByTypes(): Promise<{
|
|
19
|
+
type: string;
|
|
20
|
+
count: number;
|
|
21
|
+
}[]>;
|
|
22
|
+
getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
|
|
23
|
+
getEntitiesCount(source: EntitySource, addedEntities?: EntityReadModelSchema[], entitiesRemovedCount?: number): Promise<{
|
|
24
|
+
total: number;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=entities-read-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{and as a,count as h,eq as l,isNotNull as R,or as A,sql as u}from"drizzle-orm";import{applyPagination as g}from"../../../../../providers/database/pagination/index.js";import{getEffectivePaginationLimit as D}from"../../../../../providers/database/pagination/limit.js";import{entitiesTable as t}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{entitiesAttributesTable as m}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{VERSION_NOT_SPECIFIED as L}from"@redocly/theme/core/constants";import{applyFilter as B}from"../../../../../providers/database/pagination/filter.js";import{getFirstRunRow as O}from"../../../../../providers/database/utils/get-first-row.js";import{logger as v}from"../../../../../tools/notifiers/logger.js";import{createEntityReadModel as f}from"../../mappers/create-entity-read-model.js";import{createEntityFieldsForSelect as w,FIELDS_TO_SELECT_FOR_ENTITY as E}from"../utils.js";import{buildRbacFilter as b}from"../utils/build-rbac-filter.js";import{buildEntitiesExclusionFilter as F}from"../utils/build-entities-exclusion-filter.js";class G{#t;constructor(e){this.#t=e}async getEntities({paginationParams:e,rbacTeams:i,excludedTypes:n,excludedEntities:r}){const s=F(n,r,"entities"),o=this.#t.client.select(w("entities")).from(t).leftJoin(m,l(t.key,m.entityKey)).where(a(b(i,"entities_attributes"),s)),c=this.#t.client.select(E).from(o.as("combined_entities")),S=this.#t.client.select(E).from(o.as("combined_entities")).$dynamic(),T=g(S,{...e,limit:void 0,skip:void 0,after:void 0,before:void 0}),$=this.#t.client.$count(T),C=c.$dynamic(),y=D(e),_=g(C,{...e,limit:y+1}),[k,I]=await Promise.all([_.all(),$]),p=k,N=p.length>y;return{items:p.slice(0,y).map(d=>f(d)).filter(d=>d!==null),hasMore:N,total:I}}async getEntityById(e,i){const{rbacTeams:n,excludedTypes:r,excludedEntities:s}=i||{},o=F(r,s,"entities"),c=await this.#t.client.select(w("entities")).from(t).leftJoin(m,l(t.key,m.entityKey)).where(a(l(t.id,e),b(n,"entities_attributes"),o)).get();return c?f(c):null}async getEntityKeysAndVersionsBySourceFile(e){const i=await this.#t.client.selectDistinct({keyVersion:u`${t.key} || ':' || COALESCE(${t.version}, ${L})`.as("keyVersion")}).from(t).where(a(l(t.sourceFile,e),l(t.source,"file"),R(t.key))).all();return new Set(i.map(n=>n.keyVersion))}async getEntitiesCountByTypes(){return this.#t.client.select({type:t.type,count:h()}).from(t).where(a(l(t.isCurrent,!0),l(t.isDeleted,!1))).groupBy(t.type)}async getOutdatedEntities(e){const i=this.#t.client.select(E).from(t).$dynamic(),{whereCondition:n}=B(i,e),r=A(u`scorecards_status = 'OUTDATED'`,u`scorecards_status IS NULL`),s=n?a(n,r):r;return(await i.where(s).all()).map(c=>f(c)).filter(c=>c!==null)}async getEntitiesCount(e,i,n){let r;try{const s=await this.#t.client.select({count:h()}).from(t).where(l(t.source,e));if(r=Number(s[0]?.count??0),i?.length){const o=await this.#e(e,i);r+=i.length-o}return n!==void 0&&(r-=n),{total:r}}catch(s){throw v.error("Error getting entities count:",s),new Error(`Error getting entities count: ${s?.message}`)}}async#e(e,i){const n=u.join(i.map(o=>u`(${o.key}, ${o.version}, ${o.revision})`),u`, `),r=await this.#t.client.run(u`SELECT count(*) AS count FROM entities WHERE source = ${e} AND (key, version, revision) IN (VALUES ${n})`),s=O(r);return Number(s?.count??0)}}export{G as EntitiesReadRepository};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client';
|
|
2
|
+
import type { EntityDtoSchema } from '../../../schemas/dto-schemas';
|
|
3
|
+
import type { Filter } from '../../../../../providers/database/pagination/types';
|
|
4
|
+
import type { CreateEntityParams } from '../types';
|
|
5
|
+
import type { EntityReadModelSchema } from '../../../schemas/read-model-schemas';
|
|
6
|
+
import type { ScorecardsStatus } from '../../../entities/types';
|
|
7
|
+
export declare class EntitiesWriteRepository {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(db: DatabaseClient, organizationId: string, projectId: string);
|
|
10
|
+
createEntity({ entity, source, fileHash, sourceFile, isRootEntity, isDeleted, rbacTeams, errorOnSkip, revision, }: CreateEntityParams): Promise<EntityReadModelSchema | null>;
|
|
11
|
+
updateEntity(incomingEntity: Partial<EntityDtoSchema>, entityToBeUpdated: EntityReadModelSchema): Promise<EntityReadModelSchema | null>;
|
|
12
|
+
setEntitiesAsOutdated(filter: Filter): Promise<void>;
|
|
13
|
+
softDeleteEntitiesWithRelations({ filter, revision, fileHash, }: {
|
|
14
|
+
filter: Filter;
|
|
15
|
+
revision: string;
|
|
16
|
+
fileHash: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
deleteEntity(entityToBeRemoved: EntityReadModelSchema): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Deletes entities based on a filter.
|
|
21
|
+
* If the entity is current or default version, we need to promote the different version as current and default.
|
|
22
|
+
*/
|
|
23
|
+
deleteEntities(filter: Filter): Promise<boolean>;
|
|
24
|
+
updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
|
|
25
|
+
updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=entities-write-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{and as v,eq as c,isNull as R,or as z,sql as V}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as F}from"@redocly/theme/core/constants";import{telemetryTraceStep as C}from"../../../../../telemetry/helpers/trace-step.js";import{sha1 as _}from"../../../../../utils/crypto/sha1.js";import{logger as d}from"../../../../../tools/notifiers/logger.js";import{envConfig as K}from"../../../../../config/env-config.js";import{entitiesTable as i}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{convertFilterToWhereCondition as O}from"../../../../../providers/database/pagination/filter.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{promiseMapLimit as m}from"../../../../../utils/async/promise-map-limit.js";import{RevisionRepository as H}from"../common/revision-repository.js";import{VersionRepository as $}from"../common/version-repository.js";import{EntityAttributesWriteRepository as P}from"../entityAttributes/entity-attributes-write-repository.js";import{createEntityDbRecord as W}from"../../mappers/create-entity-db-record.js";import{createEntityReadModel as D}from"../../mappers/create-entity-read-model.js";import{createEntityRelationDbRecordFromFileSchema as b}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{createEntityRelationDbRecordFromDto as j}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{EntitiesReadRepository as G}from"./entities-read-repository.js";import{RelationsReadRepository as M}from"../relations/relations-read-repository.js";import{RelationsWriteRepository as q}from"../relations/relations-write-repository.js";const E=15;class fe{#e;#t;#n;#o;#r;#i;#a;#u;#s;constructor(e,t,s){this.#e=e,this.#r=t,this.#i=s,this.#t=new H(e),this.#n=new $(e),this.#o=new P(e),this.#a=new G(e),this.#u=new M(e),this.#s=new q(e,t,s)}async createEntity({entity:e,source:t,fileHash:s,sourceFile:n,isRootEntity:r,isDeleted:o,rbacTeams:u,errorOnSkip:h=!1,revision:f}){return C("catalog_entities.remote_repository.create_entity",async()=>{const{relations:l=[],...p}=e,y=_(JSON.stringify(p)),g=e.version??F,A=f??new Date().toISOString(),L=await this.#t.shouldSkipRevisionCreation(e.key,g,y,r,o);if(Array.isArray(u)&&await this.#o.upsertEntityAttributes({entityKey:e.key,rbacTeams:u,organizationId:this.#r,projectId:this.#i}),L){if(h)throw new Error("Entity validation failed: entity already exists");return d.warn(`Entity ${e.key} already exists, skipping creation`),null}const{shouldSetNewCurrentRevision:w,hasCurrentRevision:x}=await this.#t.getCurrentRevisionInfo({key:e.key,version:g,revision:A}),k=W({entity:{...e,revision:A,hash:y,isCurrent:w,isDefaultVersion:w,isDeleted:o,version:g},organizationId:this.#r,projectId:this.#i,source:t,sourceFile:n??null,fileHash:s??null}),{key:S,...T}=k;if(w&&x&&(await this.#t.markAllRevisionsAsNotCurrent(S),await this.#n.markAllVersionsAsNotDefault(S)),K.isDevelopMode&&!K.REDOCLY_INTERNAL_DEV)return await this.#l(k,l);const N=await this.#e.client.insert(i).values(k).onConflictDoUpdate({target:[i.key,i.source,i.revision,i.version],set:T}).returning();return N.length?(l&&await this.#s.createEntityRelations(l.map(I=>({...I,sourceKey:e.key,targetKey:I.key}))),D(N[0])):null})}async updateEntity(e,t){return C("catalog_entities.remote_repository.update_entity",async()=>{try{d.info(`Updating entity ${t.key} in remote database`);const{shouldSetNewCurrentRevision:s,hasCurrentRevision:n}=await this.#t.getCurrentRevisionInfo({key:t.key,version:e.version??t.version??F,revision:t.revision});s&&n&&(await this.#t.markAllRevisionsAsNotCurrent(t.key),await this.#n.markAllVersionsAsNotDefault(t.key));const r=W({entity:{...t,...e,hash:_(JSON.stringify({...t,...e})),isCurrent:s,isDefaultVersion:s,createdAt:t.createdAt??void 0},organizationId:this.#r,projectId:this.#i,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,scorecardsStatus:h,...f}=r,l=await this.#e.client.insert(i).values(r).onConflictDoUpdate({target:[i.key,i.source,i.revision,i.version],set:{...f,scorecardsStatus:V`CASE WHEN ${i.scorecardsStatus} = 'CALCULATING' THEN 'CANCELLED' ELSE 'OUTDATED' END`}}).returning();return l.length?D(l[0]):null}catch(s){return d.error("Error updating entity",s),null}})}async setEntitiesAsOutdated(e){try{const t=O(e);await this.#e.client.update(i).set({scorecardsStatus:"OUTDATED"}).where(t)}catch(t){d.error("Error updating entities as outdated",t)}}async#l(e,t){const{key:s,source:n,version:r,isDefaultVersion:o,...u}=e,l=await this.#e.client.select({id:i.id}).from(i).where(v(c(i.key,s),r?c(i.version,r):R(i.version))).limit(1).get()!=null?await this.#e.client.update(i).set(u).where(v(c(i.key,s),r?c(i.version,r):R(i.version))).returning():await this.#e.client.insert(i).values(e).onConflictDoUpdate({target:[i.key,i.source,i.revision,i.version],set:u}).returning(),p=t?.map(y=>{const g=b({relation:y,sourceFile:e.sourceFile??"",fileHash:e.fileHash??"",sourceKey:e.key,sourceVersion:e.version??null,sourceRevision:e.revision??null,organizationId:this.#r,projectId:this.#i});return this.#e.client.insert(a).values(g).onConflictDoUpdate({target:[a.sourceKey,a.targetKey,a.sourceVersion,a.targetVersion,a.sourceRevision,a.targetRevision,a.sourceToTargetRelation],set:g}).run()})??[];return await m(p,E,async y=>y),D(l[0])}async softDeleteEntitiesWithRelations({filter:e,revision:t,fileHash:s}){const r={op:"AND",conditions:[e,{field:"is_deleted",operator:"equal",value:!1}]};for(;;){const o=await this.#a.getEntities({paginationParams:{filter:r,limit:500}});if(o.items.length===0)break;const u=await this.#c({entities:o.items,revision:t,fileHash:s});await this.#d(u,t)}}async deleteEntity(e){return C("catalog_entities.remote_repository.delete_entity",async()=>{try{return await this.#s.deleteEntityRelationsOnEntityRemoval(e),await this.#e.client.delete(i).where(c(i.id,e.id)),await this.#t.ensureDefaultAndCurrentRevisionForKey(e.key),e.id}catch(t){return d.error("Error deleting entity",t),null}})}async deleteEntities(e){try{const t=O(e);if(!t)return!1;const s=await this.#e.client.delete(i).where(t).returning({key:i.key,source:i.source,isCurrent:i.isCurrent,isDefaultVersion:i.isDefaultVersion,version:i.version});if(s.length===0)return!0;const n=s.reduce((r,o)=>((o.isCurrent||o.isDefaultVersion)&&r.add(o.key),r),new Set);if(n.size===0)return!0;await m(Array.from(n),E,async r=>this.#t.ensureDefaultAndCurrentRevisionForKey(r));for(const r of s)await this.#e.client.delete(a).where(z(v(c(a.sourceKey,r.key),...r.version?[c(a.sourceVersion,r.version)]:[R(a.sourceVersion)]),v(c(a.targetKey,r.key),...r.version?[c(a.targetVersion,r.version)]:[R(a.targetVersion)])));return!0}catch(t){return d.error("Error deleting entities",t),!1}}async updateEntityScorecardsStatus(e,t){try{return(await this.#e.client.update(i).set({scorecardsStatus:t}).where(c(i.id,e)).returning()).length>0}catch(s){return d.error("Error updating entity scorecards status",s),!1}}async updateEntityScorecardsStatusIfCalculating(e,t){try{return(await this.#e.client.update(i).set({scorecardsStatus:t}).where(V`${i.id} = ${e} AND ${i.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(s){return d.error("Error updating entity scorecards status if calculating",s),!1}}async#c({entities:e,revision:t,fileHash:s}){try{return(await m(e,E,async r=>{const o={type:r.type,key:r.key,title:r.title,summary:r.summary??void 0,tags:r.tags??void 0,metadata:r.metadata??void 0,git:r.git??void 0,contact:r.contact??void 0,links:r.links??void 0,version:r.version??void 0};return this.createEntity({entity:o,sourceFile:r.sourceFile??"",fileHash:s,isDeleted:!0,errorOnSkip:!1,source:r.source,revision:t})})).filter(r=>r!==null)}catch(n){return d.error("Error soft deleting entities",n),[]}}async#d(e,t){try{if(e.length===0)return!0;const s=await m(e,E,async n=>(await this.#u.getRelationsForEntity(n.key,n.version,t)).map(o=>{if(!o)return null;const u=o.direction,h=o.sourceToTargetRelation,f=o.targetKey,l=u==="outgoing"?n.key:f,p=u==="outgoing"?f:n.key,y=u==="outgoing"?h:h.startsWith("reverse:")?h.slice(8):h;return!y||!l||!p?null:j({type:y,sourceKey:l,targetKey:p,sourceVersion:n.version,targetVersion:n.version,sourceRevision:t,targetRevision:t,isDeleted:!0},this.#r,this.#i)}).filter(o=>o!==null));return await m(s.flat(),E,async n=>this.#s.upsertEntityRelation(n)),!0}catch(s){return d.error("Error soft deleting entity relations",s),!1}}}export{fe as EntitiesWriteRepository};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
2
|
+
export declare class EntityAttributesWriteRepository {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(db: DatabaseClient);
|
|
5
|
+
upsertEntityAttributes({ entityKey, rbacTeams, organizationId, projectId, }: {
|
|
6
|
+
entityKey: string;
|
|
7
|
+
rbacTeams: string[];
|
|
8
|
+
organizationId: string;
|
|
9
|
+
projectId: string;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=entity-attributes-write-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{entitiesAttributesTable as e}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{createEntityAttributesDbRecord as a}from"../../mappers/create-entity-attributes-db-record.js";class p{#t;constructor(t){this.#t=t}async upsertEntityAttributes({entityKey:t,rbacTeams:r,organizationId:i,projectId:o}){try{await this.#t.client.insert(e).values(a({rbacTeams:r,entityKey:t,organizationId:i,projectId:o})).onConflictDoUpdate({target:[e.entityKey],set:{rbacTeams:JSON.stringify(r)}}).run()}catch(s){n.error("Error saving entity attributes",s)}}}export{p as EntityAttributesWriteRepository};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { BffCatalogRelatedEntity } from '@redocly/theme/core/types';
|
|
2
2
|
import type { DatabaseClient } from '../../../../../providers/database/client';
|
|
3
3
|
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
|
|
4
|
-
import type { ListResult } from '
|
|
5
|
-
|
|
4
|
+
import type { ListResult } from '../types.js';
|
|
5
|
+
import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
|
|
6
|
+
export declare class RelationsReadRepository {
|
|
6
7
|
#private;
|
|
7
|
-
constructor(db: DatabaseClient
|
|
8
|
+
constructor(db: DatabaseClient);
|
|
8
9
|
getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
|
|
9
10
|
targetKey: string;
|
|
10
11
|
targetRevision: string;
|
|
@@ -19,5 +20,7 @@ export declare class CatalogEntitiesRelationsRepository {
|
|
|
19
20
|
excludedTypes?: string[];
|
|
20
21
|
excludedEntities?: string[];
|
|
21
22
|
}): Promise<ListResult<BffCatalogRelatedEntity>>;
|
|
23
|
+
getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
|
|
24
|
+
getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
|
|
22
25
|
}
|
|
23
|
-
//# sourceMappingURL=
|
|
26
|
+
//# sourceMappingURL=relations-read-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{and as $,desc as L,eq as R,sql as i}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as O}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{entitiesRelationsTable as t}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{entitiesAttributesTable as C}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{excludeFieldsFromFilter as W,getFirstFilterFieldValue as T}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as g}from"../../../../../providers/database/pagination/index.js";import{getEffectivePaginationLimit as S}from"../../../../../providers/database/pagination/limit.js";import{createBffRelatedEntityFromQueryRow as H}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as q}from"../../mappers/map-entity-relation-row.js";import{buildEntitiesExclusionFilter as Y}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as M}from"../utils/build-rbac-filter.js";import{FIELDS_TO_SELECT_FOR_ENTITY_RELATION as p}from"../utils.js";import{createEntityRelationReadModel as A}from"../../mappers/create-entity-relation-read-model.js";class oe{#e;constructor(r){this.#e=r}async getRelationsForEntity(r,n,u){const a=await this.#t(r,n,u);return a?(await this.#e.client.select().from(a).all()).map(c=>q(c)):[]}async getRelatedEntities({key:r,paginationParams:n,rbacTeams:u,excludedTypes:a,excludedEntities:d}){const c=T(n.filter,"version"),y=T(n.filter,"revision"),o=await this.#t(r,c,y);if(!o)return{items:[],total:0};const m=this.#e.client.select({relationType:o.relationName,direction:o.direction,key:e.key,revision:e.revision,id:e.id,type:e.type,title:e.title,summary:e.summary,tags:e.tags,metadata:e.metadata,createdAt:e.createdAt,updatedAt:e.updatedAt,source:e.source,sourceFile:e.sourceFile,version:e.version,isDeleted:e.isDeleted,isCurrent:e.isCurrent,rbacTeams:C.rbacTeams,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${o.entityKey} ORDER BY ${o.priority} ASC, CASE WHEN ${o.entityRevision} = ${e.revision} THEN 1 ELSE 0 END DESC, CASE WHEN ${o.entityVersion} = ${e.version} THEN 1 ELSE 0 END DESC, ${e.isCurrent} DESC, ${e.revision} DESC)`.as("dedupRn")}).from(o).innerJoin(e,i`${o.entityKey} = ${e.key} AND (${o.entityRevision} = ${e.revision} OR ${o.entityRevision} = '' OR ${e.isCurrent} = 1) AND (${o.entityVersion} = ${e.version} OR ${o.entityVersion} = '' OR ${e.version} = ${O})`).leftJoin(C,R(e.key,C.entityKey)).as("unique_relations"),f=M(u,"unique_relations"),E=Y(a,d,"unique_relations");let s=i`${m.dedupRn} = 1 AND COALESCE(${m.isDeleted}, 0) = 0`;f&&(s=i`${s} AND ${f}`),E&&(s=i`${s} AND ${E}`);const l=this.#e.client.select().from(m).$dynamic(),V=this.#e.client.select().from(m).$dynamic(),F=W(n.filter,["version","revision"]),D={...n,filter:F,baseWhereCondition:s},w=g(V,{...D,limit:void 0,skip:void 0,after:void 0,before:void 0}),_=this.#e.client.$count(w),N=S(n),b=g(l,{...D,limit:N+1}),[B,K]=await Promise.all([b.all(),_]),h=B.filter(v=>v.id!=null).map(v=>H(v)).filter(v=>v!==null),I=h.slice(0,N),Q=h.length>N;return{items:I,hasMore:Q,total:K}}async getEntitiesRelations(r={}){const n=this.#e.client.select(p).from(t),u=this.#e.client.select(p).from(n.as("combined_entities_relations")).$dynamic(),a=this.#e.client.select(p).from(n.as("combined_entities_relations")).$dynamic(),d=g(a,{...r,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(d),y=S(r),o=g(u,{...r,limit:y+1}),[m,f]=await Promise.all([o.all(),c]),E=m,s=E.length>y;return{items:E.slice(0,y).map(l=>A(l)).filter(l=>l!==null),hasMore:s,total:f}}async getEntityRelationById(r){const n=await this.#e.client.select(p).from(t).where(R(t.id,r)).get();return n?A(n):null}async#i(r,n){if(n){const c=await this.#e.client.select({version:e.version,revision:e.revision}).from(e).where($(R(e.key,r),R(e.version,n))).orderBy(L(e.revision)).limit(1).get();return c?{version:c.version||null,revision:c.revision||null}:null}const a=await this.#e.client.select({version:e.version,revision:e.revision}).from(e).where($(R(e.key,r),R(e.isCurrent,!0))).limit(1).get();return a?{version:a.version||null,revision:a.revision||null}:null}async#t(r,n,u){const a=u?{version:n||null,revision:u}:await this.#i(r,n||null),d=n||a?.version||null,c=u||a?.revision||null,y=!d||d===O,o=y?i`1 = 1`:i`(${t.sourceVersion} = ${d} OR ${t.sourceVersion} = '')`,m=y?i`1 = 1`:i`(${t.targetVersion} = ${d} OR ${t.targetVersion} = '')`,f=c?i`(${t.sourceRevision} <= ${c} OR ${t.sourceRevision} = '')`:i`1 = 0`,E=c?i`(${t.targetRevision} <= ${c} OR ${t.targetRevision} = '')`:i`1 = 0`,s=this.#e.client.select({entityKey:t.targetKey,entityRevision:t.targetRevision,entityVersion:t.targetVersion,relationName:t.sourceToTargetRelation,direction:i`'outgoing'`.as("direction"),priority:i`1`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.targetKey}, ${t.sourceToTargetRelation} ORDER BY CASE WHEN ${t.sourceVersion} != '' THEN 1 ELSE 0 END DESC, ${t.sourceRevision} DESC)`.as("rn")}).from(t).where($(R(t.sourceKey,r),o,f)).as("outgoing_filtered"),l=this.#e.client.select({entityKey:t.sourceKey,entityRevision:t.sourceRevision,entityVersion:t.sourceVersion,relationName:t.targetToSourceRelation,direction:i`'incoming'`.as("direction"),priority:i`2`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.sourceKey}, ${t.targetToSourceRelation} ORDER BY CASE WHEN ${t.targetVersion} != '' THEN 1 ELSE 0 END DESC, ${t.targetRevision} DESC)`.as("rn")}).from(t).where($(R(t.targetKey,r),m,E)).as("incoming_filtered");return this.#e.client.select({entityKey:s.entityKey,entityRevision:s.entityRevision,entityVersion:s.entityVersion,relationName:s.relationName,direction:s.direction,priority:s.priority}).from(s).where(i`${s.rn} = 1 AND COALESCE(${s.isDeleted}, 0) = 0`).unionAll(this.#e.client.select({entityKey:l.entityKey,entityRevision:l.entityRevision,entityVersion:l.entityVersion,relationName:l.relationName,direction:l.direction,priority:l.priority}).from(l).where(i`${l.rn} = 1 AND COALESCE(${l.isDeleted}, 0) = 0`)).as("all_relations")}}export{oe as RelationsReadRepository};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
2
|
+
import type { DatabaseEntityRelation, DatabaseEntityRelationDto } from '../../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js';
|
|
3
|
+
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
4
|
+
import type { EntityRelationDtoSchema } from '../../../schemas/dto-schemas.js';
|
|
5
|
+
import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
|
|
6
|
+
export declare class RelationsWriteRepository {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(db: DatabaseClient, organizationId: string, projectId: string);
|
|
9
|
+
createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<EntityRelationReadModelSchema | null>;
|
|
10
|
+
createEntityRelations(relations: EntityRelationDtoSchema[]): Promise<(EntityRelationReadModelSchema | null)[]>;
|
|
11
|
+
upsertEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
|
|
12
|
+
deleteEntityRelation(id: string): Promise<string | null>;
|
|
13
|
+
deleteEntitiesRelations(filter: Filter): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Deletes entity relations when an entity is removed.
|
|
16
|
+
* The deletion logic depends on what other revisions exist:
|
|
17
|
+
* - If this is the only revision of the key: remove all relations with this key (source or target)
|
|
18
|
+
* - If this is the only revision with given version: remove relations with key+version (any revision)
|
|
19
|
+
* - Always: remove relations with exact key+version+revision match
|
|
20
|
+
*/
|
|
21
|
+
deleteEntityRelationsOnEntityRemoval(entity: {
|
|
22
|
+
id: string;
|
|
23
|
+
key: string;
|
|
24
|
+
version?: string | null;
|
|
25
|
+
revision?: string | null;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=relations-write-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{and as a,eq as i,ne as m,or as h,sql as g}from"drizzle-orm";import{entitiesRelationsTable as t}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{logger as c}from"../../../../../tools/notifiers/logger.js";import{telemetryTraceStep as l}from"../../../../../telemetry/helpers/trace-step.js";import{entitiesTable as o}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{promiseMapLimit as f}from"../../../../../utils/async/promise-map-limit.js";import{convertFilterToWhereCondition as v}from"../../../../../providers/database/pagination/filter.js";import{createEntityRelationReadModel as w}from"../../mappers/create-entity-relation-read-model.js";import{createEntityRelationDbRecordFromDto as _}from"../../mappers/create-entity-relation-db-record-from-dto.js";const E=15;class k{#e;#t;#r;constructor(r,e,n){this.#e=r,this.#t=e,this.#r=n}async createEntityRelation(r){return l("catalog_entities.remote_repository.create_entity_relation",async()=>{if(!r)return null;try{const e=_(r,this.#t,this.#r),n=await this.upsertEntityRelation(e);return w(n)}catch(e){throw c.error("Error creating entity relation",e),e}})}async createEntityRelations(r){return l("catalog_entities.remote_repository.create_entity_relations",async()=>await f(r,E,async e=>this.createEntityRelation(e)))}async upsertEntityRelation(r){if(!r)return null;try{const{sourceKey:e,targetKey:n,sourceVersion:R,targetVersion:s,sourceRevision:y,targetRevision:p,...d}=r,u=await this.#e.client.insert(t).values(r).onConflictDoUpdate({target:[t.sourceKey,t.targetKey,t.sourceVersion,t.targetVersion,t.sourceRevision,t.targetRevision,t.sourceToTargetRelation],set:d}).returning();return u?.length?u[0]:null}catch(e){return c.error("Error creating entity relation",e),null}}async deleteEntityRelation(r){return l("catalog_entities.remote_repository.delete_entity_relation",async()=>{try{return await this.#e.client.delete(t).where(i(t.id,r)),r}catch(e){return c.error("Error deleting entity relation",e),null}})}async deleteEntitiesRelations(r){return l("catalog_entities.remote_repository.delete_entities_relations",async()=>{try{const e=v(r);return e?(await this.#e.client.delete(t).where(e),!0):!1}catch(e){return c.error("Error deleting entities relations",e),!1}})}async deleteEntityRelationsOnEntityRemoval(r){const{key:e,version:n,revision:R}=r,s=n??"",y=R??"";if(((await this.#e.client.select({count:g`COUNT(*)`}).from(o).where(a(i(o.key,e),m(o.id,r.id))).get())?.count??0)===0){await this.#e.client.delete(t).where(h(i(t.sourceKey,e),i(t.targetKey,e)));return}if(((await this.#e.client.select({count:g`COUNT(*)`}).from(o).where(a(i(o.key,e),i(o.version,s),m(o.id,r.id))).get())?.count??0)===0){await this.#e.client.delete(t).where(h(a(i(t.sourceKey,e),i(t.sourceVersion,s)),a(i(t.targetKey,e),i(t.targetVersion,s))));return}await this.#e.client.delete(t).where(h(a(i(t.sourceKey,e),i(t.sourceVersion,s),i(t.sourceRevision,y)),a(i(t.targetKey,e),i(t.targetVersion,s),i(t.targetRevision,y))))}}export{k as RelationsWriteRepository};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EntityDtoSchema } from '../../schemas/dto-schemas';
|
|
2
|
+
import type { EntitySource } from '../../schemas/read-model-schemas';
|
|
3
|
+
export type ListResult<T> = {
|
|
4
|
+
items: T[];
|
|
5
|
+
hasMore?: boolean;
|
|
6
|
+
total: number;
|
|
7
|
+
};
|
|
8
|
+
export type CatalogFiltersParams = {
|
|
9
|
+
entitiesTypes?: string[];
|
|
10
|
+
emptyFilters?: string[];
|
|
11
|
+
rbacTeams?: string[];
|
|
12
|
+
excludedTypes?: string[];
|
|
13
|
+
excludedEntities?: string[];
|
|
14
|
+
};
|
|
15
|
+
export type FilterOption = {
|
|
16
|
+
value: string;
|
|
17
|
+
count: number;
|
|
18
|
+
};
|
|
19
|
+
export type CreateEntityParams = {
|
|
20
|
+
entity: EntityDtoSchema;
|
|
21
|
+
source: EntitySource;
|
|
22
|
+
revision?: string;
|
|
23
|
+
fileHash?: string;
|
|
24
|
+
sourceFile?: string;
|
|
25
|
+
rbacTeams?: string[];
|
|
26
|
+
isRootEntity?: boolean;
|
|
27
|
+
isDeleted?: boolean;
|
|
28
|
+
errorOnSkip?: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type CreateEntityResult = {
|
|
31
|
+
result: 'created';
|
|
32
|
+
entityKey: string;
|
|
33
|
+
entityRevision: string;
|
|
34
|
+
entityVersion: string | null;
|
|
35
|
+
} | {
|
|
36
|
+
result: 'skipped' | 'error';
|
|
37
|
+
entityKey: string;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DatabaseConnectionFactory } from '../../../providers/database/database-connection-factory';
|
|
2
|
+
export type PublishCatalogEntitiesParams = {
|
|
3
|
+
baseDbDir: string;
|
|
4
|
+
chunkSize?: number;
|
|
5
|
+
changedSourceFiles?: string[];
|
|
6
|
+
removedSourceFiles?: string[];
|
|
7
|
+
};
|
|
8
|
+
export type PublishCatalogEntitiesRunResult = {
|
|
9
|
+
runId: string;
|
|
10
|
+
published: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type PublishRowsResult = {
|
|
13
|
+
upserted: number;
|
|
14
|
+
skipped: number;
|
|
15
|
+
};
|
|
16
|
+
export type DatabaseConnection = NonNullable<Awaited<ReturnType<typeof DatabaseConnectionFactory.create>>>;
|
|
17
|
+
export type SourceFilesFilter = string[] | 'none';
|
|
18
|
+
export type BulkSyncResult<T> = Array<{
|
|
19
|
+
status: 'ok';
|
|
20
|
+
resource: T | null;
|
|
21
|
+
} | {
|
|
22
|
+
key: string;
|
|
23
|
+
status: 'error';
|
|
24
|
+
error: string;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import y from"node:path";import{removeLeadingSlash as g}from"@redocly/theme/core/utils";import{toKebabCase as d}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as m}from"../../../../../utils/async/promise-map-limit.js";import{removeMarkdocTags as w}from"../../../../../../markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as v}from"./base.js";const f=15;class A extends v{constructor(t){super("arazzo",t)}mapApiDescriptionToEntity(t,i){const a=g(t.realRelativePath),l=t.document.info.title,e=this.resolveEntityKey({realRelativePath:t.realRelativePath,customKey:t.document["x-redocly-catalog-key"]});return{type:this.type,key:e,title:l,summary:t.document.info.description?w(t.document.info.description):null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:a},version:i}}async loadApiDescriptions(){return(await this.context.cache.load(".","arazzo-docs")).data}async processApiDescription(t,i,a,l){if(!this.#t(t)){this.context.logger.warn(`Skipping Arazzo description without source descriptions: ${t.realRelativePath}`);return}const e=this.getRbacTeamsForDefinition(t.relativePath),o=this.mapApiDescriptionToEntity(t,a);await this.catalogEntitiesService.createEntity({entity:{...o},revision:i,sourceFile:t.realRelativePath,fileHash:t.hash,isRootEntity:!0,rbacTeams:e,source:"file"}),l.delete(`${o.key}:${a}`),await this.#e(t,o.key,o.version,a,i,l,e);const h=t.document.sourceDescriptions||[];await m(h,f,async r=>{if(!(r.type!=="openapi"||!r.url))try{const s=this.resolveSourceDescriptionUrl(r.url,t.realRelativePath);if(!s){!r.url.startsWith("http://")&&!r.url.startsWith("https://")&&this.context.logger.warn(`Could not resolve URL to local path: ${r.url}`);return}const c=await this.context.cache.load(s,"load-oas");if(!(c.data&&Array.isArray(c.data)&&c.data.length>0)){this.context.logger.warn(`No OpenAPI definition found at path: ${s}`);return}const p=c.data[0],u=this.resolveEntityKey({realRelativePath:p.realRelativePath,customKey:p.definition["x-redocly-catalog-key"]});await this.catalogEntitiesService.createEntityRelation({sourceKey:o.key,type:"relatesTo",targetKey:u,sourceFile:t.realRelativePath,fileHash:t.hash}),await this.#r(t,r.name,p,o.key,u,o.version,i)}catch(s){this.context.logger.warn(`Failed to create relation to OpenAPI source "${r.url}": ${s instanceof Error?s.message:"Unknown error"}`)}})}#t=t=>!!t?.document?.sourceDescriptions&&t.document.sourceDescriptions.length>0;#e=async(t,i,a,l,e,o,h)=>{try{const r=t.document.components?.inputs,s=r?Object.entries(r):[],c=[];for(const[n,p]of s)c.push(async()=>{const u=await this.#a({schemaName:n,schema:p,description:t,parentKey:i,parentVersion:a,parentRevision:e,rbacTeams:h});o.delete(`${u?.key}:${l}`),u&&await this.catalogEntitiesService.createEntityRelation({sourceKey:i,type:"uses",targetKey:u.key,sourceFile:t.realRelativePath,fileHash:t.hash,sourceVersion:a,targetVersion:a,sourceRevision:e,targetRevision:e})});if(c.length===0)return;await m(c,f,n=>n())}catch(r){this.context.logger.warn(`Failed to create data schema entities for Arazzo description: ${r instanceof Error?r.message:"Unknown error"}`)}};#a=async({schemaName:t,schema:i,description:a,parentKey:l,parentVersion:e,parentRevision:o,rbacTeams:h})=>{const r={type:"data-schema",key:`${l}-${d(t)}`,title:t,summary:i.description||i.title||null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:a.realRelativePath,schema:"{}"},version:e};try{return await this.catalogEntitiesService.createEntity({entity:r,sourceFile:a.realRelativePath,fileHash:a.hash,rbacTeams:h,source:"file",revision:o})}catch(s){return this.context.logger.warn(`Failed to create data schema entity for ${t}: ${s instanceof Error?s.message:"Unknown error"}`),null}};#r=async(t,i,a,l,e,o,h)=>{const r=t.document.workflows||[];if(r.length===0)return;const s=new Set;for(const c of r)for(const n of c.steps||[]){if(!n.operationId)continue;const p=n.operationId.startsWith(`${i}.`)?n.operationId.substring(`${i}.`.length):n.operationId;p&&s.add(p)}s.size!==0&&await m(Array.from(s),f,async c=>{try{const n=`${e}-${d(c)}`;await this.catalogEntitiesService.createEntityRelation({sourceKey:l,type:"uses",targetKey:n,sourceFile:t.realRelativePath,fileHash:t.hash,sourceVersion:o,targetVersion:o,sourceRevision:h,targetRevision:h})}catch(n){this.context.logger.warn(`Failed to create relation to operation "${c}": ${n instanceof Error?n.message:"Unknown error"}`)}})};resolveSourceDescriptionUrl(t,i){try{const a=t.trim(),l=a.startsWith("@")?a.slice(1):a,[e]=l.split("#");if(e.startsWith("http://")||e.startsWith("https://"))return null;if(e.startsWith("/"))return g(y.posix.normalize(e));const o=y.posix.dirname(i);return e.startsWith(o+"/")?y.posix.normalize(e):y.posix.normalize(y.posix.join(o,e))}catch{return this.context.logger.warn(`Failed to resolve URL: ${t}`),null}}}export{A as ArazzoEntitiesExtractor};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { BundledDefinition } from '../../../../asyncapi-docs/asyncapi-doc-loader';
|
|
2
|
-
import type { EntityFileSchema } from '@redocly/config';
|
|
3
2
|
import type { BaseApiEntitiesExtractorParams } from '../../../types/extractors.js';
|
|
3
|
+
import type { EntityDtoSchema } from '../../../schemas/dto-schemas';
|
|
4
4
|
import { BaseApiEntitiesExtractor } from './base.js';
|
|
5
5
|
type Params = BaseApiEntitiesExtractorParams;
|
|
6
6
|
export declare class AsyncApiEntitiesExtractor extends BaseApiEntitiesExtractor<BundledDefinition> {
|
|
7
7
|
#private;
|
|
8
8
|
constructor(params: Params);
|
|
9
|
-
mapApiDescriptionToEntity(description: BundledDefinition, version: string):
|
|
9
|
+
mapApiDescriptionToEntity(description: BundledDefinition, version: string): EntityDtoSchema;
|
|
10
10
|
loadApiDescriptions(): Promise<BundledDefinition[]>;
|
|
11
11
|
processApiDescription(description: BundledDefinition, revision: string, version: string, entitiesToRemoveFromFile: Set<string>): Promise<void>;
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{removeLeadingSlash as
|
|
1
|
+
import{removeLeadingSlash as R}from"@redocly/theme/core/utils";import{toKebabCase as f}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as p}from"../../../../../utils/async/promise-map-limit.js";import{promiseMapLimitWithStatus as $}from"../../../../../utils/async/promise-map-limit-with-status.js";import{removeMarkdocTags as d}from"../../../../../../markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as E}from"./base.js";import{extractPartsFromComponentsRef as y}from"../../../utils/extract-parts-from-components-ref.js";import{extractPartsFromChannelsMessageRef as w}from"../../../utils/extract-parts-from-channels-message-ref.js";const u=15;class M extends E{constructor(e){super("asyncapi",e)}mapApiDescriptionToEntity(e,t){const a=R(e.realRelativePath),n=e.document.info.title,s=this.resolveEntityKey({realRelativePath:e.realRelativePath,customKey:e.document["x-redocly-catalog-key"]});return{type:this.type,key:s,title:n,summary:d(e.document.info.description),tags:e.document.info.tags?.map(r=>r.name),metadata:{specType:this.specType,descriptionFile:a},version:t}}async loadApiDescriptions(){return(await this.context.cache.load(".","asyncapi-docs")).data}async processApiDescription(e,t,a,n){const s=this.getRbacTeamsForDefinition(e.relativePath),r=this.mapApiDescriptionToEntity(e,a);await this.catalogEntitiesService.createEntity({entity:r,sourceFile:e.realRelativePath,fileHash:e.hash,isRootEntity:!0,rbacTeams:s,source:"file"}),n.delete(`${r.key}:${a}`);const o=this.#a(e),[i,c]=await Promise.allSettled([this.#s(e,r.key,r.version,a,t,n,s),this.#n(o,e,r.key,r.version,a,t,n,s)]);i.status!=="fulfilled"&&this.context.logger.error("Schema processing failed:",i.reason),c.status!=="fulfilled"&&this.context.logger.error("Operation processing failed:",c.reason)}#a=e=>{const t=e.documentWithReferences.operations;return t?Object.entries(t).map(([a,n])=>({operationName:a,operation:n})):[]};#s=async(e,t,a,n,s,r,o)=>{const i=e.document.components?.schemas;if(!i)return;const c=Object.entries(i);if(c.length===0)return;const l=await $(c,u,async([m,h])=>{const g=await this.#r({schemaName:m,schema:h,description:e,parentKey:t,parentVersion:a,parentRevision:s,rbacTeams:o});r.delete(`${g?.key}:${n}`),g&&await this.catalogEntitiesService.createEntityRelation({sourceKey:t,type:"uses",targetKey:g.key,sourceFile:e.realRelativePath,fileHash:e.hash,sourceVersion:a,targetVersion:a,sourceRevision:s,targetRevision:s})},this.context.logger);l.count.failed>0&&this.context.logger.warn(`Schema processing completed with ${l.count.failed} failures out of ${c.length} schemas for ${e.realRelativePath}`)};#r=async({schemaName:e,schema:t,description:a,parentKey:n,parentVersion:s,parentRevision:r,rbacTeams:o})=>{const i=`${n}-${f(e)}`,c="title"in t?t.title??t.description:null,l=JSON.stringify(t),m={type:"data-schema",key:i,title:e,summary:c,tags:[],metadata:{specType:this.specType,schema:l},version:s};try{return await this.catalogEntitiesService.createEntity({entity:m,sourceFile:a.realRelativePath,fileHash:a.hash,rbacTeams:o,source:"file",revision:r})}catch(h){return this.context.logger.warn(`Failed to create data schema entity for ${e}: ${h instanceof Error?h.message:"Unknown error"}`),null}};#n=async(e,t,a,n,s,r,o,i)=>{if(!e.length)return;const c=await $(e,u,async({operationName:l,operation:m})=>{const h=await this.#o(m,l,t,a,n,r,i);h&&o.delete(`${h}:${s}`)},this.context.logger);c.count.failed>0&&this.context.logger.warn(`Operation processing completed with ${c.count.failed} failures out of ${e.length} operations for ${t.realRelativePath}`)};#o=async(e,t,a,n,s,r,o)=>{const i=await this.#i(e.messages??[],a,n),c=await this.#c(t,e,i,a,n,s,r,o);return c&&await this.#l({apiOperationKey:c.key,operation:e,descriptionUniqueKey:n,description:a,descriptionVersion:s,parentRevision:r}),c?.key??null};#i=async(e,t,a)=>{if(!e||e.length===0)return[];const n=new Set;for(const s of e){let r=null;if("$ref"in s){const o=s.$ref.startsWith("#/channels/")?this.#e(s.$ref,t):s.$ref;if(o){const i=y(o);if(i?.componentName&&i.componentType==="messages"){const c=t.documentWithReferences.components?.messages[i.componentName];c?.payload&&"$ref"in c.payload&&c.payload.$ref&&(r=c.payload.$ref)}}}else s.payload&&"$ref"in s.payload&&s.payload.$ref&&(r=s.payload.$ref);if(r){const o=y(r);o?.componentName&&o.componentType==="schemas"&&n.add(`${a}-${f(o.componentName)}`)}}return Array.from(n)};#c=async(e,t,a,n,s,r,o,i)=>{const c={type:"api-operation",key:`${s}-${f(e)}`,title:t.title||e,summary:t.summary??"",tags:t.tags?.map(l=>l.name)??[],metadata:{method:t.action==="send"?"PUBLISH":"SUBSCRIBE",path:t.channel.address??"",payload:t.action==="receive"?a:[],responses:t.action==="send"?a:[]},version:r};try{return await this.catalogEntitiesService.createEntity({entity:c,sourceFile:n.realRelativePath,fileHash:n.hash,rbacTeams:i,source:"file",revision:o})}catch(l){return this.context.logger.warn(`Failed to create API operation entity for ${e}: ${l instanceof Error?l.message:"Unknown error"}`),null}};#l=async({apiOperationKey:e,operation:t,descriptionUniqueKey:a,description:n,descriptionVersion:s,parentRevision:r})=>(await this.catalogEntitiesService.createEntityRelation({sourceKey:e,type:"partOf",targetKey:a,sourceFile:n.realRelativePath,fileHash:n.hash,sourceVersion:s,targetVersion:s,sourceRevision:r,targetRevision:r}),await this.#h(t,e,n,s,r),!Array.isArray(t.messages)||!t.messages?.length?[]:await this.#m(t.messages,e,n,a,s,r));#h=async(e,t,a,n,s)=>{e["x-catalog-relations"]?.length&&await p(e["x-catalog-relations"],u,async r=>{try{this.validateEntityRelationFileSchema(r),await this.catalogEntitiesService.createEntityRelation({sourceKey:t,type:r.type,targetKey:r.key,sourceFile:a.realRelativePath,fileHash:a.hash,sourceVersion:n,targetVersion:"",sourceRevision:s,targetRevision:""})}catch(o){this.context.logger.warn(`Error creating entity relation for operation ${t} based on custom property: ${o instanceof Error?o.message:"Unknown error"}`)}})};#m=async(e,t,a,n,s,r)=>e.length===0?[]:(await p(e,u,async i=>await this.#f(i,t,a,n,s,r)??"")).filter(i=>!!i);#f=async(e,t,a,n,s,r)=>"$ref"in e?this.#y(e,t,a,n,s,r):e.payload?this.#u(e,t,a,n,s,r):null;#y=async(e,t,a,n,s,r)=>{const o=e.$ref.startsWith("#/channels/")?this.#e(e.$ref,a):e.$ref;if(!o)return null;const i=y(o);if(!i||!i.componentName||i.componentType!=="messages")return null;const c=a.documentWithReferences.components?.messages[i.componentName];return!c?.payload||!("$ref"in c.payload)||!c.payload.$ref?null:this.#t(c.payload.$ref,t,a,n,s,r)};#e=(e,t)=>{const a=w(e);if(!a||!a.channelName||!a.messageName)return null;const n=t.documentWithReferences.channels?.[a.channelName];if(!n?.messages)return null;const s=n.messages[a.messageName];return!s||!("$ref"in s)||typeof s.$ref!="string"||!s.$ref.startsWith("#/components/messages/")?null:s.$ref};#u=async(e,t,a,n,s,r)=>!e.payload||!("$ref"in e.payload)||!e.payload.$ref?null:this.#t(e.payload.$ref,t,a,n,s,r);#t=async(e,t,a,n,s,r)=>{const o=y(e);if(!o||!o.componentName||o.componentType!=="schemas")return null;const i=`${n}-${f(o.componentName)}`;return await this.catalogEntitiesService.createEntityRelation({sourceKey:t,type:"uses",targetKey:i,sourceFile:a.realRelativePath,fileHash:a.hash,sourceVersion:s,targetVersion:s,sourceRevision:r,targetRevision:r}),i}}export{M as AsyncApiEntitiesExtractor};
|
package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { type EntityFileSchema } from '@redocly/config';
|
|
2
1
|
import type { AfterRoutesCreatedActions, FileInfo, LifecycleContext } from '../../../../../types';
|
|
3
2
|
import type { CatalogEntitiesService } from '../../../database/catalog-entities-service.js';
|
|
4
3
|
import type { BaseEntitiesExtractor } from '../base';
|
|
5
4
|
import type { FileType } from '../../../../../persistence/file-hashes/types.js';
|
|
6
5
|
import type { HashManager } from '../../../utils/hash-manager.js';
|
|
7
6
|
import type { BaseApiEntitiesExtractorParams, SpecType } from '../../../types/extractors.js';
|
|
7
|
+
import type { EntityDtoSchema } from '../../../schemas/dto-schemas.js';
|
|
8
8
|
export declare abstract class BaseApiEntitiesExtractor<BundledApiDefinition extends Pick<FileInfo, 'realRelativePath' | 'relativePath' | 'isVirtual' | 'hash'>> implements BaseEntitiesExtractor {
|
|
9
9
|
#private;
|
|
10
10
|
protected type: "api-description";
|
|
@@ -32,7 +32,7 @@ export declare abstract class BaseApiEntitiesExtractor<BundledApiDefinition exte
|
|
|
32
32
|
extensionPattern?: RegExp;
|
|
33
33
|
}): string;
|
|
34
34
|
protected abstract loadApiDescriptions(): Promise<BundledApiDefinition[]>;
|
|
35
|
-
protected abstract mapApiDescriptionToEntity(definition: BundledApiDefinition, version: string):
|
|
35
|
+
protected abstract mapApiDescriptionToEntity(definition: BundledApiDefinition, version: string, revision?: string): EntityDtoSchema;
|
|
36
36
|
protected abstract processApiDescription(definition: BundledApiDefinition, revision: string, version: string, entitiesToRemoveFromFile: Set<string>): Promise<void>;
|
|
37
37
|
}
|
|
38
38
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{entityRelationFileSchema as
|
|
1
|
+
import{entityRelationFileSchema as P}from"@redocly/config";import{removeLeadingSlash as _}from"@redocly/theme/core/utils";import{toKebabCase as R}from"../../../../../../utils/string/to-kebab-case.js";import{FileHashStatus as g}from"../../../../../persistence/file-hashes/types.js";import{promiseMapLimit as w}from"../../../../../utils/async/promise-map-limit.js";import{OPERATORS as A}from"../../../../../providers/database/pagination/constants.js";import{VERSION_NOT_SPECIFIED as T}from"@redocly/theme/core/constants";import{getRbacTeamsListForResource as F}from"../../../../../utils/rbac.js";import{envConfig as u}from"../../../../../config/env-config.js";import{resolveEntityVersion as S}from"../../../utils/resolve-entity-version.js";import{catalogDataCollector as p}from"../../../utils/catalog-data-collector.js";import{createValidator as D}from"../../../utils/ajv-validator.js";const H=15,C=200,O=500;class z{type="api-description";specType;fileType;actions;context;catalogEntitiesService;fileHashManager;entitySources={};#e;constructor(i,e){this.specType=i,this.fileType=e.fileType,this.actions=e.actions,this.context=e.context,this.catalogEntitiesService=e.catalogEntitiesService,this.fileHashManager=e.fileHashManager,this.#e=e.shouldCalculateEntities??!1}async extract(){const i=await this.loadApiDescriptions(),e=await this.fileHashManager.getStatusSnapshot(this.fileType);await this.fileHashManager.markAllAsOutdated(this.fileType),i.length&&p.addExtractor(this.specType);const a=this.#s(i),t={skipped:0,fileHashMissing:0,fileHashMismatch:0,shouldCalculateFlag:0,forceRevalidateFlag:0,previouslyUnconfirmed:0},o=[],r=new Set;await w(Array.from(a.values()),H,async c=>{for(const{description:s,version:l}of c)try{const n=s.hash;if(!n)continue;r.add(s.realRelativePath);const h=await this.fileHashManager.getByPath(s.realRelativePath),m=h?.hash!==n,v=e.get(s.realRelativePath),E=v!==void 0&&v!==g.UP_TO_DATE,f=this.#i({fileHashChanged:m,hasExistingHashRecord:!!h,previouslyUnconfirmed:E});if(!(f!==null)){t.skipped++,p.increaseSkippedFilesCount(),await this.fileHashManager.upsert(this.fileType,s.realRelativePath,n,g.UP_TO_DATE);continue}f&&t[f]++,f==="fileHashMismatch"&&h&&o.length<3&&o.push({path:s.realRelativePath,stored:h.hash,incoming:n});const d=await this.catalogEntitiesService.getEntityKeysAndVersionsBySourceFile(s.realRelativePath);await this.#a(d);const y=new Date().toISOString();await this.processApiDescription(s,y,l,d),(m||E||u.FORCE_CATALOG_CACHE_REVALIDATE)&&p.markSourceFileAsChanged(s.realRelativePath),await this.#r(d,s.realRelativePath,y,n),p.increaseProcessedFilesCount(),await this.fileHashManager.upsert(this.fileType,s.realRelativePath,n,g.OUTDATED),p.markFileHashPendingConfirmation({fileType:this.fileType,filePath:s.realRelativePath,hash:n})}catch(n){this.context.logger.warn(`Error extracting entities from ${this.specType} description: ${s.realRelativePath}`),this.context.logger.warn(n)}}),await this.#o(r)}#i({fileHashChanged:i,hasExistingHashRecord:e,previouslyUnconfirmed:a}){return i?e?"fileHashMismatch":"fileHashMissing":a?"previouslyUnconfirmed":this.#e?"shouldCalculateFlag":u.FORCE_CATALOG_CACHE_REVALIDATE?"forceRevalidateFlag":null}#a=async i=>{u.FORCE_CATALOG_CACHE_REVALIDATE&&(await this.catalogEntitiesService.deleteEntities({field:"key",operator:"in",value:Array.from(i).map(e=>e.split(":")[0])}),i.clear())};#t=async i=>{let e=0,a=0;for(;;){const t=await this.catalogEntitiesService.getEntities({paginationParams:{limit:O,filter:i}});if(!t||t.items.length===0)break;await this.catalogEntitiesService.deleteEntities({field:"id",operator:"in",value:t.items.map(({id:o})=>o)}),e+=t.items.length,a+=1}return{total:e,pages:a}};#s(i){const e=new Map;for(const a of i)if(!(a.isVirtual||!a.hash))try{const t=this.#n(a),o=this.mapApiDescriptionToEntity(a,t),r=e.get(o.key)??[];r.push({description:a,version:t}),e.set(o.key,r)}catch(t){this.context.logger.warn(`Error resolving entity key for ${this.specType} description (skipping): ${a.realRelativePath}`),this.context.logger.warn(t)}return e}#o=async i=>{const e=await this.fileHashManager.getAllOutdated(this.fileType);if(!e||e.length===0)return;const a=e.filter(({filePath:l})=>!i.has(l));if(a.length===0)return;a.forEach(({filePath:l})=>{p.markSourceFileAsRemoved(l)});const t=a.map(({filePath:l})=>l),{total:o,pages:r}=await this.#t({op:"AND",conditions:[{field:"source_file",operator:"in",value:t},{field:"is_current",operator:"equal",value:!0}]}),{total:c,pages:s}=await this.#t({field:"source_file",operator:"in",value:t});this.context.logger.info(`[${this.specType}] removed-files cleanup: files=${t.length} currentRevisionsDeleted=${o} currentPages=${r} orphanRevisionsDeleted=${c} orphanPages=${s} removedFiles=${t.slice(0,3).join(", ")}${t.length>3?`, +${t.length-3} more`:""}`)};#r=async(i,e,a,t)=>{if(i.size===0||u.FORCE_CATALOG_CACHE_REVALIDATE)return;const o=Array.from(i).map(r=>{const[c,s]=r.split(":");return{key:c,version:s}});for(let r=0;r<o.length;r+=C){const c=o.slice(r,r+C),s=Array.from(new Set(c.map(({key:n})=>n))),l=c.map(({key:n,version:h})=>({op:A.AND,conditions:[{field:"key",operator:"equal",value:n},{field:"version",operator:"equal",value:h}]}));await this.catalogEntitiesService.softDeleteEntitiesWithRelations({revision:a,fileHash:t,filter:{op:"AND",conditions:[{field:"key",operator:"in",value:s},{op:A.OR,conditions:l},{field:"source",operator:"equal",value:"file"},{field:"source_file",operator:"equal",value:e},{field:"is_current",operator:"equal",value:!0}]}})}};#n(i){const e=i.document?.info?.version??i.definition?.info?.version??null,a=S(e,i.realRelativePath);return a.success?a.version??T:T}validateEntityRelationFileSchema(i){D(P,{errorPrefix:"Entity relation validation failed:",dataVar:"relation"})(i)}getRbacTeamsForDefinition(i){const e=this.actions.getConfig().access?.rbac,a=this.actions.getRouteByFsPath(i);return F(a||{fsPath:i},e||{})}resolveEntityKey({realRelativePath:i,customKey:e,extensionPattern:a}){const t=this.#l(i,a);return typeof e=="string"&&e.trim()?R(e.trim()):t}#l(i,e){let t=_(i);for(;/^@[^/]+\//.test(t);)t=t.replace(/^@[^/]+\//,"");t=t.replace(/\/@[^/]+/g,"");const o=e?t.replace(e,""):t.replace(/\.[^.]+$/,"");return R(o.replace(/[\\/]/g,"-"))}}export{z as BaseApiEntitiesExtractor};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GraphQLSchema } from 'graphql';
|
|
2
|
-
import type { EntityFileSchema } from '@redocly/config';
|
|
3
2
|
import type { FileInfo } from '../../../../../types';
|
|
4
3
|
import type { BaseApiEntitiesExtractorParams } from '../../../types/extractors.js';
|
|
4
|
+
import type { EntityDtoSchema } from '../../../schemas/dto-schemas.js';
|
|
5
5
|
import { BaseApiEntitiesExtractor } from './base.js';
|
|
6
6
|
type GraphqlBundledDefinition = Omit<Pick<FileInfo, 'realRelativePath' | 'relativePath' | 'isVirtual' | 'hash'>, 'hash'> & {
|
|
7
7
|
hash: string;
|
|
@@ -13,7 +13,7 @@ export declare class GraphqlEntitiesExtractor extends BaseApiEntitiesExtractor<G
|
|
|
13
13
|
#private;
|
|
14
14
|
constructor(params: BaseApiEntitiesExtractorParams);
|
|
15
15
|
loadApiDescriptions(): Promise<GraphqlBundledDefinition[]>;
|
|
16
|
-
mapApiDescriptionToEntity(description: GraphqlBundledDefinition, version: string):
|
|
16
|
+
mapApiDescriptionToEntity(description: GraphqlBundledDefinition, version: string): EntityDtoSchema;
|
|
17
17
|
processApiDescription(description: GraphqlBundledDefinition, revision: string, version: string, entitiesToRemoveFromFile: Set<string>): Promise<void>;
|
|
18
18
|
}
|
|
19
19
|
export {};
|