@redocly/realm 0.129.1 → 0.130.0-custom.1

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 (457) hide show
  1. package/CHANGELOG.md +398 -83
  2. package/dist/bin.d.ts +1 -0
  3. package/dist/bin.js +1 -1
  4. package/dist/cli/develop.js +1 -1
  5. package/dist/cli/eject/resolveEjectParams.js +1 -1
  6. package/dist/cli/prepare/copy-env-files.js +1 -1
  7. package/dist/cli/prepare/index.js +1 -1
  8. package/dist/cli/stats/collectors/openapi.d.ts +3 -0
  9. package/dist/cli/stats/collectors/openapi.js +1 -0
  10. package/dist/cli/stats/index.d.ts +7 -0
  11. package/dist/cli/stats/index.js +1 -0
  12. package/dist/cli/stats/options.d.ts +3 -0
  13. package/dist/cli/stats/options.js +1 -0
  14. package/dist/cli/telemetry/index.d.ts +2 -2
  15. package/dist/cli/telemetry/index.js +1 -1
  16. package/dist/client/App.js +1 -1
  17. package/dist/client/ErrorBoundary.js +1 -1
  18. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  19. package/dist/client/app/Sidebar/Sidebar.js +2 -2
  20. package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -1
  21. package/dist/client/app/hooks/catalog/useCatalogClassic.d.ts +1 -1
  22. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  23. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  24. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  25. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  26. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  27. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  28. package/dist/client/app/hooks/useTelemetry.d.ts +2 -2
  29. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  30. package/dist/client/app/search/message-handlers.d.ts +29 -0
  31. package/dist/client/app/search/message-handlers.js +1 -0
  32. package/dist/client/app/search/sse-parser.d.ts +10 -0
  33. package/dist/client/app/search/sse-parser.js +2 -0
  34. package/dist/client/app/search/useAiSearch.d.ts +9 -11
  35. package/dist/client/app/search/useAiSearch.js +1 -1
  36. package/dist/client/app/search/useSearch.js +1 -1
  37. package/dist/client/app/telemetry/index.d.ts +11 -1
  38. package/dist/client/app/telemetry/index.js +1 -1
  39. package/dist/client/browser-entry.js +5 -5
  40. package/dist/client/constants/ai-search.d.ts +30 -0
  41. package/dist/client/constants/ai-search.js +1 -0
  42. package/dist/client/constants/index.d.ts +2 -0
  43. package/dist/client/constants/index.js +1 -0
  44. package/dist/client/providers/hooks.js +1 -1
  45. package/dist/client/runtime/loader.js +1 -1
  46. package/dist/client/types/ai-search.d.ts +73 -0
  47. package/dist/client/types/ai-search.js +0 -0
  48. package/dist/client/types/index.d.ts +1 -0
  49. package/dist/config/env-config.d.ts +17 -0
  50. package/dist/config/env-config.js +1 -0
  51. package/dist/config/env-schema.d.ts +242 -0
  52. package/dist/config/env-schema.js +3 -0
  53. package/dist/config/env-schemas/api-urls.d.ts +24 -0
  54. package/dist/config/env-schemas/api-urls.js +1 -0
  55. package/dist/config/env-schemas/auth.d.ts +42 -0
  56. package/dist/config/env-schemas/auth.js +1 -0
  57. package/dist/config/env-schemas/catalog.d.ts +12 -0
  58. package/dist/config/env-schemas/catalog.js +1 -0
  59. package/dist/config/env-schemas/database.d.ts +15 -0
  60. package/dist/config/env-schemas/database.js +1 -0
  61. package/dist/config/env-schemas/environment-detection.d.ts +24 -0
  62. package/dist/config/env-schemas/environment-detection.js +1 -0
  63. package/dist/config/env-schemas/feature-flags.d.ts +24 -0
  64. package/dist/config/env-schemas/feature-flags.js +1 -0
  65. package/dist/config/env-schemas/organization-project.d.ts +27 -0
  66. package/dist/config/env-schemas/organization-project.js +1 -0
  67. package/dist/config/env-schemas/scorecards.d.ts +12 -0
  68. package/dist/config/env-schemas/scorecards.js +1 -0
  69. package/dist/config/env-schemas/search.d.ts +21 -0
  70. package/dist/config/env-schemas/search.js +1 -0
  71. package/dist/config/env-schemas/server-config.d.ts +51 -0
  72. package/dist/config/env-schemas/server-config.js +1 -0
  73. package/dist/config/env-schemas/site.d.ts +12 -0
  74. package/dist/config/env-schemas/site.js +1 -0
  75. package/dist/config/env-schemas/ssr.d.ts +18 -0
  76. package/dist/config/env-schemas/ssr.js +1 -0
  77. package/dist/config/env-schemas/telemetry.d.ts +15 -0
  78. package/dist/config/env-schemas/telemetry.js +1 -0
  79. package/dist/config/env-schemas/test.d.ts +22 -0
  80. package/dist/config/env-schemas/test.js +1 -0
  81. package/dist/constants/common.d.ts +4 -2
  82. package/dist/constants/common.js +1 -1
  83. package/dist/constants/l10n/langs/ar.js +1 -1
  84. package/dist/constants/l10n/langs/de.js +1 -1
  85. package/dist/constants/l10n/langs/en.js +1 -1
  86. package/dist/constants/l10n/langs/es.js +1 -1
  87. package/dist/constants/l10n/langs/fr.js +1 -1
  88. package/dist/constants/l10n/langs/hi.js +1 -1
  89. package/dist/constants/l10n/langs/it.js +1 -1
  90. package/dist/constants/l10n/langs/ja.js +1 -1
  91. package/dist/constants/l10n/langs/ko.js +1 -1
  92. package/dist/constants/l10n/langs/pl.js +1 -1
  93. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  94. package/dist/constants/l10n/langs/pt.js +1 -1
  95. package/dist/constants/l10n/langs/ru.js +1 -1
  96. package/dist/constants/l10n/langs/uk.js +1 -1
  97. package/dist/constants/l10n/langs/zh.js +1 -1
  98. package/dist/server/api-routes/execute-api-route.js +1 -1
  99. package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
  100. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  101. package/dist/server/constants/common.js +1 -1
  102. package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
  103. package/dist/server/constants/plugins/catalog-entities.js +1 -1
  104. package/dist/server/entitlements/entitlements-provider.js +1 -1
  105. package/dist/server/esbuild/esbuild-logger.js +2 -2
  106. package/dist/server/esbuild/esbuild.js +3 -3
  107. package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
  108. package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
  109. package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
  110. package/dist/server/fs/cache.js +1 -1
  111. package/dist/server/fs/content-fs.d.ts +1 -0
  112. package/dist/server/fs/content-fs.js +1 -1
  113. package/dist/server/fs/last-modified-tracker.js +1 -1
  114. package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
  115. package/dist/server/node-bundle-entry.js +1 -1
  116. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +1 -0
  117. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -1
  118. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  119. package/dist/server/plugins/analytics/adobe/index.js +1 -1
  120. package/dist/server/plugins/analytics/amplitude/index.js +1 -1
  121. package/dist/server/plugins/analytics/fullstory/index.js +1 -1
  122. package/dist/server/plugins/analytics/ga/index.js +1 -1
  123. package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
  124. package/dist/server/plugins/analytics/gtm/index.js +1 -1
  125. package/dist/server/plugins/analytics/heap/index.js +1 -1
  126. package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
  127. package/dist/server/plugins/analytics/segment/index.js +1 -1
  128. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +3 -3
  129. package/dist/server/plugins/asyncapi-docs/get-server-props.js +1 -1
  130. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  131. package/dist/server/plugins/asyncapi-docs/search/schema-processor.js +1 -1
  132. package/dist/server/plugins/asyncapi-docs/search/search-resolver.js +1 -1
  133. package/dist/server/plugins/asyncapi-docs/store-definition-bundles.js +1 -1
  134. package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.d.ts +2 -1
  135. package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +9 -3
  136. package/dist/server/plugins/catalog-classic/get-server-props.d.ts +8 -3
  137. package/dist/server/plugins/catalog-classic/get-server-props.js +1 -1
  138. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +38 -64
  139. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  140. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
  141. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
  142. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +2 -1
  143. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  144. package/dist/server/plugins/catalog-entities/database/mappers/{create-entity-relation.d.ts → create-entity-relation-read-model.d.ts} +2 -2
  145. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -0
  146. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -1
  147. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
  148. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
  149. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
  150. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
  151. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +15 -4
  152. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +38 -27
  153. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +36 -9
  154. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +37 -21
  155. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +41 -42
  156. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  157. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -1
  158. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  159. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
  160. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  161. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +5 -9
  162. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  163. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
  164. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
  165. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
  166. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
  167. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
  168. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
  169. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
  170. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
  171. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
  172. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
  173. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  174. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  175. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +6 -4
  176. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  177. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  178. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
  179. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  180. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  181. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  182. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  183. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
  184. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  185. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +15 -1
  186. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  187. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +26 -164
  188. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +0 -1
  189. package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
  190. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
  191. package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
  192. package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
  193. package/dist/server/plugins/catalog-entities/types/params.js +0 -0
  194. package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
  195. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  196. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
  197. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
  198. package/dist/server/plugins/config-parser/index.js +1 -1
  199. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  200. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  201. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  202. package/dist/server/plugins/default-theme/index.js +1 -1
  203. package/dist/server/plugins/entitlements/index.js +1 -1
  204. package/dist/server/plugins/graphql-docs/graphql-doc-loader.js +1 -1
  205. package/dist/server/plugins/graphql-docs/index.js +1 -1
  206. package/dist/server/plugins/graphql-docs/search/search-resolver.js +1 -1
  207. package/dist/server/plugins/graphql-docs/template/GraphQLDocs.js +6 -2
  208. package/dist/server/plugins/lifecycle.js +2 -2
  209. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  210. package/dist/server/plugins/markdown/compiler.d.ts +1 -0
  211. package/dist/server/plugins/markdown/compiler.js +1 -1
  212. package/dist/server/plugins/markdown/index.js +1 -1
  213. package/dist/server/plugins/markdown/is-partial.d.ts +1 -1
  214. package/dist/server/plugins/markdown/is-partial.js +1 -1
  215. package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
  216. package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
  217. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.d.ts +1 -1
  218. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +2 -2
  219. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  220. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  221. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +54 -0
  222. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -0
  223. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +9 -8
  224. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  225. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +9 -8
  226. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  227. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +9 -8
  228. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  229. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +9 -8
  230. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  231. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +7 -13
  232. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  233. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +9 -6
  234. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  235. package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +9 -2
  236. package/dist/server/plugins/mcp/docs-mcp/tools/search.js +1 -1
  237. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +2 -1
  238. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  239. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +9 -2
  240. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  241. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  242. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  243. package/dist/server/plugins/mcp/handlers/handle-mcp-request.d.ts +5 -0
  244. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -0
  245. package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -1
  246. package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +1 -1
  247. package/dist/server/plugins/mcp/servers/base-server.js +1 -1
  248. package/dist/server/plugins/mcp/types.d.ts +40 -0
  249. package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +3 -0
  250. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -0
  251. package/dist/server/plugins/nav-utils.d.ts +1 -1
  252. package/dist/server/plugins/nav-utils.js +1 -1
  253. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -0
  254. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  255. package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.d.ts +2 -4
  256. package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.js +1 -1
  257. package/dist/server/plugins/openapi-docs/get-server-props.js +1 -1
  258. package/dist/server/plugins/openapi-docs/index.js +1 -1
  259. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -0
  260. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  261. package/dist/server/plugins/openapi-docs/openrpc-converter.d.ts +2 -0
  262. package/dist/server/plugins/openapi-docs/openrpc-converter.js +1 -0
  263. package/dist/server/plugins/openapi-docs/search/search-resolver.js +1 -1
  264. package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
  265. package/dist/server/plugins/openapi-docs/store-definition-bundles.js +1 -1
  266. package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
  267. package/dist/server/plugins/openapi-docs/template/helpers.d.ts +2 -2
  268. package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
  269. package/dist/server/plugins/openapi-docs/utils.d.ts +1 -0
  270. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +2 -1
  271. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  272. package/dist/server/plugins/scorecard-classic/get-scorecard-config.d.ts +2 -1
  273. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  274. package/dist/server/plugins/scorecard-classic/lint.d.ts +1 -1
  275. package/dist/server/plugins/scorecard-classic/lint.js +1 -1
  276. package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
  277. package/dist/server/plugins/scorecard-classic/loaders/scorecard.d.ts +6 -4
  278. package/dist/server/plugins/scorecard-classic/loaders/scorecard.js +1 -1
  279. package/dist/server/plugins/scorecard-classic/shared-utils.d.ts +1 -1
  280. package/dist/server/plugins/scorecard-classic/shared-utils.js +1 -1
  281. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.d.ts +2 -1
  282. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.js +3 -3
  283. package/dist/server/plugins/scorecard-classic/template/LevelIndicator.d.ts +1 -0
  284. package/dist/server/plugins/scorecard-classic/template/LevelIndicator.js +3 -3
  285. package/dist/server/plugins/scorecard-classic/template/components.js +1 -1
  286. package/dist/server/plugins/scorecard-classic/template/index.styles.d.ts +1 -0
  287. package/dist/server/plugins/scorecard-classic/template/index.styles.js +93 -19
  288. package/dist/server/plugins/scorecard-classic/template/index.types.d.ts +5 -1
  289. package/dist/server/plugins/scorecard-classic/template/useData.js +1 -1
  290. package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
  291. package/dist/server/plugins/scorecard-classic/types.d.ts +5 -3
  292. package/dist/server/plugins/scorecard-classic/types.js +1 -1
  293. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.d.ts +12 -0
  294. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +1 -0
  295. package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +11 -0
  296. package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -0
  297. package/dist/server/plugins/scorecards/plugin.js +1 -1
  298. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -1
  299. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  300. package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -12
  301. package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
  302. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  303. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  304. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  305. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  306. package/dist/server/plugins/search/index.js +1 -1
  307. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  308. package/dist/server/plugins/search/utils.js +2 -2
  309. package/dist/server/plugins/sidebars/index.d.ts +0 -2
  310. package/dist/server/plugins/sidebars/index.js +3 -3
  311. package/dist/server/plugins/sso/index.js +1 -1
  312. package/dist/server/providers/database/base-repository.d.ts +1 -0
  313. package/dist/server/providers/database/base-repository.js +1 -1
  314. package/dist/server/providers/database/database-connection-factory.js +1 -1
  315. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  316. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +2 -0
  317. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
  318. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +393 -0
  319. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
  320. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +14 -0
  321. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
  322. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
  323. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  324. package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +19 -0
  325. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +261 -0
  326. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
  327. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +24 -18
  328. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -1
  329. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  330. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0007_catalog-relations-constraint-fix.sql +2 -0
  331. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
  332. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0007_snapshot.json +833 -0
  333. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
  334. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
  335. package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
  336. package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
  337. package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
  338. package/dist/server/providers/database/pagination/utils/index.js +1 -1
  339. package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
  340. package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
  341. package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
  342. package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
  343. package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
  344. package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
  345. package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
  346. package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
  347. package/dist/server/ssr/render.js +1 -1
  348. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  349. package/dist/server/ssr/utils.js +8 -8
  350. package/dist/server/store.d.ts +14 -6
  351. package/dist/server/store.js +1 -1
  352. package/dist/server/telemetry/index.js +1 -1
  353. package/dist/server/tools/notifiers/formatter.js +3 -3
  354. package/dist/server/tools/notifiers/helpers/colors.js +1 -1
  355. package/dist/server/tools/notifiers/logger.js +2 -2
  356. package/dist/server/tools/notifiers/reporter.js +9 -9
  357. package/dist/server/tools/notifiers/terminal-manager.js +4 -4
  358. package/dist/server/types/plugins/common.d.ts +7 -1
  359. package/dist/server/types/plugins/markdown.d.ts +2 -0
  360. package/dist/server/types/plugins/scorecards.d.ts +30 -0
  361. package/dist/server/types/plugins/scorecards.js +0 -0
  362. package/dist/server/utils/envs/get-api-route-allowed-env-variables.js +1 -1
  363. package/dist/server/utils/envs/load-env-variables.d.ts +1 -1
  364. package/dist/server/utils/envs/load-env-variables.js +1 -1
  365. package/dist/server/utils/envs/sanitize-branch-name.d.ts +6 -0
  366. package/dist/server/utils/envs/sanitize-branch-name.js +1 -0
  367. package/dist/server/utils/globs.js +1 -1
  368. package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
  369. package/dist/server/utils/is-scorecards-enabled.js +1 -1
  370. package/dist/server/utils/lifecycle-hooks.js +1 -1
  371. package/dist/server/utils/rbac.d.ts +76 -7
  372. package/dist/server/utils/rbac.js +1 -1
  373. package/dist/server/utils/report-all-errors.js +1 -1
  374. package/dist/server/utils/set-execution-mode.d.ts +5 -0
  375. package/dist/server/utils/set-execution-mode.js +1 -0
  376. package/dist/server/utils/time/with-timestamp.d.ts +42 -10
  377. package/dist/server/utils/time/with-timestamp.js +1 -1
  378. package/dist/server/version.js +1 -1
  379. package/dist/server/web-server/auth.js +3 -3
  380. package/dist/server/web-server/dev-server.js +1 -1
  381. package/dist/server/web-server/handle-api-route-request.js +1 -1
  382. package/dist/server/web-server/http.js +2 -2
  383. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  384. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
  385. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  386. package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
  387. package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
  388. package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
  389. package/dist/server/web-server/routes/ask-ai.js +1 -1
  390. package/dist/server/web-server/routes/auth.js +1 -1
  391. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  392. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  393. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  394. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  395. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.d.ts +3 -0
  396. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.js +0 -0
  397. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.d.ts +43 -0
  398. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.js +1 -0
  399. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +6823 -0
  400. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -0
  401. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.d.ts +1102 -0
  402. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.js +1 -0
  403. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
  404. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
  405. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.d.ts +4 -0
  406. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.js +1 -0
  407. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +4 -0
  408. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.js +1 -0
  409. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +4 -0
  410. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.js +1 -0
  411. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +4 -0
  412. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.js +1 -0
  413. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +13 -0
  414. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.js +1 -0
  415. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +13 -0
  416. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.js +1 -0
  417. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +13 -0
  418. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.js +1 -0
  419. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  420. package/dist/server/web-server/routes/error.js +1 -1
  421. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
  422. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
  423. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
  424. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
  425. package/dist/server/web-server/routes/index.js +1 -1
  426. package/dist/server/web-server/routes/info.js +1 -1
  427. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  428. package/dist/server/web-server/routes/otel/otel.js +1 -1
  429. package/dist/server/web-server/routes/page-data.js +1 -1
  430. package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
  431. package/dist/server/web-server/utils.d.ts +2 -2
  432. package/dist/server/workers/mcp-tool-worker-pool.d.ts +4 -0
  433. package/dist/server/workers/mcp-tool-worker-pool.js +1 -0
  434. package/dist/server/workers/mcp-tool-worker.d.ts +2 -0
  435. package/dist/server/workers/mcp-tool-worker.js +1 -0
  436. package/dist/server/workers/types.d.ts +7 -1
  437. package/dist/server/workers/worker-pool.js +1 -1
  438. package/package.json +19 -21
  439. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +0 -1
  440. package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +0 -6
  441. package/dist/server/plugins/catalog-entities/entities/validate-entity.js +0 -1
  442. package/dist/server/plugins/mcp/workers/run-api-routes-worker.d.ts +0 -5
  443. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +0 -1
  444. package/dist/server/utils/envs/is-build-mode.d.ts +0 -2
  445. package/dist/server/utils/envs/is-build-mode.js +0 -1
  446. package/dist/server/utils/envs/is-develop-mode.d.ts +0 -7
  447. package/dist/server/utils/envs/is-develop-mode.js +0 -1
  448. package/dist/server/utils/envs/is-production-mode.d.ts +0 -10
  449. package/dist/server/utils/envs/is-production-mode.js +0 -1
  450. package/dist/server/workers/mcp-worker-pool.d.ts +0 -4
  451. package/dist/server/workers/mcp-worker-pool.js +0 -1
  452. package/dist/utils/env/is-local-development.d.ts +0 -13
  453. package/dist/utils/env/is-local-development.js +0 -1
  454. package/dist/utils/env/is-production.d.ts +0 -13
  455. package/dist/utils/env/is-production.js +0 -1
  456. package/dist/utils/env/is-web-view.d.ts +0 -14
  457. package/dist/utils/env/is-web-view.js +0 -1
@@ -1 +1 @@
1
- import{setCookie as L,deleteCookie as T}from"hono/cookie";import{AuthProviderType as G}from"@redocly/config";import{withPathPrefix as R,getPathPrefix as _}from"@redocly/theme/core/utils";import{compareURIs as X}from"../../../utils/url/compare-uris.js";import{ensureArray as q}from"../../../utils/array/ensure-array.js";import{ALTERNATIVE_AUD_CLAIM_NAME as E,JWT_SECRET_KEY as v,ORG_SLUG as W}from"../../constants/common.js";import{DEFAULT_COOKIE_EXPIRATION as F,ServerRoutes as D}from"../../../constants/common.js";import{sanitizeRedirectPathname as B}from"../../../utils/url/sanitize-redirect-pathname.js";import{telemetry as k}from"../../telemetry/index.js";import{getAuthProviderLoginParams as Y,isOidcProviderConfig as $,isSaml2ProviderConfig as Q,oidcExchangeCodeForToken as Z,buildLoginUrl as x,decodeSamlResponse as ee,extractUserClaims as re,parseSamlResponse as oe,parseOidcState as ne,verifySAMLResponse as te,getUsernameFromPayload as ie,buildOidcLogoutUrl as se,getOidcMetadata as z,getRedoclyTokenPayload as ae,isRedoclySso as de,rewritePreviewAuthRedirectUri as ce,parsePreviewBranch as N,buildOidcLoginUrl as le,createMcpSessionResource as I}from"../auth.js";import*as S from"../jwt/jwt.js";import{AlgorithmTypes as ue}from"../jwt/types.js";import{handleErrorPageRender as pe}from"../utils.js";import{encodeBase64URL as ge}from"../jwt/encode.js";async function Oe(i){if(process.env.NODE_ENV==="production")return i.newResponse(null,404,{});const{password:e,...r}=await i.req.json(),a=await S.sign({...r,name:r.username||r.email||"Unknown"},v);return L(i,"authorization",a,{path:_()||"/",httpOnly:!0,secure:!0,sameSite:"none"}),i.newResponse(null,200,{})}function Pe(){return async i=>{const e=i.get("logger"),r=encodeURIComponent(i.req.query("message")||"");e.error(`Login error: ${r}`);const a=`${D.LOGIN}/?error=${encodeURIComponent(r)}`;return i.newResponse(null,301,{Location:a})}}function H(i){if(!i||!i.includes(D.MCP_CALLBACK))return null;try{const e=i.split("/"),r=e[e.length-1];if(r){const a=Buffer.from(r,"base64url").toString("utf-8");return JSON.parse(a).mcpSessionId||null}}catch{}return null}function Se(i){return async e=>{const r=e.get("logger"),a=i.getConfig().ssoDirect,n=ne(e.req.query("state")),f=n.idpId,t=n.source==="mcp"||n.redirectTo&&typeof n.redirectTo=="string"&&n.redirectTo.includes(D.MCP_CALLBACK),c=t?H(typeof n.redirectTo=="string"?n.redirectTo:void 0):null,s=a?.[f];if(!$(s))return r.error("OIDC login error: missing OIDC provider config"),e.text("Forbidden",403);const d=await z(f,s);if(a&&!d.token_endpoint){const p="Invalid OIDC configuration: token_endpoint is required";return r.error(`OIDC login error: ${p}`),e.text(p,500)}try{const p=d.token_endpoint,l=e.req.query("code"),m=e.req.query("error");if(m)return t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:`OIDC error: ${m}`,error_details:e.req.query("error_description")||null}),pe(e,i,{slug:"/"},403,"403OIDC");if(!l){const h="Code is expected but not present";return r.error(`OIDC login error: ${h}`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:h,error_details:null}),new Response(`Forbidden: ${h}`,{status:403})}const y=e.req.header("x-forwarded-host"),g=e.req.header("x-forwarded-proto")||"https",A=t&&typeof n.redirectUri=="string"?n.redirectUri:new URL(R(D.OIDC_CALLBACK),y?`${g}://${y}`:e.req.url).toString(),C=e.get("cookies")?.code_verifier,u=await Z(p,l,A,s,{...s.tokenRequestCustomParams,...C?{code_verifier:C}:{}});if(u.error)return r.error(`Error from OIDC provider: "${u.error}"`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:`Token exchange error: ${u.error}`,error_details:u.error_description||null}),e.text(`Forbidden: ${u.error_description||u.error}`,403);if(!u?.id_token){const h="No id_token, please, add openid to scopes";return r.error(`OIDC login error: ${h}`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:h,error_details:null}),new Response(`Forbidden: ${h}`,{status:403})}const{payload:o,header:U}=S.decode(u.id_token),j=U.alg===ue.RS256;if(s.audience?.length&&![...q(o.aud||[]),...q(o[E]||[])].some(M=>s.audience?.includes(M))){const M="No valid audience found in id_token";return r.error(`OIDC login error: ${M}`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:M,error_details:null}),new Response(`Forbidden: ${M}`)}const b=j?u.id_token:await S.sign({...o,idpId:f},v);ie(o)||r.warn("To display your username, the required 'email' or 'full_profile' scope must be added to the identity provider configuration");const O=s?.tokenExpirationTime?Date.now()+s.tokenExpirationTime*1e3:o.exp*1e3||Date.now()+F*1e3;if(s.introspectEndpoint){const h=await fetch(s.introspectEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({access_token:u.access_token})});if(h.ok){const P=(await h.json()).ext?.federatedIdentity;P&&(L(e,"federated_access_token",P.access_token||"",{path:_()||"/",httpOnly:!1,expires:new Date(O)}),L(e,"federated_id_token",P.id_token||"",{path:_()||"/",httpOnly:!1,expires:new Date(O)}))}else r.warn(`OIDC introspect error: ${h.statusText}`)}if(L(e,"authorization",b,{path:_()||"/",httpOnly:!0,expires:new Date(O)}),b!==u.id_token&&L(e,"idp_id_token",u.id_token||"",{path:_()||"/",httpOnly:!0,expires:new Date(O)}),L(e,"idp_access_token",u.access_token||"",{path:_()||"/",httpOnly:!0,expires:new Date(O)}),T(e,"code_verifier",{path:_()||"/"}),t&&n.redirectTo&&typeof n.redirectTo=="string"&&n.redirectTo.includes(D.MCP_CALLBACK)){const h=e.req.url.split("?")[0].replace(D.OIDC_CALLBACK,""),M=R(n.redirectTo),P=`${h}${M}`;return e.newResponse(null,302,{Location:P})}const K=typeof n.redirectTo=="string"?n.redirectTo:void 0;let J=B(new URL(K||"/",e.req.url).pathname);const V=e.newResponse(null,302,{Location:J});return r.updateContext({email:o.email,subject:o.sub}),r.info("OIDC login successful"),V}catch(p){const l=p instanceof Error?p.message:String(p),m=p instanceof Error?p.stack:String(p);if(r.error(`OIDC login error: ${l}`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:l,error_details:m}),p.error==="access_denied")return r.info("Access denied"),e.text("Forbidden",403)}const w="Something went wrong";return r.error(`OIDC login error: ${w}`),t&&k.sendMcpAuthorizationFailedMessage({...I(c),error:w,error_details:null}),e.text(w,500)}}function ve(i){return async e=>{const r=e.get("logger"),n=e.get("auth").claims?.idpId,t=i.getConfig().ssoDirect?.[n];if(e.req.method==="POST")return $(t)||T(e,"authorization",{path:_()||"/"}),r.info("Logout successful"),e.newResponse(null,200,{});let c;if($(t)){const s=(await z(n,t)).end_session_endpoint;if(s){const d=new URL(e.req.url),w=e.req.header("x-forwarded-proto")||d.protocol.slice(0,-1)||"https",p=e.req.header("x-forwarded-host")||d.host,l=`${w}://${p}`,m=N(l),y=m?ge(JSON.stringify({branch:N(l)})):void 0,g=m?`${ce(l)}/_auth/logout`:`${l}/post-logout`;c=se(s,g,e.get("cookies")?.idp_id_token||e.get("cookies")?.authorization||"",y)}}return r.info("Logout successful"),T(e,"authorization",{path:_()||"/"}),e.newResponse(null,302,{Location:c||R("/")})}}function $e(i){return async e=>{const r=i.getConfig().logoutReturnUrl,a=r||R("/");return e.newResponse(null,302,{Location:a})}}function Ue(i){return async e=>{const r=e.get("logger"),a=e.req.param("code"),n=process.env.BH_API_URL,f=(t,c,s)=>t&&c?`${t} ${c.charAt(0)}`:s;try{if(!n)throw new Error("BH_API_URL is not set");const t=i.getConfig().ssoDirect;if(!t||!Object.keys(t).length)return r.warn("Invite no sso configured to handle"),e.redirect(R("/"));const c=await fetch(`${n}/user-invites/public/${a}`);if(!c.ok)return c.status===404?(r.warn(`Invite ${a} not found redirect to homepage`),e.redirect(R("/"))):(r.error("Invite error",await c.text()),e.redirect(R("/")));const s=await c.json(),d=new URL(R("/invite"),e.req.url);return d.searchParams.set("code",a),d.searchParams.set("org",s.organization.name),d.searchParams.set("invitedBy",f(s.invitedBy.firstName,s.invitedBy.lastName,s.invitedBy.name)),e.newResponse(null,302,{Location:d.toString()})}catch(t){return r.error("Error processing invite",{error:t,inviteCode:a}),e.text(t.message||"Failed to process invite",400)}}}function Te(i){return async e=>{const r=e.get("logger"),a=i.getConfig().ssoDirect,n=new URL(e.req.url),f=e.req.query("inviteCode"),t=e.req.header("x-forwarded-proto")||n.protocol.slice(0,-1)||"https",c=e.req.header("x-forwarded-host")||n.host,s=`${t}://${c}`;let d=n.searchParams.get("idpId");const w=n.searchParams.get("redirectTo"),p=Object.keys(a||{})[0];d=d||p;const l=n.searchParams.get("mcp_redirect_uri"),m=!!l;if(!a?.[d]){const o="Invalid idpId";if(r.error(`IdP login error: ${o}`),m){const U=H(w||void 0);k.sendMcpAuthorizationFailedMessage({...I(U),error:o,error_details:null})}return e.text(`Forbidden: ${o}`,403)}const g=d&&a?await Y(d,a[d]):void 0,A={};for(const o of Object.keys(g?.extraParams||{}))A[o]=n.searchParams.get(o)||g?.extraParams?.[o]||void 0;let C,u={};if(m&&l&&g&&g.type===G.OIDC){r.info(`Building MCP OAuth login URL with redirect_uri: ${l}`);const o=le("",{...g,extraParams:A},w,f,{redirectUriOverride:l,sourceOverride:"mcp",branchOverride:void 0});C=o.loginUrl,u=o.cookies||{}}else if(g){const o=x({...g,extraParams:A},s,w,f);C=o.loginUrl,u=o.cookies||{}}return Object.keys(u).forEach(o=>{L(e,o,u[o].value,u[o].options)}),r.info(`IdP login initiated for ID '${d}'`),e.newResponse(null,302,{Location:C||new URL(e.req.url).pathname})}}function qe(i){return async e=>{const r=e.get("logger"),a=await e.req.formData(),n=a.get("SAMLResponse"),f=a.get("RelayState");if(typeof n!="string"||typeof f!="string"){const o="SAMLResponse is required";return r.error(`SAML2 login error: ${o}`),e.text(`Bad request: ${o}`,400)}const t=ee(n),{success:c,uid:s,nameFormat:d,attrs:w,issuerId:p,expiresAt:l}=oe(t),{idpId:m,redirectTo:y}=JSON.parse(f);if(!c){const o="SAML2 assertion is not successful";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!l||Math.ceil(Date.now()/1e3)>=l){const o="SAML2 Token Expired";return r.error(`SAML2 login error: ${o}`),e.text(o,401)}const g=i.getConfig().ssoDirect?.[m];if(!g||!Q(g)){const o="Cannot find valid IdP";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!(g.issuerId&&p&&X(g.issuerId,p))){const o="IssuerID is misconfigured or untrusted assertions issuer received";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!await te(t,g.x509PublicCert)){const o="SAMLResponse signature invalid";return r.error(`SAML2 login error: ${o}`),e.text(o,401)}const C=re(s,d,w,g.teamsAttributeName);if(!C.sub){const o="The provider did not return a valid user identity.";return r.error(`SAML2 login error: ${o}`),e.text(o,400)}if(!C.email){const o="The provider did not return a valid user email.";return r.error(`SAML2 login error: ${o}`),e.text(o,400)}const u=await S.sign({...C,idpId:m},v);return L(e,"authorization",u,{path:_()||"/",httpOnly:!0,expires:new Date(l*1e3)}),r.updateContext({email:C.email,subject:C.sub}),r.info("SAML2 login successful"),e.newResponse(null,302,{Location:y||"/"})}}function be(i){return async e=>{const r=e.get("logger"),a=new URL(e.req.query("redirectTo")||"/",e.req.url),n=R(B(a.pathname)),f=i.getConfig().ssoDirect,t=Object.entries(f||{}).find(([,y])=>$(y)&&de(y));if(!(f&&t))return e.newResponse(null,302,{Location:n});const s=e.req.query("token"),d=s&&await ae(s);if(!d)return e.newResponse(null,302,{Location:n});if(!q(d[E]||[]).some(y=>y===W))return e.newResponse(null,302,{Location:n});const l=await S.sign({...d,idpId:t?.at(0)},v),m=Date.now()+F*1e3;return L(e,"authorization",l,{path:_()||"/",httpOnly:!0,expires:new Date(m),sameSite:"None",secure:!0}),r.info("Token login successful"),e.newResponse(null,302,{Location:n})}}export{Oe as authorizeHandler,Te as idpLoginHandler,Ue as inviteHandler,ve as logoutHandler,Se as oidcCallbackHandler,$e as postLogoutHandler,Pe as redoclyLoginCallbackHandler,be as redoclyTokenLoginHandler,qe as samlCallbackHandler};
1
+ import{setCookie as _,deleteCookie as q}from"hono/cookie";import{AuthProviderType as W}from"@redocly/config";import{withPathPrefix as I,getPathPrefix as R}from"@redocly/theme/core/utils";import{compareURIs as Y}from"../../../utils/url/compare-uris.js";import{ensureArray as b}from"../../../utils/array/ensure-array.js";import{ALTERNATIVE_AUD_CLAIM_NAME as F,JWT_SECRET_KEY as v,ORG_SLUG as Q,ORG_ID as Z}from"../../constants/common.js";import{DEFAULT_COOKIE_EXPIRATION as B,ServerRoutes as S}from"../../../constants/common.js";import{sanitizeRedirectPathname as z}from"../../../utils/url/sanitize-redirect-pathname.js";import{telemetry as M}from"../../telemetry/index.js";import{envConfig as H}from"../../../config/env-config.js";import{getAuthProviderLoginParams as x,isOidcProviderConfig as $,isSaml2ProviderConfig as ee,oidcExchangeCodeForToken as re,buildLoginUrl as oe,decodeSamlResponse as ne,extractUserClaims as te,parseSamlResponse as ie,parseOidcState as se,verifySAMLResponse as ae,getUsernameFromPayload as de,buildOidcLogoutUrl as ce,getOidcMetadata as j,getRedoclyTokenPayload as le,isRedoclySso as ue,rewritePreviewAuthRedirectUri as pe,parsePreviewBranch as N,buildOidcLoginUrl as ge,createMcpSessionResource as k}from"../auth.js";import*as O from"../jwt/jwt.js";import{AlgorithmTypes as P}from"../jwt/types.js";import{handleErrorPageRender as fe}from"../utils.js";import{encodeBase64URL as me}from"../jwt/encode.js";async function ve(i){if(H.isProductionEnv)return i.newResponse(null,404,{});const{password:e,...r}=await i.req.json(),a=await O.sign({...r,name:r.username||r.email||"Unknown"},v,P.HS256);return _(i,"authorization",a,{path:R()||"/",httpOnly:!0,secure:!0,sameSite:"none"}),i.newResponse(null,200,{})}function $e(){return async i=>{const e=i.get("logger"),r=encodeURIComponent(i.req.query("message")||"");e.error(`Login error: ${r}`);const a=`${S.LOGIN}/?error=${encodeURIComponent(r)}`;return i.newResponse(null,301,{Location:a})}}function K(i){if(!i||!i.includes(S.MCP_CALLBACK))return null;try{const e=i.split("/"),r=e[e.length-1];if(r){const a=Buffer.from(r,"base64url").toString("utf-8");return JSON.parse(a).mcpSessionId||null}}catch{}return null}function Ue(i){return async e=>{const r=e.get("logger"),a=i.getConfig().ssoDirect,n=se(e.req.query("state")),f=n.idpId,t=n.source==="mcp"||n.redirectTo&&typeof n.redirectTo=="string"&&n.redirectTo.includes(S.MCP_CALLBACK),c=t?K(typeof n.redirectTo=="string"?n.redirectTo:void 0):null,s=a?.[f];if(!$(s))return r.error("OIDC login error: missing OIDC provider config"),e.text("Forbidden",403);const d=await j(f,s);if(a&&!d.token_endpoint){const p="Invalid OIDC configuration: token_endpoint is required";return r.error(`OIDC login error: ${p}`),e.text(p,500)}try{const p=d.token_endpoint,l=e.req.query("code"),m=e.req.query("error");if(m)return t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:`OIDC error: ${m}`,error_details:e.req.query("error_description")||null}]),fe(e,i,{slug:"/"},403,"403OIDC");if(!l){const w="Code is expected but not present";return r.error(`OIDC login error: ${w}`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:w,error_details:null}]),new Response(`Forbidden: ${w}`,{status:403})}const h=e.req.header("x-forwarded-host"),g=e.req.header("x-forwarded-proto")||"https",A=t&&typeof n.redirectUri=="string"?n.redirectUri:new URL(I(S.OIDC_CALLBACK),h?`${g}://${h}`:e.req.url).toString(),C=e.get("cookies")?.code_verifier,u=await re(p,l,A,s,{...s.tokenRequestCustomParams,...C?{code_verifier:C}:{}});if(u.error)return r.error(`Error from OIDC provider: "${u.error}"`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:`Token exchange error: ${u.error}`,error_details:u.error_description||null}]),e.text(`Forbidden: ${u.error_description||u.error}`,403);if(!u?.id_token){const w="No id_token, please, add openid to scopes";return r.error(`OIDC login error: ${w}`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:w,error_details:null}]),new Response(`Forbidden: ${w}`,{status:403})}const{payload:o,header:U}=O.decode(u.id_token),J=U.alg===P.RS256;if(s.audience?.length&&![...b(o.aud||[]),...b(o[F]||[])].some(L=>s.audience?.includes(L))){const L="No valid audience found in id_token";return r.error(`OIDC login error: ${L}`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:L,error_details:null}]),new Response(`Forbidden: ${L}`)}const E=J?u.id_token:await O.sign({...o,idpId:f},v,P.HS256);de(o)||r.warn("To display your username, the required 'email' or 'full_profile' scope must be added to the identity provider configuration");const D=s?.tokenExpirationTime?Date.now()+s.tokenExpirationTime*1e3:o.exp*1e3||Date.now()+B*1e3;if(s.introspectEndpoint){const w=await fetch(s.introspectEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({access_token:u.access_token})});if(w.ok){const T=(await w.json()).ext?.federatedIdentity;T&&(_(e,"federated_access_token",T.access_token||"",{path:R()||"/",httpOnly:!1,expires:new Date(D)}),_(e,"federated_id_token",T.id_token||"",{path:R()||"/",httpOnly:!1,expires:new Date(D)}))}else r.warn(`OIDC introspect error: ${w.statusText}`)}if(_(e,"authorization",E,{path:R()||"/",httpOnly:!0,expires:new Date(D)}),E!==u.id_token&&_(e,"idp_id_token",u.id_token||"",{path:R()||"/",httpOnly:!0,expires:new Date(D)}),_(e,"idp_access_token",u.access_token||"",{path:R()||"/",httpOnly:!0,expires:new Date(D)}),q(e,"code_verifier",{path:R()||"/"}),t&&n.redirectTo&&typeof n.redirectTo=="string"&&n.redirectTo.includes(S.MCP_CALLBACK)){const L=`${e.req.url.split("?")[0].replace(S.OIDC_CALLBACK,"")}${n.redirectTo}`;return e.newResponse(null,302,{Location:L})}const G=typeof n.redirectTo=="string"?n.redirectTo:void 0;let V=z(new URL(G||"/",e.req.url).pathname);const X=e.newResponse(null,302,{Location:V});return r.updateContext({email:o.email,subject:o.sub}),r.info("OIDC login successful"),X}catch(p){const l=p instanceof Error?p.message:String(p),m=p instanceof Error?p.stack:String(p);if(r.error(`OIDC login error: ${l}`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:l,error_details:m}]),p.error==="access_denied")return r.info("Access denied"),e.text("Forbidden",403)}const y="Something went wrong";return r.error(`OIDC login error: ${y}`),t&&M.sendMcpAuthorizationFailedMessage([{...k(c),error:y,error_details:null}]),e.text(y,500)}}function Te(i){return async e=>{const r=e.get("logger"),n=e.get("auth").claims?.idpId,t=i.getConfig().ssoDirect?.[n];if(e.req.method==="POST")return $(t)||q(e,"authorization",{path:R()||"/"}),r.info("Logout successful"),e.newResponse(null,200,{});let c;if($(t)){const s=(await j(n,t)).end_session_endpoint;if(s){const d=new URL(e.req.url),y=e.req.header("x-forwarded-proto")||d.protocol.slice(0,-1)||"https",p=e.req.header("x-forwarded-host")||d.host,l=`${y}://${p}`,m=N(l),h=m?me(JSON.stringify({branch:N(l)})):void 0,g=m?`${pe(l)}/_auth/logout`:`${l}/post-logout`;c=ce(s,g,e.get("cookies")?.idp_id_token||e.get("cookies")?.authorization||"",h)}}return r.info("Logout successful"),q(e,"authorization",{path:R()||"/"}),e.newResponse(null,302,{Location:c||I("/")})}}function qe(i){return async e=>{const r=i.getConfig().logoutReturnUrl,a=r||I("/");return e.newResponse(null,302,{Location:a})}}function be(i){return async e=>{const r=e.get("logger"),a=e.req.param("code"),n=H.BH_API_URL,f=(t,c,s)=>t&&c?`${t} ${c.charAt(0)}`:s;try{if(!n)throw new Error("BH_API_URL is not set");const t=i.getConfig().ssoDirect;if(!t||!Object.keys(t).length)return r.warn("Invite no sso configured to handle"),e.redirect(I("/"));const c=await fetch(`${n}/user-invites/public/${a}`);if(!c.ok)return c.status===404?(r.warn(`Invite ${a} not found redirect to homepage`),e.redirect(I("/"))):(r.error("Invite error",await c.text()),e.redirect(I("/")));const s=await c.json(),d=new URL(I("/invite"),e.req.url);return d.searchParams.set("code",a),d.searchParams.set("org",s.organization.name),d.searchParams.set("invitedBy",f(s.invitedBy.firstName,s.invitedBy.lastName,s.invitedBy.name)),e.newResponse(null,302,{Location:d.toString()})}catch(t){return r.error("Error processing invite",{error:t,inviteCode:a}),e.text(t.message||"Failed to process invite",400)}}}function Ee(i){return async e=>{const r=e.get("logger"),a=i.getConfig().ssoDirect,n=new URL(e.req.url),f=e.req.query("inviteCode"),t=e.req.header("x-forwarded-proto")||n.protocol.slice(0,-1)||"https",c=e.req.header("x-forwarded-host")||n.host,s=`${t}://${c}`;let d=n.searchParams.get("idpId");const y=n.searchParams.get("redirectTo"),p=Object.keys(a||{})[0];d=d||p;const l=n.searchParams.get("mcp_redirect_uri"),m=!!l;if(!a?.[d]){const o="Invalid idpId";if(r.error(`IdP login error: ${o}`),m){const U=K(y||void 0);M.sendMcpAuthorizationFailedMessage([{...k(U),error:o,error_details:null}])}return e.text(`Forbidden: ${o}`,403)}const g=d&&a?await x(d,a[d]):void 0,A={};for(const o of Object.keys(g?.extraParams||{}))A[o]=n.searchParams.get(o)||g?.extraParams?.[o]||void 0;let C,u={};if(m&&l&&g&&g.type===W.OIDC){r.info(`Building MCP OAuth login URL with redirect_uri: ${l}`);const o=ge("",{...g,extraParams:A},y,f,{redirectUriOverride:l,sourceOverride:"mcp",branchOverride:void 0});C=o.loginUrl,u=o.cookies||{}}else if(g){const o=oe({...g,extraParams:A},s,y,f);C=o.loginUrl,u=o.cookies||{}}return Object.keys(u).forEach(o=>{_(e,o,u[o].value,u[o].options)}),r.info(`IdP login initiated for ID '${d}'`),e.newResponse(null,302,{Location:C||new URL(e.req.url).pathname})}}function Fe(i){return async e=>{const r=e.get("logger"),a=await e.req.formData(),n=a.get("SAMLResponse"),f=a.get("RelayState");if(typeof n!="string"||typeof f!="string"){const o="SAMLResponse is required";return r.error(`SAML2 login error: ${o}`),e.text(`Bad request: ${o}`,400)}const t=ne(n),{success:c,uid:s,nameFormat:d,attrs:y,issuerId:p,expiresAt:l}=ie(t),{idpId:m,redirectTo:h}=JSON.parse(f);if(!c){const o="SAML2 assertion is not successful";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!l||Math.ceil(Date.now()/1e3)>=l){const o="SAML2 Token Expired";return r.error(`SAML2 login error: ${o}`),e.text(o,401)}const g=i.getConfig().ssoDirect?.[m];if(!g||!ee(g)){const o="Cannot find valid IdP";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!(g.issuerId&&p&&Y(g.issuerId,p))){const o="IssuerID is misconfigured or untrusted assertions issuer received";return r.error(`SAML2 login error: ${o}`),e.text(`Permission denied: ${o}`,401)}if(!await ae(t,g.x509PublicCert)){const o="SAMLResponse signature invalid";return r.error(`SAML2 login error: ${o}`),e.text(o,401)}const C=te(s,d,y,g.teamsAttributeName);if(!C.sub){const o="The provider did not return a valid user identity.";return r.error(`SAML2 login error: ${o}`),e.text(o,400)}if(!C.email){const o="The provider did not return a valid user email.";return r.error(`SAML2 login error: ${o}`),e.text(o,400)}const u=await O.sign({...C,idpId:m},v,P.HS256);return _(e,"authorization",u,{path:R()||"/",httpOnly:!0,expires:new Date(l*1e3)}),r.updateContext({email:C.email,subject:C.sub}),r.info("SAML2 login successful"),e.newResponse(null,302,{Location:h||"/"})}}function Be(i){return async e=>{const r=e.get("logger"),a=new URL(e.req.query("redirectTo")||"/",e.req.url),n=I(z(a.pathname)),f=i.getConfig().ssoDirect,t=Object.entries(f||{}).find(([,h])=>$(h)&&ue(h));if(!(f&&t))return e.newResponse(null,302,{Location:n});const s=e.req.query("token"),d=s&&await le(s);if(!d)return e.newResponse(null,302,{Location:n});if(!b(d[F]||[]).some(h=>h===Q||h===Z))return e.newResponse(null,302,{Location:n});const l=await O.sign({...d,idpId:t?.at(0)},v,P.HS256),m=Date.now()+B*1e3;return _(e,"authorization",l,{path:R()||"/",httpOnly:!0,expires:new Date(m),sameSite:"None",secure:!0}),r.info("Token login successful"),e.newResponse(null,302,{Location:n})}}export{ve as authorizeHandler,Ee as idpLoginHandler,be as inviteHandler,Te as logoutHandler,Ue as oidcCallbackHandler,qe as postLogoutHandler,$e as redoclyLoginCallbackHandler,Be as redoclyTokenLoginHandler,Fe as samlCallbackHandler};
@@ -1 +1 @@
1
- import{telemetryTraceStep as n}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_KEY as m}from"../../../../constants/common.js";import{ALLOWED_CATALOG_QUERY_PARAMS as l}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as u}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as y}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as d}from"../../../providers/database/pagination/schemas.js";import{ENTITY_RELATION_FROM_DATABASE as c}from"../../../plugins/catalog-entities/database/mappers/field-transformations.js";const f=["id","key","title","type","summary","source","sourceFile","createdAt","updatedAt","version","revision"],g=async({catalogEntitiesService:i,ctx:t})=>n("catalog_entities.bff.related_entities.get_related_entities",async r=>{try{const e=t.req.param(m);if(!e)return r?.error(new Error("Entity key is required")),t.json({message:"Entity key is required"},400);r?.setAttribute("pathParams",JSON.stringify({entityKey:e}));const s=t.req.query();r?.setAttribute("queryParams",JSON.stringify(u(s,l)));const o=d(f,c).parse(s),a=await i.getRelatedEntities(e,o);return r?.setAttribute("relatedEntitiesCount",a.items.length),t.json(a)}catch(e){return console.error(e),r?.error(e),t.json({message:e.message},500)}});function q(i){return async t=>n("catalog_entities.bff.related_entities",async r=>{r?.setAttribute("method",t.req.method);const e=await y.getInstance({baseDbDir:i.serverOutDir});return g({catalogEntitiesService:e,ctx:t})})}export{q as bffCatalogRelatedEntitiesHandler};
1
+ import{telemetryTraceStep as o}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_KEY as d}from"../../../../constants/common.js";import{ALLOWED_CATALOG_QUERY_PARAMS as y}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as g}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as f}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as E}from"../../../providers/database/pagination/schemas.js";import{ENTITY_RELATION_FROM_DATABASE as A}from"../../../plugins/catalog-entities/database/mappers/field-transformations.js";import{getRbacRestrictionsDataForCatalog as b}from"../helpers/get-rbac-restrictions-data-for-catalog.js";const _=["id","key","title","type","summary","source","sourceFile","createdAt","updatedAt","version","revision"],p=async({catalogEntitiesService:i,store:a,ctx:e})=>o("catalog_entities.bff.related_entities.get_related_entities",async t=>{try{const r=e.req.param(d);if(!r)return t?.error(new Error("Entity key is required")),e.json({message:"Entity key is required"},400);t?.setAttribute("pathParams",JSON.stringify({entityKey:r}));const s=e.req.query();t?.setAttribute("queryParams",JSON.stringify(g(s,y)));const m=E(_,A).parse(s),{currentRbacTeamsForRead:l,excludedTypes:c,excludedEntities:u}=b({store:a,ctx:e}),n=await i.getRelatedEntities({entityKey:r,paginationParams:m,rbacTeams:l,excludedTypes:c,excludedEntities:u});return t?.setAttribute("relatedEntitiesCount",n.items.length),e.json(n)}catch(r){return console.error(r),t?.error(r),e.json({message:r.message},500)}});function v(i){return async a=>o("catalog_entities.bff.related_entities",async e=>{e?.setAttribute("method",a.req.method);const t=await f.getInstance({baseDbDir:i.serverOutDir});return p({catalogEntitiesService:t,ctx:a,store:i})})}export{v as bffCatalogRelatedEntitiesHandler};
@@ -1 +1 @@
1
- import{telemetryTraceStep as o}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_KEY as u}from"../../../../constants/common.js";import{ALLOWED_CATALOG_QUERY_PARAMS as l}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as d}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as f}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as g}from"../../../providers/database/pagination/schemas.js";import{isValidIsoDate as c}from"../../../utils/is-valid-iso-date.js";import{isValidSanitizedString as v}from"../../../utils/validate-and-sanitize-string.js";const E=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","version","revision","createdAt","updatedAt","domains","owners"],p=async({catalogEntitiesService:n,ctx:t})=>o("catalog_entities.bff.get_entities",async e=>{const r=t.req.query();e?.setAttribute("queryParams",JSON.stringify(d(r,l)));const i=g(E).parse(r),a=await n.getEntitiesWithRelations(i);return e?.setAttribute("entitiesCount",a.items.length),t.json(a)}),A=async({catalogEntitiesService:n,ctx:t})=>o("catalog_entities.bff.get_entity",async e=>{const r=t.req.param(u);if(!r)return e?.error(new Error("Entity key is required")),t.json({message:"Entity key is required"},400);const i=t.req.query("revision");let a=null;if(i){if(!c(i))return e?.error(new Error("Invalid revision parameter")),t.json({message:"Invalid revision parameter: must be a valid ISO 8601 date-time string"},400);a=i}const m=t.req.query("version");if(!v(m,{pattern:/^[a-zA-Z0-9._-]+$/,maxLength:100,allowEmpty:!0}))return e?.error(new Error("Invalid version parameter")),t.json({message:"Invalid version parameter: version must contain only alphanumeric characters, dots, hyphens, and underscores, and must not exceed 100 characters"},400);const y=t.req.query();e?.setAttribute("queryParams",JSON.stringify(y)),e?.setAttribute("pathParams",JSON.stringify({entityKey:r}));const s=await n.getEntityWithRelationsByKey(r,{revision:a,version:m});return s?(e?.setAttribute("entity",JSON.stringify(s)),t.json(s)):(e?.error(new Error("Entity not found")),t.json({message:"Entity not found"},404))});function j(n){return async t=>o("catalog_entities.bff",async e=>{e?.setAttribute("method",t.req.method);const r=await f.getInstance({baseDbDir:n.serverOutDir});return t.req.param("entityKey")?A({catalogEntitiesService:r,ctx:t}):p({catalogEntitiesService:r,ctx:t})})}export{j as bffCatalogHandler};
1
+ import{telemetryTraceStep as d}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_KEY as g}from"../../../../constants/common.js";import{ALLOWED_CATALOG_QUERY_PARAMS as p}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as E}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as b}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as v}from"../../../providers/database/pagination/schemas.js";import{isValidIsoDate as A}from"../../../utils/is-valid-iso-date.js";import{isValidSanitizedString as q}from"../../../utils/validate-and-sanitize-string.js";import{getRbacRestrictionsDataForCatalog as l}from"../helpers/get-rbac-restrictions-data-for-catalog.js";const h=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","version","revision","createdAt","updatedAt","domains","owners"],w=async({catalogEntitiesService:r,ctx:e,store:n})=>d("catalog_entities.bff.get_entities",async t=>{const i=e.req.query();t?.setAttribute("queryParams",JSON.stringify(E(i,p)));const a=v(h).parse(i),{currentRbacTeamsForRead:s,excludedTypes:o,excludedEntities:u}=l({store:n,ctx:e}),m=await r.getEntitiesWithRelations({paginationParams:a,rbacTeams:s,excludedTypes:o,excludedEntities:u});return t?.setAttribute("entitiesCount",m.items.length),e.json(m)}),R=async({catalogEntitiesService:r,ctx:e,store:n})=>d("catalog_entities.bff.get_entity",async t=>{const i=e.req.param(g);if(!i)return t?.error(new Error("Entity key is required")),e.json({message:"Entity key is required"},400);const a=e.req.query("revision");let s=null;if(a){if(!A(a))return t?.error(new Error("Invalid revision parameter")),e.json({message:"Invalid revision parameter: must be a valid ISO 8601 date-time string"},400);s=a}const o=e.req.query("version");if(!q(o,{pattern:/^[a-zA-Z0-9._-]+$/,maxLength:100,allowEmpty:!0}))return t?.error(new Error("Invalid version parameter")),e.json({message:"Invalid version parameter: version must contain only alphanumeric characters, dots, hyphens, and underscores, and must not exceed 100 characters"},400);const u=e.req.query();t?.setAttribute("queryParams",JSON.stringify(u)),t?.setAttribute("pathParams",JSON.stringify({entityKey:i}));const{currentRbacTeamsForRead:m,excludedTypes:c,excludedEntities:f}=l({store:n,ctx:e}),y=await r.getEntityWithRelationsByKey({entityKey:i,filter:{revision:s,version:o},rbacTeams:m,excludedTypes:c,excludedEntities:f});return y?(t?.setAttribute("entity",JSON.stringify(y)),e.json(y)):(t?.error(new Error("Entity not found")),e.json({message:"Entity not found"},404))});function F(r){return async e=>d("catalog_entities.bff",async n=>{n?.setAttribute("method",e.req.method);const t=await b.getInstance({baseDbDir:r.serverOutDir});return e.req.param("entityKey")?R({catalogEntitiesService:t,ctx:e,store:r}):w({catalogEntitiesService:t,ctx:e,store:r})})}export{F as bffCatalogHandler};
@@ -1 +1 @@
1
- import{telemetryTraceStep as l}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_RELATION_ID as d}from"../../../../constants/common.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as c,ALLOWED_CATALOG_QUERY_PARAMS as E}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as f}from"../../../../utils/object/allowlist-object.js";import{entitiesRelationsDtoSchema as R,entityRelationDtoSchema as A}from"../../../plugins/catalog-entities/schemas/dto-schemas.js";import{CatalogEntitiesService as _}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as w}from"../../../providers/database/pagination/schemas.js";import{createValidator as y}from"../../../plugins/catalog-entities/utils/ajv-validator.js";import{ENTITY_RELATION_TO_DATABASE as b}from"../../../plugins/catalog-entities/database/mappers/field-transformations.js";import{CacheService as h}from"../../../persistence/cache/services/cache-service.js";const j=y(A,{errorPrefix:"Entity relation validation failed:",dataVar:"relation"}),O=y(R,{errorPrefix:"Entities relations validation failed:",dataVar:"relation"}),q=["id","organizationId","projectId","sourceKey","targetKey","type","createdAt","updatedAt"],u=async a=>{await(await h.getInstance({baseDbDir:a})).deleteByNamespace(c)},T=async({catalogEntitiesService:a,ctx:e})=>l("catalog_entities.relations.get_entity_relation",async n=>{const t=e.req.param(d);if(!t)return n?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400);n?.setAttribute("pathParams",JSON.stringify({entityRelationId:t}));const i=await a.getEntityRelationById(t);return i?(n?.setAttribute("entityRelation",JSON.stringify(i)),e.json(i)):(n?.error(new Error("Entity relation not found")),e.json({message:"Entity relation not found"},404))}),p=async({catalogEntitiesService:a,ctx:e})=>l("catalog_entities.relations.get_entities_relations",async n=>{try{const t=e.req.query();n?.setAttribute("queryParams",JSON.stringify(f(t,E)));const i=w(q,b).parse(t),r=await a.getEntitiesRelations(i);return n?.setAttribute("entitiesRelationsCount",r.items.length),e.json(r)}catch(t){return console.error(t),n?.error(new Error("Failed to get entities relations")),e.json({message:"Failed to get entities relations"},500)}}),N=async({catalogEntitiesService:a,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.create_entity_relation",async t=>{const i=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const o=j(r),s=await a.createEntityRelation(o);return s?(u(n),t?.setAttribute("entityRelation",JSON.stringify(s)),e.json(s)):(t?.error(new Error("Failed to create entity relation")),e.json({message:"Failed to create entity relation"},500))}catch(r){return i.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entity relation"},500))}}),P=async({catalogEntitiesService:a,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.bulk_upsert_entities_relations",async t=>{const i=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const o=O(r),s=await a.createEntitiesRelations(o);if(!s.length)return t?.error(new Error("Failed to create entity relations")),e.json({message:"Failed to create entity relations"},500);u(n);const g=s.filter(m=>m.status==="ok");return t?.setAttribute("totalSuccess",g.length),t?.setAttribute("totalFailed",s.length-g.length),e.json(s,207)}catch(r){return i.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entity relations"},500))}}),D=async({catalogEntitiesService:a,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.update_entity_relation",async t=>{const i=e.get("logger"),r=e.req.param(d);if(!r)return t?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400);t?.setAttribute("pathParams",JSON.stringify({entityRelationId:r}));try{const o=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(o));const s=await a.updateEntityRelation(r,o);return s?(u(n),t?.setAttribute("entityRelation",JSON.stringify(s)),e.json(s)):(t?.error(new Error("Failed to update entity relation")),e.json({message:"Failed to update entity relation"},500))}catch(o){return i.error(o),o instanceof Error&&o.message.includes("validation failed")?(t?.error(new Error(o.message)),e.json({message:o.message},400)):(t?.error(o),e.json({message:o.message},500))}}),v=async({catalogEntitiesService:a,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.delete_entity_relation",async t=>{const i=e.req.param(d);return i?(t?.setAttribute("pathParams",JSON.stringify({entityRelationId:i})),await a.deleteEntityRelation(i),u(n),new Response(null,{status:204})):(t?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400))}),F={GET:p,POST:N,PUT:P},I={GET:T,DELETE:v,PATCH:D};function U(a){return async e=>l("catalog_entities.relations",async n=>{n?.setAttribute("method",e.req.method);const t=await _.getInstance({baseDbDir:a.serverOutDir}),i=e.req.method,r=e.req.param(d)?I:F;return r[i]?await r[i]({catalogEntitiesService:t,ctx:e,serverOutDir:a.serverOutDir}):(n?.error(new Error("Method not allowed")),e.json({message:"Method not allowed"},405))})}export{U as catalogRelationsHandler};
1
+ import{telemetryTraceStep as l}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_RELATION_ID as y}from"../../../../constants/common.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as m,ALLOWED_CATALOG_QUERY_PARAMS as E}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as c}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as f}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as R}from"../../../providers/database/pagination/schemas.js";import{ENTITY_RELATION_TO_DATABASE as w}from"../../../plugins/catalog-entities/database/mappers/field-transformations.js";import{CacheService as A}from"../../../persistence/cache/services/cache-service.js";import{parseEntityRelation as _}from"./parsers/relations/parse-entity-relation.js";import{parseEntitiesRelations as j}from"./parsers/relations/parse-entities-relations.js";import{parseEntityRelationUpdateData as b}from"./parsers/relations/parse-entity-relation-update-data.js";const h=["id","organizationId","projectId","sourceKey","targetKey","type","createdAt","updatedAt"],g=async o=>{await(await A.getInstance({baseDbDir:o})).deleteByNamespace(m)},p=async({catalogEntitiesService:o,ctx:e})=>l("catalog_entities.relations.get_entity_relation",async n=>{const t=e.req.param(y);if(!t)return n?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400);n?.setAttribute("pathParams",JSON.stringify({entityRelationId:t}));const i=await o.getEntityRelationById(t);return i?(n?.setAttribute("entityRelation",JSON.stringify(i)),e.json(i)):(n?.error(new Error("Entity relation not found")),e.json({message:"Entity relation not found"},404))}),O=async({catalogEntitiesService:o,ctx:e})=>l("catalog_entities.relations.get_entities_relations",async n=>{try{const t=e.req.query();n?.setAttribute("queryParams",JSON.stringify(c(t,E)));const i=R(h,w).parse(t),r=await o.getEntitiesRelations(i);return n?.setAttribute("entitiesRelationsCount",r.items.length),e.json(r)}catch(t){return console.error(t),n?.error(new Error("Failed to get entities relations")),e.json({message:"Failed to get entities relations"},500)}}),q=async({catalogEntitiesService:o,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.create_entity_relation",async t=>{const i=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const a=_(r),s=await o.createEntityRelation(a);return s?(g(n),t?.setAttribute("entityRelation",JSON.stringify(s)),e.json(s)):(t?.error(new Error("Failed to create entity relation")),e.json({message:"Failed to create entity relation"},500))}catch(r){return i.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entity relation"},500))}}),T=async({catalogEntitiesService:o,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.bulk_upsert_entities_relations",async t=>{const i=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const a=j(r),s=await o.createEntitiesRelations(a);if(!s.length)return t?.error(new Error("Failed to create entity relations")),e.json({message:"Failed to create entity relations"},500);g(n);const u=s.filter(d=>d.status==="ok");return t?.setAttribute("totalSuccess",u.length),t?.setAttribute("totalFailed",s.length-u.length),e.json(s,207)}catch(r){return i.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entity relations"},500))}}),N=async({catalogEntitiesService:o,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.update_entity_relation",async t=>{const i=e.get("logger"),r=e.req.param(y);if(!r)return t?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400);t?.setAttribute("pathParams",JSON.stringify({entityRelationId:r}));try{const a=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(a));const s=await o.getEntityRelationById(r);if(!s)return t?.error(new Error(`Entity relation with id: ${r} not found`)),e.json({message:`Entity relation with id: ${r} not found`},404);const u=b(a),d=await o.updateEntityRelation(u,s);return d?(g(n),t?.setAttribute("entityRelation",JSON.stringify(d)),e.json(d)):(t?.error(new Error("Failed to update entity relation")),e.json({message:"Failed to update entity relation"},500))}catch(a){return i.error(a),a instanceof Error&&a.message.includes("validation failed")?(t?.error(new Error(a.message)),e.json({message:a.message},400)):(t?.error(a),e.json({message:a.message},500))}}),I=async({catalogEntitiesService:o,ctx:e,serverOutDir:n})=>l("catalog_entities.relations.delete_entity_relation",async t=>{const i=e.req.param(y);return i?(t?.setAttribute("pathParams",JSON.stringify({entityRelationId:i})),await o.deleteEntityRelation(i),g(n),new Response(null,{status:204})):(t?.error(new Error("Entity relation id is required")),e.json({message:"Entity relation id is required"},400))}),D={GET:O,POST:q,PUT:T},F={GET:p,DELETE:I,PATCH:N};function Y(o){return async e=>l("catalog_entities.relations",async n=>{n?.setAttribute("method",e.req.method);const t=await f.getInstance({baseDbDir:o.serverOutDir}),i=e.req.method,r=e.req.param(y)?F:D;return r[i]?await r[i]({catalogEntitiesService:t,ctx:e,serverOutDir:o.serverOutDir}):(n?.error(new Error("Method not allowed")),e.json({message:"Method not allowed"},405))})}export{Y as catalogRelationsHandler};
@@ -1 +1 @@
1
- import{getCompleteCatalogConfig as c}from"../../../plugins/catalog-entities/get-complete-catalog-config.js";import{parseAndValidateEntities as E,parseAndValidateEntity as f}from"../../../plugins/catalog-entities/entities/validate-entity.js";import{telemetryTraceStep as g}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as A,ALLOWED_CATALOG_QUERY_PARAMS as w}from"../../../constants/plugins/catalog-entities.js";import{CATALOG_ENTITY_KEY as u}from"../../../../constants/common.js";import{allowlistObject as b}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as h}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as j}from"../../../providers/database/pagination/schemas.js";import{createEntityRelationDtoFromFileSchema as _}from"../../../plugins/catalog-entities/database/mappers/create-entity-relation-dto-from-file-schema.js";import{CacheService as q}from"../../../persistence/cache/services/cache-service.js";const p=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","createdAt","updatedAt"],m=async s=>{await(await q.getInstance({baseDbDir:s})).deleteByNamespace(A)},O=async({catalogEntitiesService:s,ctx:e})=>g("catalog_entities.get_entities",async i=>{const n=e.get("logger");try{const r=e.req.query();i?.setAttribute("queryParams",JSON.stringify(b(r,w)));const o=j(p).parse(r),t=await s.getEntities(o);return i?.setAttribute("entitiesCount",t.items.length),e.json(t)}catch(r){return n.error(r),i?.error(r),e.json({message:"Failed to get entities"},500)}}),C=async({catalogEntitiesService:s,ctx:e})=>g("catalog_entities.get_entity",async i=>{const n=e.req.param(u);if(!n)return i?.error(new Error("Entity key is required")),e.json({message:"Entity key is required"},400);i?.setAttribute("pathParams",JSON.stringify({entityKey:n}));const r=await s.getEntityByKey(n);return r?(i?.setAttribute("entity",JSON.stringify(r)),e.json(r)):(i?.error(new Error("Entity not found")),e.json({message:"Entity not found"},404))}),F=async({catalogEntitiesService:s,ctx:e,catalogConfig:i,serverOutDir:n})=>g("catalog_entities.create_entity",async r=>{const o=e.get("logger");try{const t=await e.req.json();r?.setAttribute("requestBody",JSON.stringify(t));const a=f(t,i),y=await s.createEntity(a),l=a.relations?.map(d=>_(a.key,d));return await s.createEntitiesRelations(l??[]),y?(m(n),r?.setAttribute("entity",JSON.stringify(y)),e.json(y)):(r?.error(new Error("Failed to create entity")),e.json({message:"Failed to create entity"},500))}catch(t){return o.error(t),t instanceof Error&&t.message.includes("validation failed")?(r?.error(new Error(t.message)),e.json({message:t.message},400)):(r?.error(t),e.json({message:"Failed to create entity"},500))}}),P=async({catalogEntitiesService:s,ctx:e,catalogConfig:i,serverOutDir:n})=>g("catalog_entities.bulk_upsert_entities",async r=>{const o=e.get("logger");try{const t=await e.req.json();r?.setAttribute("requestBody",JSON.stringify(t));const a=E(t,i),y=await s.createEntities(a);if(!y.length)return r?.error(new Error("Failed to create entities")),e.json({message:"Failed to create entities"},500);m(n);const l=y.filter(d=>d.status==="ok");return r?.setAttribute("totalSuccess",l.length),r?.setAttribute("totalFailed",y.length-l.length),e.json(y,207)}catch(t){return o.error(t),t instanceof Error&&t.message.includes("validation failed")?(r?.error(new Error(t.message)),e.json({message:t.message},400)):(r?.error(t),e.json({message:"Failed to create entities"},500))}}),N=async({catalogEntitiesService:s,ctx:e,serverOutDir:i})=>g("catalog_entities.update_entity",async n=>{const r=e.get("logger"),o=e.req.param(u);if(!o)return n?.error(new Error("Entity key is required")),e.json({message:"Entity key is required"},400);n?.setAttribute("pathParams",JSON.stringify({entityKey:o}));try{const t=await e.req.json();n?.setAttribute("requestBody",JSON.stringify(t));const a=await s.updateEntityByKey(o,t);return a?(m(i),n?.setAttribute("entity",JSON.stringify(a)),e.json(a)):(n?.error(new Error("Failed to update entity")),e.json({message:"Failed to update entity"},500))}catch(t){return r.error(t),t instanceof Error&&t.message.includes("validation failed")?(n?.error(new Error(t.message)),e.json({message:t.message},400)):(n?.error(t),e.json({message:t.message},500))}}),T=async({catalogEntitiesService:s,ctx:e,serverOutDir:i})=>g("catalog_entities.delete_entity",async n=>{const r=e.req.param(u);return r?(n?.setAttribute("pathParams",JSON.stringify({entityKey:r})),await s.deleteEntityByKey(r),m(i),new Response(null,{status:204})):(n?.error(new Error("Entity key is required")),e.json({message:"Entity key is required"},400))}),k={GET:O,POST:F,PUT:P},v={GET:C,DELETE:T,PATCH:N};function U(s){return async e=>g("catalog_entities",async i=>{const n=await h.getInstance({baseDbDir:s.serverOutDir}),r=e.req.method;i?.setAttribute("method",r);const o=e.req.param(u)?v:k,t=c(s.config.entitiesCatalog),a=o[r];return a?await a({catalogEntitiesService:n,ctx:e,catalogConfig:t,serverOutDir:s.serverOutDir}):(i?.error(new Error("Method not allowed")),e.json({message:"Method not allowed"},405))})}export{U as catalogHandler};
1
+ import{getCompleteCatalogConfig as w}from"../../../plugins/catalog-entities/get-complete-catalog-config.js";import{telemetryTraceStep as m}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as h,ALLOWED_CATALOG_QUERY_PARAMS as T}from"../../../constants/plugins/catalog-entities.js";import{CATALOG_ENTITY_ID as E}from"../../../../constants/common.js";import{allowlistObject as b}from"../../../../utils/object/allowlist-object.js";import{isValidIsoDate as j}from"../../../utils/is-valid-iso-date.js";import{CatalogEntitiesService as _}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as q}from"../../../providers/database/pagination/schemas.js";import{createEntityRelationDtoFromFileSchema as O}from"../../../plugins/catalog-entities/database/mappers/create-entity-relation-dto-from-file-schema.js";import{CacheService as R}from"../../../persistence/cache/services/cache-service.js";import{hasAccessToEntity as f}from"./helpers/has-access-to-entity.js";import{getRbacRestrictionsDataForCatalog as p}from"../helpers/get-rbac-restrictions-data-for-catalog.js";import{mapEntityReadModelSchemaToEntityReadDto as g}from"./mappers/map-entity-read-model-schema-to-entity-read-dto.js";import{parseEntity as v}from"./parsers/entities/parse-entity.js";import{parseEntityUpdateData as C}from"./parsers/entities/parse-entity-update-data.js";import{parseEntities as F}from"./parsers/entities/parse-entities.js";const D=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","createdAt","updatedAt"],A=async n=>{await(await R.getInstance({baseDbDir:n})).deleteByNamespace(h)},I=async({catalogEntitiesService:n,ctx:e,store:y})=>m("catalog_entities.get_entities",async i=>{const a=e.get("logger");try{const t=e.req.query();i?.setAttribute("queryParams",JSON.stringify(b(t,T)));const{currentRbacTeamsForRead:o,excludedTypes:r,excludedEntities:s}=p({store:y,ctx:e}),c=q(D).parse(t),u=await n.getEntities({paginationParams:c,rbacTeams:o,excludedTypes:r,excludedEntities:s});return i?.setAttribute("entitiesCount",u.items.length),e.json({...u,items:u.items.map(g)})}catch(t){return a.error(t),i?.error(t),e.json({message:"Failed to get entities"},500)}}),P=async({catalogEntitiesService:n,ctx:e,store:y})=>m("catalog_entities.get_entity",async i=>{const a=e.req.param(E);if(!a)return i?.error(new Error("Entity id is required")),e.json({message:"Entity id is required"},400);i?.setAttribute("pathParams",JSON.stringify({entityId:a}));const{currentRbacTeamsForRead:t,excludedTypes:o,excludedEntities:r}=p({store:y,ctx:e}),s=await n.getEntityById(a,{rbacTeams:t,excludedTypes:o,excludedEntities:r});return s?(i?.setAttribute("entity",JSON.stringify(s)),e.json(g(s))):(i?.error(new Error("Entity not found")),e.json({message:"Entity not found"},404))}),N=async({catalogEntitiesService:n,ctx:e,catalogConfig:y,serverOutDir:i,store:a})=>m("catalog_entities.create_entity",async t=>{const o=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const s=v(r,y);if(!f({ctx:e,store:a,accessLevel:"WRITE",entityType:s.type,entityKey:s.key}))return t?.error(new Error("Access denied")),e.json({message:"Access denied"},403);const u=await n.createEntity(s),d=s.relations?.map(l=>O(s.key,l));return await n.createEntitiesRelations(d??[]),u?(A(i),t?.setAttribute("entity",JSON.stringify(u)),e.json(g(u))):(t?.error(new Error("Failed to create entity")),e.json({message:"Failed to create entity"},500))}catch(r){return o.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entity"},500))}}),W=async({catalogEntitiesService:n,ctx:e,catalogConfig:y,serverOutDir:i,store:a})=>m("catalog_entities.bulk_upsert_entities",async t=>{const o=e.get("logger");try{const r=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(r));const s=F(r,y);for(const d of s)if(!f({ctx:e,store:a,accessLevel:"WRITE",entityType:d.type,entityKey:d.key}))return t?.error(new Error("Access denied")),e.json({message:"Access denied"},403);const c=await n.createEntities(s);if(!c.length)return t?.error(new Error("Failed to create entities")),e.json({message:"Failed to create entities"},500);A(i);const u=c.filter(d=>d.status==="ok");return t?.setAttribute("totalSuccess",u.length),t?.setAttribute("totalFailed",c.length-u.length),e.json(u.map(d=>({...d,resource:g(d.resource)})),207)}catch(r){return o.error(r),r instanceof Error&&r.message.includes("validation failed")?(t?.error(new Error(r.message)),e.json({message:r.message},400)):(t?.error(r),e.json({message:"Failed to create entities"},500))}}),k=async({catalogEntitiesService:n,ctx:e,catalogConfig:y,serverOutDir:i,store:a})=>m("catalog_entities.update_entity",async t=>{const o=e.get("logger"),r=e.req.param(E);if(!r)return t?.error(new Error("Entity id is required")),e.json({message:"Entity id is required"},400);t?.setAttribute("pathParams",JSON.stringify({entityId:r}));try{const s=await e.req.json();t?.setAttribute("requestBody",JSON.stringify(s));const c=await n.getEntityById(r);if(!c)return t?.error(new Error(`Entity with id: ${r} not found`)),e.json({message:`Entity with id: ${r} not found`},404);if(!f({ctx:e,store:a,accessLevel:"WRITE",entityType:s.type??c.type,entityKey:s.key??c.key}))return t?.error(new Error("Access denied")),e.json({message:"Access denied"},403);const d=C(s,y,s?.type??c.type);if(d.revision&&!j(d.revision))throw new Error("Entity validation failed: 'entity.revision' must be a valid ISO 8601 date-time string");const l=await n.updateEntity(d,c);return l?(A(i),t?.setAttribute("entity",JSON.stringify(l)),e.json(g(l))):(t?.error(new Error("Failed to update entity")),e.json({message:"Failed to update entity"},500))}catch(s){return o.error(s),s instanceof Error&&s.message.includes("validation failed")?(t?.error(new Error(s.message)),e.json({message:s.message},400)):(t?.error(s),e.json({message:s.message},500))}}),L=async({catalogEntitiesService:n,ctx:e,serverOutDir:y,store:i})=>m("catalog_entities.delete_entity",async a=>{const t=e.req.param(E);if(!t)return a?.error(new Error("Entity id is required")),e.json({message:"Entity id is required"},400);a?.setAttribute("pathParams",JSON.stringify({entityId:t}));const o=await n.getEntityById(t);return o?f({ctx:e,store:i,accessLevel:"WRITE",entityType:o.type,entityKey:o.key})?(await n.deleteEntity(o),A(y),new Response(null,{status:204})):(a?.error(new Error("Access denied")),e.json({message:"Access denied"},403)):new Response(null,{status:204})}),J={GET:I,POST:N,PUT:W},B={GET:P,DELETE:L,PATCH:k};function re(n){return async e=>m("catalog_entities",async y=>{const i=await _.getInstance({baseDbDir:n.serverOutDir}),a=e.req.method;y?.setAttribute("method",a);const t=e.req.param(E)?B:J,o=w(n.config.entitiesCatalog),r=t[a];return r?await r({catalogEntitiesService:i,ctx:e,catalogConfig:o,serverOutDir:n.serverOutDir,store:n}):(y?.error(new Error("Method not allowed")),e.json({message:"Method not allowed"},405))})}export{re as catalogHandler};
@@ -0,0 +1,3 @@
1
+ import type { EntityReadModelSchema } from '../../../../plugins/catalog-entities/schemas/read-model-schemas';
2
+ export type EntityReadDto = Omit<EntityReadModelSchema, 'isDeleted' | 'rbacTeams' | 'hash'>;
3
+ //# sourceMappingURL=read-entity-dto.d.ts.map
@@ -0,0 +1,43 @@
1
+ export declare function createEntityRelationUpdateSchema(): {
2
+ required: undefined;
3
+ type: "object";
4
+ properties: {
5
+ readonly type: {
6
+ readonly type: "string";
7
+ readonly enum: readonly ["partOf", "hasParts", "creates", "createdBy", "owns", "ownedBy", "implements", "implementedBy", "dependsOn", "dependencyOf", "uses", "usedBy", "produces", "consumes", "linksTo", "supersedes", "supersededBy", "compatibleWith", "extends", "extendedBy", "relatesTo", "hasMember", "memberOf", "triggers", "triggeredBy", "returns", "returnedBy"];
8
+ };
9
+ readonly sourceKey: {
10
+ readonly type: "string";
11
+ readonly minLength: 2;
12
+ readonly maxLength: 150;
13
+ };
14
+ readonly targetKey: {
15
+ readonly type: "string";
16
+ readonly minLength: 2;
17
+ readonly maxLength: 150;
18
+ };
19
+ readonly sourceVersion: {
20
+ readonly type: readonly ["string", "null"];
21
+ };
22
+ readonly sourceRevision: {
23
+ readonly type: readonly ["string", "null"];
24
+ };
25
+ readonly targetVersion: {
26
+ readonly type: readonly ["string", "null"];
27
+ };
28
+ readonly targetRevision: {
29
+ readonly type: readonly ["string", "null"];
30
+ };
31
+ readonly sourceFile: {
32
+ readonly type: readonly ["string", "null"];
33
+ };
34
+ readonly fileHash: {
35
+ readonly type: readonly ["string", "null"];
36
+ };
37
+ readonly isDeleted: {
38
+ readonly type: readonly ["boolean", "null"];
39
+ };
40
+ };
41
+ additionalProperties: false;
42
+ };
43
+ //# sourceMappingURL=create-entity-relation-update-schema.d.ts.map
@@ -0,0 +1 @@
1
+ import{entityRelationDtoSchema as e}from"../../../../plugins/catalog-entities/schemas/dto-schemas.js";function n(){return{...e,required:void 0}}export{n as createEntityRelationUpdateSchema};