@redocly/redoc 0.133.0-next.1 → 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 +45 -2
- package/dist/server/constants/plugins/catalog-entities.d.ts +2 -0
- package/dist/server/constants/plugins/catalog-entities.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/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/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/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/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/{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 +1 -0
- package/dist/server/store.js +1 -1
- package/dist/server/types/plugins/common.d.ts +1 -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 +9 -9
- 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/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/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/{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
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const DEFAULT_CHUNK_SIZE = 20;
|
|
2
|
+
export declare const MAX_LOGGED_DB_ERROR_LENGTH = 1000;
|
|
3
|
+
export declare const MIN_RETRYABLE_BATCH_SIZE = 2;
|
|
4
|
+
export declare const MAX_BATCH_PAYLOAD_BYTES = 500000;
|
|
5
|
+
export declare const ENTITIES_UPSERT_SET: {
|
|
6
|
+
organizationId: import("drizzle-orm").SQL<unknown>;
|
|
7
|
+
projectId: import("drizzle-orm").SQL<unknown>;
|
|
8
|
+
type: import("drizzle-orm").SQL<unknown>;
|
|
9
|
+
title: import("drizzle-orm").SQL<unknown>;
|
|
10
|
+
summary: import("drizzle-orm").SQL<unknown>;
|
|
11
|
+
tags: import("drizzle-orm").SQL<unknown>;
|
|
12
|
+
metadata: import("drizzle-orm").SQL<unknown>;
|
|
13
|
+
git: import("drizzle-orm").SQL<unknown>;
|
|
14
|
+
contact: import("drizzle-orm").SQL<unknown>;
|
|
15
|
+
links: import("drizzle-orm").SQL<unknown>;
|
|
16
|
+
createdAt: import("drizzle-orm").SQL<unknown>;
|
|
17
|
+
updatedAt: import("drizzle-orm").SQL<unknown>;
|
|
18
|
+
sourceFile: import("drizzle-orm").SQL<unknown>;
|
|
19
|
+
fileHash: import("drizzle-orm").SQL<unknown>;
|
|
20
|
+
hash: import("drizzle-orm").SQL<unknown>;
|
|
21
|
+
isCurrent: import("drizzle-orm").SQL<unknown>;
|
|
22
|
+
isDefaultVersion: import("drizzle-orm").SQL<unknown>;
|
|
23
|
+
isDeleted: import("drizzle-orm").SQL<unknown>;
|
|
24
|
+
scorecardsStatus: import("drizzle-orm").SQL<unknown>;
|
|
25
|
+
lastSeenRunId: import("drizzle-orm").SQL<unknown>;
|
|
26
|
+
};
|
|
27
|
+
export declare const RELATIONS_UPSERT_SET: {
|
|
28
|
+
organizationId: import("drizzle-orm").SQL<unknown>;
|
|
29
|
+
projectId: import("drizzle-orm").SQL<unknown>;
|
|
30
|
+
targetToSourceRelation: import("drizzle-orm").SQL<unknown>;
|
|
31
|
+
sourceFile: import("drizzle-orm").SQL<unknown>;
|
|
32
|
+
fileHash: import("drizzle-orm").SQL<unknown>;
|
|
33
|
+
isDeleted: import("drizzle-orm").SQL<unknown>;
|
|
34
|
+
createdAt: import("drizzle-orm").SQL<unknown>;
|
|
35
|
+
updatedAt: import("drizzle-orm").SQL<unknown>;
|
|
36
|
+
lastSeenRunId: import("drizzle-orm").SQL<unknown>;
|
|
37
|
+
};
|
|
38
|
+
export declare const ATTRIBUTES_UPSERT_SET: {
|
|
39
|
+
organizationId: import("drizzle-orm").SQL<unknown>;
|
|
40
|
+
projectId: import("drizzle-orm").SQL<unknown>;
|
|
41
|
+
rbacTeams: import("drizzle-orm").SQL<unknown>;
|
|
42
|
+
createdAt: import("drizzle-orm").SQL<unknown>;
|
|
43
|
+
updatedAt: import("drizzle-orm").SQL<unknown>;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{sql as e}from"drizzle-orm";const t=20,c=1e3,a=2,l=5e5,u={organizationId:e`excluded.organization_id`,projectId:e`excluded.project_id`,type:e`excluded.type`,title:e`excluded.title`,summary:e`excluded.summary`,tags:e`excluded.tags`,metadata:e`excluded.metadata`,git:e`excluded.git`,contact:e`excluded.contact`,links:e`excluded.links`,createdAt:e`excluded.created_at`,updatedAt:e`excluded.updated_at`,sourceFile:e`excluded.source_file`,fileHash:e`excluded.file_hash`,hash:e`excluded.hash`,isCurrent:e`excluded.is_current`,isDefaultVersion:e`excluded.is_default_version`,isDeleted:e`excluded.is_deleted`,scorecardsStatus:e`excluded.scorecards_status`,lastSeenRunId:e`excluded.last_seen_run_id`},r={organizationId:e`excluded.organization_id`,projectId:e`excluded.project_id`,targetToSourceRelation:e`excluded.target_to_source_relation`,sourceFile:e`excluded.source_file`,fileHash:e`excluded.file_hash`,isDeleted:e`excluded.is_deleted`,createdAt:e`excluded.created_at`,updatedAt:e`excluded.updated_at`,lastSeenRunId:e`excluded.last_seen_run_id`},_={organizationId:e`excluded.organization_id`,projectId:e`excluded.project_id`,rbacTeams:e`excluded.rbac_teams`,createdAt:e`excluded.created_at`,updatedAt:e`excluded.updated_at`};export{_ as ATTRIBUTES_UPSERT_SET,t as DEFAULT_CHUNK_SIZE,u as ENTITIES_UPSERT_SET,l as MAX_BATCH_PAYLOAD_BYTES,c as MAX_LOGGED_DB_ERROR_LENGTH,a as MIN_RETRYABLE_BATCH_SIZE,r as RELATIONS_UPSERT_SET};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { BffCatalogEntity } from '@redocly/theme/core/types';
|
|
2
|
-
|
|
3
|
-
export declare function createBffEntity(entity: Row): BffCatalogEntity | null;
|
|
2
|
+
export declare function createBffEntity(entity: Record<string, unknown>): BffCatalogEntity | null;
|
|
4
3
|
//# sourceMappingURL=create-bff-entity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as o}from"../../../../tools/notifiers/logger.js";import{entityDatabaseSchema as s}from"../../schemas/database-schemas.js";import{validateWithResult as l}from"../../utils/ajv-validator.js";import{createBffRelatedEntities as n}from"./create-bff-related-entities.js";function
|
|
1
|
+
import{logger as o}from"../../../../tools/notifiers/logger.js";import{entityDatabaseSchema as s}from"../../schemas/database-schemas.js";import{validateWithResult as l}from"../../utils/ajv-validator.js";import{createBffRelatedEntities as n}from"./create-bff-related-entities.js";function f(t){const r=t.domains,i=t.owners,a=l(s,{...t});if(!a.success)return o.warn(`Invalid database catalog entity for entity ${String(t.key)}, error: ${a.error}`),null;const e=a.data||{};return{id:e.id,organizationId:e.organizationId,projectId:e.projectId,type:e.type,key:e.key,title:e.title,summary:e.summary??void 0,tags:e.tags?JSON.parse(e.tags):null,metadata:e.metadata?JSON.parse(e.metadata):null,git:e.git?JSON.parse(e.git):null,contact:e.contact?JSON.parse(e.contact):null,links:e.links?JSON.parse(e.links):null,source:e.source,sourceFile:e.sourceFile??void 0,createdAt:e.createdAt,updatedAt:e.updatedAt,version:e.version??void 0,revision:e.revision,isCurrent:e.isCurrent!==null?!!e.isCurrent:null,isDefaultVersion:e.isDefaultVersion!==null?!!e.isDefaultVersion:null,isDeleted:e.isDeleted!==null?!!e.isDeleted:null,object:"catalogEntityView",domains:n(r),owners:n(i)}}export{f as createBffEntity};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DatabaseEntityAttributesDto } from '../../../../providers/database/databases/
|
|
1
|
+
import type { DatabaseEntityAttributesDto } from '../../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js';
|
|
2
2
|
export declare function createEntityAttributesDbRecord({ rbacTeams, entityKey, organizationId, projectId, }: {
|
|
3
3
|
rbacTeams: string[];
|
|
4
4
|
entityKey: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntityBaseFileSchema } from '@redocly/config';
|
|
2
|
-
import type { DatabaseEntityDto } from '../../../../providers/database/databases/
|
|
2
|
+
import type { DatabaseEntityDto } from '../../../../providers/database/databases/sqlite-db/schemas/entities-table.js';
|
|
3
3
|
export declare function createEntityDbRecord({ entity, organizationId, projectId, source, sourceFile, fileHash, }: {
|
|
4
4
|
entity: EntityBaseFileSchema & {
|
|
5
5
|
id?: string;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { Row } from '@libsql/client';
|
|
2
1
|
import type { EntityReadModelSchema } from '../../schemas/read-model-schemas.js';
|
|
3
|
-
|
|
4
|
-
export declare function createEntityReadModel(entity: DatabaseEntity | Row): EntityReadModelSchema | null;
|
|
2
|
+
export declare function createEntityReadModel(entity: Record<string, unknown>): EntityReadModelSchema | null;
|
|
5
3
|
//# sourceMappingURL=create-entity-read-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as r}from"../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as
|
|
1
|
+
import{logger as r}from"../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as s}from"@redocly/theme/core/constants";import{entityDatabaseSchema as i}from"../../schemas/database-schemas.js";import{validateWithResult as o}from"../../utils/ajv-validator.js";function d(a){const t=o(i,{...a});if(!t.success)return r.warn(`Invalid database catalog entity for entity ${a.key}, error: ${t.error}`),null;const e=t.data||{};return{id:e.id,organizationId:e.organizationId,projectId:e.projectId,type:e.type,key:e.key||"",title:e.title||"",summary:e.summary||null,tags:e.tags?JSON.parse(e.tags):null,metadata:e.metadata?JSON.parse(e.metadata):null,git:e.git?JSON.parse(e.git):null,contact:e.contact?JSON.parse(e.contact):null,links:e.links?JSON.parse(e.links):null,source:e.source,sourceFile:e.sourceFile||null,version:e.version||s,revision:e.revision??"",hash:e.hash||null,isCurrent:e.isCurrent??!1,isDefaultVersion:e.isDefaultVersion??!1,createdAt:e.createdAt,updatedAt:e.updatedAt,isDeleted:e.isDeleted??!1,object:"catalogEntity",rbacTeams:e.rbacTeams?JSON.parse(e.rbacTeams):[]}}export{d as createEntityReadModel};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntityRelationDtoSchema } from '../../schemas/dto-schemas.js';
|
|
2
|
-
import type { DatabaseEntityRelationDto } from '../../../../providers/database/databases/
|
|
2
|
+
import type { DatabaseEntityRelationDto } from '../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js';
|
|
3
3
|
export declare function createEntityRelationDbRecordFromDto(relation: EntityRelationDtoSchema & {
|
|
4
4
|
id?: string;
|
|
5
5
|
createdAt?: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntityRelationFileSchema } from '@redocly/config';
|
|
2
|
-
import type { DatabaseEntityRelationDto } from '../../../../providers/database/databases/
|
|
2
|
+
import type { DatabaseEntityRelationDto } from '../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js';
|
|
3
3
|
type CreateEntityRelationDbRecordFromFileSchemaParams = {
|
|
4
4
|
relation: EntityRelationFileSchema;
|
|
5
5
|
sourceFile: string;
|
package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DatabaseEntityRelation } from '../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
|
|
1
|
+
import type { DatabaseEntityRelation } from '../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js';
|
|
3
2
|
import type { EntityRelationReadModelSchema } from '../../schemas/read-model-schemas.js';
|
|
4
|
-
export
|
|
3
|
+
export type CreateEntityRelationReadModelInput = DatabaseEntityRelation | Record<string, unknown>;
|
|
4
|
+
export declare function createEntityRelationReadModel(relation: CreateEntityRelationReadModelInput | null): (EntityRelationReadModelSchema & {
|
|
5
5
|
object: 'catalogEntityRelation';
|
|
6
6
|
}) | null;
|
|
7
7
|
//# sourceMappingURL=create-entity-relation-read-model.d.ts.map
|
package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as o}from"../../../../tools/notifiers/logger.js";import{entityRelationDatabaseSchema as a}from"../../schemas/database-schemas.js";import{validateWithResult as n}from"../../utils/ajv-validator.js";function u(r){if(!r)return null;const t=n(a,{...r});if(!t.success)return o.warn(`Invalid database catalog entity relation, error: ${t.error}`),null;const e=t.data||{};return{id:e.id,organizationId:e.organizationId,projectId:e.projectId,sourceKey:e.sourceKey,targetKey:e.targetKey,sourceVersion:e.sourceVersion??null,sourceRevision:e.sourceRevision??null,targetVersion:e.targetVersion??null,targetRevision:e.targetRevision??null,type:e.sourceToTargetRelation,lastSeenRunId:e.lastSeenRunId??null,createdAt:e.createdAt,updatedAt:e.updatedAt,object:"catalogEntityRelation"}}export{u as createEntityRelationReadModel};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { BffCatalogEntity } from '@redocly/theme/core/types';
|
|
2
2
|
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
|
|
3
3
|
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
4
|
-
import type { ListResult } from '
|
|
5
|
-
export declare class
|
|
4
|
+
import type { ListResult } from '../types.js';
|
|
5
|
+
export declare class BffEntitiesReadRepository {
|
|
6
6
|
#private;
|
|
7
|
-
constructor(db: DatabaseClient
|
|
7
|
+
constructor(db: DatabaseClient);
|
|
8
8
|
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
|
|
9
9
|
paginationParams: PaginationParams;
|
|
10
10
|
rbacTeams?: string[];
|
|
@@ -22,4 +22,4 @@ export declare class CatalogEntitiesBffRepository {
|
|
|
22
22
|
excludedEntities?: string[];
|
|
23
23
|
}): Promise<BffCatalogEntity | null>;
|
|
24
24
|
}
|
|
25
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=bff-entities-read-repository.d.ts.map
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import{and as S,desc as q,eq as l,sql as e}from"drizzle-orm";import{logger as V}from"../../../../../tools/notifiers/logger.js";import{applyPagination as k}from"../../../../../providers/database/pagination/index.js";import{getEffectivePaginationLimit as J}from"../../../../../providers/database/pagination/limit.js";import{applyFilter as P,excludeFieldsFromFilter as z,getAllFilterFieldValues as W}from"../../../../../providers/database/pagination/filter.js";import{entitiesAttributesTable as N}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{entitiesRelationsTable as K}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{entitiesTable as a}from"../../../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{createBffEntity as L}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as p,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as G,createEntityFieldsForSelect as D}from"../utils.js";import{buildEntitiesExclusionFilter as B}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as X,buildSubqueryRbacJoinAndFilter as Y}from"../utils/build-rbac-filter.js";import{buildSemanticVersionSortExpr as I}from"../utils/semantic-version-sort.js";const i={entityForKey:"e",baseEntities:"base_entities",pagedEntities:"paged_entities",combinedRelations:"combined_relations",combinedTargetEntities:"combined_target_entities",combinedTargetAttributes:"combined_target_attributes"};class ut{#t;constructor(t){this.#t=t}async getEntitiesWithRelations({paginationParams:t,rbacTeams:r,excludedEntities:n,excludedTypes:o}){const c=W(t.filter,"owners");if(c.length>0)return this.#c(t,c,r,o,n);const E=W(t.filter,"domains");return E.length>0?this.#l(t,E,r,o,n):this.#d(t,r,o,n)}async getEntityWithRelationsByKey({entityKey:t,filter:r,rbacTeams:n,excludedTypes:o,excludedEntities:c}){if(!t||t.trim()==="")return null;const E=r?.revision,u=r?.version,y=E?null:await this.#u(t,u||null),C=u??y?.version,R=E||y?.revision||null,F=B(o,c,"entities"),d=this.#t.client.select(D("entities")).from(a).leftJoin(N,l(a.key,N.entityKey)).where(S(l(a.key,t),X(n,"entities_attributes"),F)).as(i.entityForKey),g=this.#e().as(i.combinedRelations),b=this.#i(o,c).as(i.combinedTargetEntities),$=this.#s().as(i.combinedTargetAttributes),h=this.#t.client.with(d,g,b,$).select({...D(i.entityForKey),domains:this.#n(i.entityForKey,n).as("domains"),owners:this.#r(i.entityForKey,n).as("owners")}).from(d).$dynamic();R?h.where(S(l(e.raw("revision"),R),C?l(e.raw("version"),C):void 0)):(h.where(l(e.raw("is_current"),1)),h.orderBy(e`${I("version")} DESC`,e.raw("revision DESC"))),h.limit(1);const s=await h.get();return s?L(s):null}async#c(t,r,n,o,c){const E=this.#o(n,o,c),u=this.#e(),y=this.#i(o,c),C=u.as(i.combinedRelations),R=y.as(i.combinedTargetEntities),_=this.#s().as(i.combinedTargetAttributes),d=r.map(s=>e`
|
|
2
|
+
EXISTS (
|
|
3
|
+
SELECT 1 FROM (${u}) cr
|
|
4
|
+
WHERE cr.source_key = ${s}
|
|
5
|
+
AND cr.source_to_target_relation = 'owns'
|
|
6
|
+
AND cr.target_key = ${e.raw(`${i.baseEntities}.key`)}
|
|
7
|
+
)
|
|
8
|
+
`),g=d.length===1?d[0]:e`(${e.join(d,e` OR `)})`,T=W(t.filter,"domains");let b=g;if(T.length>0){const s=T.map(m=>e`
|
|
9
|
+
EXISTS (
|
|
10
|
+
SELECT 1 FROM (${u}) cr
|
|
11
|
+
JOIN (${y}) d ON d.key = ${m}
|
|
12
|
+
WHERE d.type = 'domain'
|
|
13
|
+
AND d.is_current = 1
|
|
14
|
+
AND cr.source_key = ${m}
|
|
15
|
+
AND cr.target_key = ${e.raw(`${i.baseEntities}.key`)}
|
|
16
|
+
AND cr.source_to_target_relation = 'hasParts'
|
|
17
|
+
)
|
|
18
|
+
`),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;b=e`(${g} AND ${f})`}const v=z(t.filter,["owners","domains"]),$={...t,filter:v,baseWhereCondition:b},h=this.#t.client.select(p).from(E.as(i.baseEntities)).$dynamic();try{const s=this.#t.client.select(p).from(E.as(i.baseEntities)).$dynamic();k(s,{...$,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#t.client.$count(s),m=J(t);k(h,{...$,limit:m+1});const w=h.as(i.pagedEntities),Q=this.#t.client.with(C,R,_,w).select({...D(i.pagedEntities),domains:this.#n(i.pagedEntities,n).as("domains"),owners:this.#r(i.pagedEntities,n).as("owners")}).from(w),[M,H]=await Promise.all([Q.all(),f]),O=M,j=O.length>m;return{items:O.slice(0,m).map(A=>L(A)).filter(A=>A!==null),hasMore:j,total:H}}catch(s){return V.error("Error getting entities with relations (owner optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#l(t,r,n,o,c){const E=this.#o(n,o,c),u=this.#e(),y=this.#i(o,c),C=u.as(i.combinedRelations),R=y.as(i.combinedTargetEntities),_=this.#s().as(i.combinedTargetAttributes),d=r.map(s=>e`
|
|
19
|
+
EXISTS (
|
|
20
|
+
SELECT 1 FROM (${u}) cr
|
|
21
|
+
JOIN (${y}) d ON d.key = ${s}
|
|
22
|
+
WHERE d.type = 'domain'
|
|
23
|
+
AND d.is_current = 1
|
|
24
|
+
AND cr.source_key = ${s}
|
|
25
|
+
AND cr.target_key = ${e.raw(`${i.baseEntities}.key`)}
|
|
26
|
+
AND cr.source_to_target_relation = 'hasParts'
|
|
27
|
+
)
|
|
28
|
+
`),g=d.length===1?d[0]:e`(${e.join(d,e` OR `)})`,T=W(t.filter,"owners");let b=g;if(T.length>0){const s=T.map(m=>e`
|
|
29
|
+
EXISTS (
|
|
30
|
+
SELECT 1 FROM (${u}) cr
|
|
31
|
+
WHERE cr.source_key = ${m}
|
|
32
|
+
AND cr.source_to_target_relation = 'owns'
|
|
33
|
+
AND cr.target_key = ${e.raw(`${i.baseEntities}.key`)}
|
|
34
|
+
)
|
|
35
|
+
`),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;b=e`(${g} AND ${f})`}const v=z(t.filter,["domains","owners"]),$={...t,filter:v,baseWhereCondition:b},h=this.#t.client.select(p).from(E.as(i.baseEntities)).$dynamic();try{const s=this.#t.client.select(p).from(E.as(i.baseEntities)).$dynamic();k(s,{...$,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#t.client.$count(s),m=J(t);k(h,{...$,limit:m+1});const w=h.as(i.pagedEntities),Q=this.#t.client.with(C,R,_,w).select({...D(i.pagedEntities),domains:this.#n(i.pagedEntities,n).as("domains"),owners:this.#r(i.pagedEntities,n).as("owners")}).from(w),[M,H]=await Promise.all([Q.all(),f]),O=M,j=O.length>m;return{items:O.slice(0,m).map(A=>L(A)).filter(A=>A!==null),hasMore:j,total:H}}catch(s){return V.error("Error getting entities with relations (domain optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#d(t,r,n,o){const c=this.#o(r,n,o),E=this.#e(),u=this.#i(n,o),y=E.as(i.combinedRelations),C=u.as(i.combinedTargetEntities),F=this.#s().as(i.combinedTargetAttributes),_=this.#t.client.select(p).from(c.as(i.baseEntities)).$dynamic(),{whereCondition:d}=P(_,t.filter);d&&_.where(d);try{const g=this.#t.client.select(p).from(c.as(i.baseEntities)).$dynamic();d&&g.where(d);const T=this.#t.client.$count(g),b=J(t);k(_,{...t,limit:b+1});const v=_.as(i.pagedEntities),$=this.#t.client.with(y,C,F,v).select({...D(i.pagedEntities),domains:this.#n(i.pagedEntities,r).as("domains"),owners:this.#r(i.pagedEntities,r).as("owners")}).from(v),[h,s]=await Promise.all([$.all(),T]),f=h,m=f.length>b;return{items:f.slice(0,b).map(w=>L(w)).filter(w=>w!==null),hasMore:m,total:s}}catch(g){return V.error("Error getting entities with relations (optimized path): "+g.message),{items:[],hasMore:!1,total:0}}}#o(t,r,n){const o=B(r,n,"entities");return this.#t.client.select(D("entities")).from(a).leftJoin(N,l(a.key,N.entityKey)).where(S(l(a.isCurrent,!0),l(a.isDeleted,!1),X(t,"entities_attributes"),o,this.#a("entities")))}#e(){return this.#t.client.select(G).from(K).where(l(K.isDeleted,!1))}#i(t,r){const n=B(t,r,"entities");return this.#t.client.select(p).from(a).where(S(l(a.isCurrent,!0),l(a.isDeleted,!1),n,this.#a("entities")))}async#u(t,r){if(r){const c=await this.#t.client.select({version:a.version,revision:a.revision}).from(a).where(S(l(a.key,t),l(a.version,r))).orderBy(q(a.revision)).limit(1).get();return c?{version:c.version||null,revision:c.revision||null}:null}const n=await this.#t.client.select({version:a.version,revision:a.revision}).from(a).where(S(l(a.key,t),l(a.isCurrent,!0),l(a.isDeleted,!1))).orderBy(e`${I("entities.version")} DESC`,q(a.revision)).limit(1).get();return n?{version:n.version||null,revision:n.revision||null}:null}#a(t){const r=e.raw(`${t}.key`),n=I(`${t}.version`),o=e.raw(`${t}.revision`),c=I("higher.version");return e`
|
|
36
|
+
NOT EXISTS (
|
|
37
|
+
SELECT 1
|
|
38
|
+
FROM entities higher
|
|
39
|
+
WHERE higher.key = ${r}
|
|
40
|
+
AND higher.is_current = 1
|
|
41
|
+
AND COALESCE(higher.is_deleted, 0) = 0
|
|
42
|
+
AND (
|
|
43
|
+
(${c}) > (${n})
|
|
44
|
+
OR (
|
|
45
|
+
(${c}) = (${n})
|
|
46
|
+
AND higher.revision > ${o}
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
`}#n(t,r){const{join:n,filter:o}=Y(r,"d.key");return e`
|
|
51
|
+
COALESCE(
|
|
52
|
+
(
|
|
53
|
+
SELECT json_group_array(
|
|
54
|
+
json_object(
|
|
55
|
+
'id', d.id,
|
|
56
|
+
'key', d.key,
|
|
57
|
+
'type', d.type,
|
|
58
|
+
'title', d.title,
|
|
59
|
+
'summary', d.summary,
|
|
60
|
+
'created_at', d.created_at,
|
|
61
|
+
'updated_at', d.updated_at,
|
|
62
|
+
'source', d.source,
|
|
63
|
+
'source_file', d.source_file
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
FROM (
|
|
67
|
+
SELECT DISTINCT d.*
|
|
68
|
+
FROM combined_relations er
|
|
69
|
+
JOIN combined_target_entities d ON d.key = er.source_key
|
|
70
|
+
${n}
|
|
71
|
+
WHERE er.source_to_target_relation = 'hasParts'
|
|
72
|
+
AND er.target_key = ${e.raw(`${t}.key`)}
|
|
73
|
+
AND d.type = 'domain'
|
|
74
|
+
AND d.is_current = 1
|
|
75
|
+
${o}
|
|
76
|
+
AND CASE
|
|
77
|
+
WHEN ${e.raw(`${t}.version`)} = ''
|
|
78
|
+
THEN er.target_version = ''
|
|
79
|
+
ELSE (er.target_version = ${e.raw(`${t}.version`)} OR er.target_version = '')
|
|
80
|
+
END
|
|
81
|
+
AND CASE
|
|
82
|
+
WHEN ${e.raw(`${t}.revision`)} = ''
|
|
83
|
+
THEN 1 = 1
|
|
84
|
+
ELSE (er.target_revision <= ${e.raw(`${t}.revision`)} OR er.target_revision = '')
|
|
85
|
+
END
|
|
86
|
+
LIMIT 10
|
|
87
|
+
) d
|
|
88
|
+
),
|
|
89
|
+
json_array()
|
|
90
|
+
)
|
|
91
|
+
`}#r(t,r){const{join:n,filter:o}=Y(r,"o.key");return e`
|
|
92
|
+
COALESCE(
|
|
93
|
+
(
|
|
94
|
+
SELECT json_group_array(
|
|
95
|
+
json_object(
|
|
96
|
+
'id', o.id,
|
|
97
|
+
'key', o.key,
|
|
98
|
+
'type', o.type,
|
|
99
|
+
'title', o.title,
|
|
100
|
+
'summary', o.summary,
|
|
101
|
+
'created_at', o.created_at,
|
|
102
|
+
'updated_at', o.updated_at,
|
|
103
|
+
'source', o.source,
|
|
104
|
+
'source_file', o.source_file
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
FROM (
|
|
108
|
+
SELECT DISTINCT o.*
|
|
109
|
+
FROM combined_relations er
|
|
110
|
+
JOIN combined_target_entities o ON o.key = er.source_key
|
|
111
|
+
${n}
|
|
112
|
+
WHERE er.source_to_target_relation = 'owns'
|
|
113
|
+
AND er.target_key = ${e.raw(`${t}.key`)}
|
|
114
|
+
AND o.is_current = 1
|
|
115
|
+
${o}
|
|
116
|
+
AND CASE
|
|
117
|
+
WHEN ${e.raw(`${t}.version`)} = ''
|
|
118
|
+
THEN er.target_version = ''
|
|
119
|
+
ELSE (er.target_version = ${e.raw(`${t}.version`)} OR er.target_version = '')
|
|
120
|
+
END
|
|
121
|
+
AND CASE
|
|
122
|
+
WHEN ${e.raw(`${t}.revision`)} = ''
|
|
123
|
+
THEN 1 = 1
|
|
124
|
+
ELSE (er.target_revision <= ${e.raw(`${t}.revision`)} OR er.target_revision = '')
|
|
125
|
+
END
|
|
126
|
+
LIMIT 10
|
|
127
|
+
) o
|
|
128
|
+
),
|
|
129
|
+
json_array()
|
|
130
|
+
)
|
|
131
|
+
`}#s(){return this.#t.client.select({entityKey:N.entityKey,rbacTeams:N.rbacTeams}).from(N)}}export{ut as BffEntitiesReadRepository};
|
package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../providers/database/types.js';
|
|
2
|
+
import { BaseRepository } from '../../../../providers/database/base-repository.js';
|
|
3
|
+
import { RelationsReadRepository } from './relations/relations-read-repository.js';
|
|
4
|
+
import { RevisionRepository } from './common/revision-repository.js';
|
|
5
|
+
import { BffEntitiesReadRepository } from './bffEntities/bff-entities-read-repository.js';
|
|
6
|
+
import { EntitiesReadRepository } from './entities/entities-read-repository.js';
|
|
7
|
+
import { EntitiesWriteRepository } from './entities/entities-write-repository.js';
|
|
8
|
+
import { RelationsWriteRepository } from './relations/relations-write-repository.js';
|
|
9
|
+
import { FiltersRepository } from './common/filters-repository.js';
|
|
10
|
+
export declare class CatalogEntitiesRepository extends BaseRepository {
|
|
11
|
+
#private;
|
|
12
|
+
readonly entitiesRead: EntitiesReadRepository;
|
|
13
|
+
readonly entitiesWrite: EntitiesWriteRepository;
|
|
14
|
+
readonly relationsRead: RelationsReadRepository;
|
|
15
|
+
readonly relationsWrite: RelationsWriteRepository;
|
|
16
|
+
readonly bffEntitiesRead: BffEntitiesReadRepository;
|
|
17
|
+
readonly filters: FiltersRepository;
|
|
18
|
+
readonly revisions: RevisionRepository;
|
|
19
|
+
get transactionsManager(): import("../../../../providers/database/transactions-manager.js").TransactionsManager;
|
|
20
|
+
constructor(dbConnection: DatabaseConnection);
|
|
21
|
+
sync(): Promise<void>;
|
|
22
|
+
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRepository>;
|
|
23
|
+
static recreateInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRepository>;
|
|
24
|
+
static resetInstance(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=catalog-entities-repository.d.ts.map
|
package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{logger as n}from"../../../../tools/notifiers/logger.js";import{telemetryTraceStep as s}from"../../../../telemetry/helpers/trace-step.js";import{BaseRepository as a}from"../../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as c}from"../../../../providers/database/database-connection-factory.js";import{RelationsReadRepository as o}from"./relations/relations-read-repository.js";import{RevisionRepository as f}from"./common/revision-repository.js";import{BffEntitiesReadRepository as m}from"./bffEntities/bff-entities-read-repository.js";import{EntitiesReadRepository as l}from"./entities/entities-read-repository.js";import{EntitiesWriteRepository as p}from"./entities/entities-write-repository.js";import{RelationsWriteRepository as w}from"./relations/relations-write-repository.js";import{FiltersRepository as h}from"./common/filters-repository.js";class e extends a{static#t;entitiesRead;entitiesWrite;relationsRead;relationsWrite;bffEntitiesRead;filters;revisions;get transactionsManager(){return this.databaseClient.transactionsManager}constructor(t){super(t),this.revisions=new f(t.client),this.bffEntitiesRead=new m(t.client),this.relationsRead=new o(t.client),this.entitiesRead=new l(t.client),this.entitiesWrite=new p(t.client,this.organizationId,this.projectId),this.relationsWrite=new w(t.client,this.organizationId,this.projectId),this.filters=new h(t.client)}async sync(){return s("catalog_entities.remote_repository.sync",async()=>{await this.databaseClient.sync()})}static async#e(t){const r=await c.create(t);if(!r)throw new Error("Failed to create db connection for catalog entities repository");return new e(r)}static async getInstance(t){return await s("catalog_entities.remote_repository.get_instance",async r=>{if(e.#t)return e.#t;try{return e.#t=await e.#e(t),e.#t}catch(i){throw n.error("Error creating db connection for catalog entities repository",i),r?.error(i),e.#t=null,i}})}static async recreateInstance(t){const r=e.#t,i=await e.#e(t);return e.#t=i,r&&await r.close(),i}static async resetInstance(){const t=e.#t;e.#t=null,t&&await t.close()}}export{e as CatalogEntitiesRepository};
|
package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
2
|
+
import type { CatalogFiltersParams, FilterOption } from '../types.js';
|
|
3
|
+
export declare class FiltersRepository {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(db: DatabaseClient);
|
|
6
|
+
getCatalogFilters({ entitiesTypes, emptyFilters, rbacTeams, excludedTypes, excludedEntities, }: CatalogFiltersParams): Promise<Record<string, FilterOption[]>>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=filters-repository.d.ts.map
|
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};
|