@redocly/redoc 0.130.0-next.9 → 0.131.0-next.0

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.
Files changed (268) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.js +1 -1
  4. package/dist/cli/prepare/copy-env-files.js +1 -1
  5. package/dist/cli/prepare/index.js +1 -1
  6. package/dist/cli/stats/collectors/openapi.js +1 -1
  7. package/dist/cli/telemetry/index.js +1 -1
  8. package/dist/client/App.js +1 -1
  9. package/dist/client/ErrorBoundary.js +1 -1
  10. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  11. package/dist/client/app/Sidebar/Sidebar.js +2 -2
  12. package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -1
  13. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  14. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  15. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  16. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  17. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  18. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  19. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  20. package/dist/client/app/search/message-handlers.d.ts +29 -0
  21. package/dist/client/app/search/message-handlers.js +1 -0
  22. package/dist/client/app/search/sse-parser.d.ts +10 -0
  23. package/dist/client/app/search/sse-parser.js +2 -0
  24. package/dist/client/app/search/useAiSearch.d.ts +9 -11
  25. package/dist/client/app/search/useAiSearch.js +1 -1
  26. package/dist/client/app/search/useSearch.js +1 -1
  27. package/dist/client/browser-entry.js +5 -5
  28. package/dist/client/constants/ai-search.d.ts +30 -0
  29. package/dist/client/constants/ai-search.js +1 -0
  30. package/dist/client/constants/index.d.ts +2 -0
  31. package/dist/client/constants/index.js +1 -0
  32. package/dist/client/providers/hooks.js +1 -1
  33. package/dist/client/runtime/loader.js +1 -1
  34. package/dist/client/types/ai-search.d.ts +73 -0
  35. package/dist/client/types/ai-search.js +0 -0
  36. package/dist/client/types/index.d.ts +1 -0
  37. package/dist/config/env-config.d.ts +17 -0
  38. package/dist/config/env-config.js +1 -0
  39. package/dist/config/env-schema.d.ts +242 -0
  40. package/dist/config/env-schema.js +3 -0
  41. package/dist/config/env-schemas/api-urls.d.ts +24 -0
  42. package/dist/config/env-schemas/api-urls.js +1 -0
  43. package/dist/config/env-schemas/auth.d.ts +42 -0
  44. package/dist/config/env-schemas/auth.js +1 -0
  45. package/dist/config/env-schemas/catalog.d.ts +12 -0
  46. package/dist/config/env-schemas/catalog.js +1 -0
  47. package/dist/config/env-schemas/database.d.ts +15 -0
  48. package/dist/config/env-schemas/database.js +1 -0
  49. package/dist/config/env-schemas/environment-detection.d.ts +24 -0
  50. package/dist/config/env-schemas/environment-detection.js +1 -0
  51. package/dist/config/env-schemas/feature-flags.d.ts +24 -0
  52. package/dist/config/env-schemas/feature-flags.js +1 -0
  53. package/dist/config/env-schemas/organization-project.d.ts +27 -0
  54. package/dist/config/env-schemas/organization-project.js +1 -0
  55. package/dist/config/env-schemas/scorecards.d.ts +12 -0
  56. package/dist/config/env-schemas/scorecards.js +1 -0
  57. package/dist/config/env-schemas/search.d.ts +21 -0
  58. package/dist/config/env-schemas/search.js +1 -0
  59. package/dist/config/env-schemas/server-config.d.ts +51 -0
  60. package/dist/config/env-schemas/server-config.js +1 -0
  61. package/dist/config/env-schemas/site.d.ts +12 -0
  62. package/dist/config/env-schemas/site.js +1 -0
  63. package/dist/config/env-schemas/ssr.d.ts +18 -0
  64. package/dist/config/env-schemas/ssr.js +1 -0
  65. package/dist/config/env-schemas/telemetry.d.ts +15 -0
  66. package/dist/config/env-schemas/telemetry.js +1 -0
  67. package/dist/config/env-schemas/test.d.ts +22 -0
  68. package/dist/config/env-schemas/test.js +1 -0
  69. package/dist/constants/common.d.ts +1 -1
  70. package/dist/constants/common.js +1 -1
  71. package/dist/constants/l10n/langs/ar.js +1 -1
  72. package/dist/constants/l10n/langs/de.js +1 -1
  73. package/dist/constants/l10n/langs/en.js +1 -1
  74. package/dist/constants/l10n/langs/es.js +1 -1
  75. package/dist/constants/l10n/langs/fr.js +1 -1
  76. package/dist/constants/l10n/langs/hi.js +1 -1
  77. package/dist/constants/l10n/langs/it.js +1 -1
  78. package/dist/constants/l10n/langs/ja.js +1 -1
  79. package/dist/constants/l10n/langs/ko.js +1 -1
  80. package/dist/constants/l10n/langs/pl.js +1 -1
  81. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  82. package/dist/constants/l10n/langs/pt.js +1 -1
  83. package/dist/constants/l10n/langs/ru.js +1 -1
  84. package/dist/constants/l10n/langs/uk.js +1 -1
  85. package/dist/constants/l10n/langs/zh.js +1 -1
  86. package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
  87. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  88. package/dist/server/constants/common.js +1 -1
  89. package/dist/server/entitlements/entitlements-provider.js +1 -1
  90. package/dist/server/esbuild/esbuild-logger.js +2 -2
  91. package/dist/server/esbuild/esbuild.js +2 -2
  92. package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
  93. package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
  94. package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
  95. package/dist/server/fs/last-modified-tracker.js +1 -1
  96. package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
  97. package/dist/server/node-bundle-entry.js +1 -1
  98. package/dist/server/plugins/analytics/adobe/index.js +1 -1
  99. package/dist/server/plugins/analytics/amplitude/index.js +1 -1
  100. package/dist/server/plugins/analytics/fullstory/index.js +1 -1
  101. package/dist/server/plugins/analytics/ga/index.js +1 -1
  102. package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
  103. package/dist/server/plugins/analytics/gtm/index.js +1 -1
  104. package/dist/server/plugins/analytics/heap/index.js +1 -1
  105. package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
  106. package/dist/server/plugins/analytics/segment/index.js +1 -1
  107. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +36 -61
  108. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  109. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  110. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  111. package/dist/server/plugins/catalog-entities/database/mappers/{create-entity-relation.d.ts → create-entity-relation-read-model.d.ts} +2 -2
  112. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -0
  113. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +16 -5
  114. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +21 -17
  115. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +35 -9
  116. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +24 -21
  117. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +36 -39
  118. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  119. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  120. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
  121. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  122. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +4 -5
  123. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  124. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
  125. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
  126. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
  127. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
  128. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  129. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -1
  130. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  131. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  132. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  133. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  134. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  135. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +25 -164
  136. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +0 -1
  137. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
  138. package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
  139. package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
  140. package/dist/server/plugins/catalog-entities/types/params.js +0 -0
  141. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  142. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
  143. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
  144. package/dist/server/plugins/config-parser/index.js +1 -1
  145. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  146. package/dist/server/plugins/default-theme/index.js +1 -1
  147. package/dist/server/plugins/entitlements/index.js +1 -1
  148. package/dist/server/plugins/lifecycle.js +2 -2
  149. package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
  150. package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
  151. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  152. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  153. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -1
  154. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  155. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  156. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  157. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  158. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  159. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  160. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  161. package/dist/server/plugins/mcp/servers/base-server.js +1 -1
  162. package/dist/server/plugins/nav-utils.js +1 -1
  163. package/dist/server/plugins/openapi-docs/index.js +1 -1
  164. package/dist/server/plugins/openapi-docs/template/helpers.d.ts +1 -1
  165. package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
  166. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  167. package/dist/server/plugins/scorecards/plugin.js +1 -1
  168. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  169. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  170. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  171. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  172. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  173. package/dist/server/plugins/search/index.js +1 -1
  174. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  175. package/dist/server/plugins/search/utils.js +1 -1
  176. package/dist/server/plugins/sidebars/index.js +2 -2
  177. package/dist/server/plugins/sso/index.js +1 -1
  178. package/dist/server/providers/database/base-repository.js +1 -1
  179. package/dist/server/providers/database/database-connection-factory.js +1 -1
  180. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  181. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  182. package/dist/server/ssr/render.js +1 -1
  183. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  184. package/dist/server/ssr/utils.js +8 -8
  185. package/dist/server/store.d.ts +4 -4
  186. package/dist/server/store.js +1 -1
  187. package/dist/server/telemetry/index.js +1 -1
  188. package/dist/server/tools/notifiers/formatter.js +3 -3
  189. package/dist/server/tools/notifiers/helpers/colors.js +1 -1
  190. package/dist/server/tools/notifiers/logger.js +2 -2
  191. package/dist/server/tools/notifiers/reporter.js +9 -9
  192. package/dist/server/tools/notifiers/terminal-manager.js +4 -4
  193. package/dist/server/utils/envs/load-env-variables.js +1 -1
  194. package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
  195. package/dist/server/utils/is-scorecards-enabled.js +1 -1
  196. package/dist/server/utils/lifecycle-hooks.js +1 -1
  197. package/dist/server/utils/rbac.d.ts +65 -0
  198. package/dist/server/utils/report-all-errors.js +1 -1
  199. package/dist/server/version.js +1 -1
  200. package/dist/server/web-server/auth.js +3 -3
  201. package/dist/server/web-server/handle-api-route-request.js +1 -1
  202. package/dist/server/web-server/http.js +2 -2
  203. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  204. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
  205. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  206. package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
  207. package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
  208. package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
  209. package/dist/server/web-server/routes/ask-ai.js +1 -1
  210. package/dist/server/web-server/routes/auth.js +1 -1
  211. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  212. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  213. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  214. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  215. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.d.ts +3 -0
  216. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.js +0 -0
  217. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.d.ts +43 -0
  218. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.js +1 -0
  219. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +6823 -0
  220. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -0
  221. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.d.ts +1102 -0
  222. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.js +1 -0
  223. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
  224. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
  225. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.d.ts +4 -0
  226. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.js +1 -0
  227. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +4 -0
  228. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.js +1 -0
  229. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +4 -0
  230. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.js +1 -0
  231. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +4 -0
  232. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.js +1 -0
  233. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +13 -0
  234. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.js +1 -0
  235. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +13 -0
  236. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.js +1 -0
  237. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +13 -0
  238. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.js +1 -0
  239. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  240. package/dist/server/web-server/routes/error.js +1 -1
  241. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
  242. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
  243. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
  244. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
  245. package/dist/server/web-server/routes/index.js +1 -1
  246. package/dist/server/web-server/routes/info.js +1 -1
  247. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  248. package/dist/server/web-server/routes/otel/otel.js +1 -1
  249. package/dist/server/web-server/routes/page-data.js +1 -1
  250. package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
  251. package/dist/server/web-server/utils.d.ts +2 -2
  252. package/dist/server/workers/worker-pool.js +1 -1
  253. package/package.json +17 -16
  254. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +0 -1
  255. package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +0 -8
  256. package/dist/server/plugins/catalog-entities/entities/validate-entity.js +0 -1
  257. package/dist/server/utils/envs/is-build-mode.d.ts +0 -2
  258. package/dist/server/utils/envs/is-build-mode.js +0 -1
  259. package/dist/server/utils/envs/is-develop-mode.d.ts +0 -7
  260. package/dist/server/utils/envs/is-develop-mode.js +0 -1
  261. package/dist/server/utils/envs/is-production-mode.d.ts +0 -10
  262. package/dist/server/utils/envs/is-production-mode.js +0 -1
  263. package/dist/utils/env/is-local-development.d.ts +0 -13
  264. package/dist/utils/env/is-local-development.js +0 -1
  265. package/dist/utils/env/is-production.d.ts +0 -13
  266. package/dist/utils/env/is-production.js +0 -1
  267. package/dist/utils/env/is-web-view.d.ts +0 -14
  268. package/dist/utils/env/is-web-view.js +0 -1
@@ -8,6 +8,7 @@ export declare function createEntityDbRecord({ entity, organizationId, projectId
8
8
  isCurrent?: boolean;
9
9
  isDefaultVersion?: boolean;
10
10
  isDeleted?: boolean | null;
11
+ revision?: string;
11
12
  };
12
13
  organizationId: string;
13
14
  projectId: string;
@@ -1 +1 @@
1
- import{logger as r}from"../../../../tools/notifiers/logger.js";import{entityDatabaseSchema as l}from"../../schemas/database-schemas.js";import{validateWithResult as t}from"../../utils/ajv-validator.js";const o=e=>"project_id"in e&&"organization_id"in e&&"created_at"in e;function d(e){if(o(e)){const s=t(l,e);if(!s.success)return r.warn(`Invalid database catalog entity for entity ${e.key}, error: ${s.error}`),null;const a=s.data||{};return{id:a.id,type:a.type,key:a.key||"",title:a.title||"",summary:a.summary||null,tags:a.tags?JSON.parse(a.tags):null,metadata:a.metadata?JSON.parse(a.metadata):null,git:a.git?JSON.parse(a.git):null,contact:a.contact?JSON.parse(a.contact):null,links:a.links?JSON.parse(a.links):null,source:a.source||"file",sourceFile:a.source_file||null,version:a.version||null,revision:a.revision??"",hash:a.hash||null,isCurrent:a.is_current,isDefaultVersion:a.is_default_version??!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDeleted:a.is_deleted??!1,object:"catalogEntity",rbacTeams:a.rbac_teams?JSON.parse(a.rbac_teams):[]}}return{...e,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||"file",version:e.version||null,revision:e.revision??"",hash:e.hash||null,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion??!1,isDeleted:e.isDeleted??!1,object:"catalogEntity"}}export{d as createEntityReadModel};
1
+ import{logger as r}from"../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as t}from"@redocly/theme/core/constants";import{entityDatabaseSchema as l}from"../../schemas/database-schemas.js";import{validateWithResult as o}from"../../utils/ajv-validator.js";const i=e=>"project_id"in e&&"organization_id"in e&&"created_at"in e;function m(e){if(i(e)){const s=o(l,e);if(!s.success)return r.warn(`Invalid database catalog entity for entity ${e.key}, error: ${s.error}`),null;const a=s.data||{};return{id:a.id,organizationId:a.organization_id,projectId:a.project_id,type:a.type,key:a.key||"",title:a.title||"",summary:a.summary||null,tags:a.tags?JSON.parse(a.tags):null,metadata:a.metadata?JSON.parse(a.metadata):null,git:a.git?JSON.parse(a.git):null,contact:a.contact?JSON.parse(a.contact):null,links:a.links?JSON.parse(a.links):null,source:a.source||"file",sourceFile:a.source_file||null,version:a.version||t,revision:a.revision??"",hash:a.hash||null,isCurrent:a.is_current??!1,isDefaultVersion:a.is_default_version??!1,createdAt:a.created_at,updatedAt:a.updated_at,isDeleted:a.is_deleted??!1,object:"catalogEntity",rbacTeams:a.rbac_teams?JSON.parse(a.rbac_teams):[]}}return{...e,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||"file",version:e.version,revision:e.revision??"",hash:e.hash||null,isCurrent:e.isCurrent??!1,isDefaultVersion:e.isDefaultVersion??!1,isDeleted:e.isDeleted??!1,object:"catalogEntity"}}export{m as createEntityReadModel};
@@ -1,7 +1,7 @@
1
1
  import type { Row } from '@libsql/client';
2
2
  import type { DatabaseEntityRelation } from '../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
3
3
  import type { EntityRelationReadModelSchema } from '../../schemas/read-model-schemas.js';
4
- export declare function createEntityRelation(relation: DatabaseEntityRelation | Row): (EntityRelationReadModelSchema & {
4
+ export declare function createEntityRelationReadModel(relation: DatabaseEntityRelation | Row | null): (EntityRelationReadModelSchema & {
5
5
  object: 'catalogEntityRelation';
6
6
  }) | null;
7
- //# sourceMappingURL=create-entity-relation.d.ts.map
7
+ //# sourceMappingURL=create-entity-relation-read-model.d.ts.map
@@ -0,0 +1 @@
1
+ import{logger as r}from"../../../../tools/notifiers/logger.js";import{entityRelationDatabaseSchema as i}from"../../schemas/database-schemas.js";import{validateWithResult as a}from"../../utils/ajv-validator.js";const n=e=>"project_id"in e&&"organization_id"in e&&"source_key"in e;function g(e){if(!e)return null;if(n(e)){const o=a(i,e);if(!o.success)return r.warn(`Invalid database catalog entity relation, error: ${o.error}`),null;const t=o.data||{};return{id:t.id,organizationId:t.organization_id,projectId:t.project_id,sourceKey:t.source_key,targetKey:t.target_key,sourceVersion:t.source_version??null,sourceRevision:t.source_revision??null,targetVersion:t.target_version??null,targetRevision:t.target_revision??null,type:t.source_to_target_relation,createdAt:t.created_at,updatedAt:t.updated_at,object:"catalogEntityRelation"}}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,createdAt:e.createdAt,updatedAt:e.updatedAt,object:"catalogEntityRelation"}}export{g as createEntityRelationReadModel};
@@ -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?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
9
- getEntityWithRelationsByKey(entityKey: string, filter?: {
10
- revision?: string | null;
11
- version?: string | null;
12
- }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
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[];
23
+ }): Promise<BffCatalogEntity | null>;
13
24
  }
14
25
  //# sourceMappingURL=catalog-entities-bff-repository.d.ts.map
@@ -1,45 +1,45 @@
1
- import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,exists as x,inArray as z}from"drizzle-orm";import{unionAll as S}from"drizzle-orm/sqlite-core";import{logger as J}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as O}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as _}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as F}from"../../../../../providers/database/pagination/index.js";import{applyFilter as U,excludeFieldsFromFilter as q,getAllFilterFieldValues as W}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as L}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as d,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as C,createEntityFieldsForSelect as $}from"../utils.js";import{createMergedEntityFieldsForSelect as I}from"../utils/create-merged-entity-fields-for-select.js";import{buildNoHigherVersionExistsFilter as B,buildSemanticVersionSortExpr as Y}from"../utils/semantic-version-sort.js";class ae{#e;#t;constructor(i,o){this.#e=i,this.#t=o}async getEntitiesWithRelations(i={},o){const a=W(i.filter,"owners");if(a.length>0)return this.#a(i,a,o);const l=W(i.filter,"domains");return l.length>0?this.#d(i,l,o):this.#m(i,o)}async#a(i,o,a){const l=this.#n(a),c=this.#o(),h=this.#l(),b=c.as("combined_relations"),w=h.as("combined_target_entities"),u=o.map(s=>e`
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 (${c}) cr
4
- WHERE cr.source_key = ${s}
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
- `),y=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,N=W(i.filter,"domains");let v=y;if(N.length>0){const s=N.map(m=>e`
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 (${c}) cr
11
- JOIN (${h}) d ON d.key = ${m}
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
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
- `),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;v=e`(${y} AND ${f})`}const p=q(i.filter,["owners","domains"]),k={...i,filter:p,baseWhereCondition:v},E=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();try{const s=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();F(s,{...k,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(s),m=i.limit||10;F(E,{...k,limit:m+1});const R=E.as("paged_entities"),M=this.#e.client.with(b,w,R).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(R),[Q,H]=await Promise.all([M.run(),f]),T=Q.rows,j=T.length>m;return{items:T.slice(0,m).map(D=>L(D)).filter(D=>D!==null),hasMore:j,total:H}}catch(s){return J.error("Error getting entities with relations (owner optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#d(i,o,a){const l=this.#n(a),c=this.#o(),h=this.#l(),b=c.as("combined_relations"),w=h.as("combined_target_entities"),u=o.map(s=>e`
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 (${c}) cr
21
- JOIN (${h}) d ON d.key = ${s}
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 = ${s}
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
- `),y=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,N=W(i.filter,"owners");let v=y;if(N.length>0){const s=N.map(m=>e`
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 (${c}) cr
30
+ SELECT 1 FROM (${h}) cr
31
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
- `),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;v=e`(${y} AND ${f})`}const p=q(i.filter,["domains","owners"]),k={...i,filter:p,baseWhereCondition:v},E=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();try{const s=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();F(s,{...k,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(s),m=i.limit||10;F(E,{...k,limit:m+1});const R=E.as("paged_entities"),M=this.#e.client.with(b,w,R).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(R),[Q,H]=await Promise.all([M.run(),f]),T=Q.rows,j=T.length>m;return{items:T.slice(0,m).map(D=>L(D)).filter(D=>D!==null),hasMore:j,total:H}}catch(s){return J.error("Error getting entities with relations (domain optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#m(i,o){const a=this.#n(o),l=this.#o(),c=this.#l(),h=l.as("combined_relations"),b=c.as("combined_target_entities"),w=this.#e.client.select(d).from(a.as("base_entities")).$dynamic(),{whereCondition:u}=U(w,i.filter);u&&w.where(u);try{const y=this.#e.client.select(d).from(a.as("base_entities")).$dynamic();u&&y.where(u);const N=this.#e.client.$count(y),v=i.limit||10;F(w,{...i,limit:v+1});const p=w.as("paged_entities"),k=this.#e.client.with(h,b,p).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(p),[E,s]=await Promise.all([k.run(),N]),f=E.rows,m=f.length>v;return{items:f.slice(0,v).map(R=>L(R)).filter(R=>R!==null),hasMore:m,total:s}}catch(y){return J.error("Error getting entities with relations (optimized path): "+y.message),{items:[],hasMore:!1,total:0}}}#n(i){return this.#t?S(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,_.entityKey)).where(n(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),this.#i(i),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))),B("remote.entities.key","remote.entities.version","remote.entities.revision"))),this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),this.#i(i),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))),B("entities.key","entities.version","entities.revision"))),this.#e.client.select(I("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(n(A(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),A(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),this.#c(i,"ea"),B("r.key","r.version","r.revision")))):this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),this.#i(i)))}#o(){return this.#t?S(this.#e.client.select(C).from(e`remote.entities_relations`),this.#e.client.select(C).from(O).where(g(this.#e.client.select({id:C.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${O.sourceKey}`)))):this.#e.client.select(C).from(O)}#l(){return this.#t?S(this.#e.client.select(d).from(e`remote.entities`).where(n(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(d).from(t).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(I("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(n(A(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),A(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1))))):this.#e.client.select(d).from(t).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1)))}async getEntityWithRelationsByKey(i,o,a){if(!i||i.trim()==="")return null;const l=o?.revision,c=o?.version,h=l?null:await this.#h(i,c||null),b=c??h?.version,w=l||h?.revision||null,y=(this.#t?S(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,_.entityKey)).where(n(e`remote.entities.key = ${i}`,this.#i(a),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.key,i),this.#i(a),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(I("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(n(e`r.key = ${i}`,this.#c(a,"ea")))):this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.key,i),this.#i(a)))).as("e"),v=(this.#t?S(this.#e.client.select(C).from(e`remote.entities_relations`),this.#e.client.select(C).from(O).where(g(this.#e.client.select({id:C.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${O.sourceKey}`)))):this.#e.client.select(C).from(O)).as("combined_relations"),k=(this.#t?S(this.#e.client.select(d).from(e`remote.entities`).where(g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`)))),this.#e.client.select(d).from(t).where(g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`)))),this.#e.client.select(I("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`)):this.#e.client.select(d).from(t)).as("combined_target_entities"),E=this.#e.client.with(y,v,k).select({...$("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(y).$dynamic();w?E.where(n(r(e.raw("revision"),w),b?r(e.raw("version"),b):void 0)):E.where(r(e.raw("is_current"),1)),E.limit(1);const s=await E.run();if(s.rows.length===0)return null;const f=s.rows[0];return L(f)}async#h(i,o){if(o){const c=await(this.#t?S(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(n(e`key = ${i}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.version,o),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(n(e`remote.key = ${t.key}`,e`remote.version = ${o}`))))).orderBy(V(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.version,o))).orderBy(V(t.revision))).limit(1).run();if(c.rows.length>0){const h=c.rows[0];return{version:h.version||null,revision:h.revision||null}}return null}if(this.#t){const l=await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`(
36
- SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${Y("version")} DESC, revision DESC) as rn
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
37
  FROM (
38
38
  SELECT version, revision FROM remote.entities WHERE key = ${i} AND is_current = 1
39
39
  UNION ALL
40
40
  SELECT version, revision FROM entities WHERE key = ${i} AND is_current = 1
41
41
  )
42
- ) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(l.rows.length>0){const c=l.rows[0];return{version:c.version||null,revision:c.revision||null}}return null}const a=await this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.isCurrent,!0))).limit(1).run();if(a.rows.length>0){const l=a.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}#r(i){return e`
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`
43
43
  COALESCE(
44
44
  (
45
45
  SELECT json_group_array(
@@ -59,10 +59,12 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
59
59
  SELECT DISTINCT d.*
60
60
  FROM combined_relations er
61
61
  JOIN combined_target_entities d ON d.key = er.source_key
62
+ ${n}
62
63
  WHERE er.source_to_target_relation = 'hasParts'
63
64
  AND er.target_key = ${e.raw(`${i}.key`)}
64
65
  AND d.type = 'domain'
65
66
  AND d.is_current = 1
67
+ ${o}
66
68
  AND CASE
67
69
  WHEN ${e.raw(`${i}.version`)} = ''
68
70
  THEN er.target_version = ''
@@ -78,7 +80,7 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
78
80
  ),
79
81
  json_array()
80
82
  )
81
- `}#s(i){return e`
83
+ `}#s(i,s){const{join:n,filter:o}=G(s,"o.key");return e`
82
84
  COALESCE(
83
85
  (
84
86
  SELECT json_group_array(
@@ -98,9 +100,11 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
98
100
  SELECT DISTINCT o.*
99
101
  FROM combined_relations er
100
102
  JOIN combined_target_entities o ON o.key = er.source_key
103
+ ${n}
101
104
  WHERE er.source_to_target_relation = 'owns'
102
105
  AND er.target_key = ${e.raw(`${i}.key`)}
103
106
  AND o.is_current = 1
107
+ ${o}
104
108
  AND CASE
105
109
  WHEN ${e.raw(`${i}.version`)} = ''
106
110
  THEN er.target_version = ''
@@ -116,4 +120,4 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
116
120
  ),
117
121
  json_array()
118
122
  )
119
- `}#i(i){if(!(!i||i.length===0))return A(X(_.rbacTeams),e`json_array_length(${_.rbacTeams}) = 0`,x(this.#e.client.select({id:e.raw("1")}).from(e`json_each(${_.rbacTeams}) as entity_teams`).where(z(e`entity_teams.value`,i))))}#c(i,o="ea"){if(!(!i||i.length===0))return A(e.raw(`${o}.rbac_teams IS NULL`),e.raw(`json_array_length(${o}.rbac_teams) = 0`),x(this.#e.client.select({id:e.raw("1")}).from(e.raw(`json_each(${o}.rbac_teams) as entity_teams`)).where(z(e`entity_teams.value`,i))))}}export{ae as CatalogEntitiesBffRepository};
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};
@@ -3,6 +3,7 @@ import type { PaginationParams } from '../../../../../providers/database/paginat
3
3
  import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
4
4
  import type { DatabaseClient } from '../../../../../providers/database/client.js';
5
5
  import type { Filter } from '../../../../../providers/database/pagination/types.js';
6
+ import type { GetEntityByIdParams } from '../../../types/params.js';
6
7
  import { type EntityReadModelSchema, type EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
7
8
  export type ListResult<T> = {
8
9
  items: T[];
@@ -12,6 +13,9 @@ export type ListResult<T> = {
12
13
  export type CatalogFiltersParams = {
13
14
  entitiesTypes?: string[];
14
15
  emptyFilters?: string[];
16
+ rbacTeams?: string[];
17
+ excludedTypes?: string[];
18
+ excludedEntities?: string[];
15
19
  };
16
20
  export type FilterOption = {
17
21
  value: string;
@@ -21,22 +25,38 @@ export declare class CatalogEntitiesLocalReadRepository {
21
25
  #private;
22
26
  constructor(db: DatabaseClient);
23
27
  attachDatabase(databasePath: string): Promise<void>;
24
- getEntities(paginationParams?: PaginationParams): Promise<ListResult<EntityReadModelSchema>>;
28
+ getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
29
+ paginationParams: PaginationParams;
30
+ rbacTeams?: string[];
31
+ excludedTypes?: string[];
32
+ excludedEntities?: string[];
33
+ }): Promise<ListResult<EntityReadModelSchema>>;
25
34
  getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
26
35
  listEntityRevisions(entityKey: string, version?: string | null): Promise<EntityRevisionSummary[]>;
27
36
  getEntitiesCountByTypes(): Promise<{
28
37
  type: string;
29
38
  count: number;
30
39
  }[]>;
31
- getEntityById(id: string): Promise<EntityReadModelSchema | null>;
40
+ getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
32
41
  getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
33
42
  getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
34
43
  getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
35
- getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
36
- getEntityWithRelationsByKey(entityKey: string, filter?: {
37
- revision?: string | null;
38
- version?: string | null;
39
- }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
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[];
59
+ }): Promise<BffCatalogEntity | null>;
40
60
  getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
41
61
  targetKey: string;
42
62
  targetRevision: string;
@@ -44,7 +64,13 @@ export declare class CatalogEntitiesLocalReadRepository {
44
64
  direction: "outgoing" | "incoming";
45
65
  priority: number;
46
66
  }[]>;
47
- getRelatedEntities(key: string, paginationParams?: PaginationParams): Promise<ListResult<BffCatalogRelatedEntity>>;
48
- getCatalogFilters({ entitiesTypes, emptyFilters, }: CatalogFiltersParams): Promise<Record<string, FilterOption[]>>;
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[]>>;
49
75
  }
50
76
  //# sourceMappingURL=catalog-entities-local-read-repository.d.ts.map
@@ -1,15 +1,15 @@
1
- import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as F}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as A}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{applyFilter as B}from"../../../../../providers/database/pagination/filter.js";import{FIELDS_TO_SELECT_FOR_ENTITY as _,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as k}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as E}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as b}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as L}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as M}from"../utils/normalize-revision-flags.js";class te{#e;#t=void 0;#i;#r;constructor(t){this.#e=t,this.#i=new I(this.#e,this.#t||""),this.#r=new g(this.#e,this.#t||"")}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`),this.#i=new I(this.#e,t),this.#r=new g(this.#e,t))}async getEntities(t={}){const r=this.#t?f(this.#e.client.select(_).from(e`remote.entities`).where(y(this.#e.client.select({id:_.id}).from(i).where(c(e`${i.key} = remote.entities.key`,e`${i.version} = remote.entities.version`,e`${i.revision} = remote.entities.revision`)))),this.#e.client.select(_).from(i).where(y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(c(e`r.key = ${i.key}`,e`r.version = ${i.version}`,e`r.revision = ${i.revision}`)))),this.#e.client.select(b("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`)):this.#e.client.select(_).from(i),s=this.#e.client.select(_).from(r.as("combined_entities")),n=this.#e.client.select(_).from(r.as("combined_entities")).$dynamic(),d=S(n,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(d),a=s.$dynamic(),o=t.limit||10,h=S(a,{...t,limit:o+1}),[N,p]=await Promise.all([h.run(),l]),w=N.rows,T=w.length>o;return{items:w.slice(0,o).map(R=>k(R)).filter(R=>R!==null),hasMore:T,total:p}}async getEntityKeysAndVersionsBySourceFile(t){const r=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${A})`.as("keyVersion")}).from(e`remote.entities`).where(c(e`source_file = ${t}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${i.key} || ':' || COALESCE(${i.version}, ${A})`.as("keyVersion")}).from(i).where(c(u(i.sourceFile,t),u(i.source,"file"),e`${i.key} IS NOT NULL`,y(this.#e.client.select({key:e.raw("key")}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`))))):this.#e.client.select({keyVersion:e`${i.key} || ':' || COALESCE(${i.version}, ${A})`.as("keyVersion")}).from(i).where(c(u(i.sourceFile,t),u(i.source,"file"),D(i.key))),s=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(r.as("combined_keys_versions")).run();return new Set(s.rows.map(n=>n.keyVersion))}async listEntityRevisions(t,r){const s=[u(i.key,t),u(i.isDeleted,!1),...r?[u(i.version,r)]:[]],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")},d=this.#t?f(this.#e.client.select(n).from(e`remote.entities`).where(c(e`key = ${t}`,e`is_deleted = 0`,r?e`version = ${r}`:void 0,y(this.#e.client.select({id:e.raw("id")}).from(i).where(c(e`${i.key} = remote.entities.key`,e`${i.version} = remote.entities.version`,e`${i.revision} = remote.entities.revision`))))),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...s,y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(c(e`r.key = ${i.key}`,e`r.version = ${i.version}`,e`r.revision = ${i.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(c(e`r.key = ${t}`,e`r.is_deleted = 0`,e`l.is_deleted = 0`,r?e`r.version = ${r}`:void 0))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...s)),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(d.as("combined_revisions")).orderBy(e`${L("version")} DESC`,e.raw("revision DESC")).run()).rows.map(o=>({version:o.version||null,revision:o.revision??"",isCurrent:o.is_current!==null?!!o.is_current:!1,createdAt:o.created_at||null,updatedAt:o.updated_at||null,isDefaultVersion:o.is_default_version!==null?!!o.is_default_version:!1}));return M(a),a}async getEntitiesCountByTypes(){if(this.#t){const t=e`
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{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 b}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as $}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as j}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as B}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";import{createEntityRelationReadModel as M}from"../../mappers/create-entity-relation-read-model.js";class Ee{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new b(this.#e,this.#t||""),this.#s=new $(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 b(this.#e,i),this.#s=new $(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`${B("version")} DESC`,e.raw("revision DESC")).run()).rows.map(l=>({version:l.version,revision:l.revision??"",isCurrent:l.is_current!==null?!!l.is_current:!1,createdAt:l.created_at,updatedAt:l.updated_at,isDefaultVersion:l.is_default_version!==null?!!l.is_default_version:!1}));return x(a),a}async getEntitiesCountByTypes(){if(this.#t){const i=e`
2
2
  SELECT key, type, version,
3
3
  ROW_NUMBER() OVER (
4
4
  PARTITION BY key
5
- ORDER BY ${L("version")} DESC
5
+ ORDER BY ${B("version")} DESC
6
6
  ) as rn
7
7
  FROM (
8
8
  SELECT key, type, version FROM remote.entities WHERE is_current = 1 AND is_deleted = 0
9
9
  UNION ALL
10
10
  SELECT key, type, version FROM entities WHERE is_current = 1 AND is_deleted = 0
11
11
  )
12
- `;return this.#e.client.select({type:e`type`,count:v()}).from(e`(SELECT * FROM (${t}) WHERE rn = 1) as highest_version_entities`).groupBy(e`type`)}return this.#e.client.select({type:i.type,count:v()}).from(i).where(c(u(i.isCurrent,!0),u(i.isDeleted,!1))).groupBy(i.type)}async getEntityById(t){const n=(await(this.#t?f(this.#e.client.select(_).from(e`remote.entities`).where(e`id = ${t}`),this.#e.client.select(_).from(i).where(u(i.id,t))):this.#e.client.select(_).from(i).where(u(i.id,t))).run()).rows[0];return n?k(n):null}async getOutdatedEntities(t){const r=this.#t?f(this.#e.client.select(_).from(e`remote.entities`),this.#e.client.select(_).from(i).where(y(this.#e.client.select({id:_.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(_).from(i),s=this.#e.client.select(_).from(r.as("combined_entities")).$dynamic(),{whereCondition:n}=B(s,t),d=$(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`),l=n?c(n,d):d;return(await s.where(l).run()).rows.map(o=>k(o)).filter(o=>o!==null)}async getEntitiesRelations(t={}){const r=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(E).where(y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${E.sourceKey}`)))):this.#e.client.select(m).from(E),s=this.#e.client.select(m).from(r.as("combined_entities_relations")).$dynamic(),n=this.#e.client.select(m).from(r.as("combined_entities_relations")).$dynamic(),d=S(n,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(d),a=t.limit||10,o=S(s,{...t,limit:a+1}),[h,N]=await Promise.all([o.run(),l]),p=h.rows,w=p.length>a;return{items:p.slice(0,a).map(T=>C(T)).filter(T=>T!==null),hasMore:w,total:N}}async getEntityRelationById(t){const n=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(u(E.id,t)),this.#e.client.select(m).from(E).where(c(u(E.id,t),y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${E.id}`))))):this.#e.client.select(m).from(E).where(u(E.id,t))).run()).rows[0];return n?C(n):null}async getEntitiesWithRelations(t={},r){return this.#r.getEntitiesWithRelations(t,r)}async getEntityWithRelationsByKey(t,r,s){return this.#r.getEntityWithRelationsByKey(t,r,s)}async getRelationsForEntity(t,r,s){return this.#i.getRelationsForEntity(t,r,s)}async getRelatedEntities(t,r={}){return this.#i.getRelatedEntities(t,r)}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:r=[]}){if(!r.length)return{};try{return await this.#s(t),(r.includes("domains")||r.includes("owners"))&&await this.#n(),await this.#o(r)}catch(s){return console.error("Error fetching catalog filters:",s),{}}finally{await this.#l()}}async#s(t){if(this.#t?await this.#e.client.run(e`
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=>M(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?M(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(`
13
13
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
14
14
  SELECT
15
15
  e.key,
@@ -17,7 +17,8 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
17
17
  e.tags,
18
18
  e.metadata
19
19
  FROM remote.entities e
20
- WHERE e.is_current = 1
20
+ LEFT JOIN remote.entities_attributes ea ON ea.entity_key = e.key
21
+ WHERE ${a.join(" AND ")}
21
22
  UNION ALL
22
23
  SELECT
23
24
  e.key,
@@ -26,26 +27,28 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
26
27
  e.metadata
27
28
  FROM entities e
28
29
  LEFT JOIN remote.entities r ON r.key = e.key AND r.is_current = 1
29
- WHERE r.key IS NULL AND e.is_current = 1
30
- `):await this.#e.client.run(e`
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(`
31
33
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
32
34
  SELECT
33
- key,
34
- type,
35
- tags,
36
- metadata
37
- FROM entities
38
- WHERE is_current = 1
39
- `),t.length){const r=t.map(s=>`'${s.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
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(`
40
43
  CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
41
44
  SELECT * FROM temp_combined_entities
42
- WHERE type IN (${r})
45
+ WHERE type IN (${a})
43
46
  `))}else await this.#e.client.run(e`
44
47
  CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
45
48
  SELECT * FROM temp_combined_entities
46
49
  `);await this.#e.client.run(e`
47
50
  CREATE INDEX IF NOT EXISTS idx_temp_filtered_type ON temp_filtered_entities(type)
48
- `)}async#n(){this.#t?await this.#e.client.run(e`
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`
49
52
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
50
53
  SELECT
51
54
  source_key,
@@ -75,12 +78,12 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
75
78
  CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
76
79
  `),await this.#e.client.run(e`
77
80
  CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
78
- `)}async#o(t){const r={},s=[],n=t.filter(a=>a.startsWith("metadata."));t.includes("type")&&s.push(`
81
+ `)}async#a(i){const s={},r=[],n=i.filter(a=>a.startsWith("metadata."));i.includes("type")&&r.push(`
79
82
  SELECT 'type' as filter_name, type as value, COUNT(*) as count
80
83
  FROM temp_filtered_entities
81
84
  WHERE type IS NOT NULL
82
85
  GROUP BY type
83
- `),t.includes("tags")&&s.push(`
86
+ `),i.includes("tags")&&r.push(`
84
87
  SELECT 'tags' as filter_name, tag.value as value, COUNT(DISTINCT tfe.key) as count
85
88
  FROM temp_filtered_entities tfe,
86
89
  json_each(COALESCE(tfe.tags, json_array())) as tag
@@ -89,7 +92,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
89
92
  AND tag.value IS NOT NULL
90
93
  AND tag.value != ''
91
94
  GROUP BY tag.value
92
- `),t.includes("domains")&&s.push(`
95
+ `),i.includes("domains")&&r.push(`
93
96
  SELECT 'domains' as filter_name, tcr.source_key as value, COUNT(DISTINCT tfe.key) as count
94
97
  FROM temp_combined_relations tcr
95
98
  INNER JOIN temp_filtered_entities tfe ON tfe.key = tcr.target_key
@@ -97,7 +100,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
97
100
  WHERE tce.type = 'domain'
98
101
  AND tcr.source_to_target_relation = 'hasParts'
99
102
  GROUP BY tcr.source_key
100
- `),t.includes("owners")&&s.push(`
103
+ `),i.includes("owners")&&r.push(`
101
104
  SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
102
105
  FROM (
103
106
  SELECT
@@ -117,7 +120,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
117
120
  INNER JOIN temp_combined_entities tce ON tce.key = owner_key
118
121
  WHERE owner_key IS NOT NULL
119
122
  GROUP BY owner_key
120
- `);for(const a of n)await this.#a(a,r);if(s.length===0)return r;const d=s.join(" UNION ALL "),l=await this.#e.client.run(e.raw(d));if(l?.rows)for(const a of l.rows){const o=a.filter_name,h=a.value,N=Number(a.count)||0;r[o]||(r[o]=[]),h&&r[o].push({value:h,count:N})}return r}async#a(t,r){const s=t.substring(9),n=`$.${U(s)}`,d=await this.#e.client.run(e.raw(`
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(`
121
124
  SELECT json_extract(metadata, '${n}') as value, COUNT(*) as count
122
125
  FROM temp_filtered_entities
123
126
  WHERE metadata IS NOT NULL
@@ -125,4 +128,4 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
125
128
  AND json_extract(metadata, '${n}') IS NOT NULL
126
129
  AND json_extract(metadata, '${n}') != ''
127
130
  GROUP BY value
128
- `));d?.rows&&(r[t]=d.rows.map(l=>({value:l.value,count:Number(l.count)||0})).filter(l=>l.value))}async#l(){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(t){F.error("Error cleaning up temp tables:",t)}}}function U(O){return O.replace(/[^a-zA-Z0-9._-]/g,"")}export{te as CatalogEntitiesLocalReadRepository};
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};
@@ -6,6 +6,7 @@ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../
6
6
  import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
7
7
  import type { SidebarConnectedEntity } from '@redocly/theme/core/types';
8
8
  import type { EntityReadModelSchema } from '../../../../../plugins/catalog-entities/schemas/read-model-schemas.js';
9
+ import type { GetEntityByIdParams } from '../../../types/params.js';
9
10
  import { BaseRepository } from '../../../../../providers/database/base-repository.js';
10
11
  import { type CreateEntityParams, type CreateEntityResult } from './catalog-entities-local-write-repository.js';
11
12
  export declare class CatalogEntitiesLocalRepository extends BaseRepository {
@@ -15,47 +16,43 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
15
16
  getEntitySources(): Record<string, SidebarConnectedEntity>;
16
17
  static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
17
18
  attachDatabase(databasePath: string): Promise<void>;
18
- getEntities(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<EntityReadModelSchema>>;
19
- getEntityById(id: string): Promise<EntityReadModelSchema | null>;
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>;
20
26
  getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
21
27
  getEntitiesCountByTypes(): Promise<{
22
28
  type: string;
23
29
  count: number;
24
30
  }[]>;
25
- getEntitiesRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<{
26
- createdAt?: string | null | undefined;
27
- updatedAt?: string | null | undefined;
28
- sourceVersion?: string | null | undefined;
29
- sourceRevision?: string | null | undefined;
30
- targetVersion?: string | null | undefined;
31
- targetRevision?: string | null | undefined;
32
- type: string;
33
- id: string;
34
- organizationId: string;
35
- projectId: string;
36
- sourceKey: string;
37
- targetKey: string;
38
- }>>;
39
- getEntityRelationById(id: string): Promise<{
40
- createdAt?: string | null | undefined;
41
- updatedAt?: string | null | undefined;
42
- sourceVersion?: string | null | undefined;
43
- sourceRevision?: string | null | undefined;
44
- targetVersion?: string | null | undefined;
45
- targetRevision?: string | null | undefined;
46
- type: string;
47
- id: string;
48
- organizationId: string;
49
- projectId: string;
50
- sourceKey: string;
51
- targetKey: string;
52
- } | null>;
53
- getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
54
- getEntityWithRelationsByKey(entityKey: string, filter?: {
55
- revision?: string | null;
56
- version?: string | null;
57
- }, rbacTeams?: string[]): Promise<import("@redocly/theme").BffCatalogEntity | null>;
58
- getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
31
+ getEntitiesRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRelationReadModelSchema>>;
32
+ getEntityRelationById(id: string): Promise<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRelationReadModelSchema | null>;
33
+ getEntitiesWithRelations({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
34
+ paginationParams: PaginationParams;
35
+ rbacTeams?: string[];
36
+ excludedTypes?: string[];
37
+ excludedEntities?: string[];
38
+ }): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
39
+ getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
40
+ entityKey: string;
41
+ filter?: {
42
+ revision?: string | null;
43
+ version?: string | null;
44
+ };
45
+ rbacTeams?: string[];
46
+ excludedTypes?: string[];
47
+ excludedEntities?: string[];
48
+ }): Promise<import("@redocly/theme").BffCatalogEntity | null>;
49
+ getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
50
+ key: string;
51
+ paginationParams: PaginationParams;
52
+ rbacTeams?: string[];
53
+ excludedTypes?: string[];
54
+ excludedEntities?: string[];
55
+ }): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
59
56
  createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
60
57
  createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
61
58
  createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<{
@@ -66,14 +63,14 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
66
63
  projectId: string;
67
64
  sourceFile: string | null;
68
65
  isDeleted: boolean | null;
66
+ fileHash: string | null;
69
67
  sourceKey: string;
70
- targetKey: string;
71
68
  sourceVersion: string;
72
69
  sourceRevision: string;
70
+ sourceToTargetRelation: string;
71
+ targetKey: string;
73
72
  targetVersion: string;
74
73
  targetRevision: string;
75
- fileHash: string | null;
76
- sourceToTargetRelation: string;
77
74
  targetToSourceRelation: string;
78
75
  } | null>;
79
76
  createEntityRelations(relations: EntityRelationDtoSchema[]): Promise<void>;