@redocly/revel-reef 0.128.0-next.5 → 0.128.0-next.7
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.
- package/CHANGELOG.md +21 -0
- package/README.md +54 -0
- package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
- package/dist/constants/common.d.ts +2 -0
- package/dist/constants/common.js +1 -1
- package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
- package/dist/server/constants/plugins/catalog-entities.js +1 -1
- package/dist/server/esbuild/esbuild.js +2 -2
- package/dist/server/node-bundle-entry.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +5 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +6 -6
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +2 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
- package/dist/server/plugins/catalog-entities/entities/types.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.d.ts +2 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +1 -11
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/catalog-entities/types/extractors.d.ts +16 -0
- package/dist/server/plugins/catalog-entities/types/extractors.js +0 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.d.ts +20 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -0
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -0
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -0
- package/dist/server/plugins/scorecards/workers/scorecards.d.ts +14 -0
- package/dist/server/plugins/scorecards/workers/scorecards.js +1 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0002_add-scorecards-status.sql +1 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0002_snapshot.json +385 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +19 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
- package/dist/server/providers/database/databases/main-sqlite/migrations/0003_file-path-added.sql +1 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/0004_add-scorecards-tables.sql +10 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0004_snapshot.json +221 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +162 -0
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0003_add-scorecards-tables.sql +61 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0004_add-scorecards-status.sql +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0003_snapshot.json +796 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0004_snapshot.json +803 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-evaluations-table.d.ts +124 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-evaluations-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-level-states-table.d.ts +48 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-level-states-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-levels-table.d.ts +186 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-levels-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-states-table.d.ts +177 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-states-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-results-table.d.ts +179 -0
- package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-results-table.js +1 -0
- package/dist/server/providers/database/pagination/types.d.ts +9 -0
- package/dist/server/utils/is-catalog-entities-enabled.d.ts +2 -0
- package/dist/server/utils/is-catalog-entities-enabled.js +1 -0
- package/dist/server/utils/is-scorecards-enabled.d.ts +3 -0
- package/dist/server/utils/is-scorecards-enabled.js +1 -0
- package/dist/server/web-server/dev-server.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog-revisions.d.ts +4 -0
- package/dist/server/web-server/routes/catalog/bff-catalog-revisions.js +1 -0
- package/dist/server/web-server/routes/catalog/bff-catalog.d.ts +0 -1
- package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/index.js +1 -1
- package/dist/server/workers/scorecards-worker-pool.d.ts +4 -0
- package/dist/server/workers/scorecards-worker-pool.js +1 -0
- package/dist/server/workers/scorecards-worker.d.ts +2 -0
- package/dist/server/workers/scorecards-worker.js +1 -0
- package/dist/server/workers/types.d.ts +6 -0
- package/dist/utils/object/allowlist-object.d.ts +16 -0
- package/dist/utils/object/allowlist-object.js +1 -0
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @redocly/revel-reef
|
|
2
2
|
|
|
3
|
+
## 0.128.0-next.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [ca48d4ee2d]
|
|
8
|
+
- @redocly/openapi-docs@3.16.0-next.7
|
|
9
|
+
- @redocly/asyncapi-docs@1.5.0-next.7
|
|
10
|
+
- @redocly/portal-plugin-mock-server@0.13.0-next.7
|
|
11
|
+
|
|
12
|
+
## 0.128.0-next.6
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [301d33c8b3]
|
|
17
|
+
- @redocly/realm-asyncapi-sdk@0.6.0-next.1
|
|
18
|
+
- @redocly/theme@0.60.0-next.5
|
|
19
|
+
- @redocly/asyncapi-docs@1.5.0-next.6
|
|
20
|
+
- @redocly/graphql-docs@1.5.0-next.1
|
|
21
|
+
- @redocly/openapi-docs@3.16.0-next.6
|
|
22
|
+
- @redocly/portal-plugin-mock-server@0.13.0-next.6
|
|
23
|
+
|
|
3
24
|
## 0.128.0-next.5
|
|
4
25
|
|
|
5
26
|
### Minor Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# About Revel-Reef
|
|
2
|
+
|
|
3
|
+
The Revel-Reef package combines Redocly's external developer showcase platform with Redocly's API management platform.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Markdown Docs** - write content in Markdown and enhance it using built-in or custom Markdoc tags
|
|
8
|
+
- **React Pages** - build custom pages with React to create modern experience
|
|
9
|
+
- **Component ejection** - eject and customize any component to bring your theming and branding
|
|
10
|
+
- **Multi-product support** - manage and showcase multiple API products with separate configuration for each product
|
|
11
|
+
- **Localization** - present your API in multiple languages for a global audience
|
|
12
|
+
- **Catalog** - use rich metadata to organize, search, and filter APIs
|
|
13
|
+
- **Scorecard** - run multiple sets of rules against each API
|
|
14
|
+
- **API functions** - build custom backend logic within your documentation pages
|
|
15
|
+
- **Markdown Docs** - write content in Markdown and enhance it using built-in or custom Markdoc tags
|
|
16
|
+
- **API Scout** - monitor your APIs to find ones that are hidden, underused, or duplicate
|
|
17
|
+
- **Dynamic client registration** - allow customers to register a client or application, get credentials and gain access to API products
|
|
18
|
+
|
|
19
|
+
## Live demo
|
|
20
|
+
|
|
21
|
+
You can explore a live deployment of Revel at [https://redocly.com](https://redocly.com) - this website runs entirely on Realm (which includes Revel).
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
Install Redoc-Revel using npm:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install @redocly/revel-reef
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Or using pnpm:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm add @redocly/revel-reef
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Or using yarn:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
yarn add @redocly/revel-reef
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
Revel-Reef integrates with Reunite for docs-as-code workflows and collaboration.
|
|
46
|
+
|
|
47
|
+
## Support
|
|
48
|
+
|
|
49
|
+
- [Documentation](https://redocly.com/docs)
|
|
50
|
+
- [Contact the Redocly team](https://redocly.com/contact-us)
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
Built with 💙 by Redocly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import a from"react";import{ThemeDataContext as
|
|
1
|
+
import a from"react";import{ThemeDataContext as m}from"@redocly/theme/core/contexts";import{useBreadcrumbs as l,useCatalogClassic as d,useCurrentProduct as g,useGlobalData as o,useI18n as p,useI18nConfig as f,useL10n as b,useL10nConfig as C,usePageData as r,usePageSharedData as h,usePageVersions as P,usePreloadHistory as S,useProducts as T,useUserMenu as D,useSubmitFeedback as k,useTranslate as F,useSidebarSiblingsData as L,usePageProps as M,useUserTeams as v,useMarkdownText as O,useCodeHighlight as E,useLoadAndNavigate as R,useCatalog as w,useCatalogSort as x,useCatalogSearch as y,useFetchCatalogEntities as A,useFetchCatalogEntitiesRelations as I,useTelemetry as s,useMcpData as j}from"../../app/hooks";import{Link as H}from"../../app/Link";import{useFacetQuery as N,useSearch as U,useAiSearch as _}from"../../app/search";import{useSidebarItems as B}from"../../app/Sidebar/useSidebarItems";import{deepMerge as G}from"../../../utils/object/deep-merge";import{allowlistObject as Q}from"../../../utils/object/allowlist-object";const V=["title","description","seo","sidebar","excludeFromSearch","template","redirects","rbac","metadata","slug","codeSnippet","breadcrumbs","markdown","seo","navbar","footer","colorMode","feedback","navigation"],W={useBreadcrumbs:l,useCatalog:w,useCatalogSort:x,useCatalogSearch:y,useFetchCatalogEntities:A,useFetchCatalogEntitiesRelations:I,useCatalogClassic:d,useCurrentProduct:g,useGlobalData:o,useSearch:U,useAiSearch:_,useFacetQuery:N,useI18n:p,useI18nConfig:f,useL10n:b,useL10nConfig:C,usePageData:r,usePageSharedData:h,usePageVersions:P,usePreloadHistory:S,useProducts:T,useUserMenu:D,useSidebarItems:B,useSidebarSiblingsData:L,useSubmitFeedback:k,useTranslate:F,useUserTeams:v,usePageProps:M,useMarkdownText:O,useCodeHighlight:E,useLoadAndNavigate:R,useTelemetry:s,useOtelTelemetry:s,useMcpData:j},q={LinkComponent:H};function te({children:u}){const{props:e}=r()||{},t=o()||{},n=a.useMemo(()=>{const c=Q(e?.frontmatter||{},V);return G(t,c)},[t,e?.frontmatter]),i={hooks:W,components:q,config:n};return a.createElement(m.Provider,{value:i},u)}export{te as ThemeDataProvider};
|
|
@@ -36,6 +36,8 @@ export declare enum FEEDBACK_TYPES {
|
|
|
36
36
|
PROBLEM = "problem",
|
|
37
37
|
SCALE = "scale"
|
|
38
38
|
}
|
|
39
|
+
export declare const CATALOG_ENTITY_KEY = "entityKey";
|
|
40
|
+
export declare const CATALOG_ENTITY_RELATION_ID = "entityRelationId";
|
|
39
41
|
export declare const ServerRoutes: {
|
|
40
42
|
readonly INFO: "/_info";
|
|
41
43
|
readonly EJECT_COMPONENT: "/eject-component/:componentName";
|
package/dist/constants/common.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AuthProviderType as e}from"@redocly/config";import{withPathPrefix as
|
|
1
|
+
import{AuthProviderType as e}from"@redocly/config";import{withPathPrefix as r}from"@redocly/theme/core/utils";const i="openapi_docs",L="asyncapi_docs",R="graphql_docs",I="/_spec-gql",C="markdoc",S="tags",n="*",l={[n]:"read"},d=["openid","email"],P=1440*60,N="anonymous",u="authenticated",D="**",h="Reunite",x="translations.yaml",m="redocly.yaml",U="@redocly/theme",g="@theme",M="/app-data.json",G="/eject-component",_=process.env.SERVER_EDITOR_APP_URL||"http://127.0.0.1:3000",v=process.env.REDOCLY_CORS_ORIGINS?process.env.REDOCLY_CORS_ORIGINS.split(",").map(o=>o.trim()).filter(Boolean).concat(_):[_];var a;(function(o){o.BUILD="build",o.DEVELOP="develop",o.PREPARE="prepare"})(a||(a={}));var c;(function(o){o.RATING="rating",o.SENTIMENT="sentiment",o.COMMENT="comment",o.MOOD="mood",o.PROBLEM="problem",o.SCALE="scale"})(c||(c={}));const t="entityKey",A="entityRelationId",s={INFO:"/_info",EJECT_COMPONENT:"/eject-component/:componentName",SHARED_PAGE_DATA:"/page-data/shared/*",PAGE_DATA:"/page-data/*",APP_DATA:"/app-data.json",AUTHORIZATION:"/authorize",OIDC_CALLBACK:"/_auth/oidc",SAML_CALLBACK:"/_auth/saml2",REDOCLY_CALLBACK:"/_auth/redocly",REPLAY_OAUTH2_CALLBACK:"/_auth/replay-oauth2",REDOCLY_LOGIN_CALLBACK:"/_auth/redocly/redocly-login",REDOCLY_TOKEN_LOGIN:"/_auth/redocly-token-login",SEARCH:"/_search",SEARCH_FACETS:"/_search-facets",LOGOUT:"/logout",LOGIN:"/login",IDP_LOGIN:"/_auth/idp-login",INVITE:"/invite/:code",RESOLVE_ROUTE_BY_PATH:"/resolve-route-by-path",RESOLVE_ROUTES_BY_PATHS:"/resolve-routes-by-paths",RESOLVE_ROUTE_BY_SLUG:"/resolve-route-by-slug",GET_ROUTES_BY_LINE:"/get-routes-by-line",FEEDBACK:"/feedback",TELEMETRY:"/_events",OTEL_TRACES:"/_otel/v1/traces",HEALTH:"/_health",ASK_AI:"/_ask-ai",CATALOG_ENTITIES:`/catalog-entities/:${t}?`,CATALOG_ENTITIES_RELATIONS:`/catalog-entities-relations/:${A}?`,BFF_CATALOG_ENTITIES:`/bff/catalog-entities/:${t}?`,BFF_CATALOG_RELATED_ENTITIES:`/bff/catalog-related-entities/:${t}`,BFF_CATALOG_REVISIONS:`/bff/catalog-revisions/:${t}`,MCP_OAUTH_AUTHORIZATION_SERVER:"/.well-known/oauth-authorization-server",MCP_OAUTH_PROTECTED_RESOURCE:"/.well-known/oauth-protected-resource/mcp",MCP_DYNAMIC_CLIENT_REGISTRATION:"/_mcp/register",MCP_AUTHORIZATION:"/_mcp/oauth2/auth",MCP_TOKEN_PORTAL:"/_mcp/oauth2/token-portal",MCP_CALLBACK:"/_mcp/oauth/callback",SCORECARDS:"/scorecards"},F={[e.SAML2]:r(s.IDP_LOGIN),[e.OIDC]:r(s.IDP_LOGIN)};var E;(function(o){o.AI_SEARCH="aiSearch"})(E||(E={}));const y="/login",H="/invite",b={AUTH0_PASS:"/auth/auth0-pass"},B={NotExist:"ENOENT"},f="default_locale",k="sidebar-",V="PUBLIC_",K=["BROKEN_LINK","MARKDOC","RESOLVE"],Y=["logo","navbar","products","footer","sidebar","scripts","links","feedback","search","aiAssistant","colorMode","navigation","codeSnippet","markdown","openapi","graphql","analytics","userMenu","versionPicker","breadcrumbs","catalog","entitiesCatalog","scorecard","scorecards","scorecardClassic","mcp"],O="redocly_category",w="redocly_product",j="redocly_version",q="redocly_teams",$=O,Q={asyncapi:"asyncapi",apiFunctions:"apiFunctions",reactPages:"reactPages",catalog:"catalog",catalogClassic:"catalogClassic",lint:"lint",scorecard:"scorecard",scorecards:"scorecards",l10n:"l10n",openapi:"openapi",graphql:"graphql",markdown:"markdown",devOnboarding:"devOnboarding",seo:"seo",redirects:"redirects",customPlugins:"customPlugins",themeEjecting:"themeEjecting",products:"products",breadcrumbs:"breadcrumbs",mockServer:"mockServer",sso:"sso",rbac:"rbac",analytics:"analytics",removeAttribution:"removeAttribution",advancedSearch:"advancedSearch",soap:"soap",ssoDirect:"ssoDirect",codeWalkthrough:"codeWalkthrough",aiSearchLimit:"aiSearchLimit",mcp:"mcp"};export{v as ALLOWED_CORS_ORIGINS,L as ASYNC_API_DOCS_TEMPLATE_ID,t as CATALOG_ENTITY_KEY,A as CATALOG_ENTITY_RELATION_ID,m as CONFIG_FILE_NAME,C as CUSTOM_MARKDOC_OPTIONS_PATH,S as CUSTOM_MARKDOC_TAGS_PATH,N as DEFAULT_ANONYMOUS_VISITOR_TEAM,u as DEFAULT_AUTHENTICATED_TEAM,P as DEFAULT_COOKIE_EXPIRATION,f as DEFAULT_LOCALE_PLACEHOLDER,F as DEFAULT_PROVIDERS_LOGIN_URLS,D as DEFAULT_RBAC_SCOPE,h as DEFAULT_SSO_IDP_TITLE,U as DEFAULT_THEME_NAME,y as DEV_LOGIN_SLUG,G as EJECT_COMPONENT_URL,b as ExternalRoutes,Q as FEATURE,c as FEEDBACK_TYPES,B as FsErrors,M as GLOBAL_DATA_URL,I as GRAPHQL_SPEC_SLUG,R as GRAPHQL_TEMPLATE_ID,H as INVITE_SLUG,K as MARKDOC_ERROR_TYPES,i as OPENAPI_DOCS_TEMPLATE_ID,V as PUBLIC_ENV_PREFIX,l as PUBLIC_RBAC_SCOPE_ITEM,n as RBAC_ALL_OTHER_TEAMS,d as REQUIRED_OIDC_SCOPES,E as RbacFeatures,O as SEARCH_CATEGORY_FIELD,$ as SEARCH_GROUP_FACET_FIELD,w as SEARCH_PRODUCT_FIELD,q as SEARCH_RBAC_FIELD,j as SEARCH_VERSION_FIELD,_ as SERVER_EDITOR_APP_URL,k as SIDEBAR_PREFIX,s as ServerRoutes,x as TRANSLATIONS_FILE_NAME,Y as UI_ACCESSIBLE_CONFIG_PROPS,g as USER_THEME_ALIAS,a as cliCommandNames};
|
|
@@ -16,4 +16,5 @@ export declare const CATALOG_FILTERS_CACHE_NAMESPACE = "catalog-filters";
|
|
|
16
16
|
export declare const CATALOG_FILTERS_CACHE_TTL_IN_SECONDS: number;
|
|
17
17
|
export declare const CATALOG_ENTITIES_DEFAULT_CONFIG: EntitiesCatalogConfig;
|
|
18
18
|
export declare const CATALOG_ENTITIES_FILES_REGEX: RegExp;
|
|
19
|
+
export declare const ALLOWED_CATALOG_QUERY_PARAMS: readonly ["after", "before", "sort", "filter", "search", "limit", "skip"];
|
|
19
20
|
//# sourceMappingURL=catalog-entities.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=["node_modules","dist","build",".git","@l10n"],l="/catalogs",a={ALL:"all",SERVICES:"services",DOMAINS:"domains",TEAMS:"teams",USERS:"users",API_DESCRIPTIONS:"api-descriptions",DATA_SCHEMAS:"data-schemas",API_OPERATIONS:"api-operations"},s="catalog:entitySources",i="catalog-filters",o=300,t=[{title:"Domains",property:"domains"},{title:"Owner",property:"owners"},{title:"Tags",property:"tags"}],c={show:!1,catalogs:{all:{slug:a.ALL,hide:!1,includes:[],excludes:[],filters:[{title:"Type",property:"type"},...t],titleTranslationKey:"catalog.catalogs.all.title",descriptionTranslationKey:"catalog.catalogs.all.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.all.switcherLabel"},services:{slug:a.SERVICES,hide:!1,includes:[{type:"service"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.service.title",descriptionTranslationKey:"catalog.catalogs.service.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.service.switcherLabel"},domains:{slug:a.DOMAINS,hide:!1,includes:[{type:"domain"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.domain.title",descriptionTranslationKey:"catalog.catalogs.domain.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.domain.switcherLabel"},teams:{slug:a.TEAMS,hide:!1,includes:[{type:"team"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.team.title",descriptionTranslationKey:"catalog.catalogs.team.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.team.switcherLabel"},users:{slug:a.USERS,hide:!1,includes:[{type:"user"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.user.title",descriptionTranslationKey:"catalog.catalogs.user.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.user.switcherLabel"},apiDescriptions:{slug:a.API_DESCRIPTIONS,hide:!1,includes:[{type:"api-description"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.apiDescription.title",descriptionTranslationKey:"catalog.catalogs.apiDescription.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.apiDescription.switcherLabel"},dataSchemas:{slug:a.DATA_SCHEMAS,hide:!1,includes:[{type:"data-schema"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.dataSchema.title",descriptionTranslationKey:"catalog.catalogs.dataSchema.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.dataSchema.switcherLabel"},apiOperations:{slug:a.API_OPERATIONS,hide:!1,includes:[{type:"api-operation"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.apiOperation.title",descriptionTranslationKey:"catalog.catalogs.apiOperation.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.apiOperation.switcherLabel"}}},
|
|
1
|
+
const e=["node_modules","dist","build",".git","@l10n"],l="/catalogs",a={ALL:"all",SERVICES:"services",DOMAINS:"domains",TEAMS:"teams",USERS:"users",API_DESCRIPTIONS:"api-descriptions",DATA_SCHEMAS:"data-schemas",API_OPERATIONS:"api-operations"},s="catalog:entitySources",i="catalog-filters",o=300,t=[{title:"Domains",property:"domains"},{title:"Owner",property:"owners"},{title:"Tags",property:"tags"}],c={show:!1,catalogs:{all:{slug:a.ALL,hide:!1,includes:[],excludes:[],filters:[{title:"Type",property:"type"},...t],titleTranslationKey:"catalog.catalogs.all.title",descriptionTranslationKey:"catalog.catalogs.all.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.all.switcherLabel"},services:{slug:a.SERVICES,hide:!1,includes:[{type:"service"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.service.title",descriptionTranslationKey:"catalog.catalogs.service.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.service.switcherLabel"},domains:{slug:a.DOMAINS,hide:!1,includes:[{type:"domain"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.domain.title",descriptionTranslationKey:"catalog.catalogs.domain.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.domain.switcherLabel"},teams:{slug:a.TEAMS,hide:!1,includes:[{type:"team"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.team.title",descriptionTranslationKey:"catalog.catalogs.team.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.team.switcherLabel"},users:{slug:a.USERS,hide:!1,includes:[{type:"user"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.user.title",descriptionTranslationKey:"catalog.catalogs.user.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.user.switcherLabel"},apiDescriptions:{slug:a.API_DESCRIPTIONS,hide:!1,includes:[{type:"api-description"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.apiDescription.title",descriptionTranslationKey:"catalog.catalogs.apiDescription.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.apiDescription.switcherLabel"},dataSchemas:{slug:a.DATA_SCHEMAS,hide:!1,includes:[{type:"data-schema"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.dataSchema.title",descriptionTranslationKey:"catalog.catalogs.dataSchema.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.dataSchema.switcherLabel"},apiOperations:{slug:a.API_OPERATIONS,hide:!1,includes:[{type:"api-operation"}],excludes:[],filters:t,titleTranslationKey:"catalog.catalogs.apiOperation.title",descriptionTranslationKey:"catalog.catalogs.apiOperation.description",catalogSwitcherLabelTranslationKey:"catalog.catalogs.apiOperation.switcherLabel"}}},r=/\.(entity|entities)\.(yaml|yml)$/,n=["after","before","sort","filter","search","limit","skip"];export{n as ALLOWED_CATALOG_QUERY_PARAMS,l as CATALOG_BASE_SLUG,c as CATALOG_ENTITIES_DEFAULT_CONFIG,r as CATALOG_ENTITIES_FILES_REGEX,i as CATALOG_FILTERS_CACHE_NAMESPACE,o as CATALOG_FILTERS_CACHE_TTL_IN_SECONDS,a as CATALOG_SLUGS,s as ENTITIES_MAP_GLOBAL_DATA_KEY,e as ENTITY_SCHEMA_EXCLUDED_FOLDERS};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{context as a}from"esbuild";import{mkdirSync as j,writeFileSync as b,existsSync as M}from"node:fs";import*as m from"node:path";import{RUNTIME_RESOURCES_DIR as Y,TELEMETRY_ENABLED as V}from"../constants/common.js";import{fromCurrentDir as t}from"../utils/paths.js";import{NodeBrowserPlugin as S}from"./plugins/node-browser.js";import{PortalImport as l}from"./plugins/portal-import.js";import{ThemesResolver as u}from"./plugins/themes-resolver.js";import{AssetsResolver as E}from"./plugins/assets-resolver.js";import{EsbuildErrorCollector as _}from"./plugins/esbuild-compile-resolver.js";import{OpenapiDocsModuleReplacer as f}from"./plugins/openapi-docs-module-replacer/index.js";import{ServerPropsResolver as R}from"./plugins/server-props-resolver.js";import{StyledComponentsSSR as v}from"./plugins/styled-components-ssr.js";import{DependencyResolver as d}from"./plugins/dependency-resolver.js";import{YamlLoader as L}from"./plugins/yaml-loader.js";import{ApiRequestHandlersResolver as A}from"./plugins/api-request-handlers-resolver.js";import{MiddlewareResolver as N}from"./plugins/middleware-resolver.js";import{OnRebuild as D}from"./plugins/on-rebuild.js";import{getPublicEnvVariables as $}from"../utils/envs/get-public-env-variables.js";import{PORTAL_VERSION as
|
|
2
|
-
const require = topLevelCreateRequire(import.meta.url);`},platform:"node",define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"module.hot":"false"},logLevel:"silent"});return p.add(s),s}async function ae(e,o,r="production",n){return await
|
|
1
|
+
import{context as a}from"esbuild";import{mkdirSync as j,writeFileSync as b,existsSync as M}from"node:fs";import*as m from"node:path";import{RUNTIME_RESOURCES_DIR as Y,TELEMETRY_ENABLED as V}from"../constants/common.js";import{fromCurrentDir as t}from"../utils/paths.js";import{NodeBrowserPlugin as S}from"./plugins/node-browser.js";import{PortalImport as l}from"./plugins/portal-import.js";import{ThemesResolver as u}from"./plugins/themes-resolver.js";import{AssetsResolver as E}from"./plugins/assets-resolver.js";import{EsbuildErrorCollector as _}from"./plugins/esbuild-compile-resolver.js";import{OpenapiDocsModuleReplacer as f}from"./plugins/openapi-docs-module-replacer/index.js";import{ServerPropsResolver as R}from"./plugins/server-props-resolver.js";import{StyledComponentsSSR as v}from"./plugins/styled-components-ssr.js";import{DependencyResolver as d}from"./plugins/dependency-resolver.js";import{YamlLoader as L}from"./plugins/yaml-loader.js";import{ApiRequestHandlersResolver as A}from"./plugins/api-request-handlers-resolver.js";import{MiddlewareResolver as N}from"./plugins/middleware-resolver.js";import{OnRebuild as D}from"./plugins/on-rebuild.js";import{getPublicEnvVariables as $}from"../utils/envs/get-public-env-variables.js";import{PORTAL_VERSION as w}from"../version.js";import{AsyncApiPatch as O}from"./plugins/async-api-patch.js";import{telemetryTraceStep as T}from"../../cli/telemetry/helpers/trace-step.js";const C={bundle:!0,format:"esm",chunkNames:"chunks/[name]-[hash]"};function y(e){const o=m.join(e,"tsconfig.json");return M(o)?o:void 0}const p=new Set;async function ie(){await Promise.all([...p].map(e=>e.dispose())),p.clear()}async function ce(e,o,r="production",n){return await T("build.create_client_compiler",async()=>{const c=$(),i={};Object.entries(c).map(([I,h])=>i[`process.env.${I}`]=JSON.stringify(h));const s=[...n?[D(n)]:[],S({path:"path-browserify",fs:"{}",tty:"tty-browserify",os:"os-browserify",http:"stream-http",https:"stream-http",readline:"{}",crypto:"{}",stream:"{}",zlib:"{}","https-proxy-agent":"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),d(),l(),L(),O(),v(),f()],g=[t(import.meta.url,"../../client/browser-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js")],P=await a({...C,entryPoints:g,outdir:m.join(o,Y),sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",plugins:s,tsconfig:y(e.contentDir),mainFields:["browser","module","main"],metafile:r!=="production",minify:r==="production",splitting:!0,external:["constants","zlib","stream","https","vm","module","worker_threads","child_process","@swc/core"],inject:[process.env.INSPECT_MODE==="true"?t(import.meta.url,"../../client/inspect-mode-hooks.js"):"",t(import.meta.url,"./web-shim.js")].filter(Boolean),define:{...i,"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.SERVER_EDITOR_APP_URL":`"${process.env.SERVER_EDITOR_APP_URL}"`,"process.env.ENABLE_COMMENTS":`"${process.env.ENABLE_COMMENTS}"`,"process.env.REDOCLY_TELEMETRY":V?'""':'"off"',"process.env.REDOCLY_PORTAL_VERSION":`"${w}"`,"process.env":`{"NODE_ENV": "${r}"}`,"process.platform":'"browser"',"process.browser":"true","module.hot":"false",global:"{}",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`},...process.env.INSPECT_MODE==="true"&&{"process.env.INSPECT_MODE":`${process.env.INSPECT_MODE}`},...process.env.MAIN_API_URL&&{"process.env.MAIN_API_URL":`"${process.env.MAIN_API_URL}"`}},logLevel:"silent"});return p.add(P),P})}async function pe(e,o,r="development",n){j(o,{recursive:!0}),b(m.join(o,"package.json"),JSON.stringify({name:"@redocly/portal/server-cache",type:"module"}));const c=[...n?[D(n)]:[],u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[t(import.meta.url,"../../client/server-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js"),t(import.meta.url,"../../client/server-props-entry.js"),t(import.meta.url,"../../client/api-request-handlers-entry.js"),t(import.meta.url,"../../client/middleware-entry.js")],s=await a({...C,entryPoints:i,outdir:o,plugins:c,sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",minify:r==="production",tsconfig:y(e.contentDir),mainFields:["module","main"],splitting:!0,external:["react","react-router-dom","@dr.pogodin/react-helmet","@swc/core","pnpapi","canvas"],banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);`},platform:"node",define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"module.hot":"false"},logLevel:"silent"});return p.add(s),s}async function ae(e,o,r="production",n){return await T("build.create_server_compiler",async()=>{const c=[...n?[D(n)]:[],S({"node-fetch":"{}",webpack:"{}",swagger2openapi:"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[{in:t(import.meta.url,"../node-bundle-entry.js"),out:"index"},{in:t(import.meta.url,"../../client/user-tags-entry.js"),out:"user-tags-entry"},{in:t(import.meta.url,"../workers/api-routes-worker.js"),out:"api-routes-worker"},{in:t(import.meta.url,"../workers/scorecards-worker.js"),out:"scorecards-worker"}],s=await a({...C,entryPoints:i,outExtension:{".js":".mjs"},outdir:o,platform:"node",plugins:c,tsconfig:y(e.contentDir),mainFields:["module","main"],metafile:r!=="production",minify:r==="production",splitting:!1,define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.REDOCLY_STATIC_BUNDLE":"true","process.env.REDOCLY_PORTAL_VERSION":`"${w}"`,"module.hot":"false",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`}},banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
|
|
3
3
|
const require = topLevelCreateRequire(import.meta.url);`},logLevel:"silent"});return p.add(s),s})}export{ce as createClientCompiler,ae as createNodeBundleCompiler,pe as createServerCompiler,ie as stopAllCompilers};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolve as a,dirname as
|
|
1
|
+
import{resolve as a,dirname as p}from"node:path";import{fileURLToPath as f}from"node:url";import{readFile as l}from"fs/promises";import{createReadStream as u}from"fs";import{telemetry as d}from"./telemetry/index.js";import{createRouter as v}from"./web-server/router.js";import{installProdRoutes as S}from"./web-server/routes/index.js";import{Store as g}from"./store.js";import{loadEnvVariables as D}from"./utils/envs/load-env-variables.js";import{startHttpServer as E}from"./web-server/http.js";import{readStaticData as P}from"./utils/static-data.js";import{startIdleTimeout as b}from"./web-server/middleware/idleTimeoutMiddleware.js";import{reporter as w}from"./tools/notifiers/reporter.js";import{EntitlementsProvider as R}from"./entitlements/entitlements-provider.js";import{DatabasePreconnectService as x}from"./providers/database/database-preconnect-service.js";import{isBuildMode as I}from"./utils/envs/is-build-mode.js";import{KvService as y}from"./persistence/kv/services/kv-service.js";import{runScorecardsWorker as N}from"./plugins/scorecards/workers/run-scorecards-worker.js";import{isCatalogEntitiesEnabled as O}from"./utils/is-catalog-entities-enabled.js";import{isScorecardsEnabled as T}from"./utils/is-scorecards-enabled.js";import{renderPage as _}from"./ssr/index.js";if(!I()){let c=function(){const r=process.argv.findIndex(o=>o==="--port"||o==="-p");if(r===-1)return null;const e=process.argv[r+1];if(e.startsWith("-"))return null;const i=parseInt(e,10);return isNaN(i)?null:i};const t=p(f(import.meta.url));D(t);const n=JSON.parse(await l(a(t,"./store.json"),"utf-8")),s=g.fromJson(n,{outdir:a(t,"../client"),serverOutDir:t,serverMode:!0,contentDir:""});if(await R.instance().init({ignoreTokenExpiration:!0}),O()){await x.init(t);const r=await y.getInstance({baseDbDir:t});setInterval(()=>r.clearExpired(),300*1e3)}m(s).catch(r=>{console.error(r)});async function m(r){d.initialize();const e=await v();S(e,r,{readStaticAsset:async o=>u(o),resolveRouteData:async o=>P(o.slug,r.outdir)}),w.printErrors();const i=c();return await E(e,i??process.env.PORT??4e3),b(),T(r.config)&&N(r.serverOutDir),e}}export{_ as renderPage};
|
|
@@ -7,6 +7,7 @@ import type { ServiceInstanceOptions } from '../../../providers/database/types.j
|
|
|
7
7
|
import type { TransactionsManager } from '../../../providers/database/transactions-manager.js';
|
|
8
8
|
import type { CreateEntityParams } from './repositories/local/catalog-entities-local-write-repository.js';
|
|
9
9
|
import type { Filter } from '../../../providers/database/pagination/types.js';
|
|
10
|
+
import type { ScorecardsStatus } from '../entities/types.js';
|
|
10
11
|
import { type EntityDtoSchema, type EntityRelationDtoSchema } from '../schemas/dto-schemas.js';
|
|
11
12
|
import { CatalogEntitiesLocalRepository } from './repositories/local/catalog-entities-local-repository.js';
|
|
12
13
|
import { CatalogEntitiesRemoteRepository } from './repositories/remote/catalog-entities-remote-repository.js';
|
|
@@ -26,6 +27,10 @@ export declare class CatalogEntitiesService {
|
|
|
26
27
|
transaction<T>(...args: Parameters<TransactionsManager['transaction']>): Promise<T>;
|
|
27
28
|
getEntities(paginationParams: PaginationParams): Promise<ListResponseResult<EntityReadModelSchema>>;
|
|
28
29
|
getEntityByKey(key: string): Promise<EntityReadModelSchema | null>;
|
|
30
|
+
getEntitiesCountByTypes(): Promise<{
|
|
31
|
+
type: string;
|
|
32
|
+
count: number;
|
|
33
|
+
}[]>;
|
|
29
34
|
getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./repositories/local/catalog-entities-local-read-repository.js").FilterOption[]>>;
|
|
30
35
|
createEntity(entity: EntityDtoSchema): Promise<EntityReadModelSchema | null>;
|
|
31
36
|
createEntities(entities: EntityDtoSchema[]): Promise<BulkSyncResult<EntityReadModelSchema>>;
|
|
@@ -125,6 +130,9 @@ export declare class CatalogEntitiesService {
|
|
|
125
130
|
getEntityWithRelationsByKey(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogEntity | null>;
|
|
126
131
|
getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogRelatedEntityList>;
|
|
127
132
|
listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<EntityReadModelSchema, "version" | "isDefaultVersion" | "createdAt" | "updatedAt" | "revision" | "isCurrent">[]>;
|
|
133
|
+
updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
|
|
134
|
+
updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
|
|
135
|
+
getOutdatedEntity(): Promise<EntityReadModelSchema | null>;
|
|
128
136
|
}
|
|
129
137
|
export {};
|
|
130
138
|
//# sourceMappingURL=catalog-entities-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{entityFileSchema as
|
|
1
|
+
import{entityFileSchema as d}from"@redocly/config";import{deepMerge as y}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as c}from"../../../utils/async/promise-map-limit.js";import{logger as r}from"../../../tools/notifiers/logger.js";import{entityRelationDtoSchema as h}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as m}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as R}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as o}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as l}from"./mappers/field-transformations.js";import{createValidator as u}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const E=15,f=u(h,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=u(d,{errorPrefix:"Entity file validation failed:",dataVar:"entity"});class n{static#a;static#i;#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async#n(t){const[e,a]=await Promise.all([m.getInstance(t),t.runOnlyLocalDatabase?void 0:R.getInstance(t)]),i=new n(e,a);a&&(process.env.NODE_ENV==="development"&&r.info("Attaching remote database to local database"),await i.#t.attachDatabase(a.path)),n.#a=i,n.#i=t}static async getInstance(t){return t.runOnlyLocalDatabase===void 0&&(t.runOnlyLocalDatabase=process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true"),t.removeExisting===void 0&&(t.removeExisting=!1),(!n.#a||w(n.#i,t))&&await n.#n(t),n.#a}async transaction(...t){return this.#t.transactionsManager.transaction(...t)}async getEntities(t){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntities(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityByKey(t){return await this.#e?.sync(),await this.#t.getEntityByKey(t)}async getEntitiesCountByTypes(){return await this.#e?.sync(),this.#t.getEntitiesCountByTypes()}async getCatalogFilters(t){return await this.#e?.sync(),this.#t.getCatalogFilters(t)}async createEntity(t){return this.#e?this.#e.createEntity(t):(r.warn("No remote database found"),null)}async createEntities(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntity(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.key,status:"error",error:i}))):(r.warn("No remote database found"),[])}getEntitySources(){return this.#t.getEntitySources()}async createEntityInLocalDatabase(t){await this.#t.createEntity(t)}async createEntitiesInLocalDatabase(t){await this.#t.createEntities(t)}async createEntityRelationInLocalDatabase(t){await this.#t.createEntityRelation(t)}async createEntityRelationsInLocalDatabase(t){await this.#t.createEntityRelations(t)}async updateEntityByKey(t,e){const a=await this.#t.getEntityByKey(t);if(!a)throw new Error(`Entity with key ${t} not found`);const i=y(a,e),s=p(i);return await this.#e?.updateEntity({...s,id:a.id,createdAt:a.createdAt||""})}async deleteEntityByKey(t){const e=await this.#e?.deleteEntity(t);return await this.#s(t),e}async deleteEntitiesInLocalDatabase(t){await this.#t.deleteEntities(t)}async getEntityRelationById(t){return await this.#e?.sync(),await this.#t.getEntityRelationById(t)}async getEntitiesRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesRelations(t);return o({data:e,params:t,totalCount:a,nameTransformationsFromDatabase:l,hasMore:i})}async createEntityRelation(t){return this.#e?.createEntityRelation(t)}async createEntitiesRelations(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntityRelation(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.sourceKey,status:"error",error:i}))):(r.warn("No remote database found"),[])}async updateEntityRelation(t,e){const a=await this.#t.getEntityRelationById(t);if(!a)throw new Error(`Entity relation with id ${t} not found`);const i=y(a,e),s=f(i);return this.#e?.createEntityRelation(s)}async deleteEntityRelation(t){let e=await this.#e?.deleteEntityRelation(t);return e||(e=await this.#t.deleteEntityRelation(t)),e}async deleteEntityRelationsInLocalDatabase(t){await this.#t.deleteEntityRelations(t)}async getEntitiesWithRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesWithRelations(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}async getRelatedEntities(t,e={}){await this.#e?.sync();const{items:a,total:i,hasMore:s}=await this.#t.getRelatedEntities(t,e);return o({data:a,params:e,totalCount:i,nameTransformationsFromDatabase:l,hasMore:s})}async#s(t){await this.#e?.deleteEntitiesRelations({op:"OR",conditions:[{field:"source_key",operator:"equal",value:t},{field:"target_key",operator:"equal",value:t}]})}async listEntityRevisions(t,e){return await this.#e?.sync(),this.#t.listEntityRevisions(t,e)}async updateEntityScorecardsStatus(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatus(t,e)}async updateEntityScorecardsStatusIfCalculating(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatusIfCalculating(t,e)}async getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{n as CatalogEntitiesService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ulid as e}from"ulid";function
|
|
1
|
+
import{ulid as e}from"ulid";function n({entity:s,organizationId:a,projectId:l,source:u,sourceFile:i,fileHash:o}){const r=new Date().toISOString();return{id:s.id||`ce_${e()}`,organizationId:a,projectId:l,key:s.key,type:s.type,title:s.title,summary:s.summary||null,tags:s.tags?JSON.stringify(s.tags):null,metadata:s.metadata?JSON.stringify(s.metadata):null,git:s.git?JSON.stringify(s.git):null,contact:s.contact?JSON.stringify(s.contact):null,links:s.links?JSON.stringify(s.links):null,createdAt:s.createdAt||r,updatedAt:r,source:u||"file",sourceFile:i||null,fileHash:o||null,version:s.version||null,revision:s.revision,hash:s.hash,isCurrent:s.isCurrent,isDefaultVersion:s.isDefaultVersion??!1,scorecardsStatus:"OUTDATED"}}export{n as createEntityDbRecord};
|
|
@@ -22,7 +22,12 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
22
22
|
attachDatabase(databasePath: string): Promise<void>;
|
|
23
23
|
getEntities(paginationParams?: PaginationParams): Promise<ListResult<EntityReadModelSchema>>;
|
|
24
24
|
listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<EntityReadModelSchema, 'version' | 'revision' | 'isCurrent' | 'createdAt' | 'updatedAt' | 'isDefaultVersion'>[]>;
|
|
25
|
+
getEntitiesCountByTypes(): Promise<{
|
|
26
|
+
type: string;
|
|
27
|
+
count: number;
|
|
28
|
+
}[]>;
|
|
25
29
|
getEntityByKey(key: string): Promise<EntityReadModelSchema | null>;
|
|
30
|
+
getOneOutdatedEntity(): Promise<EntityReadModelSchema | null>;
|
|
26
31
|
getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
|
|
27
32
|
getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
|
|
28
33
|
getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm";import{unionAll as k}from"drizzle-orm/sqlite-core";import{asc as Y}from"drizzle-orm";import{logger as X}from"../../../../../tools/notifiers/logger.js";import{isObject as G}from"../../../../../../utils/guards/is-object.js";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Q,getFirstFilterFieldValue as x}from"../../../../../providers/database/pagination/filter.js";import{createBffRelatedEntity as z}from"../../mappers/create-bff-related-entity.js";import{createBffEntity as V}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as _,createEntityFieldsForSelect as j,createEntityRelationFieldsForSelect as Z,createQualifiedEntityFieldsForSelect as K,createQualifiedEntityFieldsForSelectWithAliases as ee}from"../utils.js";import{createEntityReadModel as P}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as J}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";class fe{#e;#t=void 0;constructor(t){this.#e=t}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`))}async getEntities(t={}){const s=this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0)),n=this.#e.client.select(c).from(s.as("combined_entities")),l=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),E=S(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(E),d=n.$dynamic(),m=t.limit||10,y=S(d,{...t,limit:m+1}),[f,h]=await Promise.all([y.run(),u]),T=f.rows,g=T.length>m;return{items:T.slice(0,m).map(w=>P(w)).filter(w=>w!==null),hasMore:g,total:h}}async listEntityRevisions(t,s){const n=[r(i.key,t),...s?[r(i.version,s)]:[]],l=this.#t?k(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(e`remote.entities`).where(o(e`key = ${t}`,s?e`version = ${s}`:void 0)),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(o(...n,N(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`)))))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(o(...n));return(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(l.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(u=>({version:u.version||null,revision:u.revision||null,isCurrent:u.is_current!==null?!!u.is_current:!1,createdAt:u.created_at||null,updatedAt:u.updated_at||null,isDefaultVersion:u.is_default_version!==null?!!u.is_default_version:!1}))}async getEntityByKey(t){const l=(await(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(o(r(i.key,t),r(e.raw("is_current"),1))),this.#e.client.select(c).from(i).where(o(r(i.key,t),r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(o(r(i.key,t),r(i.isCurrent,!0)))).run()).rows[0];return l?P(l):null}async getEntitiesRelations(t={}){const s=this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a),n=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),l=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),E=S(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(E),d=t.limit||10,m=S(n,{...t,limit:d+1}),[y,f]=await Promise.all([m.run(),u]),h=y.rows,T=h.length>d;return{items:h.slice(0,d).map(g=>J(g)).filter(g=>g!==null),hasMore:T,total:f}}async getEntityRelationById(t){const l=(await(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`).where(r(a.id,t)),this.#e.client.select(_).from(a).where(o(r(a.id,t),N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${a.id}`))))):this.#e.client.select(_).from(a).where(r(a.id,t))).run()).rows[0];return l?J(l):null}async getEntitiesWithRelations(t={}){const n=(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0))).as("e"),E=(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),d=(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),m=this.#e.client.with(n,E,d).select({...j("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),y={...c,domains:m.domains,owners:m.owners},f=this.#e.client.with(m).select(y).from(m).$dynamic(),h=this.#e.client.with(m).select(y).from(m).$dynamic(),{whereCondition:T}=Q(f,t.filter);T&&f.where(T);const{whereCondition:g}=Q(h,t.filter);g&&h.where(g);try{const w=S(h,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),I=this.#e.client.$count(w),R=t.limit||10,L=S(f,{...t,limit:R+1}),[$,p]=await Promise.all([L.run(),I]),v=$.rows,D=v.length>R;return{items:v.slice(0,R).map(C=>V(C)).filter(C=>C!==null),hasMore:D,total:p}}catch(w){return X.error("Error getting entities with relations:",w),{items:[],hasMore:!1,total:0}}}#i(t){return G(t)?t.field==="version"||t.field==="revision":Array.isArray(t)?t.some(s=>this.#i(s)):!1}async getEntityWithRelationsByKey(t,s={}){const n=this.#i(s.filter),l=n?[]:[r(i.isCurrent,!0)],E=n?[e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`]:[e`remote.is_current = 1`],u=this.#e.client.select(c).from(e`remote.entities`),d=n?u.where(r(e.raw("key"),t)):u.where(o(r(e.raw("key"),t),r(e.raw("is_current"),1))),m=this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,...E)),y=this.#e.client.select(c).from(i).where(o(r(i.key,t),...l,N(m))),f=this.#e.client.select(c).from(i),h=n?f.where(r(i.key,t)):f.where(o(r(i.key,t),r(i.isCurrent,!0))),g=(this.#t?k(d,y):h).as("e"),I=(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),R=this.#e.client.select(c).from(e`remote.entities`),L=n?R:R.where(r(e.raw("is_current"),1)),$=this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,...E)),p=this.#e.client.select(c).from(i),v=p.where(o(...l,N($))),D=n?p:p.where(r(i.isCurrent,!0)),H=(this.#t?k(L,v):D).as("combined_target_entities"),b=this.#e.client.with(g,I,H).select({...j("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(g).as("entities_with_relations_by_key"),U={...c,domains:b.domains,owners:b.owners},A=this.#e.client.with(b).select(U).from(b).$dynamic();A.where(r(e.raw("key"),t));const{whereCondition:F}=Q(A,s.filter);F&&A.where(F),A.limit(1);const W=await A.run();if(W.rows.length===0)return null;const O=W.rows[0];return V(O)}async getRelatedEntities(t,s={}){const n=Z("","relation_id"),l=x(s.filter,"version"),E=x(s.filter,"revision"),u=[B(r(a.sourceKey,t),r(a.targetKey,t))],d=typeof l=="string"?B(o(r(a.sourceKey,t),r(a.sourceVersion,l)),o(r(a.targetKey,t),r(a.targetVersion,l))):void 0,m=typeof E=="string"?B(o(r(a.sourceKey,t),r(a.sourceRevision,E)),o(r(a.targetKey,t),r(a.targetRevision,E))):void 0,y=[...u,d,m].filter(O=>O!==void 0),h=(this.#t?k(this.#e.client.select(n).from(e`remote.entities_relations`).where(o(...y)),this.#e.client.select(n).from(a).where(o(...y,N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(o(e`remote.source_key = ${a.sourceKey}`,e`remote.target_key = ${a.targetKey}`,e`remote.source_to_target_relation = ${a.sourceToTargetRelation}`)))))):this.#e.client.select(n).from(a).where(o(...y))).as("combined_relations"),T=j("","entity_id"),w=(this.#t?k(this.#e.client.select(T).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(T).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(T).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),I=ee("combined_target_entities"),R=Object.values(K("combined_target_entities")),L={...I,relation_type:e`
|
|
1
|
+
import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"drizzle-orm";import{unionAll as w}from"drizzle-orm/sqlite-core";import{asc as G}from"drizzle-orm";import{logger as x}from"../../../../../tools/notifiers/logger.js";import{isObject as z}from"../../../../../../utils/guards/is-object.js";import{applyPagination as R}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Q,getFirstFilterFieldValue as V}from"../../../../../providers/database/pagination/filter.js";import{createBffRelatedEntity as Z}from"../../mappers/create-bff-related-entity.js";import{createBffEntity as P}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as o,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as _,createEntityFieldsForSelect as q,createEntityRelationFieldsForSelect as K,createQualifiedEntityFieldsForSelect as ee,createQualifiedEntityFieldsForSelectWithAliases as te}from"../utils.js";import{createEntityReadModel as j}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as J}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";class we{#e;#t=void 0;constructor(t){this.#e=t}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`))}async getEntities(t={}){const s=this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0)),n=this.#e.client.select(o).from(s.as("combined_entities")),l=this.#e.client.select(o).from(s.as("combined_entities")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=n.$dynamic(),m=t.limit||10,E=R(d,{...t,limit:m+1}),[N,h]=await Promise.all([E.run(),u]),T=N.rows,g=T.length>m;return{items:T.slice(0,m).map(k=>j(k)).filter(k=>k!==null),hasMore:g,total:h}}async listEntityRevisions(t,s){const n=[r(i.key,t),...s?[r(i.version,s)]:[]],l=this.#t?w(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(e`remote.entities`).where(c(e`key = ${t}`,s?e`version = ${s}`:void 0)),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...n,f(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`)))))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...n));return(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(l.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(u=>({version:u.version||null,revision:u.revision||null,isCurrent:u.is_current!==null?!!u.is_current:!1,createdAt:u.created_at||null,updatedAt:u.updated_at||null,isDefaultVersion:u.is_default_version!==null?!!u.is_default_version:!1}))}async getEntitiesCountByTypes(){return this.#e.client.select({type:i.type,count:Y()}).from(i).groupBy(i.type)}async getEntityByKey(t){const l=(await(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(c(r(i.key,t),r(e.raw("is_current"),1))),this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0)))).run()).rows[0];return l?j(l):null}async getOneOutdatedEntity(){const t=this.#t?w(this.#e.client.select(o).from(e`remote.entities`),this.#e.client.select(o).from(i).where(f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(o).from(i),n=(await this.#e.client.select(o).from(t.as("combined_entities")).where(L(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`)).orderBy(e`combined_entities.updated_at ASC`).limit(1).run()).rows[0];return n?j(n):null}async getEntitiesRelations(t={}){const s=this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a),n=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),l=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=t.limit||10,m=R(n,{...t,limit:d+1}),[E,N]=await Promise.all([m.run(),u]),h=E.rows,T=h.length>d;return{items:h.slice(0,d).map(g=>J(g)).filter(g=>g!==null),hasMore:T,total:N}}async getEntityRelationById(t){const l=(await(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`).where(r(a.id,t)),this.#e.client.select(_).from(a).where(c(r(a.id,t),f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${a.id}`))))):this.#e.client.select(_).from(a).where(r(a.id,t))).run()).rows[0];return l?J(l):null}async getEntitiesWithRelations(t={}){const n=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("e"),y=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),d=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),m=this.#e.client.with(n,y,d).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),E={...o,domains:m.domains,owners:m.owners},N=this.#e.client.with(m).select(E).from(m).$dynamic(),h=this.#e.client.with(m).select(E).from(m).$dynamic(),{whereCondition:T}=Q(N,t.filter);T&&N.where(T);const{whereCondition:g}=Q(h,t.filter);g&&h.where(g);try{const k=R(h,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),I=this.#e.client.$count(k),S=t.limit||10,$=R(N,{...t,limit:S+1}),[D,p]=await Promise.all([$.run(),I]),b=D.rows,F=b.length>S;return{items:b.slice(0,S).map(C=>P(C)).filter(C=>C!==null),hasMore:F,total:p}}catch(k){return x.error("Error getting entities with relations:",k),{items:[],hasMore:!1,total:0}}}#i(t){return z(t)?t.field==="version"||t.field==="revision":Array.isArray(t)?t.some(s=>this.#i(s)):!1}async getEntityWithRelationsByKey(t,s={}){const n=this.#i(s.filter),l=n?[]:[r(i.isCurrent,!0)],y=n?[e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`]:[e`remote.is_current = 1`],u=this.#e.client.select(o).from(e`remote.entities`),d=n?u.where(r(e.raw("key"),t)):u.where(c(r(e.raw("key"),t),r(e.raw("is_current"),1))),m=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),E=this.#e.client.select(o).from(i).where(c(r(i.key,t),...l,f(m))),N=this.#e.client.select(o).from(i),h=n?N.where(r(i.key,t)):N.where(c(r(i.key,t),r(i.isCurrent,!0))),g=(this.#t?w(d,E):h).as("e"),I=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),S=this.#e.client.select(o).from(e`remote.entities`),$=n?S:S.where(r(e.raw("is_current"),1)),D=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),p=this.#e.client.select(o).from(i),b=p.where(c(...l,f(D))),F=n?p:p.where(r(i.isCurrent,!0)),H=(this.#t?w($,b):F).as("combined_target_entities"),v=this.#e.client.with(g,I,H).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(g).as("entities_with_relations_by_key"),U={...o,domains:v.domains,owners:v.owners},A=this.#e.client.with(v).select(U).from(v).$dynamic();A.where(r(e.raw("key"),t));const{whereCondition:B}=Q(A,s.filter);B&&A.where(B),A.limit(1);const W=await A.run();if(W.rows.length===0)return null;const O=W.rows[0];return P(O)}async getRelatedEntities(t,s={}){const n=K("","relation_id"),l=V(s.filter,"version"),y=V(s.filter,"revision"),u=[L(r(a.sourceKey,t),r(a.targetKey,t))],d=typeof l=="string"?L(c(r(a.sourceKey,t),r(a.sourceVersion,l)),c(r(a.targetKey,t),r(a.targetVersion,l))):void 0,m=typeof y=="string"?L(c(r(a.sourceKey,t),r(a.sourceRevision,y)),c(r(a.targetKey,t),r(a.targetRevision,y))):void 0,E=[...u,d,m].filter(O=>O!==void 0),h=(this.#t?w(this.#e.client.select(n).from(e`remote.entities_relations`).where(c(...E)),this.#e.client.select(n).from(a).where(c(...E,f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(c(e`remote.source_key = ${a.sourceKey}`,e`remote.target_key = ${a.targetKey}`,e`remote.source_to_target_relation = ${a.sourceToTargetRelation}`)))))):this.#e.client.select(n).from(a).where(c(...E))).as("combined_relations"),T=q("","entity_id"),k=(this.#t?w(this.#e.client.select(T).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(T).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(T).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),I=te("combined_target_entities"),S=Object.values(ee("combined_target_entities")),$={...I,relation_type:e`
|
|
2
2
|
CASE
|
|
3
3
|
WHEN COUNT(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN 1 END) > 0
|
|
4
4
|
THEN MIN(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN combined_relations.source_to_target_relation END)
|
|
@@ -10,7 +10,7 @@ import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm
|
|
|
10
10
|
THEN 'source'
|
|
11
11
|
ELSE 'target'
|
|
12
12
|
END
|
|
13
|
-
`.as("relation_role")}
|
|
13
|
+
`.as("relation_role")},D=this.#e.client.with(h,k).select($).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).orderBy(G(e.raw("relation_role"))).$dynamic(),p=this.#e.client.with(h,k).select(I).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).$dynamic(),b=R(p,{...s,limit:void 0,skip:void 0,after:void 0,before:void 0}),F=this.#e.client.$count(b),C=s.limit||10,H={...s,limit:C+1},v=R(D,H),[U,A]=await Promise.all([v.run(),F]),B=U.rows,W=B.length>C;return{items:B.slice(0,C).map(O=>Z(O)).filter(O=>O!==null),hasMore:W,total:A}}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#n(t),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#c(s)}catch(n){return console.error("Error fetching catalog filters:",n),{}}finally{await this.#l()}}async#n(t){if(this.#t?await this.#e.client.run(e`
|
|
14
14
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
15
15
|
SELECT
|
|
16
16
|
e.key,
|
|
@@ -74,7 +74,7 @@ import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm
|
|
|
74
74
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
|
|
75
75
|
`),await this.#e.client.run(e`
|
|
76
76
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
|
|
77
|
-
`)}async#
|
|
77
|
+
`)}async#c(t){const s={},n=[],l=t.filter(d=>d.startsWith("metadata."));t.includes("type")&&n.push(`
|
|
78
78
|
SELECT 'type' as filter_name, type as value, COUNT(*) as count
|
|
79
79
|
FROM temp_filtered_entities
|
|
80
80
|
WHERE type IS NOT NULL
|
|
@@ -121,7 +121,7 @@ import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm
|
|
|
121
121
|
INNER JOIN temp_combined_entities tce ON tce.key = owner_key
|
|
122
122
|
WHERE owner_key IS NOT NULL
|
|
123
123
|
GROUP BY owner_key
|
|
124
|
-
`);for(const d of l)await this.#
|
|
124
|
+
`);for(const d of l)await this.#a(d,s);if(n.length===0)return s;const y=n.join(" UNION ALL "),u=await this.#e.client.run(e.raw(y));if(u?.rows)for(const d of u.rows){const m=d.filter_name,E=d.value,N=Number(d.count)||0;s[m]||(s[m]=[]),E&&s[m].push({value:E,count:N})}return s}async#a(t,s){const n=t.substring(9),l=`$.${ie(n)}`,y=await this.#e.client.run(e.raw(`
|
|
125
125
|
SELECT json_extract(metadata, '${l}') as value, COUNT(*) as count
|
|
126
126
|
FROM temp_filtered_entities
|
|
127
127
|
WHERE metadata IS NOT NULL
|
|
@@ -129,7 +129,7 @@ import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm
|
|
|
129
129
|
AND json_extract(metadata, '${l}') IS NOT NULL
|
|
130
130
|
AND json_extract(metadata, '${l}') != ''
|
|
131
131
|
GROUP BY value
|
|
132
|
-
`));
|
|
132
|
+
`));y?.rows&&(s[t]=y.rows.map(u=>({value:u.value,count:Number(u.count)||0})).filter(u=>u.value))}async#l(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(t){x.error("Error cleaning up temp tables:",t)}}#r(t){return e`
|
|
133
133
|
COALESCE(
|
|
134
134
|
(
|
|
135
135
|
SELECT json_group_array(
|
|
@@ -223,4 +223,4 @@ import{and as o,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm
|
|
|
223
223
|
),
|
|
224
224
|
json_array()
|
|
225
225
|
)
|
|
226
|
-
`}}function
|
|
226
|
+
`}}function ie(X){return X.replace(/[^a-zA-Z0-9._-]/g,"")}export{we as CatalogEntitiesLocalReadRepository};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
2
2
|
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
|
|
3
3
|
import type { EntityRelationDtoSchema } from '../../../../../plugins/catalog-entities/schemas/dto-schemas.js';
|
|
4
|
+
import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
|
|
4
5
|
import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
|
|
5
6
|
import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
|
|
6
7
|
import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
|
|
@@ -14,6 +15,10 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
14
15
|
attachDatabase(databasePath: string): Promise<void>;
|
|
15
16
|
getEntities(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema>>;
|
|
16
17
|
getEntityByKey(key: string): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
|
|
18
|
+
getEntitiesCountByTypes(): Promise<{
|
|
19
|
+
type: string;
|
|
20
|
+
count: number;
|
|
21
|
+
}[]>;
|
|
17
22
|
getEntitiesRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<{
|
|
18
23
|
createdAt?: string | null | undefined;
|
|
19
24
|
updatedAt?: string | null | undefined;
|
|
@@ -77,5 +82,8 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
77
82
|
deleteEntityRelations(filter: Filter): Promise<boolean>;
|
|
78
83
|
getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
|
|
79
84
|
listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema, "version" | "isDefaultVersion" | "createdAt" | "updatedAt" | "revision" | "isCurrent">[]>;
|
|
85
|
+
updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
|
|
86
|
+
updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
|
|
87
|
+
getOneOutdatedEntity(): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
|
|
80
88
|
}
|
|
81
89
|
//# sourceMappingURL=catalog-entities-local-repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{promiseMapLimit as n}from"../../../../../utils/async/promise-map-limit.js";import{CatalogEntitiesLocalReadRepository as r}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as o}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as y}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{BaseRepository as l}from"../../../../../providers/database/base-repository.js";import{LocalDatabaseInitializationStrategy as
|
|
1
|
+
import{promiseMapLimit as n}from"../../../../../utils/async/promise-map-limit.js";import{CatalogEntitiesLocalReadRepository as r}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as o}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as y}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{BaseRepository as l}from"../../../../../providers/database/base-repository.js";import{LocalDatabaseInitializationStrategy as E}from"../../../../../providers/database/database-initialization-strategy.js";import{CATALOG_DATABASE_MIGRATIONS_FOLDER as c,CATALOG_LOCAL_DATABASE_FOLDER as d,CATALOG_LOCAL_DATABASE_NAME as h}from"../../consts.js";import{hasOptionsChanged as u}from"../../../utils/has-options-changed.js";const a=50;class i extends l{static#i;static#n;#t;#e;#a={};constructor(t){super(t),this.#t=new r(this.databaseClient),this.#e=new o(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#a}static async getInstance(t){const e=u(i.#n,t);if(!i.#i||e){const s=await new E().initialize({databaseName:h,additionalFolder:d,migrationsFolder:c,...t});i.#i=new i(s),i.#n=t}return i.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#a[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await n(t,a,async e=>this.createEntity(e))}createEntityRelation(t){const e=y(t,this.organizationId,this.projectId);return this.#e.createEntityRelation(e)}async createEntityRelations(t){await n(t,a,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{i as CatalogEntitiesLocalRepository};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EntityBaseFileSchema } from '@redocly/config';
|
|
2
2
|
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
3
3
|
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
4
|
+
import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
|
|
4
5
|
import { type DatabaseEntityRelation, type DatabaseEntityRelationDto } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
|
|
5
6
|
export type CreateEntityParams = {
|
|
6
7
|
entity: EntityBaseFileSchema;
|
|
@@ -21,5 +22,7 @@ export declare class CatalogEntitiesLocalWriteRepository {
|
|
|
21
22
|
deleteEntityRelation(id: string): Promise<string | null>;
|
|
22
23
|
deleteEntityRelations(filter: Filter): Promise<boolean>;
|
|
23
24
|
createEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
|
|
25
|
+
updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
|
|
26
|
+
updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
|
|
24
27
|
}
|
|
25
28
|
//# sourceMappingURL=catalog-entities-local-write-repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as h,desc as I,eq as a,isNull as g,or as V,sql as v}from"drizzle-orm";import{logger as l}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as D}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as K}from"../../../../../utils/crypto/sha1.js";import{createEntityDbRecord as N}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as B}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as s}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as C}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as T}from"../../../utils/version-compare.js";const E=15;class q{#e;#t;#r;constructor(t,r,i){this.#e=t,this.#t=r,this.#r=i}async createEntity({entity:t,fileHash:r,sourceFile:i}){try{const{relations:o=[],...n}=t,u=K(JSON.stringify(n));if(await this.#i(u))return;const c=t.version??null,{shouldBeCurrent:f,shouldBeDefaultVersion:m}=await this.#o(t.key,c),w=new Date().toISOString(),p=N({entity:{...t,revision:w,hash:u,isCurrent:f,isDefaultVersion:m},sourceFile:i,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:A,source:O,...R}=p;await this.#a({key:A,isCurrent:f,isDefaultVersion:m});const S=this.#e.client.insert(e).values(p).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:R}),k=o?.length&&o.length>0?this.#e.client.insert(s).values(o.map(y=>B({relation:y,sourceFile:i,fileHash:r,sourceKey:t.key,sourceVersion:c,sourceRevision:w,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision]}).run():Promise.resolve();await D([S,k],E,async y=>y)}catch(o){console.error(o),l.error("Error adding entity",o)}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(a(e.key,t)),t}catch(r){return l.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=C(t);if(!r)return!1;const i=await this.#e.client.delete(e).where(r).returning({key:e.key,source:e.source,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion,version:e.version});if(i.length===0)return!0;const o=i.reduce((n,u)=>((u.isCurrent||u.isDefaultVersion)&&n.add(u.key),n),new Set);if(o.size===0)return!0;await D(Array.from(o),E,async n=>this.#u(n));for(const n of i)await this.#e.client.delete(s).where(V(h(a(s.sourceKey,n.key),...n.version?[a(s.sourceVersion,n.version)]:[g(s.sourceVersion)]),h(a(s.targetKey,n.key),...n.version?[a(s.targetVersion,n.version)]:[g(s.targetVersion)])));return!0}catch(r){return l.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(s).where(a(s.id,t)),t}catch{return null}}async deleteEntityRelations(t){try{const r=C(t);return r?(await this.#e.client.delete(s).where(r),!0):!1}catch(r){return l.error("Error deleting entity relations",r),!1}}async createEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:i,sourceVersion:o,targetVersion:n,sourceRevision:u,targetRevision:d,...c}=t,f=await this.#e.client.insert(s).values(t).onConflictDoUpdate({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision],set:c}).returning();return f?.length?f[0]:null}catch(r){return l.error("Error creating entity relation",r),null}}async#i(t){const r=await this.#e.client.select({id:e.id,revision:e.revision}).from(e).where(h(a(e.hash,t),a(e.isCurrent,!0))).limit(1).run();return r.rows.length===0?null:{id:r.rows[0].id,revision:r.rows[0].revision}}async#n(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(h(a(e.key,t),a(e.source,"file"))).orderBy(I(e.createdAt)).run()).rows.map(i=>({version:i.version,isDefaultVersion:!!i.isDefaultVersion,revision:i.revision,createdAt:new Date(i.createdAt)}))}#s(t){const r=t.find(n=>n.isDefaultVersion);if(r)return r;const i=t.filter(n=>n.version!==null),o=t.filter(n=>n.version===null);if(i.length>0){i.sort((d,c)=>T(d.version,c.version));const n=i[0].version,u=i.filter(d=>d.version===n);return u.sort((d,c)=>c.createdAt.getTime()-d.createdAt.getTime()),u[0]}return o.length>0?(o.sort((n,u)=>u.createdAt.getTime()-n.createdAt.getTime()),o[0]):null}async#o(t,r){const i=await this.#e.client.select({currentDefaultVersion:v`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:v`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(h(a(e.key,t),a(e.source,"file"))).get(),o=i?.currentDefaultVersion,n=(i?.versionMatchCount??0)>0;return r&&r===o?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!n,shouldBeDefaultVersion:!n}}async#a({key:t,isCurrent:r,isDefaultVersion:i}){if(!r&&!i)return;const o={},n=[];r&&(o.isCurrent=!1,n.push(a(e.isCurrent,!0))),i&&(o.isDefaultVersion=!1,n.push(a(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(o).where(h(a(e.key,t),a(e.source,"file"),V(...n))).run()}#u=async t=>{const r=await this.#n(t),i=this.#s(r);if(!i){l.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(h(a(e.key,t),a(e.revision,i.revision),i.version?a(e.version,i.version):g(e.version))).run()};async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(a(e.id,t)).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status",i),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(v`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status if calculating",i),!1}}}export{q as CatalogEntitiesLocalWriteRepository};
|
|
@@ -8,6 +8,7 @@ export declare class CatalogEntitiesRemoteRepository extends BaseRepository {
|
|
|
8
8
|
#private;
|
|
9
9
|
get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
|
|
10
10
|
constructor(initializationResult: DatabaseInitializationResult);
|
|
11
|
+
sync(): Promise<void>;
|
|
11
12
|
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRemoteRepository | undefined>;
|
|
12
13
|
createEntity(entity: EntityDtoSchema): Promise<EntityReadModelSchema | null>;
|
|
13
14
|
updateEntity(entity: EntityDtoSchema & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq as E}from"drizzle-orm";import{convertFilterToWhereCondition as
|
|
1
|
+
import{eq as E,sql as p}from"drizzle-orm";import{convertFilterToWhereCondition as g}from"../../../../../providers/database/pagination/filter.js";import{promiseMapLimit as A}from"../../../../../utils/async/promise-map-limit.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{SQLD_REMOTE_DATABASE_FOLDER as T,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as f,SQLD_REMOTE_DATABASE_NAME as D}from"../../../../../constants/sqld-remote-database.js";import{telemetryTraceStep as i}from"../../../../../telemetry/helpers/trace-step.js";import{createEntityDbRecord as _}from"../../mappers/create-entity-db-record.js";import{createEntityReadModel as m}from"../../mappers/create-entity-read-model.js";import{createEntityRelationDbRecordFromDto as w}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{entitiesTable as r}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{BaseRepository as b}from"../../../../../providers/database/base-repository.js";import{DatabaseConnectionsManager as R}from"../../../../../providers/database/database-connections-manager.js";import{RemoteDatabaseInitializationStrategy as S}from"../../../../../providers/database/database-initialization-strategy.js";const L=15;class s extends b{static#t;get transactionsManager(){return this.databaseClient.transactionsManager}constructor(t){super(t)}async sync(){return i("catalog_entities.remote_repository.sync",async()=>{await this.#e(),await this.databaseClient.sync()})}static async getInstance(t){return await i("catalog_entities.remote_repository.get_instance",async e=>{if(!s.#t){if(!process.env.SQLD_REMOTE_DATABASE_URL||!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN){n.warn("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables not set - remote database will not be initialized"),e?.error(new Error("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables not set - remote database will not be initialized"));return}try{const o=await R.getConnection({config:{...t,databaseName:D,additionalFolder:T,migrationsFolder:f,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN},strategy:new S});if(!o){n.warn("Remote database connection failed!"),e?.error(new Error("Remote database connection failed!")),s.#t=void 0;return}s.#t=new s(o)}catch(o){s.#t=void 0,e?.error(o);return}}return s.#t})}async createEntity(t){return i("catalog_entities.remote_repository.create_entity",async()=>{await this.#e();try{n.info(`Adding entity ${t.key} to remote database`);const e=_({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,...d}=e,l=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:d}).returning();return l.length?(t.relations&&await this.createEntityRelations(t.relations.map(c=>({...c,sourceKey:t.key,targetKey:c.key}))),m(l[0])):null}catch(e){throw n.error("Error adding entity",e),e}})}async updateEntity(t){return i("catalog_entities.remote_repository.update_entity",async()=>{await this.#e();try{n.info(`Updating entity ${t.key} in remote database`);const e=_({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,scorecardsStatus:d,...l}=e,c=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:{...l,scorecardsStatus:p`CASE WHEN ${r.scorecardsStatus} = 'CALCULATING' THEN 'CANCELLED' ELSE 'OUTDATED' END`}}).returning();return c.length?m(c[0]):null}catch(e){return n.error("Error updating entity",e),null}})}async deleteEntity(t){return i("catalog_entities.remote_repository.delete_entity",async()=>{await this.#e();try{return await this.databaseClient.client.delete(r).where(E(r.key,t)),t}catch(e){return n.error("Error deleting entity",e),null}})}async createEntityRelations(t){return i("catalog_entities.remote_repository.create_entity_relations",async()=>(await this.#e(),await A(t,L,async e=>this.createEntityRelation(e))))}async createEntityRelation(t){return i("catalog_entities.remote_repository.create_entity_relation",async()=>{if(await this.#e(),!t)return null;try{const e=w(t,this.organizationId,this.projectId),{sourceKey:o,targetKey:u,sourceVersion:d,targetVersion:l,sourceRevision:c,targetRevision:v,...h}=e,y=await this.databaseClient.client.insert(a).values(e).onConflictDoUpdate({target:[a.sourceKey,a.targetKey,a.sourceVersion,a.targetVersion,a.sourceRevision,a.targetRevision],set:h}).returning();return y.length?y[0]:null}catch(e){throw n.error("Error creating entity relation",e),e}})}async deleteEntityRelation(t){return i("catalog_entities.remote_repository.delete_entity_relation",async()=>{await this.#e();try{return await this.databaseClient.client.delete(a).where(E(a.id,t)),t}catch(e){return n.error("Error deleting entity relation",e),null}})}async deleteEntitiesRelations(t){return i("catalog_entities.remote_repository.delete_entities_relations",async()=>{await this.#e();try{const e=g(t);return e?(await this.databaseClient.client.delete(a).where(e),!0):!1}catch(e){return n.error("Error deleting entities relations",e),!1}})}#e(){return i("catalog_entities.remote_repository.db_health",async t=>{if(this.databaseClient.dbClient.$client.closed){const e=new Error("The remote database connection is closed!");throw t?.error(e),e}})}}export{s as CatalogEntitiesRemoteRepository};
|
|
@@ -20,6 +20,7 @@ export declare const createEntityFieldsForSelect: (tableAlias?: string, idAlias?
|
|
|
20
20
|
revision: import("drizzle-orm").SQL<unknown>;
|
|
21
21
|
hash: import("drizzle-orm").SQL<unknown>;
|
|
22
22
|
isCurrent: import("drizzle-orm").SQL<unknown>;
|
|
23
|
+
scorecardsStatus: import("drizzle-orm").SQL<unknown>;
|
|
23
24
|
};
|
|
24
25
|
export declare const createEntityRelationFieldsForSelect: (tableAlias?: string, idAlias?: string) => {
|
|
25
26
|
id: import("drizzle-orm").SQL<unknown> | import("drizzle-orm").SQL.Aliased<unknown>;
|
|
@@ -107,6 +108,7 @@ export declare const FIELDS_TO_SELECT_FOR_ENTITY: {
|
|
|
107
108
|
revision: import("drizzle-orm").SQL<unknown>;
|
|
108
109
|
hash: import("drizzle-orm").SQL<unknown>;
|
|
109
110
|
isCurrent: import("drizzle-orm").SQL<unknown>;
|
|
111
|
+
scorecardsStatus: import("drizzle-orm").SQL<unknown>;
|
|
110
112
|
};
|
|
111
113
|
export declare const FIELDS_TO_SELECT_FOR_ENTITY_RELATION: {
|
|
112
114
|
id: import("drizzle-orm").SQL<unknown> | import("drizzle-orm").SQL.Aliased<unknown>;
|