@redocly/reef 0.133.0-next.1 → 0.133.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +59 -2
  2. package/dist/server/constants/plugins/catalog-entities.d.ts +2 -0
  3. package/dist/server/constants/plugins/catalog-entities.js +1 -1
  4. package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
  5. package/dist/server/persistence/cache/mappers/create-cache-read-model.d.ts +1 -1
  6. package/dist/server/persistence/cache/repositories/{cache-local-repository.d.ts → cache-repository.d.ts} +3 -3
  7. package/dist/server/persistence/cache/repositories/cache-repository.js +1 -0
  8. package/dist/server/persistence/cache/services/cache-service.d.ts +2 -2
  9. package/dist/server/persistence/cache/services/cache-service.js +1 -1
  10. package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
  11. package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.d.ts +2 -2
  12. package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.js +1 -1
  13. package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-read-repository.d.ts → file-hashes-read-repository.d.ts} +3 -7
  14. package/dist/server/persistence/file-hashes/repositories/file-hashes-read-repository.js +1 -0
  15. package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-repository.d.ts → file-hashes-repository.d.ts} +4 -3
  16. package/dist/server/persistence/file-hashes/repositories/file-hashes-repository.js +1 -0
  17. package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-write-repository.d.ts → file-hashes-write-repository.d.ts} +2 -2
  18. package/dist/server/persistence/file-hashes/repositories/file-hashes-write-repository.js +1 -0
  19. package/dist/server/persistence/file-hashes/services/file-hashes-service.d.ts +3 -5
  20. package/dist/server/persistence/file-hashes/services/file-hashes-service.js +1 -1
  21. package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
  22. package/dist/server/persistence/kv/mappers/create-kv-list-entry.d.ts +1 -1
  23. package/dist/server/persistence/kv/mappers/create-kv-value.d.ts +1 -1
  24. package/dist/server/persistence/kv/repositories/{kv-remote-repository.d.ts → kv-repository.d.ts} +3 -3
  25. package/dist/server/persistence/kv/repositories/kv-repository.js +2 -0
  26. package/dist/server/persistence/kv/services/kv-service.d.ts +2 -2
  27. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  28. package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.d.ts +6 -0
  29. package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.js +12 -0
  30. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +29 -66
  31. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  32. package/dist/server/plugins/catalog-entities/database/consts.d.ts +45 -0
  33. package/dist/server/plugins/catalog-entities/database/consts.js +1 -0
  34. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.d.ts +1 -2
  35. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
  36. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
  37. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
  38. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.d.ts +1 -3
  39. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  40. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.d.ts +1 -1
  41. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
  42. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.d.ts +3 -3
  43. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -1
  44. package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-bff-repository.d.ts → bffEntities/bff-entities-read-repository.d.ts} +4 -4
  45. package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.js +131 -0
  46. package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.d.ts +26 -0
  47. package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -0
  48. package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +8 -0
  49. package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.js +82 -0
  50. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +7 -7
  51. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -1
  52. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -1
  53. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +27 -0
  54. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.js +1 -0
  55. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +27 -0
  56. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -0
  57. package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +12 -0
  58. package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.js +1 -0
  59. package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-relations-repository.d.ts → relations/relations-read-repository.d.ts} +7 -4
  60. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.js +1 -0
  61. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.d.ts +28 -0
  62. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.js +1 -0
  63. package/dist/server/plugins/catalog-entities/database/repositories/types.d.ts +39 -0
  64. package/dist/server/plugins/catalog-entities/database/repositories/types.js +0 -0
  65. package/dist/server/plugins/catalog-entities/database/types.d.ts +26 -0
  66. package/dist/server/plugins/catalog-entities/database/types.js +0 -0
  67. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  68. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
  69. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  70. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
  71. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  72. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
  73. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  74. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
  75. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  76. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  77. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  78. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  79. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +38 -36
  80. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  81. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +1 -3
  82. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +3 -1
  83. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.d.ts +15 -0
  84. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  85. package/dist/server/plugins/catalog-entities/utils/hash-manager.d.ts +1 -0
  86. package/dist/server/plugins/catalog-entities/utils/hash-manager.js +1 -1
  87. package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.d.ts +18 -0
  88. package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.js +1 -0
  89. package/dist/server/plugins/entitlements/index.js +1 -1
  90. package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.d.ts +0 -1
  91. package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.js +1 -1
  92. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  93. package/dist/server/plugins/mcp/types.d.ts +5 -0
  94. package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +1 -0
  95. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
  96. package/dist/server/plugins/scorecards/database/repositories/{local/scorecards-config-local-repository.d.ts → scorecards-config-repository.d.ts} +4 -4
  97. package/dist/server/plugins/scorecards/database/repositories/scorecards-config-repository.js +1 -0
  98. package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -1
  99. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +1 -1
  100. package/dist/server/providers/database/base-repository.js +2 -2
  101. package/dist/server/providers/database/client.d.ts +1 -1
  102. package/dist/server/providers/database/client.js +1 -1
  103. package/dist/server/providers/database/constants.d.ts +4 -9
  104. package/dist/server/providers/database/constants.js +1 -1
  105. package/dist/server/providers/database/copy-migrations.js +1 -1
  106. package/dist/server/providers/database/database-connection-factory.d.ts +2 -2
  107. package/dist/server/providers/database/database-connection-factory.js +1 -1
  108. package/dist/server/providers/database/database-connections-manager.d.ts +3 -8
  109. package/dist/server/providers/database/database-connections-manager.js +1 -1
  110. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  111. package/dist/server/providers/database/databases/sqlite-db/drizzle.config.d.ts +12 -0
  112. package/dist/server/providers/database/databases/sqlite-db/drizzle.config.js +1 -0
  113. package/dist/server/providers/database/databases/sqlite-db/migrations/0009_add-missing-local-tables.sql +41 -0
  114. package/dist/server/providers/database/databases/sqlite-db/migrations/0010_add-last-seen-run-id-to-entities-tables.sql +4 -0
  115. package/dist/server/providers/database/databases/sqlite-db/migrations/0011_update-entities-relations-index.sql +2 -0
  116. package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0009_snapshot.json +1141 -0
  117. package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0010_snapshot.json +1165 -0
  118. package/dist/server/providers/database/databases/sqlite-db/migrations/meta/0011_snapshot.json +1165 -0
  119. package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/_journal.json +21 -0
  120. package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.d.ts +19 -0
  121. package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.js +1 -1
  122. package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.d.ts +19 -0
  123. package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.js +1 -1
  124. package/dist/server/providers/database/pagination/limit.d.ts +5 -0
  125. package/dist/server/providers/database/pagination/limit.js +1 -1
  126. package/dist/server/providers/database/transient-sqld-error.d.ts +14 -0
  127. package/dist/server/providers/database/transient-sqld-error.js +1 -0
  128. package/dist/server/providers/database/types.d.ts +6 -6
  129. package/dist/server/providers/database/utils/get-first-row.d.ts +19 -0
  130. package/dist/server/providers/database/utils/get-first-row.js +1 -0
  131. package/dist/server/store.d.ts +1 -0
  132. package/dist/server/store.js +1 -1
  133. package/dist/server/types/plugins/common.d.ts +1 -0
  134. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  135. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  136. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +0 -147
  137. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -1
  138. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -1
  139. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +1 -2
  140. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +1 -2
  141. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +1 -2
  142. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +1 -1
  143. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +1 -1
  144. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +1 -1
  145. package/dist/server/workers/mcp-tool-worker-pool.d.ts +1 -0
  146. package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
  147. package/dist/server/workers/mcp-tool-worker.js +1 -1
  148. package/dist/server/workers/types.d.ts +5 -1
  149. package/package.json +9 -9
  150. package/dist/server/persistence/cache/repositories/cache-local-repository.js +0 -1
  151. package/dist/server/persistence/file-hashes/repositories/file-hashes-local-read-repository.js +0 -1
  152. package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.js +0 -1
  153. package/dist/server/persistence/file-hashes/repositories/file-hashes-local-write-repository.js +0 -1
  154. package/dist/server/persistence/file-hashes/repositories/utils.d.ts +0 -10
  155. package/dist/server/persistence/file-hashes/repositories/utils.js +0 -1
  156. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +0 -2
  157. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +0 -123
  158. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +0 -98
  159. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +0 -145
  160. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +0 -100
  161. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +0 -1
  162. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +0 -43
  163. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +0 -1
  164. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +0 -1
  165. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +0 -20
  166. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +0 -1
  167. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +0 -1
  168. package/dist/server/providers/database/database-initialization-strategy.d.ts +0 -17
  169. package/dist/server/providers/database/database-initialization-strategy.js +0 -1
  170. package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.d.ts +0 -11
  171. package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.js +0 -1
  172. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0001_catalog-versions-and-revisions.sql +0 -20
  173. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0002_add-scorecards-status.sql +0 -1
  174. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0003_catalog_versions_and_revisions_relations.sql +0 -46
  175. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0004_normalize_relation_types.sql +0 -147
  176. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +0 -2
  177. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +0 -11
  178. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0001_snapshot.json +0 -378
  179. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0002_snapshot.json +0 -385
  180. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0003_snapshot.json +0 -392
  181. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0004_snapshot.json +0 -392
  182. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +0 -393
  183. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +0 -458
  184. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +0 -55
  185. package/dist/server/providers/database/databases/main-sqlite/drizzle.config.d.ts +0 -10
  186. package/dist/server/providers/database/databases/main-sqlite/drizzle.config.js +0 -1
  187. package/dist/server/providers/database/databases/main-sqlite/migrations/0000_initial_migration.sql +0 -11
  188. package/dist/server/providers/database/databases/main-sqlite/migrations/0001_update_file_hashes_file_type_values.sql +0 -10
  189. package/dist/server/providers/database/databases/main-sqlite/migrations/0002_cache-table.sql +0 -11
  190. package/dist/server/providers/database/databases/main-sqlite/migrations/0003_file-path-added.sql +0 -6
  191. package/dist/server/providers/database/databases/main-sqlite/migrations/0004_add-scorecards-tables.sql +0 -10
  192. package/dist/server/providers/database/databases/main-sqlite/migrations/0005_recreate-scorecards-config.sql +0 -25
  193. package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +0 -19
  194. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0000_snapshot.json +0 -82
  195. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0001_snapshot.json +0 -82
  196. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0002_snapshot.json +0 -146
  197. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0003_snapshot.json +0 -153
  198. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0004_snapshot.json +0 -221
  199. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0005_snapshot.json +0 -263
  200. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +0 -261
  201. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +0 -55
  202. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.d.ts +0 -14
  203. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +0 -1
  204. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0000_initial_migration.sql +0 -46
  205. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0000_snapshot.json +0 -307
  206. /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/migrations/0000_initial_migration.sql +0 -0
  207. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0001_add_kv_table.sql +0 -0
  208. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0002_catalog-versions-and-revisions.sql +0 -0
  209. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0003_add-scorecards-tables.sql +0 -0
  210. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0004_add-scorecards-status.sql +0 -0
  211. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0005_recreate-scorecards-tables.sql +0 -0
  212. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0006_catalog-versions-and-revisions-relations.sql +0 -0
  213. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0007_catalog-relations-constraint-fix.sql +0 -0
  214. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/0008_add-catalog-entitities-attributes-table.sql +0 -0
  215. /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/migrations/meta/0000_snapshot.json +0 -0
  216. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0001_snapshot.json +0 -0
  217. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0002_snapshot.json +0 -0
  218. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0003_snapshot.json +0 -0
  219. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0004_snapshot.json +0 -0
  220. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0005_snapshot.json +0 -0
  221. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0006_snapshot.json +0 -0
  222. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0007_snapshot.json +0 -0
  223. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/migrations/meta/0008_snapshot.json +0 -0
  224. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.d.ts +0 -0
  225. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.js +0 -0
  226. /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.d.ts +0 -0
  227. /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.js +0 -0
  228. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.d.ts +0 -0
  229. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.js +0 -0
  230. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.d.ts +0 -0
  231. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.js +0 -0
  232. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.d.ts +0 -0
  233. /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.js +0 -0
  234. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.d.ts +0 -0
  235. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.js +0 -0
  236. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.d.ts +0 -0
  237. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.js +0 -0
  238. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.d.ts +0 -0
  239. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.js +0 -0
  240. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.d.ts +0 -0
  241. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.js +0 -0
  242. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.d.ts +0 -0
  243. /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.js +0 -0
@@ -1 +0,0 @@
1
- import{sql as a}from"drizzle-orm";const e={id:a.raw("id"),fileType:a.raw("file_type"),filePath:a.raw("file_path"),hash:a.raw("hash"),status:a.raw("status"),createdAt:a.raw("created_at"),updatedAt:a.raw("updated_at")};export{e as FIELDS_TO_SELECT_FOR_FILE_HASH};
@@ -1,2 +0,0 @@
1
- import{eq as K,and as h,gte as u,gt as B,lt as f,asc as S,desc as L,or as w,isNull as b,sql as s,inArray as M,count as N}from"drizzle-orm";import{logger as i}from"../../../tools/notifiers/logger.js";import{kvTable as t}from"../../../providers/database/databases/sqld-sqlite/schemas/kv-table.js";import{BaseRepository as T}from"../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as $}from"../../../providers/database/database-connection-factory.js";import{createKvValue as D}from"../mappers/create-kv-value.js";import{createKvDbRecord as q,encodeKvKey as l}from"../mappers/create-kv-db-record.js";import{decodeCursor as I}from"../helpers/decode-cursor.js";import{encodeCursor as O}from"../helpers/encode-cursor.js";import{createKvListEntry as E}from"../mappers/create-kv-list-entry.js";const z="";class y extends T{static#e;#t=!1;constructor(e){super(e)}static async getInstance(e){if(!y.#e)try{const r=await $.create("sqld-remote",e);if(!r)return y.#e=null,null;y.#e=new y(r)}catch(r){return i.error("Error creating kv remote repository",r),y.#e=null,null}return y.#e}async sync(){if(this.isNonRemoteDatabaseMode()){this.#t||(i.warn(`KV database is currently operating in local mode: not connected to the remote database.
2
- All changes and data will only persist locally and will not be synced remotely.`),this.#t=!0);return}await this.databaseClient.sync()}async get(e){try{const r=l(e),n=await this.databaseClient.client.select().from(t).where(h(K(t.encodedKey,r),w(b(t.expiresAt),u(s`datetime(${t.expiresAt})`,s`datetime('now')`)))).get();return n?D(n):null}catch(r){return i.error("Error getting kv entry by key",r),null}}async getMany(e){try{if(e.length===0)return[];const r=e.map(d=>l(d)),n=w(b(t.expiresAt),u(s`datetime(${t.expiresAt})`,s`datetime('now')`)),a=await this.databaseClient.client.select().from(t).where(h(M(t.encodedKey,r),n)).all(),o=new Map(a.map(d=>[d.encodedKey,d]));return e.map((d,C)=>{const g=r[C],x=o.get(g);return x?E(x):null})}catch(r){return i.error("Error getting multiple kv entries",r),[]}}async list(e,r){try{const n=r?.limit??100,a=r?.reverse??!1,o=[],A=w(b(t.expiresAt),u(s`datetime(${t.expiresAt})`,s`datetime('now')`));if(o.push(A),"prefix"in e){const c=l(e.prefix),m="start"in e?l(e.start):c,k="end"in e?l(e.end):c+z;o.push(u(t.encodedKey,m)),o.push(f(t.encodedKey,k))}else if("start"in e&&"end"in e){const c=l(e.start),m=l(e.end);o.push(u(t.encodedKey,c)),o.push(f(t.encodedKey,m))}if(r?.cursor){const c=I(r.cursor),m=a?f(t.encodedKey,c):B(t.encodedKey,c);o.push(m)}const d=this.databaseClient.client.select().from(t),C=o.length>0?d.where(h(...o)):d,g=this.databaseClient.client.select({count:N()}).from(t),v=(await(o.length>0?g.where(h(...o)):g).get())?.count??0,p=await C.orderBy(a?L(t.encodedKey):S(t.encodedKey)).limit(n).all();return{items:p.map(c=>E(c)),total:v,cursor:v>p.length?O(p[p.length-1]?.encodedKey):null}}catch(n){return i.error("Error listing kv entries",n),{items:[],total:0,cursor:null}}}async set(e,r,n){try{const a=q({key:e,value:r,ttlInSeconds:n?.ttlInSeconds});return await this.databaseClient.client.insert(t).values(a).onConflictDoUpdate({target:[t.encodedKey],set:{value:a.value,expiresAt:a.expiresAt,updatedAt:a.updatedAt}}),E(a)}catch(a){return i.error("Error saving kv entry",a),null}}async delete(e){try{const r=l(e);await this.databaseClient.client.delete(t).where(K(t.encodedKey,r))}catch(r){i.error("Error deleting kv entry by key",r)}}async clearExpired(){try{await this.databaseClient.client.delete(t).where(f(s`datetime(${t.expiresAt})`,s`datetime('now')`))}catch(e){i.error("Error clearing expired kv entries",e)}}async transaction(e){return this.databaseClient.transactionsManager.transaction(async()=>e({get:async n=>this.get(n),getMany:async n=>this.getMany(n),set:async(n,a,o)=>this.set(n,a,o),delete:async n=>this.delete(n)}))}async getTotalStoredEntryBytes(){try{return await this.getTableSizeInBytes("kv")}catch(e){return i.error("Error getting total kv stored entry bytes",e),0}}async getStoredEntrySizeByEncodedKey(e){try{const r=w(b(t.expiresAt),u(s`datetime(${t.expiresAt})`,s`datetime('now')`)),n=await this.databaseClient.client.select({bytes:s`COALESCE(LENGTH(CAST(${t.encodedKey} AS BLOB)) + LENGTH(CAST(${t.value} AS BLOB)), 0)`}).from(t).where(h(K(t.encodedKey,e),r)).get();return Number(n?.bytes??0)}catch(r){return i.error("Error getting kv entry size by encoded key",r),0}}}export{z as KV_KEY_END_BOUNDARY,y as KvRemoteRepository};
@@ -1,123 +0,0 @@
1
- import{and as a,desc as U,eq as r,notExists as k,sql as e,or as j}from"drizzle-orm";import{unionAll as W}from"drizzle-orm/sqlite-core";import{logger as z}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as L}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as d}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as J}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Z,excludeFieldsFromFilter as P,getAllFilterFieldValues as B}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as V}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as f,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as F,createEntityFieldsForSelect as C}from"../utils.js";import{createMergedEntityFieldsForSelect as X}from"../utils/create-merged-entity-fields-for-select.js";import{buildNoHigherVersionExistsFilter as Y,buildSemanticVersionSortExpr as x}from"../utils/semantic-version-sort.js";import{buildEntitiesExclusionFilter as N}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as p,buildSubqueryRbacJoinAndFilter as G}from"../utils/build-rbac-filter.js";class ye{#e;#t;constructor(i,s){this.#e=i,this.#t=s}async getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:n,excludedTypes:o}){const l=B(i.filter,"owners");if(l.length>0)return this.#c(i,l,s,o,n);const u=B(i.filter,"domains");return u.length>0?this.#a(i,u,s,o,n):this.#m(i,s,o,n)}async#c(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
2
- EXISTS (
3
- SELECT 1 FROM (${h}) cr
4
- WHERE cr.source_key = ${c}
5
- AND cr.source_to_target_relation = 'owns'
6
- AND cr.target_key = base_entities.key
7
- )
8
- `),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"domains");let $=v;if(g.length>0){const c=g.map(m=>e`
9
- EXISTS (
10
- SELECT 1 FROM (${h}) cr
11
- JOIN (${b}) d ON d.key = ${m}
12
- WHERE d.type = 'domain'
13
- AND d.is_current = 1
14
- AND cr.source_key = ${m}
15
- AND cr.target_key = base_entities.key
16
- AND cr.source_to_target_relation = 'hasParts'
17
- )
18
- `),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["owners","domains"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (owner optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#a(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
19
- EXISTS (
20
- SELECT 1 FROM (${h}) cr
21
- JOIN (${b}) d ON d.key = ${c}
22
- WHERE d.type = 'domain'
23
- AND d.is_current = 1
24
- AND cr.source_key = ${c}
25
- AND cr.target_key = base_entities.key
26
- AND cr.source_to_target_relation = 'hasParts'
27
- )
28
- `),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"owners");let $=v;if(g.length>0){const c=g.map(m=>e`
29
- EXISTS (
30
- SELECT 1 FROM (${h}) cr
31
- WHERE cr.source_key = ${m}
32
- AND cr.source_to_target_relation = 'owns'
33
- AND cr.target_key = base_entities.key
34
- )
35
- `),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["domains","owners"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (domain optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#m(i,s,n,o){const l=this.#o(s,n,o),u=this.#l(),h=this.#i(n,o),b=u.as("combined_relations"),A=h.as("combined_target_entities"),I=this.#n().as("combined_target_attributes"),w=this.#e.client.select(f).from(l.as("base_entities")).$dynamic(),{whereCondition:_}=Z(w,i.filter);_&&w.where(_);try{const v=this.#e.client.select(f).from(l.as("base_entities")).$dynamic();_&&v.where(_);const g=this.#e.client.$count(v),$=i.limit||10;J(w,{...i,limit:$+1});const D=w.as("paged_entities"),S=this.#e.client.with(b,A,I,D).select({...C("paged_entities"),domains:this.#r("paged_entities",s).as("domains"),owners:this.#s("paged_entities",s).as("owners")}).from(D),[R,c]=await Promise.all([S.run(),g]),y=R.rows,m=y.length>$;return{items:y.slice(0,$).map(E=>V(E)).filter(E=>E!==null),hasMore:m,total:c}}catch(v){return z.error("Error getting entities with relations (optimized path): "+v.message),{items:[],hasMore:!1,total:0}}}#o(i,s,n){const o=N(s,n,"remote.entities"),l=N(s,n,"entities"),u=N(s,n,"r");return this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),p(i,"remote.entities_attributes"),o,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))),Y("remote.entities.key","remote.entities.version","remote.entities.revision"))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))),Y("entities.key","entities.version","entities.revision"))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),p(i,"ea"),u,Y("r.key","r.version","r.revision")))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l))}#l(){return this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)}#i(i,s){const n=N(i,s,"remote.entities"),o=N(i,s,"entities"),l=N(i,s,"r");return this.#t?W(this.#e.client.select(f).from(e`remote.entities`).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),n,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),l))):this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o))}async getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:n,excludedTypes:o,excludedEntities:l}){if(!i||i.trim()==="")return null;const u=s?.revision,h=s?.version,b=u?null:await this.#u(i,h||null),A=h??b?.version,T=u||b?.revision||null,I=N(o,l,"remote.entities"),w=N(o,l,"entities"),_=N(o,l,"r"),g=(this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(e`remote.entities.key = ${i}`,p(n,"remote.entities_attributes"),I,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(e`r.key = ${i}`,p(n,"ea"),_))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w))).as("e"),D=(this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)).as("combined_relations"),R=this.#i(o,l).as("combined_target_entities"),y=this.#n().as("combined_target_attributes"),m=this.#e.client.with(g,D,R,y).select({...C("e"),domains:this.#r("e",n).as("domains"),owners:this.#s("e",n).as("owners")}).from(g).$dynamic();T?m.where(a(r(e.raw("revision"),T),A?r(e.raw("version"),A):void 0)):m.where(r(e.raw("is_current"),1)),m.limit(1);const E=await m.run();if(E.rows.length===0)return null;const M=E.rows[0];return V(M)}async#u(i,s){if(s){const l=await(this.#t?W(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(a(e`key = ${i}`,e`version = ${s}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s),k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(a(e`remote.key = ${t.key}`,e`remote.version = ${s}`))))).orderBy(U(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s))).orderBy(U(t.revision))).limit(1).run();if(l.rows.length>0){const u=l.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}if(this.#t){const o=await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`(
36
- SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${x("version")} DESC, revision DESC) as rn
37
- FROM (
38
- SELECT version, revision FROM remote.entities WHERE key = ${i} AND is_current = 1
39
- UNION ALL
40
- SELECT version, revision FROM entities WHERE key = ${i} AND is_current = 1
41
- )
42
- ) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(o.rows.length>0){const l=o.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}const n=await this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.isCurrent,!0))).limit(1).run();if(n.rows.length>0){const o=n.rows[0];return{version:o.version||null,revision:o.revision||null}}return null}#r(i,s){const{join:n,filter:o}=G(s,"d.key");return e`
43
- COALESCE(
44
- (
45
- SELECT json_group_array(
46
- json_object(
47
- 'id', d.id,
48
- 'key', d.key,
49
- 'type', d.type,
50
- 'title', d.title,
51
- 'summary', d.summary,
52
- 'created_at', d.created_at,
53
- 'updated_at', d.updated_at,
54
- 'source', d.source,
55
- 'source_file', d.source_file
56
- )
57
- )
58
- FROM (
59
- SELECT DISTINCT d.*
60
- FROM combined_relations er
61
- JOIN combined_target_entities d ON d.key = er.source_key
62
- ${n}
63
- WHERE er.source_to_target_relation = 'hasParts'
64
- AND er.target_key = ${e.raw(`${i}.key`)}
65
- AND d.type = 'domain'
66
- AND d.is_current = 1
67
- ${o}
68
- AND CASE
69
- WHEN ${e.raw(`${i}.version`)} = ''
70
- THEN er.target_version = ''
71
- ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
72
- END
73
- AND CASE
74
- WHEN ${e.raw(`${i}.revision`)} = ''
75
- THEN 1 = 1
76
- ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
77
- END
78
- LIMIT 10
79
- ) d
80
- ),
81
- json_array()
82
- )
83
- `}#s(i,s){const{join:n,filter:o}=G(s,"o.key");return e`
84
- COALESCE(
85
- (
86
- SELECT json_group_array(
87
- json_object(
88
- 'id', o.id,
89
- 'key', o.key,
90
- 'type', o.type,
91
- 'title', o.title,
92
- 'summary', o.summary,
93
- 'created_at', o.created_at,
94
- 'updated_at', o.updated_at,
95
- 'source', o.source,
96
- 'source_file', o.source_file
97
- )
98
- )
99
- FROM (
100
- SELECT DISTINCT o.*
101
- FROM combined_relations er
102
- JOIN combined_target_entities o ON o.key = er.source_key
103
- ${n}
104
- WHERE er.source_to_target_relation = 'owns'
105
- AND er.target_key = ${e.raw(`${i}.key`)}
106
- AND o.is_current = 1
107
- ${o}
108
- AND CASE
109
- WHEN ${e.raw(`${i}.version`)} = ''
110
- THEN er.target_version = ''
111
- ELSE (er.target_version = ${e.raw(`${i}.version`)} OR er.target_version = '')
112
- END
113
- AND CASE
114
- WHEN ${e.raw(`${i}.revision`)} = ''
115
- THEN 1 = 1
116
- ELSE (er.target_revision <= ${e.raw(`${i}.revision`)} OR er.target_revision = '')
117
- END
118
- LIMIT 10
119
- ) o
120
- ),
121
- json_array()
122
- )
123
- `}#n(){return this.#t?W(this.#e.client.select({entityKey:e.raw("entity_key"),rbacTeams:e.raw("rbac_teams")}).from(e`remote.entities_attributes`),this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d).where(k(this.#e.client.select({id:e.raw("1")}).from(e`remote.entities_attributes as remote`).where(e`remote.entity_key = ${d.entityKey}`)))):this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d)}}export{ye as CatalogEntitiesBffRepository};
@@ -1,98 +0,0 @@
1
- import type { BffCatalogEntity, BffCatalogRelatedEntity } from '@redocly/theme/core/types';
2
- import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
3
- import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
4
- import type { DatabaseClient } from '../../../../../providers/database/client.js';
5
- import type { Filter } from '../../../../../providers/database/pagination/types.js';
6
- import type { GetEntityByIdParams } from '../../../types/params.js';
7
- import { type EntityReadModelSchema, type EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
8
- export type ListResult<T> = {
9
- items: T[];
10
- hasMore?: boolean;
11
- total: number;
12
- };
13
- export type CatalogFiltersParams = {
14
- entitiesTypes?: string[];
15
- emptyFilters?: string[];
16
- rbacTeams?: string[];
17
- excludedTypes?: string[];
18
- excludedEntities?: string[];
19
- };
20
- export type FilterOption = {
21
- value: string;
22
- count: number;
23
- };
24
- export declare class CatalogEntitiesLocalReadRepository {
25
- #private;
26
- constructor(db: DatabaseClient);
27
- attachDatabase(databasePath: string): Promise<void>;
28
- getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
29
- paginationParams: PaginationParams;
30
- rbacTeams?: string[];
31
- excludedTypes?: string[];
32
- excludedEntities?: string[];
33
- }): Promise<ListResult<EntityReadModelSchema>>;
34
- getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
35
- listEntityRevisions(entityKey: string, version?: string | null): Promise<EntityRevisionSummary[]>;
36
- getEntitiesCountByTypes(): Promise<{
37
- type: string;
38
- count: number;
39
- }[]>;
40
- getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
41
- getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
42
- getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
43
- getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
44
- getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
45
- paginationParams: PaginationParams;
46
- rbacTeams?: string[];
47
- excludedEntities?: string[];
48
- excludedTypes?: string[];
49
- }): Promise<ListResult<BffCatalogEntity>>;
50
- getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
51
- entityKey: string;
52
- filter?: {
53
- revision?: string | null;
54
- version?: string | null;
55
- };
56
- rbacTeams?: string[];
57
- excludedTypes?: string[];
58
- excludedEntities?: string[];
59
- }): Promise<BffCatalogEntity | null>;
60
- getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
61
- targetKey: string;
62
- targetRevision: string;
63
- sourceToTargetRelation: string;
64
- direction: "outgoing" | "incoming";
65
- priority: number;
66
- }[]>;
67
- getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
68
- key: string;
69
- paginationParams: PaginationParams;
70
- rbacTeams?: string[];
71
- excludedTypes?: string[];
72
- excludedEntities?: string[];
73
- }): Promise<ListResult<BffCatalogRelatedEntity>>;
74
- getCatalogFilters({ entitiesTypes, emptyFilters, rbacTeams, excludedTypes, excludedEntities, }: CatalogFiltersParams): Promise<Record<string, FilterOption[]>>;
75
- /**
76
- * Returns total entity count for the given source. When `addedEntities` is provided (e.g.
77
- * uncommitted entities in a transaction), only entities that do not already exist in the DB
78
- * are added to the count, avoiding double-counting on conflict updates (onConflictDoUpdate).
79
- */
80
- getEntitiesCount(source: 'file' | 'remote', addedEntities?: EntityReadModelSchema[], entitiesRemovedCount?: number): Promise<{
81
- total: number;
82
- }>;
83
- /**
84
- * Returns the count of duplicated entities: entities with the same (key, version, revision)
85
- * present in both local and remote DBs.
86
- *
87
- * @param addedEntities - Optional entities not yet persisted (e.g. in a transaction). Each one
88
- * whose (key, version, revision) already exists in either DB is counted as a duplicate,
89
- * regardless of which DB it will be written to.
90
- * @param removedEntities - Optional entities being removed. Any of these that would otherwise
91
- * be counted as a duplicate (same triple in both DBs or in addedEntities) are excluded.
92
- * @returns Total number of duplicated entities (existing in DB + matching added − removed).
93
- */
94
- getDuplicatedEntitiesCount(addedEntities?: EntityReadModelSchema[], removedEntities?: EntityReadModelSchema[]): Promise<{
95
- total: number;
96
- }>;
97
- }
98
- //# sourceMappingURL=catalog-entities-local-read-repository.d.ts.map
@@ -1,145 +0,0 @@
1
- import{and as u,count as A,eq as E,isNotNull as q,notExists as h,or as J,sql as e}from"drizzle-orm";import{unionAll as T}from"drizzle-orm/sqlite-core";import{logger as g}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as L}from"@redocly/theme/core/constants";import{applyPagination as v}from"../../../../../providers/database/pagination/index.js";import{applyFilter as P}from"../../../../../providers/database/pagination/filter.js";import{createEntityFieldsForSelect as p,FIELDS_TO_SELECT_FOR_ENTITY as N,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as d}from"../utils.js";import{createEntityReadModel as $}from"../../mappers/create-entity-read-model.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as _}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{CatalogEntitiesRelationsRepository as D}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as M}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as j}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as B}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as x}from"../utils/normalize-revision-flags.js";import{buildEntitiesExclusionFilter as R}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as S,buildRbacFilterRaw as Y}from"../utils/build-rbac-filter.js";import{createEntityRelationReadModel as U}from"../../mappers/create-entity-relation-read-model.js";class ye{#e;#t=void 0;#i;#s;constructor(t){this.#e=t,this.#i=new D(this.#e,this.#t||""),this.#s=new M(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 D(this.#e,t),this.#s=new M(this.#e,t))}async getEntities({paginationParams:t,rbacTeams:s,excludedTypes:n,excludedEntities:r}){const o=R(n,r,"remote.entities"),l=R(n,r,"entities"),a=R(n,r,"r"),c=this.#t?T(this.#e.client.select(p("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,E(i.key,_.entityKey)).where(u(S(s,"remote.entities_attributes"),o,h(this.#e.client.select({id:N.id}).from(i).where(u(e`${i.key} = remote.entities.key`,e`${i.version} = remote.entities.version`,e`${i.revision} = remote.entities.revision`))))),this.#e.client.select(p("entities")).from(i).leftJoin(_,E(i.key,_.entityKey)).where(u(S(s,"entities_attributes"),l,h(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(e`r.key = ${i.key}`,e`r.version = ${i.version}`,e`r.revision = ${i.revision}`))))),this.#e.client.select(j("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(u(S(s,"ea"),a))):this.#e.client.select(p("entities")).from(i).leftJoin(_,E(i.key,_.entityKey)).where(u(S(s,"entities_attributes"),l)),m=this.#e.client.select(N).from(c.as("combined_entities")),f=this.#e.client.select(N).from(c.as("combined_entities")).$dynamic(),k=v(f,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),O=this.#e.client.$count(k),w=m.$dynamic(),C=t.limit||10,W=v(w,{...t,limit:C+1}),[H,V]=await Promise.all([W.run(),O]),F=H.rows,X=F.length>C;return{items:F.slice(0,C).map(I=>$(I)).filter(I=>I!==null),hasMore:X,total:V}}async getEntityKeysAndVersionsBySourceFile(t){const s=this.#t?T(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${L})`.as("keyVersion")}).from(e`remote.entities`).where(u(e`source_file = ${t}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${i.key} || ':' || COALESCE(${i.version}, ${L})`.as("keyVersion")}).from(i).where(u(E(i.sourceFile,t),E(i.source,"file"),e`${i.key} IS NOT NULL`,h(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}, ${L})`.as("keyVersion")}).from(i).where(u(E(i.sourceFile,t),E(i.source,"file"),q(i.key))),n=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(n.rows.map(r=>r.keyVersion))}async listEntityRevisions(t,s){const n=[E(i.key,t),E(i.isDeleted,!1),...s?[E(i.version,s)]:[]],r={version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")},o=this.#t?T(this.#e.client.select(r).from(e`remote.entities`).where(u(e`key = ${t}`,e`is_deleted = 0`,s?e`version = ${s}`:void 0,h(this.#e.client.select({id:e.raw("id")}).from(i).where(u(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(u(...n,h(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(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(u(e`r.key = ${t}`,e`r.is_deleted = 0`,e`l.is_deleted = 0`,s?e`r.version = ${s}`:void 0))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(u(...n)),a=(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(o.as("combined_revisions")).orderBy(e`${B("version")} DESC`,e.raw("revision DESC")).run()).rows.map(c=>({version:c.version,revision:c.revision??"",isCurrent:c.is_current!==null?!!c.is_current:!1,createdAt:c.created_at,updatedAt:c.updated_at,isDefaultVersion:c.is_default_version!==null?!!c.is_default_version:!1}));return x(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 ${B("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:A()}).from(e`(SELECT * FROM (${t}) WHERE rn = 1) as highest_version_entities`).groupBy(e`type`)}return this.#e.client.select({type:i.type,count:A()}).from(i).where(u(E(i.isCurrent,!0),E(i.isDeleted,!1))).groupBy(i.type)}async getEntityById(t,s){const{rbacTeams:n,excludedTypes:r,excludedEntities:o}=s||{},l=R(r,o,"remote.entities"),a=R(r,o,"entities"),f=(await(this.#t?T(this.#e.client.select(p("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,E(i.key,_.entityKey)).where(u(e`remote.entities.id = ${t}`,S(n,"remote.entities_attributes"),l)),this.#e.client.select(p("entities")).from(i).leftJoin(_,E(i.key,_.entityKey)).where(u(E(i.id,t),S(n,"entities_attributes"),a))):this.#e.client.select(p("entities")).from(i).leftJoin(_,E(i.key,_.entityKey)).where(u(E(i.id,t),S(n,"entities_attributes"),a))).run()).rows[0];return f?$(f):null}async getOutdatedEntities(t){const s=this.#t?T(this.#e.client.select(N).from(e`remote.entities`),this.#e.client.select(N).from(i).where(h(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),n=this.#e.client.select(N).from(s.as("combined_entities")).$dynamic(),{whereCondition:r}=P(n,t),o=J(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`),l=r?u(r,o):o;return(await n.where(l).run()).rows.map(c=>$(c)).filter(c=>c!==null)}async getEntitiesRelations(t={}){const s=this.#t?T(this.#e.client.select(d).from(e`remote.entities_relations`),this.#e.client.select(d).from(y).where(h(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${y.sourceKey}`)))):this.#e.client.select(d).from(y),n=this.#e.client.select(d).from(s.as("combined_entities_relations")).$dynamic(),r=this.#e.client.select(d).from(s.as("combined_entities_relations")).$dynamic(),o=v(r,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),l=this.#e.client.$count(o),a=t.limit||10,c=v(n,{...t,limit:a+1}),[m,f]=await Promise.all([c.run(),l]),k=m.rows,O=k.length>a;return{items:k.slice(0,a).map(w=>U(w)).filter(w=>w!==null),hasMore:O,total:f}}async getEntityRelationById(t){const r=(await(this.#t?T(this.#e.client.select(d).from(e`remote.entities_relations`).where(E(y.id,t)),this.#e.client.select(d).from(y).where(u(E(y.id,t),h(this.#e.client.select({id:d.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${y.id}`))))):this.#e.client.select(d).from(y).where(E(y.id,t))).run()).rows[0];return r?U(r):null}async getEntitiesWithRelations({paginationParams:t,rbacTeams:s,excludedEntities:n,excludedTypes:r}){return this.#s.getEntitiesWithRelations({paginationParams:t,rbacTeams:s,excludedEntities:n,excludedTypes:r})}async getEntityWithRelationsByKey({entityKey:t,filter:s,rbacTeams:n,excludedTypes:r,excludedEntities:o}){return this.#s.getEntityWithRelationsByKey({entityKey:t,filter:s,rbacTeams:n,excludedTypes:r,excludedEntities:o})}async getRelationsForEntity(t,s,n){return this.#i.getRelationsForEntity(t,s,n)}async getRelatedEntities({key:t,paginationParams:s,rbacTeams:n,excludedTypes:r,excludedEntities:o}){return this.#i.getRelatedEntities({key:t,paginationParams:s,rbacTeams:n,excludedTypes:r,excludedEntities:o})}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:s=[],rbacTeams:n,excludedTypes:r,excludedEntities:o}){if(!s.length)return{};try{return await this.#n({entitiesTypes:t,rbacTeams:n,excludedTypes:r,excludedEntities:o}),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#a(s)}catch(l){return console.error("Error fetching catalog filters:",l),{}}finally{await this.#u()}}async#n({entitiesTypes:t,rbacTeams:s,excludedTypes:n,excludedEntities:r}){const o=Y(s,"ea"),l=this.#r(n,r);if(this.#t){const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),l&&a.push(l.replace(/ENTITY_ALIAS/g,"e"));const c=["r.key IS NULL","e.is_current = 1","e.is_deleted = 0"];o&&c.push(o),l&&c.push(l.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
13
- CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
14
- SELECT
15
- e.key,
16
- e.type,
17
- e.tags,
18
- e.metadata
19
- FROM remote.entities e
20
- LEFT JOIN remote.entities_attributes ea ON ea.entity_key = e.key
21
- WHERE ${a.join(" AND ")}
22
- UNION ALL
23
- SELECT
24
- e.key,
25
- e.type,
26
- e.tags,
27
- e.metadata
28
- FROM entities e
29
- LEFT JOIN remote.entities r ON r.key = e.key AND r.is_current = 1
30
- LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
31
- WHERE ${c.join(" AND ")}
32
- `))}else{const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),l&&a.push(l.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
33
- CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
34
- SELECT
35
- e.key,
36
- e.type,
37
- e.tags,
38
- e.metadata
39
- FROM entities e
40
- LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
41
- WHERE ${a.join(" AND ")}
42
- `))}if(t.length){const a=t.map(c=>`'${c.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
43
- CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
44
- SELECT * FROM temp_combined_entities
45
- WHERE type IN (${a})
46
- `))}else await this.#e.client.run(e`
47
- CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
48
- SELECT * FROM temp_combined_entities
49
- `);await this.#e.client.run(e`
50
- CREATE INDEX IF NOT EXISTS idx_temp_filtered_type ON temp_filtered_entities(type)
51
- `)}#r(t,s){const n=[];if(t&&t.length>0){const r=t.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");n.push(`ENTITY_ALIAS.type NOT IN (${r})`)}if(s&&s.length>0){const r=s.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");n.push(`ENTITY_ALIAS.key NOT IN (${r})`)}return n.length>0?`(${n.join(" AND ")})`:null}async#o(){this.#t?await this.#e.client.run(e`
52
- CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
53
- SELECT
54
- source_key,
55
- target_key,
56
- source_to_target_relation
57
- FROM remote.entities_relations
58
- WHERE COALESCE(is_deleted, 0) = 0
59
- UNION ALL
60
- SELECT
61
- er.source_key,
62
- er.target_key,
63
- er.source_to_target_relation
64
- FROM entities_relations er
65
- LEFT JOIN remote.entities_relations r ON r.source_key = er.source_key AND r.target_key = er.target_key
66
- WHERE r.source_key IS NULL AND COALESCE(er.is_deleted, 0) = 0
67
- `):await this.#e.client.run(e`
68
- CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
69
- SELECT
70
- source_key,
71
- target_key,
72
- source_to_target_relation
73
- FROM entities_relations
74
- WHERE COALESCE(is_deleted, 0) = 0
75
- `),await this.#e.client.run(e`
76
- CREATE INDEX IF NOT EXISTS idx_temp_rel_source ON temp_combined_relations(source_key)
77
- `),await this.#e.client.run(e`
78
- CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
79
- `),await this.#e.client.run(e`
80
- CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
81
- `)}async#a(t){const s={},n=[],r=t.filter(a=>a.startsWith("metadata."));t.includes("type")&&n.push(`
82
- SELECT 'type' as filter_name, type as value, COUNT(*) as count
83
- FROM temp_filtered_entities
84
- WHERE type IS NOT NULL
85
- GROUP BY type
86
- `),t.includes("tags")&&n.push(`
87
- SELECT 'tags' as filter_name, tag.value as value, COUNT(DISTINCT tfe.key) as count
88
- FROM temp_filtered_entities tfe,
89
- json_each(COALESCE(tfe.tags, json_array())) as tag
90
- WHERE tfe.tags IS NOT NULL
91
- AND tfe.tags != ''
92
- AND tag.value IS NOT NULL
93
- AND tag.value != ''
94
- GROUP BY tag.value
95
- `),t.includes("domains")&&n.push(`
96
- SELECT 'domains' as filter_name, tcr.source_key as value, COUNT(DISTINCT tfe.key) as count
97
- FROM temp_combined_relations tcr
98
- INNER JOIN temp_filtered_entities tfe ON tfe.key = tcr.target_key
99
- INNER JOIN temp_combined_entities tce ON tce.key = tcr.source_key
100
- WHERE tce.type = 'domain'
101
- AND tcr.source_to_target_relation = 'hasParts'
102
- GROUP BY tcr.source_key
103
- `),t.includes("owners")&&n.push(`
104
- SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
105
- FROM (
106
- SELECT
107
- tfe.key as entity_key,
108
- CASE
109
- WHEN tfe.key = tcr.target_key AND tcr.source_to_target_relation = 'owns'
110
- THEN tcr.source_key
111
- WHEN tfe.key = tcr.source_key AND tcr.source_to_target_relation = 'ownedBy'
112
- THEN tcr.target_key
113
- END as owner_key
114
- FROM temp_combined_relations tcr
115
- INNER JOIN temp_filtered_entities tfe ON (
116
- (tcr.target_key = tfe.key AND tcr.source_to_target_relation = 'owns') OR
117
- (tcr.source_key = tfe.key AND tcr.source_to_target_relation = 'ownedBy')
118
- )
119
- ) AS entity_owners
120
- INNER JOIN temp_combined_entities tce ON tce.key = owner_key
121
- WHERE owner_key IS NOT NULL
122
- GROUP BY owner_key
123
- `);for(const a of r)await this.#l(a,s);if(n.length===0)return s;const o=n.join(" UNION ALL "),l=await this.#e.client.run(e.raw(o));if(l?.rows)for(const a of l.rows){const c=a.filter_name,m=a.value,f=Number(a.count)||0;s[c]||(s[c]=[]),m&&s[c].push({value:m,count:f})}return s}async#l(t,s){const n=t.substring(9),r=`$.${K(n)}`,o=await this.#e.client.run(e.raw(`
124
- SELECT json_extract(metadata, '${r}') as value, COUNT(*) as count
125
- FROM temp_filtered_entities
126
- WHERE metadata IS NOT NULL
127
- AND metadata != ''
128
- AND json_extract(metadata, '${r}') IS NOT NULL
129
- AND json_extract(metadata, '${r}') != ''
130
- GROUP BY value
131
- `));o?.rows&&(s[t]=o.rows.map(l=>({value:l.value,count:Number(l.count)||0})).filter(l=>l.value))}async getEntitiesCount(t,s,n){let r;try{if(this.#t){const o=e`
132
- SELECT key, version, revision FROM entities WHERE source = ${t}
133
- UNION
134
- SELECT key, version, revision FROM remote.entities WHERE source = ${t}
135
- `,l=await this.#e.client.select({count:A()}).from(e`(${o}) AS combined`);r=Number(l[0]?.count??0)}else{const o=await this.#e.client.select({count:A()}).from(i).where(E(i.source,t));r=Number(o[0]?.count??0)}if(s?.length){const o=await this.#c(t,s);r+=s.length-o}return n!==void 0&&(r-=n),{total:r}}catch(o){throw g.error("Error getting entities count:",o),new Error(`Error getting entities count: ${o?.message}`)}}async#c(t,s){const n=e.join(s.map(a=>e`(${a.key}, ${a.version}, ${a.revision})`),e`, `),r=this.#t?e`SELECT count(*) AS count FROM (
136
- SELECT key, version, revision FROM entities WHERE source = ${t}
137
- UNION
138
- SELECT key, version, revision FROM remote.entities WHERE source = ${t}
139
- ) AS combined WHERE (key, version, revision) IN (VALUES ${n})`:e`SELECT count(*) AS count FROM entities WHERE source = ${t} AND (key, version, revision) IN (VALUES ${n})`,l=(await this.#e.client.run(r)).rows?.[0];return Number(l?.count??0)}async getDuplicatedEntitiesCount(t,s){if(!this.#t)return{total:0};try{const n=a=>`${a.key}|${a.version}|${a.revision}`,r=await this.#e.client.run(e`
140
- SELECT key, version, revision FROM entities
141
- INTERSECT
142
- SELECT key, version, revision FROM remote.entities
143
- `),o=new Set((r.rows??[]).map(a=>n(a)));if(t?.length){const a=e.join(t.map(m=>e`(${m.key}, ${m.version}, ${m.revision})`),e`, `),c=await this.#e.client.run(e`SELECT key, version, revision FROM entities WHERE (key, version, revision) IN (VALUES ${a})
144
- UNION
145
- SELECT key, version, revision FROM remote.entities WHERE (key, version, revision) IN (VALUES ${a})`);for(const m of c.rows??[])o.add(n(m))}let l=0;if(s?.length){const a=new Set;for(const c of s){const m=n(c);o.has(m)&&a.add(m)}l=a.size}return{total:o.size-l}}catch(n){throw g.error("Error getting duplicated entities count:",n),new Error(`Error getting duplicated entities count: ${n?.message}`)}}async#u(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(t){g.error("Error cleaning up temp tables:",t)}}}function K(b){return b.replace(/[^a-zA-Z0-9._-]/g,"")}export{ye as CatalogEntitiesLocalReadRepository};
@@ -1,100 +0,0 @@
1
- import type { Filter } from '../../../../../providers/database/pagination/types.js';
2
- import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
3
- import type { EntityRelationDtoSchema } from '../../../../../plugins/catalog-entities/schemas/dto-schemas.js';
4
- import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
5
- import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
6
- import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
7
- import type { SidebarConnectedEntity } from '@redocly/theme/core/types';
8
- import type { EntityReadModelSchema } from '../../../../../plugins/catalog-entities/schemas/read-model-schemas.js';
9
- import type { GetEntityByIdParams } from '../../../types/params.js';
10
- import { BaseRepository } from '../../../../../providers/database/base-repository.js';
11
- import { type CreateEntityParams, type CreateEntityResult } from './catalog-entities-local-write-repository.js';
12
- export declare class CatalogEntitiesLocalRepository extends BaseRepository {
13
- #private;
14
- constructor(dbConnection: DatabaseConnection);
15
- get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
16
- getEntitySources(): Record<string, SidebarConnectedEntity>;
17
- static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
18
- attachDatabase(databasePath: string): Promise<void>;
19
- getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
20
- paginationParams: PaginationParams;
21
- rbacTeams?: string[];
22
- excludedTypes?: string[];
23
- excludedEntities?: string[];
24
- }): Promise<import("./catalog-entities-local-read-repository.js").ListResult<EntityReadModelSchema>>;
25
- getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
26
- getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
27
- getEntitiesCountByTypes(): Promise<{
28
- type: string;
29
- count: number;
30
- }[]>;
31
- getEntitiesRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRelationReadModelSchema>>;
32
- getEntityRelationById(id: string): Promise<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRelationReadModelSchema | null>;
33
- getEntitiesWithRelations({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
34
- paginationParams: PaginationParams;
35
- rbacTeams?: string[];
36
- excludedTypes?: string[];
37
- excludedEntities?: string[];
38
- }): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
39
- getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
40
- entityKey: string;
41
- filter?: {
42
- revision?: string | null;
43
- version?: string | null;
44
- };
45
- rbacTeams?: string[];
46
- excludedTypes?: string[];
47
- excludedEntities?: string[];
48
- }): Promise<import("@redocly/theme").BffCatalogEntity | null>;
49
- getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
50
- key: string;
51
- paginationParams: PaginationParams;
52
- rbacTeams?: string[];
53
- excludedTypes?: string[];
54
- excludedEntities?: string[];
55
- }): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
56
- createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
57
- createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
58
- createEntityRelation(entityRelation: EntityRelationDtoSchema): Promise<{
59
- id: string;
60
- organizationId: string;
61
- projectId: string;
62
- createdAt: string;
63
- updatedAt: string;
64
- sourceFile: string | null;
65
- isDeleted: boolean | null;
66
- fileHash: string | null;
67
- sourceKey: string;
68
- sourceVersion: string;
69
- sourceRevision: string;
70
- sourceToTargetRelation: string;
71
- targetKey: string;
72
- targetVersion: string;
73
- targetRevision: string;
74
- targetToSourceRelation: string;
75
- } | null>;
76
- createEntityRelations(relations: EntityRelationDtoSchema[]): Promise<void>;
77
- deleteEntity(entityKey: string): Promise<string | null>;
78
- softDeleteEntities({ filter, revision, fileHash, }: {
79
- filter: Filter;
80
- revision: string;
81
- fileHash: string;
82
- }): Promise<void>;
83
- softDeleteEntitiesRelations(entities: CreateEntityResult[], revision: string): Promise<boolean>;
84
- deleteEntities(filter: Filter): Promise<boolean>;
85
- deleteEntityRelation(id: string): Promise<string | null>;
86
- deleteEntityRelations(filter: Filter): Promise<boolean>;
87
- getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
88
- listEntityRevisions(entityKey: string, version?: string | null): Promise<import("../../../../../plugins/catalog-entities/schemas/read-model-schemas.js").EntityRevisionSummary[]>;
89
- updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
90
- updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
91
- getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
92
- setEntitiesAsOutdated(filter: Filter): Promise<void>;
93
- getEntitiesCount(source: 'file' | 'remote', addedEntities?: EntityReadModelSchema[], entitiesRemovedCount?: number): Promise<{
94
- total: number;
95
- }>;
96
- getDuplicatedEntitiesCount(addedEntities?: EntityReadModelSchema[], removedEntities?: EntityReadModelSchema[]): Promise<{
97
- total: number;
98
- }>;
99
- }
100
- //# sourceMappingURL=catalog-entities-local-repository.d.ts.map
@@ -1 +0,0 @@
1
- import{promiseMapLimit as l}from"../../../../../utils/async/promise-map-limit.js";import{logger as R}from"../../../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as p}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as f}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 h}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as C}from"../../../utils/has-options-changed.js";const c=50;class r extends f{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(r.#n,t);if(!r.#i||e){const i=await p.create("catalog-local",t);if(!i)throw new Error("Failed to create db connection for catalog entities local repository");r.#i=new r(i),r.#n=t}return r.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities({paginationParams:t,rbacTeams:e,excludedTypes:i,excludedEntities:s}){return this.#t.getEntities({paginationParams:t,rbacTeams:e,excludedTypes:i,excludedEntities:s})}getEntityById(t,e){return this.#t.getEntityById(t,e)}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({paginationParams:t,rbacTeams:e,excludedTypes:i,excludedEntities:s}){return this.#t.getEntitiesWithRelations({paginationParams:t,rbacTeams:e,excludedTypes:i,excludedEntities:s})}getEntityWithRelationsByKey({entityKey:t,filter:e,rbacTeams:i,excludedTypes:s,excludedEntities:n}){return this.#t.getEntityWithRelationsByKey({entityKey:t,filter:e,rbacTeams:i,excludedTypes:s,excludedEntities:n})}getRelatedEntities({key:t,paginationParams:e,rbacTeams:i,excludedTypes:s,excludedEntities:n}){return this.#t.getRelatedEntities({key:t,paginationParams:e,rbacTeams:i,excludedTypes:s,excludedEntities:n})}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 l(t,c,async e=>this.createEntity(e))}createEntityRelation(t){const e=h(t,this.organizationId,this.projectId);return this.#e.upsertEntityRelation(e)}async createEntityRelations(t){await l(t,c,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}async softDeleteEntities({filter:t,revision:e,fileHash:i}){const s=await this.getEntities({paginationParams:{filter:t}}),n=await this.#e.softDeleteEntities(s.items,e,i);await this.softDeleteEntitiesRelations(n,e)}async softDeleteEntitiesRelations(t,e){try{const i=t.filter(n=>n.result==="created");if(i.length===0)return!0;const s=await l(i,c,async n=>(await this.#t.getRelationsForEntity(n.entityKey,n.entityVersion,e)).map(a=>{if(!a)return null;const u=a.direction,o=a.sourceToTargetRelation,y=a.targetKey,d=u==="outgoing"?n.entityKey:y,E=u==="outgoing"?y:n.entityKey,g=u==="outgoing"?o:o.startsWith("reverse:")?o.slice(8):o;return!g||!d||!E?null:h({type:g,sourceKey:d,targetKey:E,sourceVersion:n.entityVersion,targetVersion:n.entityVersion,sourceRevision:e,targetRevision:e,isDeleted:!0},this.organizationId,this.projectId)}).filter(a=>a!==null));return await l(s.flat(),c,async n=>this.#e.upsertEntityRelation(n)),!0}catch(i){return R.error("Error soft deleting entity relations",i),!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)}getEntitiesCount(t,e,i){return this.#t.getEntitiesCount(t,e,i)}getDuplicatedEntitiesCount(t,e){return this.#t.getDuplicatedEntitiesCount(t,e)}}export{r as CatalogEntitiesLocalRepository};
@@ -1,43 +0,0 @@
1
- import type { EntityBaseFileSchema } from '@redocly/config';
2
- import type { DatabaseClient } from '../../../../../providers/database/client.js';
3
- import type { Filter } from '../../../../../providers/database/pagination/types.js';
4
- import type { EntityReadModelSchema } from '../../../schemas/read-model-schemas.js';
5
- import type { ScorecardsStatus } from '../../../entities/types.js';
6
- import { type DatabaseEntityRelation, type DatabaseEntityRelationDto } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
7
- export type CreateEntityParams = {
8
- entity: EntityBaseFileSchema;
9
- fileHash: string;
10
- sourceFile: string;
11
- isRootEntity?: boolean;
12
- revision?: string;
13
- isDeleted?: boolean;
14
- rbacTeams?: string[];
15
- };
16
- export type CreateEntityResult = {
17
- result: 'created';
18
- entityKey: string;
19
- entityRevision: string;
20
- entityVersion: string | null;
21
- } | {
22
- result: 'skipped' | 'error';
23
- entityKey: string;
24
- };
25
- export declare class CatalogEntitiesLocalWriteRepository {
26
- #private;
27
- constructor(db: DatabaseClient, organizationId: string, projectId: string);
28
- createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, rbacTeams, }: CreateEntityParams): Promise<CreateEntityResult>;
29
- deleteEntity(entityKey: string): Promise<string | null>;
30
- /**
31
- * Deletes entities based on a filter.
32
- * If the entity is current or default version, we need to promote the different version as current and default.
33
- */
34
- deleteEntities(filter: Filter): Promise<boolean>;
35
- deleteEntityRelation(id: string): Promise<string | null>;
36
- softDeleteEntities(entities: EntityReadModelSchema[], revision: string, fileHash: string): Promise<CreateEntityResult[]>;
37
- deleteEntityRelations(filter: Filter): Promise<boolean>;
38
- upsertEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
39
- updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
40
- updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
41
- setEntitiesAsOutdated(filter: Filter): Promise<void>;
42
- }
43
- //# sourceMappingURL=catalog-entities-local-write-repository.d.ts.map
@@ -1 +0,0 @@
1
- import{and as m,eq as c,isNull as v,or as T,sql as F}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 O}from"../../../../../utils/crypto/sha1.js";import{envConfig as V}from"../../../../../config/env-config.js";import{VERSION_NOT_SPECIFIED as U}from"@redocly/theme/core/constants";import{entitiesAttributesTable as I}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{createEntityDbRecord as b}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as K}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 L}from"../common/revision-repository.js";import{VersionRepository as P}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 L(e),this.#s=new P(e)}async createEntity({entity:e,fileHash:t,sourceFile:s,revision:a=new Date().toISOString(),isRootEntity:o=!1,isDeleted:n=!1,rbacTeams:d}){try{const{relations:l=[],...f}=e,p=O(JSON.stringify(f)),y=e.version??U,g=await this.#i.shouldSkipRevisionCreation(e.key,y,p,o,n);if(Array.isArray(d)&&await this.#o({entityKey:e.key,rbacTeams:d}),g)return{result:"skipped",entityKey:e.key};const h=await this.#i.shouldSetNewCurrentRevision({key:e.key,version:y,revision:a}),R=b({entity:{...e,revision:a,hash:p,isCurrent:h,isDefaultVersion:h,isDeleted:n,version:y},sourceFile:s,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:t}),{key:D,source:x,...S}=R;if(h&&(await this.#i.markAllRevisionsAsNotCurrent(D),await this.#s.markAllVersionsAsNotDefault(D)),V.isDevelopMode&&!V.REDOCLY_INTERNAL_DEV)return await this.#n(R,l),{result:"created",entityKey:e.key,entityRevision:a,entityVersion:y};const A=this.#e.client.insert(r).values(R).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:S}),N=l?.length&&l.length>0?this.#e.client.insert(i).values(l.map(k=>K({relation:k,sourceFile:s,fileHash:t,sourceKey:e.key,sourceVersion:y,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([A,N],w,async k=>k),{result:"created",entityKey:e.key,entityRevision:a,entityVersion:y}}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(T(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 d={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:d,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:d,...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,...d}=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(d).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:d}).run(),y=t?.map(g=>{const h=K({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,...y],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(F`${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(I).values(z({rbacTeams:t,entityKey:e,organizationId:this.#t,projectId:this.#r})).onConflictDoUpdate({target:[I.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 +0,0 @@
1
- import{unionAll as C}from"drizzle-orm/sqlite-core";import{and as d,desc as D,eq as u,notExists as N,sql as i}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as A}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{entitiesAttributesTable as p}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{excludeFieldsFromFilter as W,getFirstFilterFieldValue as O}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{createBffRelatedEntityFromQueryRow as k}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as H}from"../../mappers/map-entity-relation-row.js";import{buildEntitiesExclusionFilter as L}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as q}from"../utils/build-rbac-filter.js";class te{#e;#i;constructor(n,r){this.#e=n,this.#i=r}async getRelationsForEntity(n,r,m){const y=await this.#t(n,r,m);return y?(await this.#e.client.select().from(y).run()).rows.map(a=>H(a)):[]}async getRelatedEntities({key:n,paginationParams:r,rbacTeams:m,excludedTypes:y,excludedEntities:l}){const a=O(r.filter,"version"),v=O(r.filter,"revision"),o=await this.#t(n,a,v);if(!o)return{items:[],total:0};const R=this.#e.client.select({relationType:o.relationName,direction:o.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,rbacTeams:p.rbacTeams,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${o.entityKey} ORDER BY ${o.priority} ASC, CASE WHEN ${o.entityRevision} = ${e.revision} THEN 1 ELSE 0 END DESC, CASE WHEN ${o.entityVersion} = ${e.version} THEN 1 ELSE 0 END DESC, ${e.isCurrent} DESC, ${e.revision} DESC)`.as("dedupRn")}).from(o).innerJoin(e,i`${o.entityKey} = ${e.key} AND (${o.entityRevision} = ${e.revision} OR ${o.entityRevision} = '' OR ${e.isCurrent} = 1) AND (${o.entityVersion} = ${e.version} OR ${o.entityVersion} = '' OR ${e.version} = ${A})`).leftJoin(p,u(e.key,p.entityKey)).as("unique_relations"),$=q(m,"unique_relations"),f=L(y,l,"unique_relations");let s=i`${R.dedupRn} = 1 AND COALESCE(${R.isDeleted}, 0) = 0`;$&&(s=i`${s} AND ${$}`),f&&(s=i`${s} AND ${f}`);const c=this.#e.client.select().from(R).$dynamic(),V=this.#e.client.select().from(R).$dynamic(),T=W(r.filter,["version","revision"]),g={...r,filter:T,baseWhereCondition:s},F=S(V,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0}),B=this.#e.client.$count(F),h=r.limit||10,K=S(c,{...g,limit:h+1}),[b,_]=await Promise.all([K.run(),B]),w=b.rows.filter(E=>E.id!=null).map(E=>k(E)).filter(E=>E!==null),Q=w.slice(0,h),I=w.length>h;return{items:Q,hasMore:I,total:_}}async#r(n,r){if(r){const a=await(this.#i?C(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(d(i`key = ${n}`,i`version = ${r}`)).orderBy(i.raw("revision DESC")),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(d(u(e.key,n),u(e.version,r),N(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(d(i`remote.key = ${e.key}`,i`remote.version = ${r}`))))).orderBy(D(e.revision))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(d(u(e.key,n),u(e.version,r))).orderBy(D(e.revision))).limit(1).run();if(a.rows.length>0){const v=a.rows[0];return{version:v.version||null,revision:v.revision||null}}return null}const y=await(this.#i?C(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(d(i`key = ${n}`,i`is_current = 1`)),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(d(u(e.key,n),u(e.isCurrent,!0),N(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(d(i`remote.key = ${e.key}`,i`remote.is_current = 1`)))))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(d(u(e.key,n),u(e.isCurrent,!0)))).limit(1).run();if(y.rows.length>0){const l=y.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}async#t(n,r,m){const y=m?{version:r||null,revision:m}:await this.#r(n,r||null),l=r||y?.version||null,a=m||y?.revision||null,v=!l||l===A,o=v?i`1 = 1`:i`(${t.sourceVersion} = ${l} OR ${t.sourceVersion} = '')`,R=v?i`1 = 1`:i`(${t.targetVersion} = ${l} OR ${t.targetVersion} = '')`,$=a?i`(${t.sourceRevision} <= ${a} OR ${t.sourceRevision} = '')`:i`1 = 0`,f=a?i`(${t.targetRevision} <= ${a} OR ${t.targetRevision} = '')`:i`1 = 0`,s=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(d(u(t.sourceKey,n),o,$)).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(d(u(t.targetKey,n),R,f)).as("incoming_filtered");return this.#e.client.select({entityKey:s.entityKey,entityRevision:s.entityRevision,entityVersion:s.entityVersion,relationName:s.relationName,direction:s.direction,priority:s.priority}).from(s).where(i`${s.rn} = 1 AND COALESCE(${s.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{te as CatalogEntitiesRelationsRepository};