@redocly/realm 0.130.0-next.1 → 0.130.0-next.10

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 (226) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.js +1 -1
  4. package/dist/cli/eject/resolveEjectParams.js +1 -1
  5. package/dist/cli/prepare/copy-env-files.js +1 -1
  6. package/dist/cli/stats/collectors/openapi.d.ts +3 -0
  7. package/dist/cli/stats/collectors/openapi.js +1 -0
  8. package/dist/cli/stats/index.d.ts +7 -0
  9. package/dist/cli/stats/index.js +1 -0
  10. package/dist/cli/stats/options.d.ts +3 -0
  11. package/dist/cli/stats/options.js +1 -0
  12. package/dist/cli/telemetry/index.d.ts +2 -2
  13. package/dist/cli/telemetry/index.js +1 -1
  14. package/dist/client/ErrorBoundary.js +1 -1
  15. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  16. package/dist/client/app/Sidebar/Sidebar.js +2 -2
  17. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  18. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  19. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  20. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  21. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  22. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  23. package/dist/client/app/hooks/useTelemetry.d.ts +2 -2
  24. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  25. package/dist/client/app/search/useAiSearch.js +1 -1
  26. package/dist/client/app/search/useSearch.js +1 -1
  27. package/dist/client/app/telemetry/index.d.ts +11 -1
  28. package/dist/client/app/telemetry/index.js +1 -1
  29. package/dist/client/browser-entry.js +3 -3
  30. package/dist/constants/common.d.ts +3 -1
  31. package/dist/constants/common.js +1 -1
  32. package/dist/constants/l10n/langs/ar.js +1 -1
  33. package/dist/constants/l10n/langs/de.js +1 -1
  34. package/dist/constants/l10n/langs/en.js +1 -1
  35. package/dist/constants/l10n/langs/es.js +1 -1
  36. package/dist/constants/l10n/langs/fr.js +1 -1
  37. package/dist/constants/l10n/langs/hi.js +1 -1
  38. package/dist/constants/l10n/langs/it.js +1 -1
  39. package/dist/constants/l10n/langs/ja.js +1 -1
  40. package/dist/constants/l10n/langs/ko.js +1 -1
  41. package/dist/constants/l10n/langs/pl.js +1 -1
  42. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  43. package/dist/constants/l10n/langs/pt.js +1 -1
  44. package/dist/constants/l10n/langs/ru.js +1 -1
  45. package/dist/constants/l10n/langs/uk.js +1 -1
  46. package/dist/constants/l10n/langs/zh.js +1 -1
  47. package/dist/server/api-routes/execute-api-route.js +1 -1
  48. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  49. package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
  50. package/dist/server/constants/plugins/catalog-entities.js +1 -1
  51. package/dist/server/esbuild/esbuild.js +3 -3
  52. package/dist/server/fs/cache.js +1 -1
  53. package/dist/server/node-bundle-entry.js +1 -1
  54. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +1 -0
  55. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -1
  56. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  57. package/dist/server/plugins/asyncapi-docs/store-definition-bundles.js +1 -1
  58. package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +5 -3
  59. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +11 -12
  60. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  61. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
  62. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
  63. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
  64. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  65. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -1
  66. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
  67. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
  68. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
  69. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
  70. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +2 -2
  71. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +34 -27
  72. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +5 -4
  73. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +27 -14
  74. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +10 -8
  75. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  76. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -1
  77. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  78. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  79. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +2 -5
  80. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  81. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
  82. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
  83. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
  84. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
  85. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
  86. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
  87. package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +3 -1
  88. package/dist/server/plugins/catalog-entities/entities/validate-entity.js +1 -1
  89. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  90. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  91. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +4 -3
  92. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  93. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  94. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
  95. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  96. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  97. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  98. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
  99. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  100. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +15 -1
  101. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  102. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +1 -0
  103. package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
  104. package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
  105. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  106. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  107. package/dist/server/plugins/default-theme/index.js +1 -1
  108. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +54 -0
  109. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -0
  110. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +9 -8
  111. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  112. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +9 -8
  113. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  114. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +9 -8
  115. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  116. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +9 -8
  117. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  118. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +7 -13
  119. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  120. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +9 -6
  121. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  122. package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +9 -2
  123. package/dist/server/plugins/mcp/docs-mcp/tools/search.js +1 -1
  124. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +2 -1
  125. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  126. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +9 -2
  127. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  128. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  129. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  130. package/dist/server/plugins/mcp/handlers/handle-mcp-request.d.ts +5 -0
  131. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -0
  132. package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -1
  133. package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +1 -1
  134. package/dist/server/plugins/mcp/servers/base-server.js +1 -1
  135. package/dist/server/plugins/mcp/types.d.ts +40 -0
  136. package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +3 -0
  137. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -0
  138. package/dist/server/plugins/openapi-docs/index.js +1 -1
  139. package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
  140. package/dist/server/plugins/openapi-docs/template/helpers.d.ts +1 -1
  141. package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
  142. package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
  143. package/dist/server/plugins/scorecard-classic/types.d.ts +3 -3
  144. package/dist/server/plugins/scorecard-classic/types.js +1 -1
  145. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.d.ts +12 -0
  146. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +1 -0
  147. package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +11 -0
  148. package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -0
  149. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -1
  150. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  151. package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -12
  152. package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
  153. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  154. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  155. package/dist/server/plugins/sso/index.js +1 -1
  156. package/dist/server/providers/database/base-repository.d.ts +1 -0
  157. package/dist/server/providers/database/base-repository.js +1 -1
  158. package/dist/server/providers/database/database-connection-factory.js +1 -1
  159. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +2 -0
  160. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
  161. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +393 -0
  162. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
  163. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +14 -0
  164. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
  165. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
  166. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  167. package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +19 -0
  168. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +261 -0
  169. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
  170. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +24 -18
  171. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -1
  172. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0007_catalog-relations-constraint-fix.sql +2 -0
  173. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
  174. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0007_snapshot.json +833 -0
  175. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
  176. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
  177. package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
  178. package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
  179. package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
  180. package/dist/server/providers/database/pagination/utils/index.js +1 -1
  181. package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
  182. package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
  183. package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
  184. package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
  185. package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
  186. package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
  187. package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
  188. package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
  189. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  190. package/dist/server/store.d.ts +3 -1
  191. package/dist/server/store.js +1 -1
  192. package/dist/server/tools/notifiers/logger.js +1 -1
  193. package/dist/server/tools/notifiers/reporter.js +7 -7
  194. package/dist/server/types/plugins/common.d.ts +3 -1
  195. package/dist/server/types/plugins/scorecards.d.ts +30 -0
  196. package/dist/server/types/plugins/scorecards.js +0 -0
  197. package/dist/server/utils/envs/load-env-variables.d.ts +1 -1
  198. package/dist/server/utils/envs/load-env-variables.js +1 -1
  199. package/dist/server/utils/envs/sanitize-branch-name.d.ts +6 -0
  200. package/dist/server/utils/envs/sanitize-branch-name.js +1 -0
  201. package/dist/server/utils/lifecycle-hooks.js +1 -1
  202. package/dist/server/utils/rbac.d.ts +11 -7
  203. package/dist/server/utils/rbac.js +1 -1
  204. package/dist/server/utils/time/with-timestamp.d.ts +42 -10
  205. package/dist/server/utils/time/with-timestamp.js +1 -1
  206. package/dist/server/web-server/auth.js +2 -2
  207. package/dist/server/web-server/dev-server.js +1 -1
  208. package/dist/server/web-server/handle-api-route-request.js +1 -1
  209. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  210. package/dist/server/web-server/routes/auth.js +1 -1
  211. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  212. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  213. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  214. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  215. package/dist/server/web-server/routes/page-data.js +1 -1
  216. package/dist/server/workers/mcp-tool-worker-pool.d.ts +4 -0
  217. package/dist/server/workers/mcp-tool-worker-pool.js +1 -0
  218. package/dist/server/workers/mcp-tool-worker.d.ts +2 -0
  219. package/dist/server/workers/mcp-tool-worker.js +1 -0
  220. package/dist/server/workers/types.d.ts +7 -1
  221. package/dist/utils/env/is-local-development.js +1 -1
  222. package/package.json +15 -18
  223. package/dist/server/plugins/mcp/workers/run-api-routes-worker.d.ts +0 -5
  224. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +0 -1
  225. package/dist/server/workers/mcp-worker-pool.d.ts +0 -4
  226. package/dist/server/workers/mcp-worker-pool.js +0 -1
@@ -0,0 +1 @@
1
+ import{eq as a,and as l,desc as c}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as f}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{compareVersionsDescending as m}from"../../../utils/version-compare.js";class p{db;constructor(t){this.db=t}async markAllVersionsAsNotDefault(t){await this.db.client.update(e).set({isDefaultVersion:!1}).where(l(a(e.key,t),a(e.isDefaultVersion,!0))).run()}async doesVersionExist(t,n){return await this.db.client.select().from(e).where(l(a(e.key,t),a(e.version,n))).get()!==void 0}async getOrderedVersionListForKey(t){return(await this.db.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(l(a(e.key,t))).orderBy(c(e.createdAt)).run()).rows.map(i=>({version:i.version,isDefaultVersion:!!i.isDefaultVersion,revision:i.revision,createdAt:new Date(i.createdAt)}))}getLatestVersion(t){const n=t.find(r=>r.isDefaultVersion);if(n)return n;const{versionedEntities:i,unversionedEntities:d}=t.reduce((r,s)=>(s.version!==null&&s.version!==f?r.versionedEntities.push(s):r.unversionedEntities.push(s),r),{versionedEntities:[],unversionedEntities:[]});if(i.length>0){i.sort((o,u)=>m(o.version,u.version));const r=i[0].version,s=i.filter(o=>o.version===r);return s.sort((o,u)=>u.createdAt.getTime()-o.createdAt.getTime()),s[0]}return d.length>0?(d.sort((r,s)=>s.createdAt.getTime()-r.createdAt.getTime()),d[0]):null}}export{p as VersionRepository};
@@ -5,10 +5,10 @@ import type { ListResult } from './catalog-entities-local-read-repository.js';
5
5
  export declare class CatalogEntitiesBffRepository {
6
6
  #private;
7
7
  constructor(db: DatabaseClient, attachedDatabasePath: string);
8
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
8
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
9
9
  getEntityWithRelationsByKey(entityKey: string, filter?: {
10
10
  revision?: string | null;
11
11
  version?: string | null;
12
- }): Promise<BffCatalogEntity | null>;
12
+ }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
13
13
  }
14
14
  //# sourceMappingURL=catalog-entities-bff-repository.d.ts.map
@@ -1,38 +1,45 @@
1
- import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";import{unionAll as C}from"drizzle-orm/sqlite-core";import{logger as Q}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as i}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{applyPagination as D}from"../../../../../providers/database/pagination/index.js";import{applyFilter as j,excludeFieldsFromFilter as H,getAllFilterFieldValues as S}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as O}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as n,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as R,createEntityFieldsForSelect as A}from"../utils.js";class U{#e;#t;constructor(t,o){this.#e=t,this.#t=o}async getEntitiesWithRelations(t={}){const o=S(t.filter,"owners");if(o.length>0)return this.#c(t,o);const d=S(t.filter,"domains");return d.length>0?this.#l(t,d):this.#a(t)}async#c(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
1
+ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,exists as x,inArray as z}from"drizzle-orm";import{unionAll as S}from"drizzle-orm/sqlite-core";import{logger as J}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as O}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as _}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as F}from"../../../../../providers/database/pagination/index.js";import{applyFilter as U,excludeFieldsFromFilter as q,getAllFilterFieldValues as W}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as L}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as d,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as C,createEntityFieldsForSelect as $}from"../utils.js";import{createMergedEntityFieldsForSelect as I}from"../utils/create-merged-entity-fields-for-select.js";import{buildNoHigherVersionExistsFilter as B,buildSemanticVersionSortExpr as Y}from"../utils/semantic-version-sort.js";class ae{#e;#t;constructor(i,o){this.#e=i,this.#t=o}async getEntitiesWithRelations(i={},o){const a=W(i.filter,"owners");if(a.length>0)return this.#a(i,a,o);const l=W(i.filter,"domains");return l.length>0?this.#d(i,l,o):this.#m(i,o)}async#a(i,o,a){const l=this.#n(a),c=this.#o(),h=this.#l(),b=c.as("combined_relations"),w=h.as("combined_target_entities"),u=o.map(s=>e`
2
2
  EXISTS (
3
- SELECT 1 FROM (${l}) cr
4
- WHERE cr.source_key = ${r}
3
+ SELECT 1 FROM (${c}) cr
4
+ WHERE cr.source_key = ${s}
5
5
  AND cr.source_to_target_relation = 'owns'
6
6
  AND cr.target_key = base_entities.key
7
7
  )
8
- `),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"domains");let w=_;if(b.length>0){const r=b.map(a=>e`
8
+ `),y=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,N=W(i.filter,"domains");let v=y;if(N.length>0){const s=N.map(m=>e`
9
9
  EXISTS (
10
- SELECT 1 FROM (${l}) cr
11
- JOIN (${m}) d ON d.key = ${a}
10
+ SELECT 1 FROM (${c}) cr
11
+ JOIN (${h}) d ON d.key = ${m}
12
12
  WHERE d.type = 'domain'
13
13
  AND d.is_current = 1
14
- AND cr.source_key = ${a}
14
+ AND cr.source_key = ${m}
15
15
  AND cr.target_key = base_entities.key
16
16
  AND cr.source_to_target_relation = 'hasParts'
17
17
  )
18
- `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["owners","domains"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (owner optimized path):",r),{items:[],hasMore:!1,total:0}}}async#l(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
18
+ `),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;v=e`(${y} AND ${f})`}const p=q(i.filter,["owners","domains"]),k={...i,filter:p,baseWhereCondition:v},E=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();try{const s=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();F(s,{...k,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(s),m=i.limit||10;F(E,{...k,limit:m+1});const R=E.as("paged_entities"),M=this.#e.client.with(b,w,R).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(R),[Q,H]=await Promise.all([M.run(),f]),T=Q.rows,j=T.length>m;return{items:T.slice(0,m).map(D=>L(D)).filter(D=>D!==null),hasMore:j,total:H}}catch(s){return J.error("Error getting entities with relations (owner optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#d(i,o,a){const l=this.#n(a),c=this.#o(),h=this.#l(),b=c.as("combined_relations"),w=h.as("combined_target_entities"),u=o.map(s=>e`
19
19
  EXISTS (
20
- SELECT 1 FROM (${l}) cr
21
- JOIN (${m}) d ON d.key = ${r}
20
+ SELECT 1 FROM (${c}) cr
21
+ JOIN (${h}) d ON d.key = ${s}
22
22
  WHERE d.type = 'domain'
23
23
  AND d.is_current = 1
24
- AND cr.source_key = ${r}
24
+ AND cr.source_key = ${s}
25
25
  AND cr.target_key = base_entities.key
26
26
  AND cr.source_to_target_relation = 'hasParts'
27
27
  )
28
- `),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"owners");let w=_;if(b.length>0){const r=b.map(a=>e`
28
+ `),y=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,N=W(i.filter,"owners");let v=y;if(N.length>0){const s=N.map(m=>e`
29
29
  EXISTS (
30
- SELECT 1 FROM (${l}) cr
31
- WHERE cr.source_key = ${a}
30
+ SELECT 1 FROM (${c}) cr
31
+ WHERE cr.source_key = ${m}
32
32
  AND cr.source_to_target_relation = 'owns'
33
33
  AND cr.target_key = base_entities.key
34
34
  )
35
- `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["domains","owners"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (domain optimized path):",r),{items:[],hasMore:!1,total:0}}}async#a(t){const o=this.#s(),d=this.#n(),l=this.#o(),m=d.as("combined_relations"),y=l.as("combined_target_entities"),u=this.#e.client.select(n).from(o.as("base_entities")).$dynamic(),{whereCondition:h}=j(u,t.filter);h&&u.where(h);try{const _=this.#e.client.select(n).from(o.as("base_entities")).$dynamic();h&&_.where(h);const b=this.#e.client.$count(_),w=t.limit||10;D(u,{...t,limit:w+1});const p=u.as("paged_entities"),g=this.#e.client.with(m,y,p).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(p),[E,r]=await Promise.all([g.run(),b]),f=E.rows,a=f.length>w;return{items:f.slice(0,w).map(v=>O(v)).filter(v=>v!==null),hasMore:a,total:r}}catch(_){return Q.error("Error getting entities with relations (optimized path):",_),{items:[],hasMore:!1,total:0}}}#s(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}#n(){return this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)}#o(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}async getEntityWithRelationsByKey(t,o){if(!t||t.trim()==="")return null;const d=o?.revision,l=o?.version,m=d?null:await this.#d(t,l||null),y=l??m?.version,u=d||m?.revision||null,_=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(s(i.key,t)),this.#e.client.select(n).from(i).where(c(s(i.key,t),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`))))):this.#e.client.select(n).from(i).where(s(i.key,t))).as("e"),w=(this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)).as("combined_relations"),g=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`),this.#e.client.select(n).from(i).where($(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(n).from(i)).as("combined_target_entities"),E=this.#e.client.with(_,w,g).select({...A("e"),domains:this.#i("e").as("domains"),owners:this.#r("e").as("owners")}).from(_).$dynamic();u?E.where(c(s(e.raw("revision"),u),y?s(e.raw("version"),y):void 0)):E.where(s(e.raw("is_current"),1)),E.limit(1);const r=await E.run();if(r.rows.length===0)return null;const f=r.rows[0];return O(f)}async#d(t,o){if(o){const y=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${o}`))))).orderBy(M(i.revision))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o))).orderBy(M(i.revision))).limit(1).run();if(y.rows.length>0){const u=y.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}const l=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`is_current = 1`)),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0)))).limit(1).run();if(l.rows.length>0){const m=l.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}#i(t){return e`
35
+ `),f=s.length===1?s[0]:e`(${e.join(s,e` OR `)})`;v=e`(${y} AND ${f})`}const p=q(i.filter,["domains","owners"]),k={...i,filter:p,baseWhereCondition:v},E=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();try{const s=this.#e.client.select(d).from(l.as("base_entities")).$dynamic();F(s,{...k,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(s),m=i.limit||10;F(E,{...k,limit:m+1});const R=E.as("paged_entities"),M=this.#e.client.with(b,w,R).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(R),[Q,H]=await Promise.all([M.run(),f]),T=Q.rows,j=T.length>m;return{items:T.slice(0,m).map(D=>L(D)).filter(D=>D!==null),hasMore:j,total:H}}catch(s){return J.error("Error getting entities with relations (domain optimized path): "+s.message),{items:[],hasMore:!1,total:0}}}async#m(i,o){const a=this.#n(o),l=this.#o(),c=this.#l(),h=l.as("combined_relations"),b=c.as("combined_target_entities"),w=this.#e.client.select(d).from(a.as("base_entities")).$dynamic(),{whereCondition:u}=U(w,i.filter);u&&w.where(u);try{const y=this.#e.client.select(d).from(a.as("base_entities")).$dynamic();u&&y.where(u);const N=this.#e.client.$count(y),v=i.limit||10;F(w,{...i,limit:v+1});const p=w.as("paged_entities"),k=this.#e.client.with(h,b,p).select({...$("paged_entities"),domains:this.#r("paged_entities").as("domains"),owners:this.#s("paged_entities").as("owners")}).from(p),[E,s]=await Promise.all([k.run(),N]),f=E.rows,m=f.length>v;return{items:f.slice(0,v).map(R=>L(R)).filter(R=>R!==null),hasMore:m,total:s}}catch(y){return J.error("Error getting entities with relations (optimized path): "+y.message),{items:[],hasMore:!1,total:0}}}#n(i){return this.#t?S(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,_.entityKey)).where(n(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),this.#i(i),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))),B("remote.entities.key","remote.entities.version","remote.entities.revision"))),this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),this.#i(i),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))),B("entities.key","entities.version","entities.revision"))),this.#e.client.select(I("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(n(A(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),A(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),this.#c(i,"ea"),B("r.key","r.version","r.revision")))):this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),this.#i(i)))}#o(){return this.#t?S(this.#e.client.select(C).from(e`remote.entities_relations`),this.#e.client.select(C).from(O).where(g(this.#e.client.select({id:C.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${O.sourceKey}`)))):this.#e.client.select(C).from(O)}#l(){return this.#t?S(this.#e.client.select(d).from(e`remote.entities`).where(n(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(d).from(t).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(I("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(n(A(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),A(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1))))):this.#e.client.select(d).from(t).where(n(r(t.isCurrent,!0),r(t.isDeleted,!1)))}async getEntityWithRelationsByKey(i,o,a){if(!i||i.trim()==="")return null;const l=o?.revision,c=o?.version,h=l?null:await this.#h(i,c||null),b=c??h?.version,w=l||h?.revision||null,y=(this.#t?S(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,_.entityKey)).where(n(e`remote.entities.key = ${i}`,this.#i(a),g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.key,i),this.#i(a),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(I("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(n(e`r.key = ${i}`,this.#c(a,"ea")))):this.#e.client.select($("entities")).from(t).leftJoin(_,r(t.key,_.entityKey)).where(n(r(t.key,i),this.#i(a)))).as("e"),v=(this.#t?S(this.#e.client.select(C).from(e`remote.entities_relations`),this.#e.client.select(C).from(O).where(g(this.#e.client.select({id:C.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${O.sourceKey}`)))):this.#e.client.select(C).from(O)).as("combined_relations"),k=(this.#t?S(this.#e.client.select(d).from(e`remote.entities`).where(g(this.#e.client.select({id:d.id}).from(t).where(n(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`)))),this.#e.client.select(d).from(t).where(g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(n(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`)))),this.#e.client.select(I("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`)):this.#e.client.select(d).from(t)).as("combined_target_entities"),E=this.#e.client.with(y,v,k).select({...$("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(y).$dynamic();w?E.where(n(r(e.raw("revision"),w),b?r(e.raw("version"),b):void 0)):E.where(r(e.raw("is_current"),1)),E.limit(1);const s=await E.run();if(s.rows.length===0)return null;const f=s.rows[0];return L(f)}async#h(i,o){if(o){const c=await(this.#t?S(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(n(e`key = ${i}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.version,o),g(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(n(e`remote.key = ${t.key}`,e`remote.version = ${o}`))))).orderBy(V(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.version,o))).orderBy(V(t.revision))).limit(1).run();if(c.rows.length>0){const h=c.rows[0];return{version:h.version||null,revision:h.revision||null}}return null}if(this.#t){const l=await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`(
36
+ SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${Y("version")} DESC, revision DESC) as rn
37
+ FROM (
38
+ SELECT version, revision FROM remote.entities WHERE key = ${i} AND is_current = 1
39
+ UNION ALL
40
+ SELECT version, revision FROM entities WHERE key = ${i} AND is_current = 1
41
+ )
42
+ ) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(l.rows.length>0){const c=l.rows[0];return{version:c.version||null,revision:c.revision||null}}return null}const a=await this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(n(r(t.key,i),r(t.isCurrent,!0))).limit(1).run();if(a.rows.length>0){const l=a.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}#r(i){return e`
36
43
  COALESCE(
37
44
  (
38
45
  SELECT json_group_array(
@@ -53,25 +60,25 @@ import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";impo
53
60
  FROM combined_relations er
54
61
  JOIN combined_target_entities d ON d.key = er.source_key
55
62
  WHERE er.source_to_target_relation = 'hasParts'
56
- AND er.target_key = ${e.raw(`${t}.key`)}
63
+ AND er.target_key = ${e.raw(`${i}.key`)}
57
64
  AND d.type = 'domain'
58
65
  AND d.is_current = 1
59
66
  AND CASE
60
- WHEN ${e.raw(`${t}.version`)} = ''
67
+ WHEN ${e.raw(`${i}.version`)} = ''
61
68
  THEN er.target_version = ''
62
- ELSE (er.target_version = ${e.raw(`${t}.version`)} OR er.target_version = '')
69
+ ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
63
70
  END
64
71
  AND CASE
65
- WHEN ${e.raw(`${t}.revision`)} = ''
72
+ WHEN ${e.raw(`${i}.revision`)} = ''
66
73
  THEN 1 = 1
67
- ELSE (er.target_revision <= ${e.raw(`${t}.revision`)} OR er.target_revision = '')
74
+ ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
68
75
  END
69
76
  LIMIT 10
70
77
  ) d
71
78
  ),
72
79
  json_array()
73
80
  )
74
- `}#r(t){return e`
81
+ `}#s(i){return e`
75
82
  COALESCE(
76
83
  (
77
84
  SELECT json_group_array(
@@ -92,21 +99,21 @@ import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";impo
92
99
  FROM combined_relations er
93
100
  JOIN combined_target_entities o ON o.key = er.source_key
94
101
  WHERE er.source_to_target_relation = 'owns'
95
- AND er.target_key = ${e.raw(`${t}.key`)}
102
+ AND er.target_key = ${e.raw(`${i}.key`)}
96
103
  AND o.is_current = 1
97
104
  AND CASE
98
- WHEN ${e.raw(`${t}.version`)} = ''
105
+ WHEN ${e.raw(`${i}.version`)} = ''
99
106
  THEN er.target_version = ''
100
- ELSE (er.target_version = ${e.raw(`${t}.version`)} OR er.target_version = '')
107
+ ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
101
108
  END
102
109
  AND CASE
103
- WHEN ${e.raw(`${t}.revision`)} = ''
110
+ WHEN ${e.raw(`${i}.revision`)} = ''
104
111
  THEN 1 = 1
105
- ELSE (er.target_revision <= ${e.raw(`${t}.revision`)} OR er.target_revision = '')
112
+ ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
106
113
  END
107
114
  LIMIT 10
108
115
  ) o
109
116
  ),
110
117
  json_array()
111
118
  )
112
- `}}export{U as CatalogEntitiesBffRepository};
119
+ `}#i(i){if(!(!i||i.length===0))return A(X(_.rbacTeams),e`json_array_length(${_.rbacTeams}) = 0`,x(this.#e.client.select({id:e.raw("1")}).from(e`json_each(${_.rbacTeams}) as entity_teams`).where(z(e`entity_teams.value`,i))))}#c(i,o="ea"){if(!(!i||i.length===0))return A(e.raw(`${o}.rbac_teams IS NULL`),e.raw(`json_array_length(${o}.rbac_teams) = 0`),x(this.#e.client.select({id:e.raw("1")}).from(e.raw(`json_each(${o}.rbac_teams) as entity_teams`)).where(z(e`entity_teams.value`,i))))}}export{ae as CatalogEntitiesBffRepository};
@@ -2,6 +2,7 @@ import type { BffCatalogEntity, BffCatalogRelatedEntity } from '@redocly/theme/c
2
2
  import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
3
3
  import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
4
4
  import type { DatabaseClient } from '../../../../../providers/database/client.js';
5
+ import type { Filter } from '../../../../../providers/database/pagination/types.js';
5
6
  import { type EntityReadModelSchema, type EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
6
7
  export type ListResult<T> = {
7
8
  items: T[];
@@ -27,15 +28,15 @@ export declare class CatalogEntitiesLocalReadRepository {
27
28
  type: string;
28
29
  count: number;
29
30
  }[]>;
30
- getEntityByKey(key: string): Promise<EntityReadModelSchema | null>;
31
- getOneOutdatedEntity(): Promise<EntityReadModelSchema | null>;
31
+ getEntityById(id: string): Promise<EntityReadModelSchema | null>;
32
+ getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
32
33
  getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
33
34
  getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
34
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
35
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
35
36
  getEntityWithRelationsByKey(entityKey: string, filter?: {
36
37
  revision?: string | null;
37
38
  version?: string | null;
38
- }): Promise<BffCatalogEntity | null>;
39
+ }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
39
40
  getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
40
41
  targetKey: string;
41
42
  targetRevision: string;
@@ -1,4 +1,15 @@
1
- import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as b}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as k}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as O}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";class j{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new I(this.#e,this.#t||""),this.#s=new g(this.#e,this.#t||"")}async attachDatabase(i){this.#t!==i&&(this.#t=i,await this.#e.client.run(e`ATTACH DATABASE ${i} AS remote`),this.#i=new I(this.#e,i),this.#s=new g(this.#e,i))}async getEntities(i={}){const s=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=this.#e.client.select(c).from(s.as("combined_entities")),o=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=r.$dynamic(),d=i.limit||10,h=S(u,{...i,limit:d+1}),[T,N]=await Promise.all([h.run(),a]),p=T.rows,w=p.length>d;return{items:p.slice(0,d).map(R=>O(R)).filter(R=>R!==null),hasMore:w,total:N}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${k})`.as("keyVersion")}).from(e`remote.entities`).where(l(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(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}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),v(t.key))),r=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(r.rows.map(o=>o.keyVersion))}async listEntityRevisions(i,s){const r=[n(t.key,i),n(t.isDeleted,!1),...s?[n(t.version,s)]:[]],o=this.#t?f(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(l(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(l(...r,E(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(l(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(l(...r));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(o.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(a=>({version:a.version||null,revision:a.revision??"",isCurrent:a.is_current!==null?!!a.is_current:!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDefaultVersion:a.is_default_version!==null?!!a.is_default_version:!1}))}async getEntitiesCountByTypes(){const i=this.#t?f(this.#e.client.select({type:e`type`}).from(e`remote.entities`).where(l(n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1),E(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1)));return this.#e.client.select({type:t.type,count:L()}).from(i.as("combined_entities")).groupBy(t.type).where(n(t.isDeleted,!1))}async getEntityByKey(i){const o=(await(this.#t?f(this.#e.client.select(c).from(e`remote.entities`).where(l(n(t.key,i),n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1),E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1)))).run()).rows[0];return o?O(o):null}async getOneOutdatedEntity(){const i=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=(await this.#e.client.select(c).from(i.as("combined_entities")).where(D(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 r?O(r):null}async getEntitiesRelations(i={}){const s=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(y).where(E(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${y.sourceKey}`)))):this.#e.client.select(m).from(y),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=i.limit||10,d=S(r,{...i,limit:u+1}),[h,T]=await Promise.all([d.run(),a]),N=h.rows,p=N.length>u;return{items:N.slice(0,u).map(w=>C(w)).filter(w=>w!==null),hasMore:p,total:T}}async getEntityRelationById(i){const o=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(n(y.id,i)),this.#e.client.select(m).from(y).where(l(n(y.id,i),E(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${y.id}`))))):this.#e.client.select(m).from(y).where(n(y.id,i))).run()).rows[0];return o?C(o):null}async getEntitiesWithRelations(i={}){return this.#s.getEntitiesWithRelations(i)}async getEntityWithRelationsByKey(i,s){return this.#s.getEntityWithRelationsByKey(i,s)}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities(i,s={}){return this.#i.getRelatedEntities(i,s)}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#r(i),(s.includes("domains")||s.includes("owners"))&&await this.#n(),await this.#o(s)}catch(r){return console.error("Error fetching catalog filters:",r),{}}finally{await this.#l()}}async#r(i){if(this.#t?await this.#e.client.run(e`
1
+ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as F}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as A}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{applyFilter as B}from"../../../../../providers/database/pagination/filter.js";import{FIELDS_TO_SELECT_FOR_ENTITY as _,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as k}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as E}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as b}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as L}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as M}from"../utils/normalize-revision-flags.js";class te{#e;#t=void 0;#i;#r;constructor(t){this.#e=t,this.#i=new I(this.#e,this.#t||""),this.#r=new g(this.#e,this.#t||"")}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`),this.#i=new I(this.#e,t),this.#r=new g(this.#e,t))}async getEntities(t={}){const r=this.#t?f(this.#e.client.select(_).from(e`remote.entities`).where(y(this.#e.client.select({id:_.id}).from(i).where(c(e`${i.key} = remote.entities.key`,e`${i.version} = remote.entities.version`,e`${i.revision} = remote.entities.revision`)))),this.#e.client.select(_).from(i).where(y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(c(e`r.key = ${i.key}`,e`r.version = ${i.version}`,e`r.revision = ${i.revision}`)))),this.#e.client.select(b("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`)):this.#e.client.select(_).from(i),s=this.#e.client.select(_).from(r.as("combined_entities")),n=this.#e.client.select(_).from(r.as("combined_entities")).$dynamic(),d=S(n,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(d),a=s.$dynamic(),o=t.limit||10,h=S(a,{...t,limit:o+1}),[N,p]=await Promise.all([h.run(),l]),w=N.rows,T=w.length>o;return{items:w.slice(0,o).map(R=>k(R)).filter(R=>R!==null),hasMore:T,total:p}}async getEntityKeysAndVersionsBySourceFile(t){const r=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${A})`.as("keyVersion")}).from(e`remote.entities`).where(c(e`source_file = ${t}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${i.key} || ':' || COALESCE(${i.version}, ${A})`.as("keyVersion")}).from(i).where(c(u(i.sourceFile,t),u(i.source,"file"),e`${i.key} IS NOT NULL`,y(this.#e.client.select({key:e.raw("key")}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`))))):this.#e.client.select({keyVersion:e`${i.key} || ':' || COALESCE(${i.version}, ${A})`.as("keyVersion")}).from(i).where(c(u(i.sourceFile,t),u(i.source,"file"),D(i.key))),s=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(r.as("combined_keys_versions")).run();return new Set(s.rows.map(n=>n.keyVersion))}async listEntityRevisions(t,r){const s=[u(i.key,t),u(i.isDeleted,!1),...r?[u(i.version,r)]:[]],n={version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")},d=this.#t?f(this.#e.client.select(n).from(e`remote.entities`).where(c(e`key = ${t}`,e`is_deleted = 0`,r?e`version = ${r}`:void 0,y(this.#e.client.select({id:e.raw("id")}).from(i).where(c(e`${i.key} = remote.entities.key`,e`${i.version} = remote.entities.version`,e`${i.revision} = remote.entities.revision`))))),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...s,y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(c(e`r.key = ${i.key}`,e`r.version = ${i.version}`,e`r.revision = ${i.revision}`))))),this.#e.client.select({version:e.raw("r.version AS version"),revision:e.raw("r.revision AS revision"),isCurrent:e.raw("MAX(r.is_current, l.is_current) AS is_current"),createdAt:e.raw("MIN(r.created_at, l.created_at) AS created_at"),updatedAt:e.raw("MAX(r.updated_at, l.updated_at) AS updated_at"),isDefaultVersion:e.raw("MAX(r.is_default_version, l.is_default_version) AS is_default_version")}).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(c(e`r.key = ${t}`,e`r.is_deleted = 0`,e`l.is_deleted = 0`,r?e`r.version = ${r}`:void 0))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...s)),a=(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(d.as("combined_revisions")).orderBy(e`${L("version")} DESC`,e.raw("revision DESC")).run()).rows.map(o=>({version:o.version||null,revision:o.revision??"",isCurrent:o.is_current!==null?!!o.is_current:!1,createdAt:o.created_at||null,updatedAt:o.updated_at||null,isDefaultVersion:o.is_default_version!==null?!!o.is_default_version:!1}));return M(a),a}async getEntitiesCountByTypes(){if(this.#t){const t=e`
2
+ SELECT key, type, version,
3
+ ROW_NUMBER() OVER (
4
+ PARTITION BY key
5
+ ORDER BY ${L("version")} DESC
6
+ ) as rn
7
+ FROM (
8
+ SELECT key, type, version FROM remote.entities WHERE is_current = 1 AND is_deleted = 0
9
+ UNION ALL
10
+ SELECT key, type, version FROM entities WHERE is_current = 1 AND is_deleted = 0
11
+ )
12
+ `;return this.#e.client.select({type:e`type`,count:v()}).from(e`(SELECT * FROM (${t}) WHERE rn = 1) as highest_version_entities`).groupBy(e`type`)}return this.#e.client.select({type:i.type,count:v()}).from(i).where(c(u(i.isCurrent,!0),u(i.isDeleted,!1))).groupBy(i.type)}async getEntityById(t){const n=(await(this.#t?f(this.#e.client.select(_).from(e`remote.entities`).where(e`id = ${t}`),this.#e.client.select(_).from(i).where(u(i.id,t))):this.#e.client.select(_).from(i).where(u(i.id,t))).run()).rows[0];return n?k(n):null}async getOutdatedEntities(t){const r=this.#t?f(this.#e.client.select(_).from(e`remote.entities`),this.#e.client.select(_).from(i).where(y(this.#e.client.select({id:_.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(_).from(i),s=this.#e.client.select(_).from(r.as("combined_entities")).$dynamic(),{whereCondition:n}=B(s,t),d=$(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`),l=n?c(n,d):d;return(await s.where(l).run()).rows.map(o=>k(o)).filter(o=>o!==null)}async getEntitiesRelations(t={}){const r=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(E).where(y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${E.sourceKey}`)))):this.#e.client.select(m).from(E),s=this.#e.client.select(m).from(r.as("combined_entities_relations")).$dynamic(),n=this.#e.client.select(m).from(r.as("combined_entities_relations")).$dynamic(),d=S(n,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(d),a=t.limit||10,o=S(s,{...t,limit:a+1}),[h,N]=await Promise.all([o.run(),l]),p=h.rows,w=p.length>a;return{items:p.slice(0,a).map(T=>C(T)).filter(T=>T!==null),hasMore:w,total:N}}async getEntityRelationById(t){const n=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(u(E.id,t)),this.#e.client.select(m).from(E).where(c(u(E.id,t),y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${E.id}`))))):this.#e.client.select(m).from(E).where(u(E.id,t))).run()).rows[0];return n?C(n):null}async getEntitiesWithRelations(t={},r){return this.#r.getEntitiesWithRelations(t,r)}async getEntityWithRelationsByKey(t,r,s){return this.#r.getEntityWithRelationsByKey(t,r,s)}async getRelationsForEntity(t,r,s){return this.#i.getRelationsForEntity(t,r,s)}async getRelatedEntities(t,r={}){return this.#i.getRelatedEntities(t,r)}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:r=[]}){if(!r.length)return{};try{return await this.#s(t),(r.includes("domains")||r.includes("owners"))&&await this.#n(),await this.#o(r)}catch(s){return console.error("Error fetching catalog filters:",s),{}}finally{await this.#l()}}async#s(t){if(this.#t?await this.#e.client.run(e`
2
13
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
3
14
  SELECT
4
15
  e.key,
@@ -25,10 +36,10 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
25
36
  metadata
26
37
  FROM entities
27
38
  WHERE is_current = 1
28
- `),i.length){const s=i.map(r=>`'${r.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
39
+ `),t.length){const r=t.map(s=>`'${s.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
29
40
  CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
30
41
  SELECT * FROM temp_combined_entities
31
- WHERE type IN (${s})
42
+ WHERE type IN (${r})
32
43
  `))}else await this.#e.client.run(e`
33
44
  CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
34
45
  SELECT * FROM temp_combined_entities
@@ -41,14 +52,15 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
41
52
  target_key,
42
53
  source_to_target_relation
43
54
  FROM remote.entities_relations
55
+ WHERE COALESCE(is_deleted, 0) = 0
44
56
  UNION ALL
45
57
  SELECT
46
58
  er.source_key,
47
59
  er.target_key,
48
60
  er.source_to_target_relation
49
61
  FROM entities_relations er
50
- LEFT JOIN remote.entities_relations r ON r.source_key = er.source_key
51
- WHERE r.source_key IS NULL
62
+ LEFT JOIN remote.entities_relations r ON r.source_key = er.source_key AND r.target_key = er.target_key
63
+ WHERE r.source_key IS NULL AND COALESCE(er.is_deleted, 0) = 0
52
64
  `):await this.#e.client.run(e`
53
65
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
54
66
  SELECT
@@ -56,18 +68,19 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
56
68
  target_key,
57
69
  source_to_target_relation
58
70
  FROM entities_relations
71
+ WHERE COALESCE(is_deleted, 0) = 0
59
72
  `),await this.#e.client.run(e`
60
73
  CREATE INDEX IF NOT EXISTS idx_temp_rel_source ON temp_combined_relations(source_key)
61
74
  `),await this.#e.client.run(e`
62
75
  CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
63
76
  `),await this.#e.client.run(e`
64
77
  CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
65
- `)}async#o(i){const s={},r=[],o=i.filter(u=>u.startsWith("metadata."));i.includes("type")&&r.push(`
78
+ `)}async#o(t){const r={},s=[],n=t.filter(a=>a.startsWith("metadata."));t.includes("type")&&s.push(`
66
79
  SELECT 'type' as filter_name, type as value, COUNT(*) as count
67
80
  FROM temp_filtered_entities
68
81
  WHERE type IS NOT NULL
69
82
  GROUP BY type
70
- `),i.includes("tags")&&r.push(`
83
+ `),t.includes("tags")&&s.push(`
71
84
  SELECT 'tags' as filter_name, tag.value as value, COUNT(DISTINCT tfe.key) as count
72
85
  FROM temp_filtered_entities tfe,
73
86
  json_each(COALESCE(tfe.tags, json_array())) as tag
@@ -76,7 +89,7 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
76
89
  AND tag.value IS NOT NULL
77
90
  AND tag.value != ''
78
91
  GROUP BY tag.value
79
- `),i.includes("domains")&&r.push(`
92
+ `),t.includes("domains")&&s.push(`
80
93
  SELECT 'domains' as filter_name, tcr.source_key as value, COUNT(DISTINCT tfe.key) as count
81
94
  FROM temp_combined_relations tcr
82
95
  INNER JOIN temp_filtered_entities tfe ON tfe.key = tcr.target_key
@@ -84,7 +97,7 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
84
97
  WHERE tce.type = 'domain'
85
98
  AND tcr.source_to_target_relation = 'hasParts'
86
99
  GROUP BY tcr.source_key
87
- `),i.includes("owners")&&r.push(`
100
+ `),t.includes("owners")&&s.push(`
88
101
  SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
89
102
  FROM (
90
103
  SELECT
@@ -104,12 +117,12 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
104
117
  INNER JOIN temp_combined_entities tce ON tce.key = owner_key
105
118
  WHERE owner_key IS NOT NULL
106
119
  GROUP BY owner_key
107
- `);for(const u of o)await this.#a(u,s);if(r.length===0)return s;const _=r.join(" UNION ALL "),a=await this.#e.client.run(e.raw(_));if(a?.rows)for(const u of a.rows){const d=u.filter_name,h=u.value,T=Number(u.count)||0;s[d]||(s[d]=[]),h&&s[d].push({value:h,count:T})}return s}async#a(i,s){const r=i.substring(9),o=`$.${$(r)}`,_=await this.#e.client.run(e.raw(`
108
- SELECT json_extract(metadata, '${o}') as value, COUNT(*) as count
120
+ `);for(const a of n)await this.#a(a,r);if(s.length===0)return r;const d=s.join(" UNION ALL "),l=await this.#e.client.run(e.raw(d));if(l?.rows)for(const a of l.rows){const o=a.filter_name,h=a.value,N=Number(a.count)||0;r[o]||(r[o]=[]),h&&r[o].push({value:h,count:N})}return r}async#a(t,r){const s=t.substring(9),n=`$.${U(s)}`,d=await this.#e.client.run(e.raw(`
121
+ SELECT json_extract(metadata, '${n}') as value, COUNT(*) as count
109
122
  FROM temp_filtered_entities
110
123
  WHERE metadata IS NOT NULL
111
124
  AND metadata != ''
112
- AND json_extract(metadata, '${o}') IS NOT NULL
113
- AND json_extract(metadata, '${o}') != ''
125
+ AND json_extract(metadata, '${n}') IS NOT NULL
126
+ AND json_extract(metadata, '${n}') != ''
114
127
  GROUP BY value
115
- `));_?.rows&&(s[i]=_.rows.map(a=>({value:a.value,count:Number(a.count)||0})).filter(a=>a.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(i){b.error("Error cleaning up temp tables:",i)}}}function $(A){return A.replace(/[^a-zA-Z0-9._-]/g,"")}export{j as CatalogEntitiesLocalReadRepository};
128
+ `));d?.rows&&(r[t]=d.rows.map(l=>({value:l.value,count:Number(l.count)||0})).filter(l=>l.value))}async#l(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(t){F.error("Error cleaning up temp tables:",t)}}}function U(O){return O.replace(/[^a-zA-Z0-9._-]/g,"")}export{te as CatalogEntitiesLocalReadRepository};
@@ -5,6 +5,7 @@ import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/e
5
5
  import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
6
6
  import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
7
7
  import type { SidebarConnectedEntity } from '@redocly/theme/core/types';
8
+ import type { EntityReadModelSchema } from '../../../../../plugins/catalog-entities/schemas/read-model-schemas.js';
8
9
  import { BaseRepository } from '../../../../../providers/database/base-repository.js';
9
10
  import { type CreateEntityParams, type CreateEntityResult } from './catalog-entities-local-write-repository.js';
10
11
  export declare class CatalogEntitiesLocalRepository extends BaseRepository {
@@ -14,8 +15,8 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
14
15
  getEntitySources(): Record<string, SidebarConnectedEntity>;
15
16
  static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
16
17
  attachDatabase(databasePath: string): Promise<void>;
17
- getEntities(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema>>;
18
- getEntityByKey(key: string): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
18
+ getEntities(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<EntityReadModelSchema>>;
19
+ getEntityById(id: string): Promise<EntityReadModelSchema | null>;
19
20
  getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
20
21
  getEntitiesCountByTypes(): Promise<{
21
22
  type: string;
@@ -49,22 +50,22 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
49
50
  sourceKey: string;
50
51
  targetKey: string;
51
52
  } | null>;
52
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
53
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
53
54
  getEntityWithRelationsByKey(entityKey: string, filter?: {
54
55
  revision?: string | null;
55
56
  version?: string | null;
56
- }): Promise<import("@redocly/theme").BffCatalogEntity | null>;
57
+ }, rbacTeams?: string[]): Promise<import("@redocly/theme").BffCatalogEntity | null>;
57
58
  getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
58
59
  createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
59
60
  createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
60
61
  createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<{
61
62
  id: string;
63
+ createdAt: string;
64
+ updatedAt: string;
62
65
  organizationId: string;
63
66
  projectId: string;
64
67
  sourceFile: string | null;
65
68
  isDeleted: boolean | null;
66
- createdAt: string;
67
- updatedAt: string;
68
69
  sourceKey: string;
69
70
  targetKey: string;
70
71
  sourceVersion: string;
@@ -87,9 +88,10 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
87
88
  deleteEntityRelation(id: string): Promise<string | null>;
88
89
  deleteEntityRelations(filter: Filter): Promise<boolean>;
89
90
  getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
90
- listEntityRevisions(entityKey: string, version?: string | null): Promise<import("../../../schemas/read-model-schemas.js").EntityRevisionSummary[]>;
91
+ listEntityRevisions(entityKey: string, version?: string | null): Promise<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRevisionSummary[]>;
91
92
  updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
92
93
  updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
93
- getOneOutdatedEntity(): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
94
+ getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
95
+ setEntitiesAsOutdated(filter: Filter): Promise<void>;
94
96
  }
95
97
  //# sourceMappingURL=catalog-entities-local-repository.d.ts.map
@@ -1 +1 @@
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
+ 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 g}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as I}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=I(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)}getEntityById(t){return this.#t.getEntityById(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={},e){return this.#t.getEntitiesWithRelations(t,e)}getEntityWithRelationsByKey(t,e,n){return this.#t.getEntityWithRelationsByKey(t,e,n)}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=g(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,E=y==="outgoing"?a:a.startsWith("reverse:")?a.slice(8):a;return!E||!d||!h?null:g({type:E,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)}getOutdatedEntities(t){return this.#t.getOutdatedEntities(t)}async setEntitiesAsOutdated(t){await this.#e.setEntitiesAsOutdated(t)}}export{s as CatalogEntitiesLocalRepository};
@@ -11,6 +11,7 @@ export type CreateEntityParams = {
11
11
  isRootEntity?: boolean;
12
12
  revision?: string;
13
13
  isDeleted?: boolean;
14
+ rbacTeams?: string[];
14
15
  };
15
16
  export type CreateEntityResult = {
16
17
  result: 'created';
@@ -24,7 +25,7 @@ export type CreateEntityResult = {
24
25
  export declare class CatalogEntitiesLocalWriteRepository {
25
26
  #private;
26
27
  constructor(db: DatabaseClient, organizationId: string, projectId: string);
27
- createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, }: CreateEntityParams): Promise<CreateEntityResult>;
28
+ createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, rbacTeams, }: CreateEntityParams): Promise<CreateEntityResult>;
28
29
  deleteEntity(entityKey: string): Promise<string | null>;
29
30
  /**
30
31
  * Deletes entities based on a filter.
@@ -37,5 +38,6 @@ export declare class CatalogEntitiesLocalWriteRepository {
37
38
  upsertEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
38
39
  updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
39
40
  updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
41
+ setEntitiesAsOutdated(filter: Filter): Promise<void>;
40
42
  }
41
43
  //# sourceMappingURL=catalog-entities-local-write-repository.d.ts.map
@@ -1 +1 @@
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:U,...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 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).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:c}).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};
1
+ import{and as m,eq as c,isNull as v,or as A,sql as N}from"drizzle-orm";import{logger as u}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as E}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as F}from"../../../../../utils/crypto/sha1.js";import{isWebView as b}from"../../../../../../utils/env/is-web-view.js";import{VERSION_NOT_SPECIFIED as O}from"@redocly/theme/core/constants";import{entitiesAttributesTable as D}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{createEntityDbRecord as U}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 r}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as C}from"../../../../../providers/database/pagination/filter.js";import{createEntityAttributesDbRecord as z}from"../../mappers/create-entity-attributes-db-record.js";import{RevisionRepository as P}from"../common/revision-repository.js";import{VersionRepository as j}from"../common/version-repository.js";const w=15;class re{#e;#t;#r;#i;#s;constructor(e,t,s){this.#e=e,this.#t=t,this.#r=s,this.#i=new P(e),this.#s=new j(e)}async createEntity({entity:e,fileHash:t,sourceFile:s,revision:a=new Date().toISOString(),isRootEntity:o=!1,isDeleted:n=!1,rbacTeams:y=[]}){try{const{relations:l=[],...f}=e,p=F(JSON.stringify(f)),d=e.version??O,g=await this.#i.shouldSkipRevisionCreation(e.key,d,p,o,n);if(await this.#o({entityKey:e.key,rbacTeams:y}),g)return{result:"skipped",entityKey:e.key};const h=await this.#i.shouldSetNewCurrentRevision({key:e.key,version:d,revision:a}),R=U({entity:{...e,revision:a,hash:p,isCurrent:h,isDefaultVersion:h,isDeleted:n,version:d},sourceFile:s,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:t}),{key:V,source:L,...K}=R;if(h&&(await this.#i.markAllRevisionsAsNotCurrent(V),await this.#s.markAllVersionsAsNotDefault(V)),b())return await this.#n(R,l),{result:"created",entityKey:e.key,entityRevision:a,entityVersion:d};const S=this.#e.client.insert(r).values(R).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:K}),T=l?.length&&l.length>0?this.#e.client.insert(i).values(l.map(k=>I({relation:k,sourceFile:s,fileHash:t,sourceKey:e.key,sourceVersion:d,sourceRevision:a??null,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[i.sourceKey,i.targetKey,i.sourceVersion,i.targetVersion,i.sourceRevision,i.targetRevision,i.sourceToTargetRelation]}).run():Promise.resolve();return await E([S,T],w,async k=>k),{result:"created",entityKey:e.key,entityRevision:a,entityVersion:d}}catch(l){return u.error("Error adding entity",l),{result:"error",entityKey:e.key}}}async deleteEntity(e){try{return await this.#e.client.delete(r).where(c(r.key,e)),e}catch(t){return u.error("Error deleting entity",t),null}}async deleteEntities(e){try{const t=C(e);if(!t)return!1;const s=await this.#e.client.delete(r).where(t).returning({key:r.key,source:r.source,isCurrent:r.isCurrent,isDefaultVersion:r.isDefaultVersion,version:r.version});if(s.length===0)return!0;const a=s.reduce((o,n)=>((n.isCurrent||n.isDefaultVersion)&&o.add(n.key),o),new Set);if(a.size===0)return!0;await E(Array.from(a),w,async o=>this.#i.ensureDefaultAndCurrentRevisionForKey(o));for(const o of s)await this.#e.client.delete(i).where(A(m(c(i.sourceKey,o.key),...o.version?[c(i.sourceVersion,o.version)]:[v(i.sourceVersion)]),m(c(i.targetKey,o.key),...o.version?[c(i.targetVersion,o.version)]:[v(i.targetVersion)])));return!0}catch(t){return u.error("Error deleting entities",t),!1}}async deleteEntityRelation(e){try{return await this.#e.client.delete(i).where(c(i.id,e)),e}catch{return null}}async softDeleteEntities(e,t,s){try{const a=e.map(n=>{const y={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:y,revision:t,sourceFile:n.sourceFile??"",fileHash:s,isDeleted:!0})});return await E(a,w,async n=>n)}catch(a){return u.error("Error soft deleting entities",a),[]}}async deleteEntityRelations(e){try{const t=C(e);return t?(await this.#e.client.delete(i).where(t),!0):!1}catch(t){return u.error("Error deleting entity relations",t),!1}}async upsertEntityRelation(e){if(!e)return null;try{const{sourceKey:t,targetKey:s,sourceVersion:a,targetVersion:o,sourceRevision:n,targetRevision:y,...l}=e,f=await this.#e.client.insert(i).values(e).onConflictDoUpdate({target:[i.sourceKey,i.targetKey,i.sourceVersion,i.targetVersion,i.sourceRevision,i.targetRevision,i.sourceToTargetRelation],set:l}).returning();return f?.length?f[0]:null}catch(t){return u.error("Error creating entity relation",t),null}}async#n(e,t){const{key:s,source:a,version:o,isDefaultVersion:n,...y}=e,p=(await this.#e.client.select({id:r.id}).from(r).where(m(c(r.key,s),c(r.source,a??"file"),o?c(r.version,o):v(r.version))).limit(1).run()).rows.length>0?this.#e.client.update(r).set(y).where(m(c(r.key,s),c(r.source,a??"file"),o?c(r.version,o):v(r.version))).run():this.#e.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:y}).run(),d=t?.map(g=>{const h=I({relation:g,sourceFile:e.sourceFile??"",fileHash:e.fileHash??"",sourceKey:e.key,sourceVersion:e.version??null,sourceRevision:e.revision??null,organizationId:this.#t,projectId:this.#r});return this.#e.client.insert(i).values(h).onConflictDoUpdate({target:[i.sourceKey,i.targetKey,i.sourceVersion,i.targetVersion,i.sourceRevision,i.targetRevision,i.sourceToTargetRelation],set:h}).run()})??[];await E([p,...d],w,async g=>g)}async updateEntityScorecardsStatus(e,t){try{return(await this.#e.client.update(r).set({scorecardsStatus:t}).where(c(r.id,e)).returning()).length>0}catch(s){return u.error("Error updating entity scorecards status",s),!1}}async updateEntityScorecardsStatusIfCalculating(e,t){try{return(await this.#e.client.update(r).set({scorecardsStatus:t}).where(N`${r.id} = ${e} AND ${r.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(s){return u.error("Error updating entity scorecards status if calculating",s),!1}}async#o({entityKey:e,rbacTeams:t}){try{await this.#e.client.insert(D).values(z({rbacTeams:t,entityKey:e,organizationId:this.#t,projectId:this.#r})).onConflictDoUpdate({target:[D.entityKey],set:{rbacTeams:JSON.stringify(t)}}).run()}catch(s){u.error("Error saving entity attributes",s)}}async setEntitiesAsOutdated(e){try{const t=C(e);await this.#e.client.update(r).set({scorecardsStatus:"OUTDATED"}).where(t)}catch(t){u.error("Error updating entities as outdated",t)}}}export{re as CatalogEntitiesLocalWriteRepository};
@@ -1 +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};
1
+ import{unionAll as w}from"drizzle-orm/sqlite-core";import{and as u,desc as p,eq as y,notExists as C,sql as i}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as D}from"@redocly/theme/core/constants";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 B,getFirstFilterFieldValue as N}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as O}from"../../../../../providers/database/pagination/index.js";import{createBffRelatedEntityFromQueryRow as K}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as Q}from"../../mappers/map-entity-relation-row.js";class M{#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=>Q(s)):[]}async getRelatedEntities(o,n={}){const d=N(n.filter,"version"),a=N(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,tags:e.tags,metadata:e.metadata,createdAt:e.createdAt,updatedAt:e.updatedAt,source:e.source,sourceFile:e.sourceFile,version:e.version,isDeleted:e.isDeleted,isCurrent:e.isCurrent,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${r.entityKey} ORDER BY ${r.priority} ASC, CASE WHEN ${r.entityRevision} = ${e.revision} THEN 1 ELSE 0 END DESC, 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} = '' OR ${e.isCurrent} = 1) AND (${r.entityVersion} = ${e.version} OR ${r.entityVersion} = '' OR ${e.version} = ${D})`).as("unique_relations"),m=i`${s.dedupRn} = 1 AND COALESCE(${s.isDeleted}, 0) = 0`,E=this.#e.client.select().from(s).$dynamic(),$=this.#e.client.select().from(s).$dynamic(),f=B(n.filter,["version","revision"]),R={...n,filter:f,baseWhereCondition:m},l=O($,{...R,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(l),h=n.limit||10,S=O(E,{...R,limit:h+1}),[V,A]=await Promise.all([S.run(),c]),g=V.rows.filter(v=>v.id!=null).map(v=>K(v)).filter(v=>v!==null),T=g.slice(0,h),F=g.length>h;return{items:T,hasMore:F,total:A}}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),C(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(p(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(p(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),C(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:n||null,revision:d}:await this.#r(o,n||null),r=n||a?.version||null,s=d||a?.revision||null,m=!r||r===D,E=m?i`1 = 1`:i`(${t.sourceVersion} = ${r} OR ${t.sourceVersion} = '')`,$=m?i`1 = 1`:i`(${t.targetVersion} = ${r} OR ${t.targetVersion} = '')`,f=s?i`(${t.sourceRevision} <= ${s} OR ${t.sourceRevision} = '')`:i`1 = 0`,R=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}, ${t.sourceToTargetRelation} 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),E,f)).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}, ${t.targetToSourceRelation} 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{M as CatalogEntitiesRelationsRepository};