@redocly/realm 0.130.0-next.1 → 0.130.0-next.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +179 -0
- package/dist/bin.js +1 -1
- package/dist/cli/develop.js +1 -1
- package/dist/cli/eject/resolveEjectParams.js +1 -1
- package/dist/cli/prepare/copy-env-files.js +1 -1
- package/dist/cli/stats/collectors/openapi.d.ts +3 -0
- package/dist/cli/stats/collectors/openapi.js +1 -0
- package/dist/cli/stats/index.d.ts +7 -0
- package/dist/cli/stats/index.js +1 -0
- package/dist/cli/stats/options.d.ts +3 -0
- package/dist/cli/stats/options.js +1 -0
- package/dist/cli/telemetry/index.d.ts +2 -2
- package/dist/cli/telemetry/index.js +1 -1
- package/dist/client/ErrorBoundary.js +1 -1
- package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
- package/dist/client/app/Sidebar/Sidebar.js +2 -2
- package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
- package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
- package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
- package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
- package/dist/client/app/hooks/useTelemetry.d.ts +2 -2
- package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
- package/dist/client/app/search/useAiSearch.js +1 -1
- package/dist/client/app/search/useSearch.js +1 -1
- package/dist/client/app/telemetry/index.d.ts +11 -1
- package/dist/client/app/telemetry/index.js +1 -1
- package/dist/client/browser-entry.js +3 -3
- package/dist/constants/common.d.ts +3 -1
- package/dist/constants/common.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/execute-api-route.js +1 -1
- package/dist/server/api-routes/run-api-routes-worker.js +1 -1
- package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
- package/dist/server/constants/plugins/catalog-entities.js +1 -1
- package/dist/server/esbuild/esbuild.js +3 -3
- package/dist/server/fs/cache.js +1 -1
- package/dist/server/node-bundle-entry.js +1 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +1 -0
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -1
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/asyncapi-docs/store-definition-bundles.js +1 -1
- package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +5 -3
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +38 -16
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
- 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.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +15 -4
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +38 -27
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +36 -9
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +37 -21
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +36 -11
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +2 -5
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
- package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/entities/validate-entity.js +1 -1
- 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.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +4 -3
- 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.js +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
- 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 +3 -0
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +15 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
- package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
- package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/types/params.js +0 -0
- package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
- package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
- package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
- package/dist/server/plugins/default-theme/index.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +54 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +9 -8
- 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 +9 -8
- 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 +9 -8
- 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 +9 -8
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +7 -13
- package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +9 -6
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +9 -2
- package/dist/server/plugins/mcp/docs-mcp/tools/search.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +2 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +9 -2
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
- package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
- package/dist/server/plugins/mcp/handlers/errors.js +1 -1
- package/dist/server/plugins/mcp/handlers/handle-mcp-request.d.ts +5 -0
- package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -0
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -1
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +1 -1
- package/dist/server/plugins/mcp/servers/base-server.js +1 -1
- package/dist/server/plugins/mcp/types.d.ts +40 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +3 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -0
- package/dist/server/plugins/openapi-docs/index.js +1 -1
- package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
- package/dist/server/plugins/openapi-docs/template/helpers.d.ts +1 -1
- package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
- package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
- package/dist/server/plugins/scorecard-classic/types.d.ts +3 -3
- package/dist/server/plugins/scorecard-classic/types.js +1 -1
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.d.ts +12 -0
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +1 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +11 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -0
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -1
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
- package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -12
- package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
- package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
- package/dist/server/plugins/search/documents/search-documents.js +1 -1
- package/dist/server/plugins/search/llmstxt/index.js +4 -4
- package/dist/server/plugins/sso/index.js +1 -1
- package/dist/server/providers/database/base-repository.d.ts +1 -0
- package/dist/server/providers/database/base-repository.js +1 -1
- package/dist/server/providers/database/database-connection-factory.js +1 -1
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +2 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +393 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +14 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
- package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +19 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +261 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +24 -18
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -1
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0007_catalog-relations-constraint-fix.sql +2 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0007_snapshot.json +833 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
- package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
- package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
- package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
- package/dist/server/providers/database/pagination/utils/index.js +1 -1
- package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
- package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
- package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
- package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
- package/dist/server/store.d.ts +3 -1
- package/dist/server/store.js +1 -1
- package/dist/server/tools/notifiers/logger.js +1 -1
- package/dist/server/tools/notifiers/reporter.js +7 -7
- package/dist/server/types/plugins/common.d.ts +3 -1
- package/dist/server/types/plugins/scorecards.d.ts +30 -0
- package/dist/server/types/plugins/scorecards.js +0 -0
- package/dist/server/utils/envs/load-env-variables.d.ts +1 -1
- package/dist/server/utils/envs/load-env-variables.js +1 -1
- package/dist/server/utils/envs/sanitize-branch-name.d.ts +6 -0
- package/dist/server/utils/envs/sanitize-branch-name.js +1 -0
- package/dist/server/utils/lifecycle-hooks.js +1 -1
- package/dist/server/utils/rbac.d.ts +76 -7
- package/dist/server/utils/rbac.js +1 -1
- package/dist/server/utils/time/with-timestamp.d.ts +42 -10
- package/dist/server/utils/time/with-timestamp.js +1 -1
- package/dist/server/web-server/auth.js +3 -3
- package/dist/server/web-server/dev-server.js +1 -1
- package/dist/server/web-server/handle-api-route-request.js +1 -1
- package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
- package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
- package/dist/server/web-server/routes/auth.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
- package/dist/server/web-server/routes/dynamic-route.js +1 -1
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
- package/dist/server/web-server/routes/index.js +1 -1
- package/dist/server/web-server/routes/mcp-oauth.js +1 -1
- package/dist/server/web-server/routes/page-data.js +1 -1
- package/dist/server/workers/mcp-tool-worker-pool.d.ts +4 -0
- package/dist/server/workers/mcp-tool-worker-pool.js +1 -0
- package/dist/server/workers/mcp-tool-worker.d.ts +2 -0
- package/dist/server/workers/mcp-tool-worker.js +1 -0
- package/dist/server/workers/types.d.ts +7 -1
- package/dist/utils/env/is-local-development.js +1 -1
- package/package.json +16 -19
- package/dist/server/plugins/mcp/workers/run-api-routes-worker.d.ts +0 -5
- package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +0 -1
- package/dist/server/workers/mcp-worker-pool.d.ts +0 -4
- package/dist/server/workers/mcp-worker-pool.js +0 -1
package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
2
|
+
export declare class VersionRepository {
|
|
3
|
+
private readonly db;
|
|
4
|
+
constructor(db: DatabaseClient);
|
|
5
|
+
markAllVersionsAsNotDefault(key: string): Promise<void>;
|
|
6
|
+
doesVersionExist(key: string, version: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Gets the ordered list of versions for a given key.
|
|
9
|
+
* The list is ordered by creation date, and then by version.
|
|
10
|
+
*/
|
|
11
|
+
getOrderedVersionListForKey(key: string): Promise<{
|
|
12
|
+
version: string | null;
|
|
13
|
+
isDefaultVersion: boolean;
|
|
14
|
+
revision: string;
|
|
15
|
+
createdAt: Date;
|
|
16
|
+
}[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Helper: Determines the correct entity to promote.
|
|
19
|
+
* STRATEGY:
|
|
20
|
+
* 1. Identify the highest SemVer string available.
|
|
21
|
+
* 2. Filter revisions to ONLY include that SemVer.
|
|
22
|
+
* 3. Sort those specific revisions by Date to find the tip.
|
|
23
|
+
*/
|
|
24
|
+
getLatestVersion(versionsList: {
|
|
25
|
+
version: string | null;
|
|
26
|
+
isDefaultVersion: boolean;
|
|
27
|
+
revision: string;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
}[]): {
|
|
30
|
+
version: string | null;
|
|
31
|
+
isDefaultVersion: boolean;
|
|
32
|
+
revision: string;
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
} | null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=version-repository.d.ts.map
|
package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{eq as a,and as l,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/catalog-sqlite/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(l(a(e.key,t),a(e.isDefaultVersion,!0))).run()}async doesVersionExist(t,n){return await this.db.client.select().from(e).where(l(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(l(a(e.key,t))).orderBy(c(e.createdAt)).run()).rows.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,u)=>m(o.version,u.version));const r=i[0].version,s=i.filter(o=>o.version===r);return s.sort((o,u)=>u.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};
|
|
@@ -5,10 +5,21 @@ import type { ListResult } from './catalog-entities-local-read-repository.js';
|
|
|
5
5
|
export declare class CatalogEntitiesBffRepository {
|
|
6
6
|
#private;
|
|
7
7
|
constructor(db: DatabaseClient, attachedDatabasePath: string);
|
|
8
|
-
getEntitiesWithRelations(paginationParams
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
|
|
9
|
+
paginationParams: PaginationParams;
|
|
10
|
+
rbacTeams?: string[];
|
|
11
|
+
excludedEntities?: string[];
|
|
12
|
+
excludedTypes?: string[];
|
|
13
|
+
}): Promise<ListResult<BffCatalogEntity>>;
|
|
14
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
15
|
+
entityKey: string;
|
|
16
|
+
filter?: {
|
|
17
|
+
revision?: string | null;
|
|
18
|
+
version?: string | null;
|
|
19
|
+
};
|
|
20
|
+
rbacTeams?: string[];
|
|
21
|
+
excludedTypes?: string[];
|
|
22
|
+
excludedEntities?: string[];
|
|
12
23
|
}): Promise<BffCatalogEntity | null>;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=catalog-entities-bff-repository.d.ts.map
|
|
@@ -1,38 +1,45 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as a,desc as U,eq as r,notExists as k,sql as e,or as j}from"drizzle-orm";import{unionAll as W}from"drizzle-orm/sqlite-core";import{logger as z}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as L}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as d}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as J}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Z,excludeFieldsFromFilter as P,getAllFilterFieldValues as B}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as V}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as f,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as F,createEntityFieldsForSelect as C}from"../utils.js";import{createMergedEntityFieldsForSelect as X}from"../utils/create-merged-entity-fields-for-select.js";import{buildNoHigherVersionExistsFilter as Y,buildSemanticVersionSortExpr as x}from"../utils/semantic-version-sort.js";import{buildEntitiesExclusionFilter as N}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as p,buildSubqueryRbacJoinAndFilter as G}from"../utils/build-rbac-filter.js";class ye{#e;#t;constructor(i,s){this.#e=i,this.#t=s}async getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:n,excludedTypes:o}){const l=B(i.filter,"owners");if(l.length>0)return this.#c(i,l,s,o,n);const u=B(i.filter,"domains");return u.length>0?this.#a(i,u,s,o,n):this.#m(i,s,o,n)}async#c(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
|
|
2
2
|
EXISTS (
|
|
3
|
-
SELECT 1 FROM (${
|
|
4
|
-
WHERE cr.source_key = ${
|
|
3
|
+
SELECT 1 FROM (${h}) cr
|
|
4
|
+
WHERE cr.source_key = ${c}
|
|
5
5
|
AND cr.source_to_target_relation = 'owns'
|
|
6
6
|
AND cr.target_key = base_entities.key
|
|
7
7
|
)
|
|
8
|
-
`),_
|
|
8
|
+
`),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"domains");let $=v;if(g.length>0){const c=g.map(m=>e`
|
|
9
9
|
EXISTS (
|
|
10
|
-
SELECT 1 FROM (${
|
|
11
|
-
JOIN (${
|
|
10
|
+
SELECT 1 FROM (${h}) cr
|
|
11
|
+
JOIN (${b}) d ON d.key = ${m}
|
|
12
12
|
WHERE d.type = 'domain'
|
|
13
13
|
AND d.is_current = 1
|
|
14
|
-
AND cr.source_key = ${
|
|
14
|
+
AND cr.source_key = ${m}
|
|
15
15
|
AND cr.target_key = base_entities.key
|
|
16
16
|
AND cr.source_to_target_relation = 'hasParts'
|
|
17
17
|
)
|
|
18
|
-
`),
|
|
18
|
+
`),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["owners","domains"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (owner optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#a(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
|
|
19
19
|
EXISTS (
|
|
20
|
-
SELECT 1 FROM (${
|
|
21
|
-
JOIN (${
|
|
20
|
+
SELECT 1 FROM (${h}) cr
|
|
21
|
+
JOIN (${b}) d ON d.key = ${c}
|
|
22
22
|
WHERE d.type = 'domain'
|
|
23
23
|
AND d.is_current = 1
|
|
24
|
-
AND cr.source_key = ${
|
|
24
|
+
AND cr.source_key = ${c}
|
|
25
25
|
AND cr.target_key = base_entities.key
|
|
26
26
|
AND cr.source_to_target_relation = 'hasParts'
|
|
27
27
|
)
|
|
28
|
-
`),_
|
|
28
|
+
`),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"owners");let $=v;if(g.length>0){const c=g.map(m=>e`
|
|
29
29
|
EXISTS (
|
|
30
|
-
SELECT 1 FROM (${
|
|
31
|
-
WHERE cr.source_key = ${
|
|
30
|
+
SELECT 1 FROM (${h}) cr
|
|
31
|
+
WHERE cr.source_key = ${m}
|
|
32
32
|
AND cr.source_to_target_relation = 'owns'
|
|
33
33
|
AND cr.target_key = base_entities.key
|
|
34
34
|
)
|
|
35
|
-
`),
|
|
35
|
+
`),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["domains","owners"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (domain optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#m(i,s,n,o){const l=this.#o(s,n,o),u=this.#l(),h=this.#i(n,o),b=u.as("combined_relations"),A=h.as("combined_target_entities"),I=this.#n().as("combined_target_attributes"),w=this.#e.client.select(f).from(l.as("base_entities")).$dynamic(),{whereCondition:_}=Z(w,i.filter);_&&w.where(_);try{const v=this.#e.client.select(f).from(l.as("base_entities")).$dynamic();_&&v.where(_);const g=this.#e.client.$count(v),$=i.limit||10;J(w,{...i,limit:$+1});const D=w.as("paged_entities"),S=this.#e.client.with(b,A,I,D).select({...C("paged_entities"),domains:this.#r("paged_entities",s).as("domains"),owners:this.#s("paged_entities",s).as("owners")}).from(D),[R,c]=await Promise.all([S.run(),g]),y=R.rows,m=y.length>$;return{items:y.slice(0,$).map(E=>V(E)).filter(E=>E!==null),hasMore:m,total:c}}catch(v){return z.error("Error getting entities with relations (optimized path): "+v.message),{items:[],hasMore:!1,total:0}}}#o(i,s,n){const o=N(s,n,"remote.entities"),l=N(s,n,"entities"),u=N(s,n,"r");return this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),p(i,"remote.entities_attributes"),o,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))),Y("remote.entities.key","remote.entities.version","remote.entities.revision"))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))),Y("entities.key","entities.version","entities.revision"))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),p(i,"ea"),u,Y("r.key","r.version","r.revision")))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l))}#l(){return this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)}#i(i,s){const n=N(i,s,"remote.entities"),o=N(i,s,"entities"),l=N(i,s,"r");return this.#t?W(this.#e.client.select(f).from(e`remote.entities`).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),n,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),l))):this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o))}async getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:n,excludedTypes:o,excludedEntities:l}){if(!i||i.trim()==="")return null;const u=s?.revision,h=s?.version,b=u?null:await this.#u(i,h||null),A=h??b?.version,T=u||b?.revision||null,I=N(o,l,"remote.entities"),w=N(o,l,"entities"),_=N(o,l,"r"),g=(this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(e`remote.entities.key = ${i}`,p(n,"remote.entities_attributes"),I,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(e`r.key = ${i}`,p(n,"ea"),_))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w))).as("e"),D=(this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)).as("combined_relations"),R=this.#i(o,l).as("combined_target_entities"),y=this.#n().as("combined_target_attributes"),m=this.#e.client.with(g,D,R,y).select({...C("e"),domains:this.#r("e",n).as("domains"),owners:this.#s("e",n).as("owners")}).from(g).$dynamic();T?m.where(a(r(e.raw("revision"),T),A?r(e.raw("version"),A):void 0)):m.where(r(e.raw("is_current"),1)),m.limit(1);const E=await m.run();if(E.rows.length===0)return null;const M=E.rows[0];return V(M)}async#u(i,s){if(s){const l=await(this.#t?W(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(a(e`key = ${i}`,e`version = ${s}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s),k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(a(e`remote.key = ${t.key}`,e`remote.version = ${s}`))))).orderBy(U(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s))).orderBy(U(t.revision))).limit(1).run();if(l.rows.length>0){const u=l.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}if(this.#t){const o=await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`(
|
|
36
|
+
SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${x("version")} DESC, revision DESC) as rn
|
|
37
|
+
FROM (
|
|
38
|
+
SELECT version, revision FROM remote.entities WHERE key = ${i} AND is_current = 1
|
|
39
|
+
UNION ALL
|
|
40
|
+
SELECT version, revision FROM entities WHERE key = ${i} AND is_current = 1
|
|
41
|
+
)
|
|
42
|
+
) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(o.rows.length>0){const l=o.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}const n=await this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.isCurrent,!0))).limit(1).run();if(n.rows.length>0){const o=n.rows[0];return{version:o.version||null,revision:o.revision||null}}return null}#r(i,s){const{join:n,filter:o}=G(s,"d.key");return e`
|
|
36
43
|
COALESCE(
|
|
37
44
|
(
|
|
38
45
|
SELECT json_group_array(
|
|
@@ -52,26 +59,28 @@ import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";impo
|
|
|
52
59
|
SELECT DISTINCT d.*
|
|
53
60
|
FROM combined_relations er
|
|
54
61
|
JOIN combined_target_entities d ON d.key = er.source_key
|
|
62
|
+
${n}
|
|
55
63
|
WHERE er.source_to_target_relation = 'hasParts'
|
|
56
|
-
AND er.target_key = ${e.raw(`${
|
|
64
|
+
AND er.target_key = ${e.raw(`${i}.key`)}
|
|
57
65
|
AND d.type = 'domain'
|
|
58
66
|
AND d.is_current = 1
|
|
67
|
+
${o}
|
|
59
68
|
AND CASE
|
|
60
|
-
WHEN ${e.raw(`${
|
|
69
|
+
WHEN ${e.raw(`${i}.version`)} = ''
|
|
61
70
|
THEN er.target_version = ''
|
|
62
|
-
ELSE (er.target_version = ${e.raw(`${
|
|
71
|
+
ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
|
|
63
72
|
END
|
|
64
73
|
AND CASE
|
|
65
|
-
WHEN ${e.raw(`${
|
|
74
|
+
WHEN ${e.raw(`${i}.revision`)} = ''
|
|
66
75
|
THEN 1 = 1
|
|
67
|
-
ELSE (er.target_revision <= ${e.raw(`${
|
|
76
|
+
ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
|
|
68
77
|
END
|
|
69
78
|
LIMIT 10
|
|
70
79
|
) d
|
|
71
80
|
),
|
|
72
81
|
json_array()
|
|
73
82
|
)
|
|
74
|
-
`}#
|
|
83
|
+
`}#s(i,s){const{join:n,filter:o}=G(s,"o.key");return e`
|
|
75
84
|
COALESCE(
|
|
76
85
|
(
|
|
77
86
|
SELECT json_group_array(
|
|
@@ -91,22 +100,24 @@ import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";impo
|
|
|
91
100
|
SELECT DISTINCT o.*
|
|
92
101
|
FROM combined_relations er
|
|
93
102
|
JOIN combined_target_entities o ON o.key = er.source_key
|
|
103
|
+
${n}
|
|
94
104
|
WHERE er.source_to_target_relation = 'owns'
|
|
95
|
-
AND er.target_key = ${e.raw(`${
|
|
105
|
+
AND er.target_key = ${e.raw(`${i}.key`)}
|
|
96
106
|
AND o.is_current = 1
|
|
107
|
+
${o}
|
|
97
108
|
AND CASE
|
|
98
|
-
WHEN ${e.raw(`${
|
|
109
|
+
WHEN ${e.raw(`${i}.version`)} = ''
|
|
99
110
|
THEN er.target_version = ''
|
|
100
|
-
ELSE (er.target_version = ${e.raw(`${
|
|
111
|
+
ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
|
|
101
112
|
END
|
|
102
113
|
AND CASE
|
|
103
|
-
WHEN ${e.raw(`${
|
|
114
|
+
WHEN ${e.raw(`${i}.revision`)} = ''
|
|
104
115
|
THEN 1 = 1
|
|
105
|
-
ELSE (er.target_revision <= ${e.raw(`${
|
|
116
|
+
ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
|
|
106
117
|
END
|
|
107
118
|
LIMIT 10
|
|
108
119
|
) o
|
|
109
120
|
),
|
|
110
121
|
json_array()
|
|
111
122
|
)
|
|
112
|
-
`}}export{
|
|
123
|
+
`}#n(){return this.#t?W(this.#e.client.select({entityKey:e.raw("entity_key"),rbacTeams:e.raw("rbac_teams")}).from(e`remote.entities_attributes`),this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d).where(k(this.#e.client.select({id:e.raw("1")}).from(e`remote.entities_attributes as remote`).where(e`remote.entity_key = ${d.entityKey}`)))):this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d)}}export{ye as CatalogEntitiesBffRepository};
|
|
@@ -2,6 +2,8 @@ import type { BffCatalogEntity, BffCatalogRelatedEntity } from '@redocly/theme/c
|
|
|
2
2
|
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
|
|
3
3
|
import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
|
|
4
4
|
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
5
|
+
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
6
|
+
import type { GetEntityByIdParams } from '../../../types/params.js';
|
|
5
7
|
import { type EntityReadModelSchema, type EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
|
|
6
8
|
export type ListResult<T> = {
|
|
7
9
|
items: T[];
|
|
@@ -11,6 +13,9 @@ export type ListResult<T> = {
|
|
|
11
13
|
export type CatalogFiltersParams = {
|
|
12
14
|
entitiesTypes?: string[];
|
|
13
15
|
emptyFilters?: string[];
|
|
16
|
+
rbacTeams?: string[];
|
|
17
|
+
excludedTypes?: string[];
|
|
18
|
+
excludedEntities?: string[];
|
|
14
19
|
};
|
|
15
20
|
export type FilterOption = {
|
|
16
21
|
value: string;
|
|
@@ -20,21 +25,37 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
20
25
|
#private;
|
|
21
26
|
constructor(db: DatabaseClient);
|
|
22
27
|
attachDatabase(databasePath: string): Promise<void>;
|
|
23
|
-
getEntities(paginationParams
|
|
28
|
+
getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
29
|
+
paginationParams: PaginationParams;
|
|
30
|
+
rbacTeams?: string[];
|
|
31
|
+
excludedTypes?: string[];
|
|
32
|
+
excludedEntities?: string[];
|
|
33
|
+
}): Promise<ListResult<EntityReadModelSchema>>;
|
|
24
34
|
getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
|
|
25
35
|
listEntityRevisions(entityKey: string, version?: string | null): Promise<EntityRevisionSummary[]>;
|
|
26
36
|
getEntitiesCountByTypes(): Promise<{
|
|
27
37
|
type: string;
|
|
28
38
|
count: number;
|
|
29
39
|
}[]>;
|
|
30
|
-
|
|
31
|
-
|
|
40
|
+
getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
|
|
41
|
+
getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
|
|
32
42
|
getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
|
|
33
43
|
getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
|
|
34
|
-
getEntitiesWithRelations(paginationParams
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
|
|
45
|
+
paginationParams: PaginationParams;
|
|
46
|
+
rbacTeams?: string[];
|
|
47
|
+
excludedEntities?: string[];
|
|
48
|
+
excludedTypes?: string[];
|
|
49
|
+
}): Promise<ListResult<BffCatalogEntity>>;
|
|
50
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
51
|
+
entityKey: string;
|
|
52
|
+
filter?: {
|
|
53
|
+
revision?: string | null;
|
|
54
|
+
version?: string | null;
|
|
55
|
+
};
|
|
56
|
+
rbacTeams?: string[];
|
|
57
|
+
excludedTypes?: string[];
|
|
58
|
+
excludedEntities?: string[];
|
|
38
59
|
}): Promise<BffCatalogEntity | null>;
|
|
39
60
|
getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
|
|
40
61
|
targetKey: string;
|
|
@@ -43,7 +64,13 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
43
64
|
direction: "outgoing" | "incoming";
|
|
44
65
|
priority: number;
|
|
45
66
|
}[]>;
|
|
46
|
-
getRelatedEntities(key
|
|
47
|
-
|
|
67
|
+
getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
68
|
+
key: string;
|
|
69
|
+
paginationParams: PaginationParams;
|
|
70
|
+
rbacTeams?: string[];
|
|
71
|
+
excludedTypes?: string[];
|
|
72
|
+
excludedEntities?: string[];
|
|
73
|
+
}): Promise<ListResult<BffCatalogRelatedEntity>>;
|
|
74
|
+
getCatalogFilters({ entitiesTypes, emptyFilters, rbacTeams, excludedTypes, excludedEntities, }: CatalogFiltersParams): Promise<Record<string, FilterOption[]>>;
|
|
48
75
|
}
|
|
49
76
|
//# sourceMappingURL=catalog-entities-local-read-repository.d.ts.map
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as u,count as F,eq as _,isNotNull as X,notExists as f,or as J,sql as e}from"drizzle-orm";import{unionAll as p}from"drizzle-orm/sqlite-core";import{logger as q}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as v}from"@redocly/theme/core/constants";import{applyPagination as R}from"../../../../../providers/database/pagination/index.js";import{applyFilter as P}from"../../../../../providers/database/pagination/filter.js";import{createEntityFieldsForSelect as S,FIELDS_TO_SELECT_FOR_ENTITY as h,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as g}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as b}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as d}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{CatalogEntitiesRelationsRepository as $}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as B}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as j}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as M}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as x}from"../utils/normalize-revision-flags.js";import{buildEntitiesExclusionFilter as A}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as T,buildRbacFilterRaw as Y}from"../utils/build-rbac-filter.js";class Ee{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new $(this.#e,this.#t||""),this.#s=new B(this.#e,this.#t||"")}async attachDatabase(i){this.#t!==i&&(this.#t=i,await this.#e.client.run(e`ATTACH DATABASE ${i} AS remote`),this.#i=new $(this.#e,i),this.#s=new B(this.#e,i))}async getEntities({paginationParams:i,rbacTeams:s,excludedTypes:r,excludedEntities:n}){const o=A(r,n,"remote.entities"),c=A(r,n,"entities"),a=A(r,n,"r"),l=this.#t?p(this.#e.client.select(S("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,_(t.key,d.entityKey)).where(u(T(s,"remote.entities_attributes"),o,f(this.#e.client.select({id:h.id}).from(t).where(u(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(T(s,"entities_attributes"),c,f(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(j("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(u(T(s,"ea"),a))):this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(T(s,"entities_attributes"),c)),N=this.#e.client.select(h).from(l.as("combined_entities")),E=this.#e.client.select(h).from(l.as("combined_entities")).$dynamic(),k=R(E,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),O=this.#e.client.$count(k),w=N.$dynamic(),I=i.limit||10,U=R(w,{...i,limit:I+1}),[W,V]=await Promise.all([U.run(),O]),D=W.rows,H=D.length>I;return{items:D.slice(0,I).map(C=>g(C)).filter(C=>C!==null),hasMore:H,total:V}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?p(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${v})`.as("keyVersion")}).from(e`remote.entities`).where(u(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${v})`.as("keyVersion")}).from(t).where(u(_(t.sourceFile,i),_(t.source,"file"),e`${t.key} IS NOT NULL`,f(this.#e.client.select({key:e.raw("key")}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`))))):this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${v})`.as("keyVersion")}).from(t).where(u(_(t.sourceFile,i),_(t.source,"file"),X(t.key))),r=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(r.rows.map(n=>n.keyVersion))}async listEntityRevisions(i,s){const r=[_(t.key,i),_(t.isDeleted,!1),...s?[_(t.version,s)]:[]],n={version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")},o=this.#t?p(this.#e.client.select(n).from(e`remote.entities`).where(u(e`key = ${i}`,e`is_deleted = 0`,s?e`version = ${s}`:void 0,f(this.#e.client.select({id:e.raw("id")}).from(t).where(u(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(u(...r,f(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select({version:e.raw("r.version AS version"),revision:e.raw("r.revision AS revision"),isCurrent:e.raw("MAX(r.is_current, l.is_current) AS is_current"),createdAt:e.raw("MIN(r.created_at, l.created_at) AS created_at"),updatedAt:e.raw("MAX(r.updated_at, l.updated_at) AS updated_at"),isDefaultVersion:e.raw("MAX(r.is_default_version, l.is_default_version) AS is_default_version")}).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(u(e`r.key = ${i}`,e`r.is_deleted = 0`,e`l.is_deleted = 0`,s?e`r.version = ${s}`:void 0))):this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(u(...r)),a=(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(o.as("combined_revisions")).orderBy(e`${M("version")} DESC`,e.raw("revision DESC")).run()).rows.map(l=>({version:l.version||null,revision:l.revision??"",isCurrent:l.is_current!==null?!!l.is_current:!1,createdAt:l.created_at||null,updatedAt:l.updated_at||null,isDefaultVersion:l.is_default_version!==null?!!l.is_default_version:!1}));return x(a),a}async getEntitiesCountByTypes(){if(this.#t){const i=e`
|
|
2
|
+
SELECT key, type, version,
|
|
3
|
+
ROW_NUMBER() OVER (
|
|
4
|
+
PARTITION BY key
|
|
5
|
+
ORDER BY ${M("version")} DESC
|
|
6
|
+
) as rn
|
|
7
|
+
FROM (
|
|
8
|
+
SELECT key, type, version FROM remote.entities WHERE is_current = 1 AND is_deleted = 0
|
|
9
|
+
UNION ALL
|
|
10
|
+
SELECT key, type, version FROM entities WHERE is_current = 1 AND is_deleted = 0
|
|
11
|
+
)
|
|
12
|
+
`;return this.#e.client.select({type:e`type`,count:F()}).from(e`(SELECT * FROM (${i}) WHERE rn = 1) as highest_version_entities`).groupBy(e`type`)}return this.#e.client.select({type:t.type,count:F()}).from(t).where(u(_(t.isCurrent,!0),_(t.isDeleted,!1))).groupBy(t.type)}async getEntityById(i,s){const{rbacTeams:r,excludedTypes:n,excludedEntities:o}=s||{},c=A(n,o,"remote.entities"),a=A(n,o,"entities"),E=(await(this.#t?p(this.#e.client.select(S("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,_(t.key,d.entityKey)).where(u(e`remote.entities.id = ${i}`,T(r,"remote.entities_attributes"),c)),this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(_(t.id,i),T(r,"entities_attributes"),a))):this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(_(t.id,i),T(r,"entities_attributes"),a))).run()).rows[0];return E?g(E):null}async getOutdatedEntities(i){const s=this.#t?p(this.#e.client.select(h).from(e`remote.entities`),this.#e.client.select(h).from(t).where(f(this.#e.client.select({id:h.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(h).from(t),r=this.#e.client.select(h).from(s.as("combined_entities")).$dynamic(),{whereCondition:n}=P(r,i),o=J(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`),c=n?u(n,o):o;return(await r.where(c).run()).rows.map(l=>g(l)).filter(l=>l!==null)}async getEntitiesRelations(i={}){const s=this.#t?p(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(y).where(f(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${y.sourceKey}`)))):this.#e.client.select(m).from(y),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),n=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=R(n,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(o),a=i.limit||10,l=R(r,{...i,limit:a+1}),[N,E]=await Promise.all([l.run(),c]),k=N.rows,O=k.length>a;return{items:k.slice(0,a).map(w=>b(w)).filter(w=>w!==null),hasMore:O,total:E}}async getEntityRelationById(i){const n=(await(this.#t?p(this.#e.client.select(m).from(e`remote.entities_relations`).where(_(y.id,i)),this.#e.client.select(m).from(y).where(u(_(y.id,i),f(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${y.id}`))))):this.#e.client.select(m).from(y).where(_(y.id,i))).run()).rows[0];return n?b(n):null}async getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:r,excludedTypes:n}){return this.#s.getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:r,excludedTypes:n})}async getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:r,excludedTypes:n,excludedEntities:o}){return this.#s.getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:r,excludedTypes:n,excludedEntities:o})}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities({key:i,paginationParams:s,rbacTeams:r,excludedTypes:n,excludedEntities:o}){return this.#i.getRelatedEntities({key:i,paginationParams:s,rbacTeams:r,excludedTypes:n,excludedEntities:o})}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[],rbacTeams:r,excludedTypes:n,excludedEntities:o}){if(!s.length)return{};try{return await this.#r({entitiesTypes:i,rbacTeams:r,excludedTypes:n,excludedEntities:o}),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#a(s)}catch(c){return console.error("Error fetching catalog filters:",c),{}}finally{await this.#c()}}async#r({entitiesTypes:i,rbacTeams:s,excludedTypes:r,excludedEntities:n}){const o=Y(s,"ea"),c=this.#n(r,n);if(this.#t){const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),c&&a.push(c.replace(/ENTITY_ALIAS/g,"e"));const l=["r.key IS NULL","e.is_current = 1","e.is_deleted = 0"];o&&l.push(o),c&&l.push(c.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
|
|
2
13
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
3
14
|
SELECT
|
|
4
15
|
e.key,
|
|
@@ -6,7 +17,8 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
|
|
|
6
17
|
e.tags,
|
|
7
18
|
e.metadata
|
|
8
19
|
FROM remote.entities e
|
|
9
|
-
|
|
20
|
+
LEFT JOIN remote.entities_attributes ea ON ea.entity_key = e.key
|
|
21
|
+
WHERE ${a.join(" AND ")}
|
|
10
22
|
UNION ALL
|
|
11
23
|
SELECT
|
|
12
24
|
e.key,
|
|
@@ -15,40 +27,43 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
|
|
|
15
27
|
e.metadata
|
|
16
28
|
FROM entities e
|
|
17
29
|
LEFT JOIN remote.entities r ON r.key = e.key AND r.is_current = 1
|
|
18
|
-
|
|
19
|
-
|
|
30
|
+
LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
|
|
31
|
+
WHERE ${l.join(" AND ")}
|
|
32
|
+
`))}else{const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),c&&a.push(c.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
|
|
20
33
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
21
34
|
SELECT
|
|
22
|
-
key,
|
|
23
|
-
type,
|
|
24
|
-
tags,
|
|
25
|
-
metadata
|
|
26
|
-
FROM entities
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
e.key,
|
|
36
|
+
e.type,
|
|
37
|
+
e.tags,
|
|
38
|
+
e.metadata
|
|
39
|
+
FROM entities e
|
|
40
|
+
LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
|
|
41
|
+
WHERE ${a.join(" AND ")}
|
|
42
|
+
`))}if(i.length){const a=i.map(l=>`'${l.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
|
|
29
43
|
CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
|
|
30
44
|
SELECT * FROM temp_combined_entities
|
|
31
|
-
WHERE type IN (${
|
|
45
|
+
WHERE type IN (${a})
|
|
32
46
|
`))}else await this.#e.client.run(e`
|
|
33
47
|
CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
|
|
34
48
|
SELECT * FROM temp_combined_entities
|
|
35
49
|
`);await this.#e.client.run(e`
|
|
36
50
|
CREATE INDEX IF NOT EXISTS idx_temp_filtered_type ON temp_filtered_entities(type)
|
|
37
|
-
`)}
|
|
51
|
+
`)}#n(i,s){const r=[];if(i&&i.length>0){const n=i.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");r.push(`ENTITY_ALIAS.type NOT IN (${n})`)}if(s&&s.length>0){const n=s.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");r.push(`ENTITY_ALIAS.key NOT IN (${n})`)}return r.length>0?`(${r.join(" AND ")})`:null}async#o(){this.#t?await this.#e.client.run(e`
|
|
38
52
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
|
|
39
53
|
SELECT
|
|
40
54
|
source_key,
|
|
41
55
|
target_key,
|
|
42
56
|
source_to_target_relation
|
|
43
57
|
FROM remote.entities_relations
|
|
58
|
+
WHERE COALESCE(is_deleted, 0) = 0
|
|
44
59
|
UNION ALL
|
|
45
60
|
SELECT
|
|
46
61
|
er.source_key,
|
|
47
62
|
er.target_key,
|
|
48
63
|
er.source_to_target_relation
|
|
49
64
|
FROM entities_relations er
|
|
50
|
-
LEFT JOIN remote.entities_relations r ON r.source_key = er.source_key
|
|
51
|
-
WHERE r.source_key IS NULL
|
|
65
|
+
LEFT JOIN remote.entities_relations r ON r.source_key = er.source_key AND r.target_key = er.target_key
|
|
66
|
+
WHERE r.source_key IS NULL AND COALESCE(er.is_deleted, 0) = 0
|
|
52
67
|
`):await this.#e.client.run(e`
|
|
53
68
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
|
|
54
69
|
SELECT
|
|
@@ -56,13 +71,14 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
|
|
|
56
71
|
target_key,
|
|
57
72
|
source_to_target_relation
|
|
58
73
|
FROM entities_relations
|
|
74
|
+
WHERE COALESCE(is_deleted, 0) = 0
|
|
59
75
|
`),await this.#e.client.run(e`
|
|
60
76
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_source ON temp_combined_relations(source_key)
|
|
61
77
|
`),await this.#e.client.run(e`
|
|
62
78
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
|
|
63
79
|
`),await this.#e.client.run(e`
|
|
64
80
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
|
|
65
|
-
`)}async#
|
|
81
|
+
`)}async#a(i){const s={},r=[],n=i.filter(a=>a.startsWith("metadata."));i.includes("type")&&r.push(`
|
|
66
82
|
SELECT 'type' as filter_name, type as value, COUNT(*) as count
|
|
67
83
|
FROM temp_filtered_entities
|
|
68
84
|
WHERE type IS NOT NULL
|
|
@@ -104,12 +120,12 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
|
|
|
104
120
|
INNER JOIN temp_combined_entities tce ON tce.key = owner_key
|
|
105
121
|
WHERE owner_key IS NOT NULL
|
|
106
122
|
GROUP BY owner_key
|
|
107
|
-
`);for(const
|
|
108
|
-
SELECT json_extract(metadata, '${
|
|
123
|
+
`);for(const a of n)await this.#l(a,s);if(r.length===0)return s;const o=r.join(" UNION ALL "),c=await this.#e.client.run(e.raw(o));if(c?.rows)for(const a of c.rows){const l=a.filter_name,N=a.value,E=Number(a.count)||0;s[l]||(s[l]=[]),N&&s[l].push({value:N,count:E})}return s}async#l(i,s){const r=i.substring(9),n=`$.${Q(r)}`,o=await this.#e.client.run(e.raw(`
|
|
124
|
+
SELECT json_extract(metadata, '${n}') as value, COUNT(*) as count
|
|
109
125
|
FROM temp_filtered_entities
|
|
110
126
|
WHERE metadata IS NOT NULL
|
|
111
127
|
AND metadata != ''
|
|
112
|
-
AND json_extract(metadata, '${
|
|
113
|
-
AND json_extract(metadata, '${
|
|
128
|
+
AND json_extract(metadata, '${n}') IS NOT NULL
|
|
129
|
+
AND json_extract(metadata, '${n}') != ''
|
|
114
130
|
GROUP BY value
|
|
115
|
-
`));
|
|
131
|
+
`));o?.rows&&(s[i]=o.rows.map(c=>({value:c.value,count:Number(c.count)||0})).filter(c=>c.value))}async#c(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(i){q.error("Error cleaning up temp tables:",i)}}}function Q(L){return L.replace(/[^a-zA-Z0-9._-]/g,"")}export{Ee as CatalogEntitiesLocalReadRepository};
|
|
@@ -5,6 +5,8 @@ import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/e
|
|
|
5
5
|
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
|
|
6
6
|
import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
|
|
7
7
|
import type { SidebarConnectedEntity } from '@redocly/theme/core/types';
|
|
8
|
+
import type { EntityReadModelSchema } from '../../../../../plugins/catalog-entities/schemas/read-model-schemas.js';
|
|
9
|
+
import type { GetEntityByIdParams } from '../../../types/params.js';
|
|
8
10
|
import { BaseRepository } from '../../../../../providers/database/base-repository.js';
|
|
9
11
|
import { type CreateEntityParams, type CreateEntityResult } from './catalog-entities-local-write-repository.js';
|
|
10
12
|
export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
@@ -14,8 +16,13 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
14
16
|
getEntitySources(): Record<string, SidebarConnectedEntity>;
|
|
15
17
|
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
|
|
16
18
|
attachDatabase(databasePath: string): Promise<void>;
|
|
17
|
-
getEntities(paginationParams
|
|
18
|
-
|
|
19
|
+
getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
20
|
+
paginationParams: PaginationParams;
|
|
21
|
+
rbacTeams?: string[];
|
|
22
|
+
excludedTypes?: string[];
|
|
23
|
+
excludedEntities?: string[];
|
|
24
|
+
}): Promise<import("./catalog-entities-local-read-repository.js").ListResult<EntityReadModelSchema>>;
|
|
25
|
+
getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
|
|
19
26
|
getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
|
|
20
27
|
getEntitiesCountByTypes(): Promise<{
|
|
21
28
|
type: string;
|
|
@@ -49,22 +56,39 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
49
56
|
sourceKey: string;
|
|
50
57
|
targetKey: string;
|
|
51
58
|
} | null>;
|
|
52
|
-
getEntitiesWithRelations(paginationParams
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
60
|
+
paginationParams: PaginationParams;
|
|
61
|
+
rbacTeams?: string[];
|
|
62
|
+
excludedTypes?: string[];
|
|
63
|
+
excludedEntities?: string[];
|
|
64
|
+
}): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
|
|
65
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
66
|
+
entityKey: string;
|
|
67
|
+
filter?: {
|
|
68
|
+
revision?: string | null;
|
|
69
|
+
version?: string | null;
|
|
70
|
+
};
|
|
71
|
+
rbacTeams?: string[];
|
|
72
|
+
excludedTypes?: string[];
|
|
73
|
+
excludedEntities?: string[];
|
|
56
74
|
}): Promise<import("@redocly/theme").BffCatalogEntity | null>;
|
|
57
|
-
getRelatedEntities(
|
|
75
|
+
getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
76
|
+
key: string;
|
|
77
|
+
paginationParams: PaginationParams;
|
|
78
|
+
rbacTeams?: string[];
|
|
79
|
+
excludedTypes?: string[];
|
|
80
|
+
excludedEntities?: string[];
|
|
81
|
+
}): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
|
|
58
82
|
createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
|
|
59
83
|
createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
|
|
60
84
|
createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<{
|
|
61
85
|
id: string;
|
|
86
|
+
createdAt: string;
|
|
87
|
+
updatedAt: string;
|
|
62
88
|
organizationId: string;
|
|
63
89
|
projectId: string;
|
|
64
90
|
sourceFile: string | null;
|
|
65
91
|
isDeleted: boolean | null;
|
|
66
|
-
createdAt: string;
|
|
67
|
-
updatedAt: string;
|
|
68
92
|
sourceKey: string;
|
|
69
93
|
targetKey: string;
|
|
70
94
|
sourceVersion: string;
|
|
@@ -87,9 +111,10 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
87
111
|
deleteEntityRelation(id: string): Promise<string | null>;
|
|
88
112
|
deleteEntityRelations(filter: Filter): Promise<boolean>;
|
|
89
113
|
getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
|
|
90
|
-
listEntityRevisions(entityKey: string, version?: string | null): Promise<import("
|
|
114
|
+
listEntityRevisions(entityKey: string, version?: string | null): Promise<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRevisionSummary[]>;
|
|
91
115
|
updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
|
|
92
116
|
updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
|
|
93
|
-
|
|
117
|
+
getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
|
|
118
|
+
setEntitiesAsOutdated(filter: Filter): Promise<void>;
|
|
94
119
|
}
|
|
95
120
|
//# sourceMappingURL=catalog-entities-local-repository.d.ts.map
|