@redocly/redoc 0.129.0-next.2 → 0.129.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.d.ts +1 -1
  4. package/dist/cli/develop.js +1 -1
  5. package/dist/cli/prepare/analytics/collectors/get-file-extensions-usage.js +1 -1
  6. package/dist/cli/prepare/analytics/collectors/get-frontmatter-usage.js +1 -1
  7. package/dist/cli/prepare/analytics/collectors/get-markdoc-usage.js +1 -1
  8. package/dist/cli/prepare/analytics/collectors/get-nested-configs-usage.js +1 -1
  9. package/dist/cli/prepare/analytics/collectors/get-refs-usage.js +1 -1
  10. package/dist/cli/prepare/index.d.ts +1 -1
  11. package/dist/cli/translations/collect-config-translations.js +1 -1
  12. package/dist/cli/translations/update-translations.js +1 -1
  13. package/dist/client/TestProvider.js +1 -1
  14. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  15. package/dist/client/app/Sidebar/Sidebar.js +7 -2
  16. package/dist/client/app/Sidebar/useSidebarItems.d.ts +1 -0
  17. package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
  18. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  19. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  20. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +10 -0
  21. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.js +1 -0
  22. package/dist/client/app/hooks/index.d.ts +1 -0
  23. package/dist/client/app/hooks/index.js +1 -1
  24. package/dist/client/app/hooks/useLoginUrl.js +1 -1
  25. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  26. package/dist/client/app/pages/Login/Login.js +1 -1
  27. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  28. package/dist/client/browser-entry.js +2 -2
  29. package/dist/client/providers/page-data/hooks.d.ts +2 -1
  30. package/dist/client/providers/page-data/hooks.js +1 -1
  31. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  32. package/dist/client/runtime/loader.js +1 -1
  33. package/dist/client/utils/catalog/inject-catalog-items.d.ts +1 -1
  34. package/dist/client/utils/catalog/inject-catalog-items.js +1 -1
  35. package/dist/constants/common.d.ts +0 -4
  36. package/dist/constants/common.js +1 -1
  37. package/dist/constants/l10n/langs/ar.js +1 -1
  38. package/dist/constants/l10n/langs/de.js +1 -1
  39. package/dist/constants/l10n/langs/en.js +1 -1
  40. package/dist/constants/l10n/langs/es.js +1 -1
  41. package/dist/constants/l10n/langs/fr.js +1 -1
  42. package/dist/constants/l10n/langs/hi.js +1 -1
  43. package/dist/constants/l10n/langs/it.js +1 -1
  44. package/dist/constants/l10n/langs/ja.js +1 -1
  45. package/dist/constants/l10n/langs/ko.js +1 -1
  46. package/dist/constants/l10n/langs/pl.js +1 -1
  47. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  48. package/dist/constants/l10n/langs/pt.js +1 -1
  49. package/dist/constants/l10n/langs/ru.js +1 -1
  50. package/dist/constants/l10n/langs/uk.js +1 -1
  51. package/dist/constants/l10n/langs/zh.js +1 -1
  52. package/dist/server/api-routes/execute-api-route.d.ts +0 -7
  53. package/dist/server/api-routes/execute-api-route.js +1 -1
  54. package/dist/server/api-routes/helpers/setup-logger.d.ts +2 -2
  55. package/dist/server/api-routes/helpers/setup-logger.js +1 -1
  56. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  57. package/dist/server/fs/cache.d.ts +1 -2
  58. package/dist/server/fs/cache.js +1 -1
  59. package/dist/server/fs/content-fs.d.ts +9 -4
  60. package/dist/server/fs/content-fs.js +1 -1
  61. package/dist/server/fs/fs.d.ts +6 -6
  62. package/dist/server/fs/fs.js +1 -3
  63. package/dist/server/fs/load-error.d.ts +2 -2
  64. package/dist/server/fs/load-error.js +1 -1
  65. package/dist/server/fs/utils/async-storage.d.ts +0 -8
  66. package/dist/server/fs/utils/async-storage.js +1 -1
  67. package/dist/server/fs/utils/isVirtualFile.d.ts +1 -1
  68. package/dist/server/fs/utils/isVirtualFile.js +1 -1
  69. package/dist/server/plugins/api-functions/index.js +1 -1
  70. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.d.ts +1 -1
  71. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.js +2 -2
  72. package/dist/server/plugins/arazzo-docs/index.d.ts +1 -1
  73. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  74. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.d.ts +1 -1
  75. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +2 -2
  76. package/dist/server/plugins/asyncapi-docs/index.d.ts +1 -1
  77. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  78. package/dist/server/plugins/asyncapi-docs/is-asyncapi-doc.js +1 -1
  79. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +23 -18
  80. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  81. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
  82. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.d.ts +9 -0
  83. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.js +1 -1
  84. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  85. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
  86. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  87. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.js +1 -1
  88. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.js +1 -1
  89. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +1 -1
  90. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.d.ts +12 -0
  91. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -0
  92. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +15 -4
  93. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +67 -55
  94. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +21 -15
  95. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  96. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +16 -3
  97. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  98. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +17 -0
  99. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -0
  100. package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +4 -4
  101. package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
  102. package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.d.ts → extract-file-content.d.ts} +1 -1
  103. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.d.ts +2 -2
  104. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  105. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
  106. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  107. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
  108. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  109. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
  110. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  111. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
  112. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  113. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  114. package/dist/server/plugins/catalog-entities/get-server-props.d.ts +1 -2
  115. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  116. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +64 -0
  117. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  118. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +6 -12
  119. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  120. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +4 -8
  121. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +1 -1
  122. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  123. package/dist/server/plugins/catalog-entities/utils/read-string.d.ts +7 -0
  124. package/dist/server/plugins/catalog-entities/utils/read-string.js +1 -0
  125. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  126. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  127. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  128. package/dist/server/plugins/config-parser/loaders/yaml-parser.js +1 -1
  129. package/dist/server/plugins/default-theme/resolve-products-config.js +1 -1
  130. package/dist/server/plugins/ensure-frontmatter-theme-compatibility.js +1 -1
  131. package/dist/server/plugins/entitlements/index.js +1 -1
  132. package/dist/server/plugins/graphql-docs/index.js +1 -1
  133. package/dist/server/plugins/l10n/index.js +1 -1
  134. package/dist/server/plugins/lifecycle.js +2 -2
  135. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.js +1 -1
  136. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.js +1 -1
  137. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.d.ts +1 -1
  138. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  139. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  140. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.js +1 -1
  141. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.js +1 -1
  142. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.js +1 -1
  143. package/dist/server/plugins/markdown/compiler.js +1 -1
  144. package/dist/server/plugins/markdown/get-server-props.js +1 -1
  145. package/dist/server/plugins/markdown/index.js +1 -1
  146. package/dist/server/plugins/markdown/markdoc/partials.js +1 -1
  147. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +1 -1
  148. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  149. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +1 -1
  150. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  151. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +7 -2
  152. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  153. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +7 -2
  154. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  155. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +7 -2
  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.d.ts +7 -2
  158. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  159. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -3
  160. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  161. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -2
  162. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  163. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +6 -0
  164. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  165. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  166. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  167. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  168. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  169. package/dist/server/plugins/mcp/index.js +1 -1
  170. package/dist/server/plugins/mcp/servers/docs-server.d.ts +10 -3
  171. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  172. package/dist/server/plugins/mcp/types.d.ts +26 -2
  173. package/dist/server/plugins/mcp/utils.d.ts +9 -8
  174. package/dist/server/plugins/mcp/utils.js +1 -1
  175. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +1 -1
  176. package/dist/server/plugins/nav-utils.js +1 -1
  177. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -2
  178. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  179. package/dist/server/plugins/openapi-docs/index.d.ts +2 -2
  180. package/dist/server/plugins/openapi-docs/index.js +1 -1
  181. package/dist/server/plugins/openapi-docs/is-openapi-doc.js +1 -1
  182. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -1
  183. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  184. package/dist/server/plugins/pages/index.js +1 -1
  185. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  186. package/dist/server/plugins/sidebars/index.js +3 -3
  187. package/dist/server/plugins/utils.js +1 -1
  188. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.d.ts +25 -46
  189. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  190. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +20 -3
  191. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
  192. package/dist/server/providers/database/pagination/combined-filters.d.ts +4 -1
  193. package/dist/server/providers/database/pagination/combined-filters.js +1 -1
  194. package/dist/server/providers/database/pagination/filter.d.ts +1 -0
  195. package/dist/server/providers/database/pagination/filter.js +1 -1
  196. package/dist/server/providers/database/pagination/index.d.ts +4 -1
  197. package/dist/server/store.js +1 -1
  198. package/dist/server/tools/notifiers/formatter.d.ts +2 -0
  199. package/dist/server/tools/notifiers/formatter.js +3 -3
  200. package/dist/server/tools/notifiers/logger.d.ts +18 -39
  201. package/dist/server/tools/notifiers/logger.js +2 -6
  202. package/dist/server/tools/notifiers/reporter.js +9 -9
  203. package/dist/server/tools/notifiers/terminal-manager.d.ts +8 -0
  204. package/dist/server/tools/notifiers/terminal-manager.js +5 -0
  205. package/dist/server/types/fs.d.ts +5 -10
  206. package/dist/server/types/plugins/api-routes.d.ts +0 -3
  207. package/dist/server/types/plugins/common.d.ts +0 -1
  208. package/dist/server/utils/is-valid-iso-date.d.ts +5 -0
  209. package/dist/server/utils/is-valid-iso-date.js +1 -0
  210. package/dist/server/utils/lifecycle-hooks.js +1 -1
  211. package/dist/server/utils/queue.js +1 -1
  212. package/dist/server/utils/redirects/find-redirect.d.ts +4 -2
  213. package/dist/server/utils/redirects/find-redirect.js +1 -1
  214. package/dist/server/utils/resolve-asset-path.js +1 -1
  215. package/dist/server/utils/validate-and-sanitize-string.d.ts +29 -0
  216. package/dist/server/utils/validate-and-sanitize-string.js +1 -0
  217. package/dist/server/web-server/auth.d.ts +5 -0
  218. package/dist/server/web-server/auth.js +3 -3
  219. package/dist/server/web-server/http.js +2 -2
  220. package/dist/server/web-server/middleware/loggerMiddleware.js +1 -1
  221. package/dist/server/web-server/routes/auth.js +1 -1
  222. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  223. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  224. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  225. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  226. package/dist/server/web-server/routes/search.js +1 -1
  227. package/dist/server/web-server/utils/get-redirect-login-url.js +1 -1
  228. package/dist/utils/auth/build-login-url.d.ts +1 -3
  229. package/dist/utils/auth/build-login-url.js +1 -1
  230. package/dist/utils/env/is-local-development.d.ts +13 -0
  231. package/dist/utils/env/is-local-development.js +1 -0
  232. package/dist/utils/env/is-production.d.ts +13 -0
  233. package/dist/utils/env/is-production.js +1 -0
  234. package/dist/utils/env/is-web-view.d.ts +14 -0
  235. package/dist/utils/env/is-web-view.js +1 -0
  236. package/dist/utils/path/remove-fragment.d.ts +16 -0
  237. package/dist/utils/path/remove-fragment.js +1 -0
  238. package/package.json +10 -10
  239. package/dist/server/web-server/routes/otel/types.d.ts +0 -61
  240. package/dist/server/web-server/routes/otel/types.js +0 -1
  241. /package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.js → extract-file-content.js} +0 -0
@@ -1,16 +1,4 @@
1
- import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"drizzle-orm";import{unionAll as w}from"drizzle-orm/sqlite-core";import{asc as G}from"drizzle-orm";import{logger as x}from"../../../../../tools/notifiers/logger.js";import{isObject as z}from"../../../../../../utils/guards/is-object.js";import{applyPagination as R}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Q,getFirstFilterFieldValue as V}from"../../../../../providers/database/pagination/filter.js";import{createBffRelatedEntity as Z}from"../../mappers/create-bff-related-entity.js";import{createBffEntity as P}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as o,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as _,createEntityFieldsForSelect as q,createEntityRelationFieldsForSelect as K,createQualifiedEntityFieldsForSelect as ee,createQualifiedEntityFieldsForSelectWithAliases as te}from"../utils.js";import{createEntityReadModel as j}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as J}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";class we{#e;#t=void 0;constructor(t){this.#e=t}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`))}async getEntities(t={}){const s=this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0)),n=this.#e.client.select(o).from(s.as("combined_entities")),l=this.#e.client.select(o).from(s.as("combined_entities")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=n.$dynamic(),m=t.limit||10,E=R(d,{...t,limit:m+1}),[N,h]=await Promise.all([E.run(),u]),T=N.rows,g=T.length>m;return{items:T.slice(0,m).map(k=>j(k)).filter(k=>k!==null),hasMore:g,total:h}}async listEntityRevisions(t,s){const n=[r(i.key,t),...s?[r(i.version,s)]:[]],l=this.#t?w(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(e`remote.entities`).where(c(e`key = ${t}`,s?e`version = ${s}`: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(...n,f(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${i.version}`,e`remote.revision = ${i.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(...n));return(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(l.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(u=>({version:u.version||null,revision:u.revision||null,isCurrent:u.is_current!==null?!!u.is_current:!1,createdAt:u.created_at||null,updatedAt:u.updated_at||null,isDefaultVersion:u.is_default_version!==null?!!u.is_default_version:!1}))}async getEntitiesCountByTypes(){return this.#e.client.select({type:i.type,count:Y()}).from(i).groupBy(i.type)}async getEntityByKey(t){const l=(await(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(c(r(i.key,t),r(e.raw("is_current"),1))),this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0)))).run()).rows[0];return l?j(l):null}async getOneOutdatedEntity(){const t=this.#t?w(this.#e.client.select(o).from(e`remote.entities`),this.#e.client.select(o).from(i).where(f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(o).from(i),n=(await this.#e.client.select(o).from(t.as("combined_entities")).where(L(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`)).orderBy(e`combined_entities.updated_at ASC`).limit(1).run()).rows[0];return n?j(n):null}async getEntitiesRelations(t={}){const s=this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a),n=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),l=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=t.limit||10,m=R(n,{...t,limit:d+1}),[E,N]=await Promise.all([m.run(),u]),h=E.rows,T=h.length>d;return{items:h.slice(0,d).map(g=>J(g)).filter(g=>g!==null),hasMore:T,total:N}}async getEntityRelationById(t){const l=(await(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`).where(r(a.id,t)),this.#e.client.select(_).from(a).where(c(r(a.id,t),f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${a.id}`))))):this.#e.client.select(_).from(a).where(r(a.id,t))).run()).rows[0];return l?J(l):null}async getEntitiesWithRelations(t={}){const n=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("e"),y=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),d=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),m=this.#e.client.with(n,y,d).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),E={...o,domains:m.domains,owners:m.owners},N=this.#e.client.with(m).select(E).from(m).$dynamic(),h=this.#e.client.with(m).select(E).from(m).$dynamic(),{whereCondition:T}=Q(N,t.filter);T&&N.where(T);const{whereCondition:g}=Q(h,t.filter);g&&h.where(g);try{const k=R(h,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),I=this.#e.client.$count(k),S=t.limit||10,$=R(N,{...t,limit:S+1}),[D,p]=await Promise.all([$.run(),I]),b=D.rows,F=b.length>S;return{items:b.slice(0,S).map(C=>P(C)).filter(C=>C!==null),hasMore:F,total:p}}catch(k){return x.error("Error getting entities with relations:",k),{items:[],hasMore:!1,total:0}}}#i(t){return z(t)?t.field==="version"||t.field==="revision":Array.isArray(t)?t.some(s=>this.#i(s)):!1}async getEntityWithRelationsByKey(t,s={}){const n=this.#i(s.filter),l=n?[]:[r(i.isCurrent,!0)],y=n?[e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`]:[e`remote.is_current = 1`],u=this.#e.client.select(o).from(e`remote.entities`),d=n?u.where(r(e.raw("key"),t)):u.where(c(r(e.raw("key"),t),r(e.raw("is_current"),1))),m=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),E=this.#e.client.select(o).from(i).where(c(r(i.key,t),...l,f(m))),N=this.#e.client.select(o).from(i),h=n?N.where(r(i.key,t)):N.where(c(r(i.key,t),r(i.isCurrent,!0))),g=(this.#t?w(d,E):h).as("e"),I=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),S=this.#e.client.select(o).from(e`remote.entities`),$=n?S:S.where(r(e.raw("is_current"),1)),D=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),p=this.#e.client.select(o).from(i),b=p.where(c(...l,f(D))),F=n?p:p.where(r(i.isCurrent,!0)),H=(this.#t?w($,b):F).as("combined_target_entities"),v=this.#e.client.with(g,I,H).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(g).as("entities_with_relations_by_key"),U={...o,domains:v.domains,owners:v.owners},A=this.#e.client.with(v).select(U).from(v).$dynamic();A.where(r(e.raw("key"),t));const{whereCondition:B}=Q(A,s.filter);B&&A.where(B),A.limit(1);const W=await A.run();if(W.rows.length===0)return null;const O=W.rows[0];return P(O)}async getRelatedEntities(t,s={}){const n=K("","relation_id"),l=V(s.filter,"version"),y=V(s.filter,"revision"),u=[L(r(a.sourceKey,t),r(a.targetKey,t))],d=typeof l=="string"?L(c(r(a.sourceKey,t),r(a.sourceVersion,l)),c(r(a.targetKey,t),r(a.targetVersion,l))):void 0,m=typeof y=="string"?L(c(r(a.sourceKey,t),r(a.sourceRevision,y)),c(r(a.targetKey,t),r(a.targetRevision,y))):void 0,E=[...u,d,m].filter(O=>O!==void 0),h=(this.#t?w(this.#e.client.select(n).from(e`remote.entities_relations`).where(c(...E)),this.#e.client.select(n).from(a).where(c(...E,f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(c(e`remote.source_key = ${a.sourceKey}`,e`remote.target_key = ${a.targetKey}`,e`remote.source_to_target_relation = ${a.sourceToTargetRelation}`)))))):this.#e.client.select(n).from(a).where(c(...E))).as("combined_relations"),T=q("","entity_id"),k=(this.#t?w(this.#e.client.select(T).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(T).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(T).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),I=te("combined_target_entities"),S=Object.values(ee("combined_target_entities")),$={...I,relation_type:e`
2
- CASE
3
- WHEN COUNT(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN 1 END) > 0
4
- THEN MIN(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN combined_relations.source_to_target_relation END)
5
- ELSE MIN(combined_relations.source_to_target_relation)
6
- END
7
- `.as("relation_type"),relation_role:e`
8
- CASE
9
- WHEN COUNT(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN 1 END) > 0
10
- THEN 'source'
11
- ELSE 'target'
12
- END
13
- `.as("relation_role")},D=this.#e.client.with(h,k).select($).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).orderBy(G(e.raw("relation_role"))).$dynamic(),p=this.#e.client.with(h,k).select(I).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).$dynamic(),b=R(p,{...s,limit:void 0,skip:void 0,after:void 0,before:void 0}),F=this.#e.client.$count(b),C=s.limit||10,H={...s,limit:C+1},v=R(D,H),[U,A]=await Promise.all([v.run(),F]),B=U.rows,W=B.length>C;return{items:B.slice(0,C).map(O=>Z(O)).filter(O=>O!==null),hasMore:W,total:A}}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#n(t),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#c(s)}catch(n){return console.error("Error fetching catalog filters:",n),{}}finally{await this.#l()}}async#n(t){if(this.#t?await this.#e.client.run(e`
1
+ import{and as o,count as V,desc as I,eq as r,isNotNull as Q,notExists as E,or as X,sql as e}from"drizzle-orm";import{unionAll as y}from"drizzle-orm/sqlite-core";import{logger as L}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as O}from"@redocly/theme/core/constants";import{applyPagination as T}from"../../../../../providers/database/pagination/index.js";import{applyFilter as b}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as F}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as a,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as d,createEntityFieldsForSelect as B}from"../utils.js";import{createEntityReadModel as g}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as H}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as h}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as W}from"./catalog-entities-relations-repository.js";class ne{#e;#t=void 0;#i;constructor(i){this.#e=i,this.#i=new W(this.#e,"")}async attachDatabase(i){this.#t!==i&&(this.#t=i,await this.#e.client.run(e`ATTACH DATABASE ${i} AS remote`),this.#i=new W(this.#e,i))}async getEntities(i={}){const s=this.#t?y(this.#e.client.select(a).from(e`remote.entities`),this.#e.client.select(a).from(t).where(E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(a).from(t),n=this.#e.client.select(a).from(s.as("combined_entities")),c=this.#e.client.select(a).from(s.as("combined_entities")).$dynamic(),m=T(c,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(m),u=n.$dynamic(),_=i.limit||10,f=T(u,{...i,limit:_+1}),[N,k]=await Promise.all([f.run(),l]),S=N.rows,v=S.length>_;return{items:S.slice(0,_).map(w=>g(w)).filter(w=>w!==null),hasMore:v,total:k}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?y(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${O})`.as("keyVersion")}).from(e`remote.entities`).where(o(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${O})`.as("keyVersion")}).from(t).where(o(r(t.sourceFile,i),r(t.source,"file"),e`${t.key} IS NOT NULL`,E(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}, ${O})`.as("keyVersion")}).from(t).where(o(r(t.sourceFile,i),r(t.source,"file"),Q(t.key))),n=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(n.rows.map(c=>c.keyVersion))}async listEntityRevisions(i,s){const n=[r(t.key,i),r(t.isDeleted,!1),...s?[r(t.version,s)]:[]],c=this.#t?y(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(e`remote.entities`).where(o(e`key = ${i}`,s?e`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(o(...n,E(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.version = ${t.version}`,e`remote.revision = ${t.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(o(...n));return(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(c.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(l=>({version:l.version||null,revision:l.revision??"",isCurrent:l.is_current!==null?!!l.is_current:!1,createdAt:l.created_at||null,updatedAt:l.updated_at||null,isDefaultVersion:l.is_default_version!==null?!!l.is_default_version:!1}))}async getEntitiesCountByTypes(){const i=this.#t?y(this.#e.client.select({type:e`type`}).from(e`remote.entities`).where(o(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1))),this.#e.client.select({type:t.type}).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1),E(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({type:t.type}).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1)));return this.#e.client.select({type:t.type,count:V()}).from(i.as("combined_entities")).groupBy(t.type).where(r(t.isDeleted,!1))}async getEntityByKey(i){const c=(await(this.#t?y(this.#e.client.select(a).from(e`remote.entities`).where(o(r(t.key,i),r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1))),this.#e.client.select(a).from(t).where(o(r(t.key,i),r(t.isCurrent,!0),r(t.isDeleted,!1),E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(a).from(t).where(o(r(t.key,i),r(t.isCurrent,!0),r(t.isDeleted,!1)))).run()).rows[0];return c?g(c):null}async getOneOutdatedEntity(){const i=this.#t?y(this.#e.client.select(a).from(e`remote.entities`),this.#e.client.select(a).from(t).where(E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(a).from(t),n=(await this.#e.client.select(a).from(i.as("combined_entities")).where(X(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`)).orderBy(e`combined_entities.updated_at ASC`).limit(1).run()).rows[0];return n?g(n):null}async getEntitiesRelations(i={}){const s=this.#t?y(this.#e.client.select(d).from(e`remote.entities_relations`),this.#e.client.select(d).from(h).where(E(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${h.sourceKey}`)))):this.#e.client.select(d).from(h),n=this.#e.client.select(d).from(s.as("combined_entities_relations")).$dynamic(),c=this.#e.client.select(d).from(s.as("combined_entities_relations")).$dynamic(),m=T(c,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(m),u=i.limit||10,_=T(n,{...i,limit:u+1}),[f,N]=await Promise.all([_.run(),l]),k=f.rows,S=k.length>u;return{items:k.slice(0,u).map(v=>H(v)).filter(v=>v!==null),hasMore:S,total:N}}async getEntityRelationById(i){const c=(await(this.#t?y(this.#e.client.select(d).from(e`remote.entities_relations`).where(r(h.id,i)),this.#e.client.select(d).from(h).where(o(r(h.id,i),E(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${h.id}`))))):this.#e.client.select(d).from(h).where(r(h.id,i))).run()).rows[0];return c?H(c):null}async getEntitiesWithRelations(i={}){const n=(this.#t?y(this.#e.client.select(a).from(e`remote.entities`).where(o(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1))),this.#e.client.select(a).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1),E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(a).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1)))).as("e"),m=(this.#t?y(this.#e.client.select(d).from(e`remote.entities_relations`),this.#e.client.select(d).from(h).where(E(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${h.sourceKey}`)))):this.#e.client.select(d).from(h)).as("combined_relations"),u=(this.#t?y(this.#e.client.select(a).from(e`remote.entities`).where(o(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1))),this.#e.client.select(a).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1),E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(a).from(t).where(o(r(t.isCurrent,!0),r(t.isDeleted,!1)))).as("combined_target_entities"),_=this.#e.client.with(n,m,u).select({...B("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),f={...a,domains:_.domains,owners:_.owners},N=this.#e.client.with(_).select(f).from(_).$dynamic(),k=this.#e.client.with(_).select(f).from(_).$dynamic(),{whereCondition:S}=b(N,i.filter);S&&N.where(S);const{whereCondition:v}=b(k,i.filter);v&&k.where(v);try{const w=T(k,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),p=this.#e.client.$count(w),R=i.limit||10,A=T(N,{...i,limit:R+1}),[M,U]=await Promise.all([A.run(),p]),D=M.rows,q=D.length>R;return{items:D.slice(0,R).map(C=>F(C)).filter(C=>C!==null),hasMore:q,total:U}}catch(w){return L.error("Error getting entities with relations:",w),{items:[],hasMore:!1,total:0}}}async#n(i,s){if(s){const l=await(this.#t?y(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(o(e`key = ${i}`,e`version = ${s}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(o(r(t.key,i),r(t.version,s),E(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.version = ${s}`))))).orderBy(I(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(o(r(t.key,i),r(t.version,s))).orderBy(I(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}const c=await(this.#t?y(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(o(e`key = ${i}`,e`is_current = 1`)),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(o(r(t.key,i),r(t.isCurrent,!0),E(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(o(r(t.key,i),r(t.isCurrent,!0)))).limit(1).run();if(c.rows.length>0){const m=c.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}async getEntityWithRelationsByKey(i,s){const n=s?.revision,c=s?.version,m=n?null:await this.#n(i,c||null),l=c??m?.version,u=n||m?.revision||null,f=(this.#t?y(this.#e.client.select(a).from(e`remote.entities`).where(r(t.key,i)),this.#e.client.select(a).from(t).where(o(r(t.key,i),E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`))))):this.#e.client.select(a).from(t).where(r(t.key,i))).as("e"),k=(this.#t?y(this.#e.client.select(d).from(e`remote.entities_relations`),this.#e.client.select(d).from(h).where(E(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${h.sourceKey}`)))):this.#e.client.select(d).from(h)).as("combined_relations"),v=(this.#t?y(this.#e.client.select(a).from(e`remote.entities`),this.#e.client.select(a).from(t).where(E(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(a).from(t)).as("combined_target_entities"),w=this.#e.client.with(f,k,v).select({...B("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(f).$dynamic();u?w.where(o(r(e.raw("revision"),u),l?r(e.raw("version"),l):void 0)):w.where(r(e.raw("is_current"),1)),w.limit(1);const p=await w.run();if(p.rows.length===0)return null;const R=p.rows[0];return F(R)}async getRelationsForEntity(i,s,n){return this.#i.getRelationsForEntity(i,s,n)}async getRelatedEntities(i,s={}){return this.#i.getRelatedEntities(i,s)}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#o(i),(s.includes("domains")||s.includes("owners"))&&await this.#a(),await this.#c(s)}catch(n){return console.error("Error fetching catalog filters:",n),{}}finally{await this.#u()}}async#o(i){if(this.#t?await this.#e.client.run(e`
14
2
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
15
3
  SELECT
16
4
  e.key,
@@ -37,7 +25,7 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
37
25
  metadata
38
26
  FROM entities
39
27
  WHERE is_current = 1
40
- `),t.length){const s=t.map(n=>`'${n.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
28
+ `),i.length){const s=i.map(n=>`'${n.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
41
29
  CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
42
30
  SELECT * FROM temp_combined_entities
43
31
  WHERE type IN (${s})
@@ -46,7 +34,7 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
46
34
  SELECT * FROM temp_combined_entities
47
35
  `);await this.#e.client.run(e`
48
36
  CREATE INDEX IF NOT EXISTS idx_temp_filtered_type ON temp_filtered_entities(type)
49
- `)}async#o(){this.#t?await this.#e.client.run(e`
37
+ `)}async#a(){this.#t?await this.#e.client.run(e`
50
38
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
51
39
  SELECT
52
40
  source_key,
@@ -74,12 +62,12 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
74
62
  CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
75
63
  `),await this.#e.client.run(e`
76
64
  CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
77
- `)}async#c(t){const s={},n=[],l=t.filter(d=>d.startsWith("metadata."));t.includes("type")&&n.push(`
65
+ `)}async#c(i){const s={},n=[],c=i.filter(u=>u.startsWith("metadata."));i.includes("type")&&n.push(`
78
66
  SELECT 'type' as filter_name, type as value, COUNT(*) as count
79
67
  FROM temp_filtered_entities
80
68
  WHERE type IS NOT NULL
81
69
  GROUP BY type
82
- `),t.includes("tags")&&n.push(`
70
+ `),i.includes("tags")&&n.push(`
83
71
  SELECT 'tags' as filter_name, tag.value as value, COUNT(DISTINCT tfe.key) as count
84
72
  FROM temp_filtered_entities tfe,
85
73
  json_each(COALESCE(tfe.tags, json_array())) as tag
@@ -88,7 +76,7 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
88
76
  AND tag.value IS NOT NULL
89
77
  AND tag.value != ''
90
78
  GROUP BY tag.value
91
- `),t.includes("domains")&&n.push(`
79
+ `),i.includes("domains")&&n.push(`
92
80
  SELECT 'domains' as filter_name, tce.key as value, COUNT(DISTINCT tfe.key) as count
93
81
  FROM temp_combined_relations tcr
94
82
  INNER JOIN temp_filtered_entities tfe ON (
@@ -101,7 +89,7 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
101
89
  )
102
90
  WHERE tce.type = 'domain'
103
91
  GROUP BY tce.key
104
- `),t.includes("owners")&&n.push(`
92
+ `),i.includes("owners")&&n.push(`
105
93
  SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
106
94
  FROM (
107
95
  SELECT
@@ -121,15 +109,15 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
121
109
  INNER JOIN temp_combined_entities tce ON tce.key = owner_key
122
110
  WHERE owner_key IS NOT NULL
123
111
  GROUP BY owner_key
124
- `);for(const d of l)await this.#a(d,s);if(n.length===0)return s;const y=n.join(" UNION ALL "),u=await this.#e.client.run(e.raw(y));if(u?.rows)for(const d of u.rows){const m=d.filter_name,E=d.value,N=Number(d.count)||0;s[m]||(s[m]=[]),E&&s[m].push({value:E,count:N})}return s}async#a(t,s){const n=t.substring(9),l=`$.${ie(n)}`,y=await this.#e.client.run(e.raw(`
125
- SELECT json_extract(metadata, '${l}') as value, COUNT(*) as count
112
+ `);for(const u of c)await this.#l(u,s);if(n.length===0)return s;const m=n.join(" UNION ALL "),l=await this.#e.client.run(e.raw(m));if(l?.rows)for(const u of l.rows){const _=u.filter_name,f=u.value,N=Number(u.count)||0;s[_]||(s[_]=[]),f&&s[_].push({value:f,count:N})}return s}async#l(i,s){const n=i.substring(9),c=`$.${j(n)}`,m=await this.#e.client.run(e.raw(`
113
+ SELECT json_extract(metadata, '${c}') as value, COUNT(*) as count
126
114
  FROM temp_filtered_entities
127
115
  WHERE metadata IS NOT NULL
128
116
  AND metadata != ''
129
- AND json_extract(metadata, '${l}') IS NOT NULL
130
- AND json_extract(metadata, '${l}') != ''
117
+ AND json_extract(metadata, '${c}') IS NOT NULL
118
+ AND json_extract(metadata, '${c}') != ''
131
119
  GROUP BY value
132
- `));y?.rows&&(s[t]=y.rows.map(u=>({value:u.value,count:Number(u.count)||0})).filter(u=>u.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){x.error("Error cleaning up temp tables:",t)}}#r(t){return e`
120
+ `));m?.rows&&(s[i]=m.rows.map(l=>({value:l.value,count:Number(l.count)||0})).filter(l=>l.value))}async#u(){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){L.error("Error cleaning up temp tables:",i)}}#r(i){return e`
133
121
  COALESCE(
134
122
  (
135
123
  SELECT json_group_array(
@@ -147,27 +135,39 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
147
135
  )
148
136
  FROM (
149
137
  SELECT DISTINCT d.*
150
- FROM entities_relations er
151
- JOIN entities d ON d.key = CASE
152
- WHEN er.source_key = ${e.raw(`${t}.key`)} THEN er.target_key
153
- WHEN er.target_key = ${e.raw(`${t}.key`)} THEN er.source_key
138
+ FROM combined_relations er
139
+ JOIN combined_target_entities d ON d.key = CASE
140
+ WHEN er.source_key = ${e.raw(`${i}.key`)} THEN er.target_key
141
+ WHEN er.target_key = ${e.raw(`${i}.key`)} THEN er.source_key
154
142
  END
155
143
  WHERE d.type = 'domain'
156
144
  AND d.is_current = 1
157
145
  AND (
158
146
  (
159
- er.source_key = ${e.raw(`${t}.key`)}
160
- AND (
161
- er.source_version = ${e.raw(`${t}.version`)}
162
- OR (er.source_version IS NULL AND ${e.raw(`${t}.version`)} IS NULL)
163
- )
147
+ er.source_key = ${e.raw(`${i}.key`)}
148
+ AND CASE
149
+ WHEN ${e.raw(`${i}.version`)} = ''
150
+ THEN er.source_version = ''
151
+ ELSE (er.source_version = ${e.raw(`${i}.version`)} OR er.source_version = '')
152
+ END
153
+ AND CASE
154
+ WHEN ${e.raw(`${i}.revision`)} = ''
155
+ THEN 1 = 1
156
+ ELSE (er.source_revision <= ${e.raw(`${i}.revision`)} OR er.source_revision = '')
157
+ END
164
158
  )
165
159
  OR (
166
- er.target_key = ${e.raw(`${t}.key`)}
167
- AND (
168
- er.target_version = ${e.raw(`${t}.version`)}
169
- OR (er.target_version IS NULL AND ${e.raw(`${t}.version`)} IS NULL)
170
- )
160
+ er.target_key = ${e.raw(`${i}.key`)}
161
+ AND CASE
162
+ WHEN ${e.raw(`${i}.version`)} = ''
163
+ THEN er.target_version = ''
164
+ ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
165
+ END
166
+ AND CASE
167
+ WHEN ${e.raw(`${i}.revision`)} = ''
168
+ THEN 1 = 1
169
+ ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
170
+ END
171
171
  )
172
172
  )
173
173
  LIMIT 10
@@ -175,7 +175,7 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
175
175
  ),
176
176
  json_array()
177
177
  )
178
- `}#s(t){return e`
178
+ `}#s(i){return e`
179
179
  COALESCE(
180
180
  (
181
181
  SELECT json_group_array(
@@ -193,29 +193,41 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
193
193
  )
194
194
  FROM (
195
195
  SELECT DISTINCT o.*
196
- FROM entities_relations er
197
- JOIN entities o
196
+ FROM combined_relations er
197
+ JOIN combined_target_entities o
198
198
  ON o.key = CASE
199
- WHEN er.source_key = ${e.raw(`${t}.key`)} THEN er.target_key
199
+ WHEN er.source_key = ${e.raw(`${i}.key`)} THEN er.target_key
200
200
  ELSE er.source_key
201
201
  END
202
- WHERE ((er.source_key = ${e.raw(`${t}.key`)} AND er.source_to_target_relation = 'ownedBy')
203
- OR (er.target_key = ${e.raw(`${t}.key`)} AND er.source_to_target_relation = 'owns'))
202
+ WHERE ((er.source_key = ${e.raw(`${i}.key`)} AND er.source_to_target_relation = 'ownedBy')
203
+ OR (er.target_key = ${e.raw(`${i}.key`)} AND er.source_to_target_relation = 'owns'))
204
204
  AND o.is_current = 1
205
205
  AND (
206
206
  (
207
- er.source_key = ${e.raw(`${t}.key`)}
208
- AND (
209
- er.source_version = ${e.raw(`${t}.version`)}
210
- OR (er.source_version IS NULL AND ${e.raw(`${t}.version`)} IS NULL)
211
- )
207
+ er.source_key = ${e.raw(`${i}.key`)}
208
+ AND CASE
209
+ WHEN ${e.raw(`${i}.version`)} = ''
210
+ THEN er.source_version = ''
211
+ ELSE (er.source_version = ${e.raw(`${i}.version`)} OR er.source_version = '')
212
+ END
213
+ AND CASE
214
+ WHEN ${e.raw(`${i}.revision`)} = ''
215
+ THEN 1 = 1
216
+ ELSE (er.source_revision <= ${e.raw(`${i}.revision`)} OR er.source_revision = '')
217
+ END
212
218
  )
213
219
  OR (
214
- er.target_key = ${e.raw(`${t}.key`)}
215
- AND (
216
- er.target_version = ${e.raw(`${t}.version`)}
217
- OR (er.target_version IS NULL AND ${e.raw(`${t}.version`)} IS NULL)
218
- )
220
+ er.target_key = ${e.raw(`${i}.key`)}
221
+ AND CASE
222
+ WHEN ${e.raw(`${i}.version`)} = ''
223
+ THEN er.target_version = ''
224
+ ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
225
+ END
226
+ AND CASE
227
+ WHEN ${e.raw(`${i}.revision`)} = ''
228
+ THEN 1 = 1
229
+ ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
230
+ END
219
231
  )
220
232
  )
221
233
  LIMIT 10
@@ -223,4 +235,4 @@ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"
223
235
  ),
224
236
  json_array()
225
237
  )
226
- `}}function ie(X){return X.replace(/[^a-zA-Z0-9._-]/g,"")}export{we as CatalogEntitiesLocalReadRepository};
238
+ `}}function j($){return $.replace(/[^a-zA-Z0-9._-]/g,"")}export{ne as CatalogEntitiesLocalReadRepository};
@@ -4,17 +4,19 @@ import type { EntityRelationDtoSchema } from '../../../../../plugins/catalog-ent
4
4
  import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
5
5
  import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
6
6
  import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
7
+ import type { SidebarConnectedEntity } from '@redocly/theme/core/types';
7
8
  import { BaseRepository } from '../../../../../providers/database/base-repository.js';
8
- import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
9
+ import { type CreateEntityParams, type CreateEntityResult } from './catalog-entities-local-write-repository.js';
9
10
  export declare class CatalogEntitiesLocalRepository extends BaseRepository {
10
11
  #private;
11
12
  constructor(dbConnection: DatabaseConnection);
12
13
  get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
13
- getEntitySources(): Record<string, string>;
14
+ getEntitySources(): Record<string, SidebarConnectedEntity>;
14
15
  static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
15
16
  attachDatabase(databasePath: string): Promise<void>;
16
17
  getEntities(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema>>;
17
18
  getEntityByKey(key: string): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
19
+ getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
18
20
  getEntitiesCountByTypes(): Promise<{
19
21
  type: string;
20
22
  count: number;
@@ -32,8 +34,6 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
32
34
  projectId: string;
33
35
  sourceKey: string;
34
36
  targetKey: string;
35
- sourceId: string;
36
- targetId: string;
37
37
  }>>;
38
38
  getEntityRelationById(id: string): Promise<{
39
39
  createdAt?: string | null | undefined;
@@ -48,40 +48,46 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
48
48
  projectId: string;
49
49
  sourceKey: string;
50
50
  targetKey: string;
51
- sourceId: string;
52
- targetId: string;
53
51
  } | null>;
54
52
  getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
55
- getEntityWithRelationsByKey(entityKey: string, paginationParams?: PaginationParams): Promise<import("@redocly/theme").BffCatalogEntity | null>;
53
+ getEntityWithRelationsByKey(entityKey: string, filter?: {
54
+ revision?: string | null;
55
+ version?: string | null;
56
+ }): Promise<import("@redocly/theme").BffCatalogEntity | null>;
56
57
  getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
57
- createEntity(createEntityParams: CreateEntityParams): Promise<void>;
58
+ createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
58
59
  createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
59
60
  createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<{
60
61
  id: string;
61
62
  organizationId: string;
62
63
  projectId: string;
63
64
  sourceFile: string | null;
65
+ isDeleted: boolean | null;
64
66
  createdAt: string;
65
67
  updatedAt: string;
66
68
  sourceKey: string;
67
69
  targetKey: string;
68
- sourceId: string | null;
69
- targetId: string | null;
70
- sourceVersion: string | null;
71
- sourceRevision: string | null;
72
- targetVersion: string | null;
73
- targetRevision: string | null;
70
+ sourceVersion: string;
71
+ sourceRevision: string;
72
+ targetVersion: string;
73
+ targetRevision: string;
74
74
  fileHash: string | null;
75
75
  sourceToTargetRelation: string;
76
76
  targetToSourceRelation: string;
77
77
  } | null>;
78
78
  createEntityRelations(relations: EntityRelationDtoSchema[]): Promise<void>;
79
79
  deleteEntity(entityKey: string): Promise<string | null>;
80
+ softDeleteEntities({ filter, revision, fileHash, }: {
81
+ filter: Filter;
82
+ revision: string;
83
+ fileHash: string;
84
+ }): Promise<void>;
85
+ softDeleteEntitiesRelations(entities: CreateEntityResult[], revision: string): Promise<boolean>;
80
86
  deleteEntities(filter: Filter): Promise<boolean>;
81
87
  deleteEntityRelation(id: string): Promise<string | null>;
82
88
  deleteEntityRelations(filter: Filter): Promise<boolean>;
83
89
  getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
84
- listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema, "version" | "isDefaultVersion" | "revision" | "isCurrent" | "createdAt" | "updatedAt">[]>;
90
+ listEntityRevisions(entityKey: string, version?: string | null): Promise<import("../../../schemas/read-model-schemas.js").EntityRevisionSummary[]>;
85
91
  updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
86
92
  updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
87
93
  getOneOutdatedEntity(): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
@@ -1 +1 @@
1
- import{promiseMapLimit as a}from"../../../../../utils/async/promise-map-limit.js";import{DatabaseConnectionFactory as r}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as o}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as c}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as y}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as l}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as h}from"../../../utils/has-options-changed.js";const s=50;class i extends o{static#i;static#n;#t;#e;#a={};constructor(t){super(t),this.#t=new c(this.databaseClient),this.#e=new y(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#a}static async getInstance(t){const e=h(i.#n,t);if(!i.#i||e){const n=await r.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");i.#i=new i(n),i.#n=t}return i.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#a[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await a(t,s,async e=>this.createEntity(e))}createEntityRelation(t){const e=l(t,this.organizationId,this.projectId);return this.#e.createEntityRelation(e)}async createEntityRelations(t){await a(t,s,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{i as CatalogEntitiesLocalRepository};
1
+ import{promiseMapLimit as o}from"../../../../../utils/async/promise-map-limit.js";import{logger as R}from"../../../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as f}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as p}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as m}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as w}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as E}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as C}from"../../../utils/has-options-changed.js";const l=50;class s extends p{static#i;static#n;#t;#e;#s={};constructor(t){super(t),this.#t=new m(this.databaseClient),this.#e=new w(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#s}static async getInstance(t){const e=C(s.#n,t);if(!s.#i||e){const n=await f.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");s.#i=new s(n),s.#n=t}return s.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntityKeysAndVersionsBySourceFile(t){return this.#t.getEntityKeysAndVersionsBySourceFile(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#s[t.sourceFile]={key:t.entity.key,version:t.entity.version??void 0}),this.#e.createEntity(t)}async createEntities(t){await o(t,l,async e=>this.createEntity(e))}createEntityRelation(t){const e=E(t,this.organizationId,this.projectId);return this.#e.upsertEntityRelation(e)}async createEntityRelations(t){await o(t,l,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}async softDeleteEntities({filter:t,revision:e,fileHash:n}){const c=await this.getEntities({filter:t}),i=await this.#e.softDeleteEntities(c.items,e,n);await this.softDeleteEntitiesRelations(i,e)}async softDeleteEntitiesRelations(t,e){try{const n=t.filter(i=>i.result==="created");if(n.length===0)return!0;const c=await o(n,l,async i=>(await this.#t.getRelationsForEntity(i.entityKey,i.entityVersion,e)).map(r=>{if(!r)return null;const y=r.direction,a=r.sourceToTargetRelation,u=r.targetKey,d=y==="outgoing"?i.entityKey:u,h=y==="outgoing"?u:i.entityKey,g=y==="outgoing"?a:a.startsWith("reverse:")?a.slice(8):a;return!g||!d||!h?null:E({type:g,sourceKey:d,targetKey:h,sourceVersion:i.entityVersion,targetVersion:i.entityVersion,sourceRevision:e,targetRevision:e,isDeleted:!0},this.organizationId,this.projectId)}).filter(r=>r!==null));return await o(c.flat(),l,async i=>this.#e.upsertEntityRelation(i)),!0}catch(n){return R.error("Error soft deleting entity relations",n),!1}}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{s as CatalogEntitiesLocalRepository};
@@ -1,18 +1,30 @@
1
1
  import type { EntityBaseFileSchema } from '@redocly/config';
2
2
  import type { DatabaseClient } from '../../../../../providers/database/client.js';
3
3
  import type { Filter } from '../../../../../providers/database/pagination/types.js';
4
- import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
4
+ import type { EntityReadModelSchema } from '../../../schemas/read-model-schemas.js';
5
+ import type { ScorecardsStatus } from '../../../entities/types.js';
5
6
  import { type DatabaseEntityRelation, type DatabaseEntityRelationDto } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
6
7
  export type CreateEntityParams = {
7
8
  entity: EntityBaseFileSchema;
8
9
  fileHash: string;
9
10
  sourceFile: string;
10
11
  isRootEntity?: boolean;
12
+ revision?: string;
13
+ isDeleted?: boolean;
14
+ };
15
+ export type CreateEntityResult = {
16
+ result: 'created';
17
+ entityKey: string;
18
+ entityRevision: string;
19
+ entityVersion: string | null;
20
+ } | {
21
+ result: 'skipped' | 'error';
22
+ entityKey: string;
11
23
  };
12
24
  export declare class CatalogEntitiesLocalWriteRepository {
13
25
  #private;
14
26
  constructor(db: DatabaseClient, organizationId: string, projectId: string);
15
- createEntity({ entity, fileHash, sourceFile }: CreateEntityParams): Promise<void>;
27
+ createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, }: CreateEntityParams): Promise<CreateEntityResult>;
16
28
  deleteEntity(entityKey: string): Promise<string | null>;
17
29
  /**
18
30
  * Deletes entities based on a filter.
@@ -20,8 +32,9 @@ export declare class CatalogEntitiesLocalWriteRepository {
20
32
  */
21
33
  deleteEntities(filter: Filter): Promise<boolean>;
22
34
  deleteEntityRelation(id: string): Promise<string | null>;
35
+ softDeleteEntities(entities: EntityReadModelSchema[], revision: string, fileHash: string): Promise<CreateEntityResult[]>;
23
36
  deleteEntityRelations(filter: Filter): Promise<boolean>;
24
- createEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
37
+ upsertEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
25
38
  updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
26
39
  updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
27
40
  }
@@ -1 +1 @@
1
- import{and as h,desc as I,eq as a,isNull as g,or as V,sql as v}from"drizzle-orm";import{logger as l}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as D}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as K}from"../../../../../utils/crypto/sha1.js";import{createEntityDbRecord as N}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as B}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as s}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as C}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as T}from"../../../utils/version-compare.js";const E=15;class q{#e;#t;#r;constructor(t,r,i){this.#e=t,this.#t=r,this.#r=i}async createEntity({entity:t,fileHash:r,sourceFile:i}){try{const{relations:o=[],...n}=t,u=K(JSON.stringify(n));if(await this.#i(u))return;const c=t.version??null,{shouldBeCurrent:f,shouldBeDefaultVersion:m}=await this.#o(t.key,c),w=new Date().toISOString(),p=N({entity:{...t,revision:w,hash:u,isCurrent:f,isDefaultVersion:m},sourceFile:i,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:A,source:O,...R}=p;await this.#a({key:A,isCurrent:f,isDefaultVersion:m});const S=this.#e.client.insert(e).values(p).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:R}),k=o?.length&&o.length>0?this.#e.client.insert(s).values(o.map(y=>B({relation:y,sourceFile:i,fileHash:r,sourceKey:t.key,sourceVersion:c,sourceRevision:w,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision]}).run():Promise.resolve();await D([S,k],E,async y=>y)}catch(o){console.error(o),l.error("Error adding entity",o)}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(a(e.key,t)),t}catch(r){return l.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=C(t);if(!r)return!1;const i=await this.#e.client.delete(e).where(r).returning({key:e.key,source:e.source,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion,version:e.version});if(i.length===0)return!0;const o=i.reduce((n,u)=>((u.isCurrent||u.isDefaultVersion)&&n.add(u.key),n),new Set);if(o.size===0)return!0;await D(Array.from(o),E,async n=>this.#u(n));for(const n of i)await this.#e.client.delete(s).where(V(h(a(s.sourceKey,n.key),...n.version?[a(s.sourceVersion,n.version)]:[g(s.sourceVersion)]),h(a(s.targetKey,n.key),...n.version?[a(s.targetVersion,n.version)]:[g(s.targetVersion)])));return!0}catch(r){return l.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(s).where(a(s.id,t)),t}catch{return null}}async deleteEntityRelations(t){try{const r=C(t);return r?(await this.#e.client.delete(s).where(r),!0):!1}catch(r){return l.error("Error deleting entity relations",r),!1}}async createEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:i,sourceVersion:o,targetVersion:n,sourceRevision:u,targetRevision:d,...c}=t,f=await this.#e.client.insert(s).values(t).onConflictDoUpdate({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision],set:c}).returning();return f?.length?f[0]:null}catch(r){return l.error("Error creating entity relation",r),null}}async#i(t){const r=await this.#e.client.select({id:e.id,revision:e.revision}).from(e).where(h(a(e.hash,t),a(e.isCurrent,!0))).limit(1).run();return r.rows.length===0?null:{id:r.rows[0].id,revision:r.rows[0].revision}}async#n(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(h(a(e.key,t),a(e.source,"file"))).orderBy(I(e.createdAt)).run()).rows.map(i=>({version:i.version,isDefaultVersion:!!i.isDefaultVersion,revision:i.revision,createdAt:new Date(i.createdAt)}))}#s(t){const r=t.find(n=>n.isDefaultVersion);if(r)return r;const i=t.filter(n=>n.version!==null),o=t.filter(n=>n.version===null);if(i.length>0){i.sort((d,c)=>T(d.version,c.version));const n=i[0].version,u=i.filter(d=>d.version===n);return u.sort((d,c)=>c.createdAt.getTime()-d.createdAt.getTime()),u[0]}return o.length>0?(o.sort((n,u)=>u.createdAt.getTime()-n.createdAt.getTime()),o[0]):null}async#o(t,r){const i=await this.#e.client.select({currentDefaultVersion:v`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:v`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(h(a(e.key,t),a(e.source,"file"))).get(),o=i?.currentDefaultVersion,n=(i?.versionMatchCount??0)>0;return r&&r===o?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!n,shouldBeDefaultVersion:!n}}async#a({key:t,isCurrent:r,isDefaultVersion:i}){if(!r&&!i)return;const o={},n=[];r&&(o.isCurrent=!1,n.push(a(e.isCurrent,!0))),i&&(o.isDefaultVersion=!1,n.push(a(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(o).where(h(a(e.key,t),a(e.source,"file"),V(...n))).run()}#u=async t=>{const r=await this.#n(t),i=this.#s(r);if(!i){l.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(h(a(e.key,t),a(e.revision,i.revision),i.version?a(e.version,i.version):g(e.version))).run()};async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(a(e.id,t)).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status",i),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(v`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status if calculating",i),!1}}}export{q as CatalogEntitiesLocalWriteRepository};
1
+ import{and as d,desc as k,eq as u,isNull as v,or as R,sql as D}from"drizzle-orm";import{logger as h}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as p}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as T}from"../../../../../utils/crypto/sha1.js";import{isWebView as O}from"../../../../../../utils/env/is-web-view.js";import{VERSION_NOT_SPECIFIED as S}from"@redocly/theme/core/constants";import{createEntityDbRecord as x}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as I}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{entitiesTable as e}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{convertFilterToWhereCondition as K}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as L}from"../../../utils/version-compare.js";const w=15;class Q{#e;#t;#r;constructor(t,r,s){this.#e=t,this.#t=r,this.#r=s}async createEntity({entity:t,fileHash:r,sourceFile:s,revision:a=new Date().toISOString(),isRootEntity:i=!1,isDeleted:n=!1}){try{const{relations:c=[],...l}=t,y=T(JSON.stringify(l)),f=t.version??S;if(await this.#s(t.key,f,y,i,n))return{result:"skipped",entityKey:t.key};const{shouldBeCurrent:g,shouldBeDefaultVersion:m}=await this.#o(t.key,f),E=x({entity:{...t,revision:a,hash:y,isCurrent:g,isDefaultVersion:m,isDeleted:n,version:f},sourceFile:s,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:A,source:$,...F}=E;if(await this.#a({key:A,isCurrent:g,isDefaultVersion:m}),O())return await this.#c(E,c),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f};const N=this.#e.client.insert(e).values(E).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:F}),B=c?.length&&c.length>0?this.#e.client.insert(o).values(c.map(V=>I({relation:V,sourceFile:s,fileHash:r,sourceKey:t.key,sourceVersion:f,sourceRevision:a??null,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision]}).run():Promise.resolve();return await p([N,B],w,async V=>V),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f}}catch(c){return console.error(c),h.error("Error adding entity",c),{result:"error",entityKey:t.key}}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(u(e.key,t)),t}catch(r){return h.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=K(t);if(!r)return!1;const s=await this.#e.client.delete(e).where(r).returning({key:e.key,source:e.source,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion,version:e.version});if(s.length===0)return!0;const a=s.reduce((i,n)=>((n.isCurrent||n.isDefaultVersion)&&i.add(n.key),i),new Set);if(a.size===0)return!0;await p(Array.from(a),w,async i=>this.#u(i));for(const i of s)await this.#e.client.delete(o).where(R(d(u(o.sourceKey,i.key),...i.version?[u(o.sourceVersion,i.version)]:[v(o.sourceVersion)]),d(u(o.targetKey,i.key),...i.version?[u(o.targetVersion,i.version)]:[v(o.targetVersion)])));return!0}catch(r){return h.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(o).where(u(o.id,t)),t}catch{return null}}async softDeleteEntities(t,r,s){try{const a=t.map(n=>{const c={type:n.type,key:n.key,title:n.title,summary:n.summary??void 0,tags:n.tags??void 0,metadata:n.metadata??void 0,git:n.git??void 0,contact:n.contact??void 0,links:n.links??void 0,version:n.version??void 0};return this.createEntity({entity:c,revision:r,sourceFile:n.sourceFile??"",fileHash:s,isDeleted:!0})});return await p(a,w,async n=>n)}catch(a){return h.error("Error soft deleting entities",a),[]}}async deleteEntityRelations(t){try{const r=K(t);return r?(await this.#e.client.delete(o).where(r),!0):!1}catch(r){return h.error("Error deleting entity relations",r),!1}}async upsertEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:s,sourceVersion:a,targetVersion:i,sourceRevision:n,targetRevision:c,...l}=t,y=await this.#e.client.insert(o).values(t).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision],set:l}).returning();return y?.length?y[0]:null}catch(r){return h.error("Error creating entity relation",r),null}}async#s(t,r,s,a,i){if(a||i)return!1;const n=await this.#e.client.select({hash:e.hash,isDeleted:e.isDeleted}).from(e).where(d(u(e.key,t),u(e.source,"file"),r?u(e.version,r):v(e.version))).orderBy(k(e.revision)).limit(1).run();if(n.rows.length===0)return!1;const c=n.rows[0];return c.isDeleted?!1:c.hash===s}async#i(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(d(u(e.key,t),u(e.source,"file"))).orderBy(k(e.createdAt)).run()).rows.map(s=>({version:s.version,isDefaultVersion:!!s.isDefaultVersion,revision:s.revision,createdAt:new Date(s.createdAt)}))}#n(t){const r=t.find(i=>i.isDefaultVersion);if(r)return r;const{versionedEntities:s,unversionedEntities:a}=t.reduce((i,n)=>(n.version!==null&&n.version!==S?i.versionedEntities.push(n):i.unversionedEntities.push(n),i),{versionedEntities:[],unversionedEntities:[]});if(s.length>0){s.sort((c,l)=>L(c.version,l.version));const i=s[0].version,n=s.filter(c=>c.version===i);return n.sort((c,l)=>l.createdAt.getTime()-c.createdAt.getTime()),n[0]}return a.length>0?(a.sort((i,n)=>n.createdAt.getTime()-i.createdAt.getTime()),a[0]):null}async#o(t,r){const s=await this.#e.client.select({currentDefaultVersion:D`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:D`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(d(u(e.key,t),u(e.source,"file"))).get(),a=s?.currentDefaultVersion,i=(s?.versionMatchCount??0)>0;return r&&r===a?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!i,shouldBeDefaultVersion:!i}}async#a({key:t,isCurrent:r,isDefaultVersion:s}){if(!r&&!s)return;const a={},i=[];r&&(a.isCurrent=!1,i.push(u(e.isCurrent,!0))),s&&(a.isDefaultVersion=!1,i.push(u(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(a).where(d(u(e.key,t),u(e.source,"file"),R(...i))).run()}#u=async t=>{const r=await this.#i(t),s=this.#n(r);if(!s){h.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(d(u(e.key,t),u(e.revision,s.revision),s.version?u(e.version,s.version):v(e.version))).run()};async#c(t,r){const{key:s,source:a,version:i,isDefaultVersion:n,...c}=t,f=(await this.#e.client.select({id:e.id}).from(e).where(d(u(e.key,s),u(e.source,a??"file"),i?u(e.version,i):v(e.version))).limit(1).run()).rows.length>0?this.#e.client.update(e).set(c).where(d(u(e.key,s),u(e.source,a??"file"),i?u(e.version,i):v(e.version))).run():this.#e.client.insert(e).values(t).run(),C=r?.map(g=>{const m=I({relation:g,sourceFile:t.sourceFile??"",fileHash:t.fileHash??"",sourceKey:t.key,sourceVersion:t.version??null,sourceRevision:t.revision??null,organizationId:this.#t,projectId:this.#r});return this.#e.client.insert(o).values(m).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision],set:m}).run()})??[];await p([f,...C],w,async g=>g)}async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(u(e.id,t)).returning()).length>0}catch(s){return h.error("Error updating entity scorecards status",s),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(D`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(s){return h.error("Error updating entity scorecards status if calculating",s),!1}}}export{Q as CatalogEntitiesLocalWriteRepository};
@@ -0,0 +1,17 @@
1
+ import type { BffCatalogRelatedEntity } from '@redocly/theme/core/types';
2
+ import type { DatabaseClient } from '../../../../../providers/database/client';
3
+ import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
4
+ import type { ListResult } from './catalog-entities-local-read-repository.js';
5
+ export declare class CatalogEntitiesRelationsRepository {
6
+ #private;
7
+ constructor(db: DatabaseClient, attachedDatabasePath: string);
8
+ getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
9
+ targetKey: string;
10
+ targetRevision: string;
11
+ sourceToTargetRelation: string;
12
+ direction: "outgoing" | "incoming";
13
+ priority: number;
14
+ }[]>;
15
+ getRelatedEntities(key: string, paginationParams?: PaginationParams): Promise<ListResult<BffCatalogRelatedEntity>>;
16
+ }
17
+ //# sourceMappingURL=catalog-entities-relations-repository.d.ts.map
@@ -0,0 +1 @@
1
+ import{unionAll as w}from"drizzle-orm/sqlite-core";import{and as u,desc as g,eq as y,notExists as p,sql as i}from"drizzle-orm";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{excludeFieldsFromFilter as F,getFirstFilterFieldValue as C}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as D}from"../../../../../providers/database/pagination/index.js";import{createBffRelatedEntityFromQueryRow as T}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as K}from"../../mappers/map-entity-relation-row.js";class q{#e;#i;constructor(o,n){this.#e=o,this.#i=n}async getRelationsForEntity(o,n,d){const a=await this.#t(o,n,d);return a?(await this.#e.client.select().from(a).run()).rows.map(s=>K(s)):[]}async getRelatedEntities(o,n={}){const d=C(n.filter,"version"),a=C(n.filter,"revision"),r=await this.#t(o,d,a);if(!r)return{items:[],total:0};const s=this.#e.client.select({relationType:r.relationName,direction:r.direction,key:e.key,revision:e.revision,id:e.id,type:e.type,title:e.title,summary:e.summary,metadata:e.metadata,createdAt:e.createdAt,updatedAt:e.updatedAt,source:e.source,sourceFile:e.sourceFile,version:e.version,isDeleted:e.isDeleted,isCurrent:e.isCurrent,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${r.entityKey} ORDER BY ${r.priority} ASC, CASE WHEN ${r.entityVersion} = ${e.version} THEN 1 ELSE 0 END DESC, ${e.isCurrent} DESC, ${e.revision} DESC)`.as("dedupRn")}).from(r).innerJoin(e,i`${r.entityKey} = ${e.key} AND (${r.entityRevision} = ${e.revision} OR ${r.entityRevision} = '') AND (${r.entityVersion} = ${e.version} OR ${r.entityVersion} = '')`).as("unique_relations"),m=i`${s.dedupRn} = 1 AND COALESCE(${s.isDeleted}, 0) = 0`,R=this.#e.client.select().from(s).$dynamic(),E=this.#e.client.select().from(s).$dynamic(),$=F(n.filter,["version","revision"]),l={...n,filter:$,baseWhereCondition:m},c=D(E,{...l,limit:void 0,skip:void 0,after:void 0,before:void 0}),N=this.#e.client.$count(c),f=n.limit||10,V=D(R,{...l,limit:f+1}),[A,O]=await Promise.all([V.run(),N]),h=A.rows.filter(v=>v.id!=null).map(v=>T(v)).filter(v=>v!==null),S=h.slice(0,f),B=h.length>f;return{items:S,hasMore:B,total:O}}async#r(o,n){if(n){const s=await(this.#i?w(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`version = ${n}`)).orderBy(i.raw("revision DESC")),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n),p(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.version = ${n}`))))).orderBy(g(e.revision))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n))).orderBy(g(e.revision))).limit(1).run();if(s.rows.length>0){const m=s.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}const a=await(this.#i?w(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`is_current = 1`)),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0),p(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.is_current = 1`)))))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0)))).limit(1).run();if(a.rows.length>0){const r=a.rows[0];return{version:r.version||null,revision:r.revision||null}}return null}async#t(o,n,d){const a=d?{version:d,revision:d}:await this.#r(o,n||null),r=n||a?.version||null,s=d||a?.revision||null,m=r?i`(${t.sourceVersion} = ${r} OR ${t.sourceVersion} = '')`:i`${t.sourceVersion} = ''`,R=r?i`(${t.targetVersion} = ${r} OR ${t.targetVersion} = '')`:i`${t.targetVersion} = ''`,E=s?i`(${t.sourceRevision} <= ${s} OR ${t.sourceRevision} = '')`:i`1 = 0`,$=s?i`(${t.targetRevision} <= ${s} OR ${t.targetRevision} = '')`:i`1 = 0`,l=this.#e.client.select({entityKey:t.targetKey,entityRevision:t.targetRevision,entityVersion:t.targetVersion,relationName:t.sourceToTargetRelation,direction:i`'outgoing'`.as("direction"),priority:i`1`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.targetKey} ORDER BY CASE WHEN ${t.sourceVersion} != '' THEN 1 ELSE 0 END DESC, ${t.sourceRevision} DESC)`.as("rn")}).from(t).where(u(y(t.sourceKey,o),m,E)).as("outgoing_filtered"),c=this.#e.client.select({entityKey:t.sourceKey,entityRevision:t.sourceRevision,entityVersion:t.sourceVersion,relationName:t.targetToSourceRelation,direction:i`'incoming'`.as("direction"),priority:i`2`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.sourceKey} ORDER BY CASE WHEN ${t.targetVersion} != '' THEN 1 ELSE 0 END DESC, ${t.targetRevision} DESC)`.as("rn")}).from(t).where(u(y(t.targetKey,o),R,$)).as("incoming_filtered");return this.#e.client.select({entityKey:l.entityKey,entityRevision:l.entityRevision,entityVersion:l.entityVersion,relationName:l.relationName,direction:l.direction,priority:l.priority}).from(l).where(i`${l.rn} = 1 AND COALESCE(${l.isDeleted}, 0) = 0`).unionAll(this.#e.client.select({entityKey:c.entityKey,entityRevision:c.entityRevision,entityVersion:c.entityVersion,relationName:c.relationName,direction:c.direction,priority:c.priority}).from(c).where(i`${c.rn} = 1 AND COALESCE(${c.isDeleted}, 0) = 0`)).as("all_relations")}}export{q as CatalogEntitiesRelationsRepository};
@@ -20,6 +20,7 @@ export declare const createEntityFieldsForSelect: (tableAlias?: string, idAlias?
20
20
  revision: import("drizzle-orm").SQL<unknown>;
21
21
  hash: import("drizzle-orm").SQL<unknown>;
22
22
  isCurrent: import("drizzle-orm").SQL<unknown>;
23
+ isDeleted: import("drizzle-orm").SQL<unknown>;
23
24
  scorecardsStatus: import("drizzle-orm").SQL<unknown>;
24
25
  };
25
26
  export declare const createEntityRelationFieldsForSelect: (tableAlias?: string, idAlias?: string) => {
@@ -27,12 +28,10 @@ export declare const createEntityRelationFieldsForSelect: (tableAlias?: string,
27
28
  organizationId: import("drizzle-orm").SQL<unknown>;
28
29
  projectId: import("drizzle-orm").SQL<unknown>;
29
30
  sourceKey: import("drizzle-orm").SQL<unknown>;
30
- sourceId: import("drizzle-orm").SQL<unknown>;
31
31
  sourceVersion: import("drizzle-orm").SQL<unknown>;
32
32
  sourceRevision: import("drizzle-orm").SQL<unknown>;
33
33
  sourceToTargetRelation: import("drizzle-orm").SQL<unknown>;
34
34
  targetKey: import("drizzle-orm").SQL<unknown>;
35
- targetId: import("drizzle-orm").SQL<unknown>;
36
35
  targetVersion: import("drizzle-orm").SQL<unknown>;
37
36
  targetRevision: import("drizzle-orm").SQL<unknown>;
38
37
  targetToSourceRelation: import("drizzle-orm").SQL<unknown>;
@@ -62,6 +61,7 @@ export declare const createQualifiedEntityFieldsForSelect: (tableAlias?: string)
62
61
  revision: import("drizzle-orm").SQL<unknown>;
63
62
  hash: import("drizzle-orm").SQL<unknown>;
64
63
  isCurrent: import("drizzle-orm").SQL<unknown>;
64
+ isDeleted: import("drizzle-orm").SQL<unknown>;
65
65
  };
66
66
  export declare const createQualifiedEntityFieldsForSelectWithAliases: (tableAlias?: string) => {
67
67
  id: import("drizzle-orm").SQL.Aliased<unknown>;
@@ -85,6 +85,7 @@ export declare const createQualifiedEntityFieldsForSelectWithAliases: (tableAlia
85
85
  revision: import("drizzle-orm").SQL.Aliased<unknown>;
86
86
  hash: import("drizzle-orm").SQL.Aliased<unknown>;
87
87
  isCurrent: import("drizzle-orm").SQL.Aliased<unknown>;
88
+ isDeleted: import("drizzle-orm").SQL.Aliased<unknown>;
88
89
  };
89
90
  export declare const FIELDS_TO_SELECT_FOR_ENTITY: {
90
91
  id: import("drizzle-orm").SQL<unknown> | import("drizzle-orm").SQL.Aliased<unknown>;
@@ -108,6 +109,7 @@ export declare const FIELDS_TO_SELECT_FOR_ENTITY: {
108
109
  revision: import("drizzle-orm").SQL<unknown>;
109
110
  hash: import("drizzle-orm").SQL<unknown>;
110
111
  isCurrent: import("drizzle-orm").SQL<unknown>;
112
+ isDeleted: import("drizzle-orm").SQL<unknown>;
111
113
  scorecardsStatus: import("drizzle-orm").SQL<unknown>;
112
114
  };
113
115
  export declare const FIELDS_TO_SELECT_FOR_ENTITY_RELATION: {
@@ -115,12 +117,10 @@ export declare const FIELDS_TO_SELECT_FOR_ENTITY_RELATION: {
115
117
  organizationId: import("drizzle-orm").SQL<unknown>;
116
118
  projectId: import("drizzle-orm").SQL<unknown>;
117
119
  sourceKey: import("drizzle-orm").SQL<unknown>;
118
- sourceId: import("drizzle-orm").SQL<unknown>;
119
120
  sourceVersion: import("drizzle-orm").SQL<unknown>;
120
121
  sourceRevision: import("drizzle-orm").SQL<unknown>;
121
122
  sourceToTargetRelation: import("drizzle-orm").SQL<unknown>;
122
123
  targetKey: import("drizzle-orm").SQL<unknown>;
123
- targetId: import("drizzle-orm").SQL<unknown>;
124
124
  targetVersion: import("drizzle-orm").SQL<unknown>;
125
125
  targetRevision: import("drizzle-orm").SQL<unknown>;
126
126
  targetToSourceRelation: import("drizzle-orm").SQL<unknown>;
@@ -1 +1 @@
1
- import{sql as a}from"drizzle-orm";const i=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),key:a.raw(t+"key"),type:a.raw(t+"type"),title:a.raw(t+"title"),summary:a.raw(t+"summary"),tags:a.raw(t+"tags"),metadata:a.raw(t+"metadata"),git:a.raw(t+"git"),contact:a.raw(t+"contact"),links:a.raw(t+"links"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at"),source:a.raw(t+"source"),sourceFile:a.raw(t+"source_file"),fileHash:a.raw(t+"file_hash"),version:a.raw(t+"version"),revision:a.raw(t+"revision"),hash:a.raw(t+"hash"),isCurrent:a.raw(t+"is_current"),scorecardsStatus:a.raw(t+"scorecards_status")}},s=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),sourceKey:a.raw(t+"source_key"),sourceId:a.raw(t+"source_id"),sourceVersion:a.raw(t+"source_version"),sourceRevision:a.raw(t+"source_revision"),sourceToTargetRelation:a.raw(t+"source_to_target_relation"),targetKey:a.raw(t+"target_key"),targetId:a.raw(t+"target_id"),targetVersion:a.raw(t+"target_version"),targetRevision:a.raw(t+"target_revision"),targetToSourceRelation:a.raw(t+"target_to_source_relation"),fileHash:a.raw(t+"file_hash"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at")}},n=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current")}},c=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id").as("id"),organizationId:a.raw(r+"organization_id").as("organization_id"),projectId:a.raw(r+"project_id").as("project_id"),key:a.raw(r+"key").as("key"),type:a.raw(r+"type").as("type"),title:a.raw(r+"title").as("title"),summary:a.raw(r+"summary").as("summary"),tags:a.raw(r+"tags").as("tags"),metadata:a.raw(r+"metadata").as("metadata"),git:a.raw(r+"git").as("git"),contact:a.raw(r+"contact").as("contact"),links:a.raw(r+"links").as("links"),createdAt:a.raw(r+"created_at").as("created_at"),updatedAt:a.raw(r+"updated_at").as("updated_at"),source:a.raw(r+"source").as("source"),sourceFile:a.raw(r+"source_file").as("source_file"),fileHash:a.raw(r+"file_hash").as("file_hash"),version:a.raw(r+"version").as("version"),revision:a.raw(r+"revision").as("revision"),hash:a.raw(r+"hash").as("hash"),isCurrent:a.raw(r+"is_current").as("is_current")}},w=i(),d=s();export{w as FIELDS_TO_SELECT_FOR_ENTITY,d as FIELDS_TO_SELECT_FOR_ENTITY_RELATION,i as createEntityFieldsForSelect,s as createEntityRelationFieldsForSelect,n as createQualifiedEntityFieldsForSelect,c as createQualifiedEntityFieldsForSelectWithAliases};
1
+ import{sql as a}from"drizzle-orm";const i=(t="",r)=>{const e=t?`${t}.`:"";return{id:r?a.raw(e+"id").as(r):a.raw(e+"id"),organizationId:a.raw(e+"organization_id"),projectId:a.raw(e+"project_id"),key:a.raw(e+"key"),type:a.raw(e+"type"),title:a.raw(e+"title"),summary:a.raw(e+"summary"),tags:a.raw(e+"tags"),metadata:a.raw(e+"metadata"),git:a.raw(e+"git"),contact:a.raw(e+"contact"),links:a.raw(e+"links"),createdAt:a.raw(e+"created_at"),updatedAt:a.raw(e+"updated_at"),source:a.raw(e+"source"),sourceFile:a.raw(e+"source_file"),fileHash:a.raw(e+"file_hash"),version:a.raw(e+"version"),revision:a.raw(e+"revision"),hash:a.raw(e+"hash"),isCurrent:a.raw(e+"is_current"),isDeleted:a.raw(e+"is_deleted"),scorecardsStatus:a.raw(e+"scorecards_status")}},s=(t="",r)=>{const e=t?`${t}.`:"";return{id:r?a.raw(e+"id").as(r):a.raw(e+"id"),organizationId:a.raw(e+"organization_id"),projectId:a.raw(e+"project_id"),sourceKey:a.raw(e+"source_key"),sourceVersion:a.raw(e+"source_version"),sourceRevision:a.raw(e+"source_revision"),sourceToTargetRelation:a.raw(e+"source_to_target_relation"),targetKey:a.raw(e+"target_key"),targetVersion:a.raw(e+"target_version"),targetRevision:a.raw(e+"target_revision"),targetToSourceRelation:a.raw(e+"target_to_source_relation"),fileHash:a.raw(e+"file_hash"),createdAt:a.raw(e+"created_at"),updatedAt:a.raw(e+"updated_at")}},n=(t="")=>{const r=t?`${t}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current"),isDeleted:a.raw(r+"is_deleted")}},w=(t="")=>{const r=t?`${t}.`:"";return{id:a.raw(r+"entity_id").as("id"),organizationId:a.raw(r+"organization_id").as("organization_id"),projectId:a.raw(r+"project_id").as("project_id"),key:a.raw(r+"key").as("key"),type:a.raw(r+"type").as("type"),title:a.raw(r+"title").as("title"),summary:a.raw(r+"summary").as("summary"),tags:a.raw(r+"tags").as("tags"),metadata:a.raw(r+"metadata").as("metadata"),git:a.raw(r+"git").as("git"),contact:a.raw(r+"contact").as("contact"),links:a.raw(r+"links").as("links"),createdAt:a.raw(r+"created_at").as("created_at"),updatedAt:a.raw(r+"updated_at").as("updated_at"),source:a.raw(r+"source").as("source"),sourceFile:a.raw(r+"source_file").as("source_file"),fileHash:a.raw(r+"file_hash").as("file_hash"),version:a.raw(r+"version").as("version"),revision:a.raw(r+"revision").as("revision"),hash:a.raw(r+"hash").as("hash"),isCurrent:a.raw(r+"is_current").as("is_current"),isDeleted:a.raw(r+"is_deleted").as("is_deleted")}},c=i(),d=s();export{c as FIELDS_TO_SELECT_FOR_ENTITY,d as FIELDS_TO_SELECT_FOR_ENTITY_RELATION,i as createEntityFieldsForSelect,s as createEntityRelationFieldsForSelect,n as createQualifiedEntityFieldsForSelect,w as createQualifiedEntityFieldsForSelectWithAliases};
@@ -1,4 +1,4 @@
1
1
  import type { LifecycleContext } from '../../../types';
2
2
  import type { EntitiesFileSchema } from './types.js';
3
3
  export declare const extractFileContent: (filePath: string, context: LifecycleContext) => Promise<EntitiesFileSchema | null>;
4
- //# sourceMappingURL=extract-entities-content.d.ts.map
4
+ //# sourceMappingURL=extract-file-content.d.ts.map