@redocly/revel 0.128.0-next.6 → 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 +9 -0
- package/README.md +56 -0
- 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 +4 -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 +1 -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 +4 -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.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/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/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/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/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/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/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/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @redocly/revel
|
|
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
|
+
|
|
3
12
|
## 0.128.0-next.6
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# About Revel
|
|
2
|
+
|
|
3
|
+
Revel is Redocly's external developer showcase platform that transforms your API into a branded experience.
|
|
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 a 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
|
+
- **Redocly Integration** - works seamlessly with Redoc for API docs and Reef for internal catalogs
|
|
13
|
+
|
|
14
|
+
Refer to [Redocly documentation](https://redocly.com/docs) for detailed configuration options.
|
|
15
|
+
|
|
16
|
+
You can explore a live deployment of Revel at [https://redocly.com](https://redocly.com) - our main website is built with it.
|
|
17
|
+
|
|
18
|
+
You can explore a live deployment of Revel at [https://redocly.com](https://redocly.com) - this website runs entirely on Realm (which includes Revel).
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
Install Revel using npm:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install @redocly/revel
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Or using pnpm:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pnpm add @redocly/revel
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Or using yarn:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
yarn add @redocly/revel
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
Revel is designed to work seamlessly as part of the Redocly ecosystem. It integrates with:
|
|
43
|
+
|
|
44
|
+
- **Redoc** - for API reference documentation and mock servers
|
|
45
|
+
- **Reef** - for internal service catalogs
|
|
46
|
+
- **Realm** - the complete combination of Redoc, Revel, and Reef
|
|
47
|
+
- **Reunite** - for docs-as-code workflows and collaboration
|
|
48
|
+
|
|
49
|
+
## Support
|
|
50
|
+
|
|
51
|
+
- [Documentation](https://redocly.com/docs)
|
|
52
|
+
- [Contact the Redocly team](https://redocly.com/contact-us)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
Built with 💙 by Redocly
|
|
@@ -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';
|
|
@@ -129,6 +130,9 @@ export declare class CatalogEntitiesService {
|
|
|
129
130
|
getEntityWithRelationsByKey(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogEntity | null>;
|
|
130
131
|
getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogRelatedEntityList>;
|
|
131
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>;
|
|
132
136
|
}
|
|
133
137
|
export {};
|
|
134
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};
|
|
@@ -27,6 +27,7 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
27
27
|
count: number;
|
|
28
28
|
}[]>;
|
|
29
29
|
getEntityByKey(key: string): Promise<EntityReadModelSchema | null>;
|
|
30
|
+
getOneOutdatedEntity(): Promise<EntityReadModelSchema | null>;
|
|
30
31
|
getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
|
|
31
32
|
getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
|
|
32
33
|
getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{and as o,count as Y,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 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 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 K,createQualifiedEntityFieldsForSelect as ee,createQualifiedEntityFieldsForSelectWithAliases as te}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 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?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 getEntitiesCountByTypes(){return this.#e.client.select({type:i.type,count:Y()}).from(i).groupBy(i.type)}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 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)],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=K("","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=te("combined_target_entities"),R=Object.values(ee("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,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
|
|
|
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,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
|
|
|
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,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
|
|
|
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,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
|
|
|
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,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
|
|
|
223
223
|
),
|
|
224
224
|
json_array()
|
|
225
225
|
)
|
|
226
|
-
`}}function ie(
|
|
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';
|
|
@@ -81,5 +82,8 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
|
81
82
|
deleteEntityRelations(filter: Filter): Promise<boolean>;
|
|
82
83
|
getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
|
|
83
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>;
|
|
84
88
|
}
|
|
85
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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq 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>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sql as a}from"drizzle-orm";const i=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),key:a.raw(t+"key"),type:a.raw(t+"type"),title:a.raw(t+"title"),summary:a.raw(t+"summary"),tags:a.raw(t+"tags"),metadata:a.raw(t+"metadata"),git:a.raw(t+"git"),contact:a.raw(t+"contact"),links:a.raw(t+"links"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at"),source:a.raw(t+"source"),sourceFile:a.raw(t+"source_file"),fileHash:a.raw(t+"file_hash"),version:a.raw(t+"version"),revision:a.raw(t+"revision"),hash:a.raw(t+"hash"),isCurrent:a.raw(t+"is_current")}},s=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),sourceKey:a.raw(t+"source_key"),sourceId:a.raw(t+"source_id"),sourceVersion:a.raw(t+"source_version"),sourceRevision:a.raw(t+"source_revision"),sourceToTargetRelation:a.raw(t+"source_to_target_relation"),targetKey:a.raw(t+"target_key"),targetId:a.raw(t+"target_id"),targetVersion:a.raw(t+"target_version"),targetRevision:a.raw(t+"target_revision"),targetToSourceRelation:a.raw(t+"target_to_source_relation"),fileHash:a.raw(t+"file_hash"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at")}},n=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current")}},
|
|
1
|
+
import{sql as a}from"drizzle-orm";const i=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),key:a.raw(t+"key"),type:a.raw(t+"type"),title:a.raw(t+"title"),summary:a.raw(t+"summary"),tags:a.raw(t+"tags"),metadata:a.raw(t+"metadata"),git:a.raw(t+"git"),contact:a.raw(t+"contact"),links:a.raw(t+"links"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at"),source:a.raw(t+"source"),sourceFile:a.raw(t+"source_file"),fileHash:a.raw(t+"file_hash"),version:a.raw(t+"version"),revision:a.raw(t+"revision"),hash:a.raw(t+"hash"),isCurrent:a.raw(t+"is_current"),scorecardsStatus:a.raw(t+"scorecards_status")}},s=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),sourceKey:a.raw(t+"source_key"),sourceId:a.raw(t+"source_id"),sourceVersion:a.raw(t+"source_version"),sourceRevision:a.raw(t+"source_revision"),sourceToTargetRelation:a.raw(t+"source_to_target_relation"),targetKey:a.raw(t+"target_key"),targetId:a.raw(t+"target_id"),targetVersion:a.raw(t+"target_version"),targetRevision:a.raw(t+"target_revision"),targetToSourceRelation:a.raw(t+"target_to_source_relation"),fileHash:a.raw(t+"file_hash"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at")}},n=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current")}},c=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id").as("id"),organizationId:a.raw(r+"organization_id").as("organization_id"),projectId:a.raw(r+"project_id").as("project_id"),key:a.raw(r+"key").as("key"),type:a.raw(r+"type").as("type"),title:a.raw(r+"title").as("title"),summary:a.raw(r+"summary").as("summary"),tags:a.raw(r+"tags").as("tags"),metadata:a.raw(r+"metadata").as("metadata"),git:a.raw(r+"git").as("git"),contact:a.raw(r+"contact").as("contact"),links:a.raw(r+"links").as("links"),createdAt:a.raw(r+"created_at").as("created_at"),updatedAt:a.raw(r+"updated_at").as("updated_at"),source:a.raw(r+"source").as("source"),sourceFile:a.raw(r+"source_file").as("source_file"),fileHash:a.raw(r+"file_hash").as("file_hash"),version:a.raw(r+"version").as("version"),revision:a.raw(r+"revision").as("revision"),hash:a.raw(r+"hash").as("hash"),isCurrent:a.raw(r+"is_current").as("is_current")}},w=i(),d=s();export{w as FIELDS_TO_SELECT_FOR_ENTITY,d as FIELDS_TO_SELECT_FOR_ENTITY_RELATION,i as createEntityFieldsForSelect,s as createEntityRelationFieldsForSelect,n as createQualifiedEntityFieldsForSelect,c as createQualifiedEntityFieldsForSelectWithAliases};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SCORECARDS_WORKER_KEY as n,scorecardsWorker as i}from"../../../workers/scorecards-worker-pool.js";import{logger as r}from"../../../tools/notifiers/logger.js";const c=5;async function t(s,e){try{const o=await i.exec(n,[{baseDbDir:s,pollingIntervalMs:parseInt(process.env.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);return o.success?r.info(`${o.message}`):r.error(`Scorecards Worker error (attempt ${e}/${c}):`,o.error),Promise.resolve()}catch(o){r.error(`Scorecards Worker execution failed (attempt ${e}/${c}):`,o)}return e<c?(r.info(`Retrying Scorecards Worker (attempt ${e+1}/${c})...`),t(s,e+1)):(r.error(`All ${c} attempts failed. Scorecards Worker could not be started.`),Promise.resolve())}async function l(s){return r.info("Starting continuous Scorecards Worker..."),t(s,1)}export{l as runScorecardsWorker};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ScorecardsWorkerParams = {
|
|
2
|
+
baseDbDir: string;
|
|
3
|
+
pollingIntervalMs?: number;
|
|
4
|
+
};
|
|
5
|
+
export type ScorecardsWorkerResponse = {
|
|
6
|
+
success: true;
|
|
7
|
+
message: string;
|
|
8
|
+
} | {
|
|
9
|
+
success: false;
|
|
10
|
+
message: string;
|
|
11
|
+
error: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function startScorecardsWorker(params: ScorecardsWorkerParams): Promise<ScorecardsWorkerResponse>;
|
|
14
|
+
//# sourceMappingURL=scorecards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{logger as o}from"../../../tools/notifiers/logger.js";import{loadEnvVariables as l}from"../../../utils/envs/load-env-variables.js";import{CatalogEntitiesService as d}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";const u=3e3;async function y(s){try{const{baseDbDir:r,pollingIntervalMs:a=u}=s;l(r),o.verbose(`Initializing Scorecards Worker: polling interval ${a}ms (${a/1e3}s)`);const t=await d.getInstance({baseDbDir:r});return g(t,a),{success:!0,message:"Scorecards Worker started successfully"}}catch(r){const a=r instanceof Error?r.message:String(r);return o.error("Failed to start Scorecards Worker:",r),{success:!1,message:"Failed to start Scorecards Worker",error:a}}}async function g(s,r){let a=0,t=null;return t=setInterval(n,r),new Promise(()=>{});async function c(e){return e&&(await s.updateEntityScorecardsStatus(e.id,"CALCULATING"),await new Promise(i=>{setTimeout(async()=>{i()},1)}),await s.updateEntityScorecardsStatusIfCalculating(e.id,"UP_TO_DATE")?o.verbose(`Catalog Entity (${e.key}) scorecard evaluation completed successfully`):(await s.updateEntityScorecardsStatus(e.id,"OUTDATED"),o.verbose(`Catalog Entity (${e.key}) was updated during calculation, scorecard evaluation in not applicable anymore`))),Promise.resolve()}async function n(){try{a++;const e=await s.getOutdatedEntity();if(!e)return t||(o.verbose(`\u{1F50D} Resuming normal polling interval ${r}ms (${r/1e3}s)`),t=setInterval(n,r)),Promise.resolve();o.verbose(`\u{1F50D} Poll #${a} in Scorecards Worker: found Catalog Entity (${e.key}) for scorecard evaluation`),t&&(clearInterval(t),t=null,o.verbose(`\u{1F50D} Stopping normal polling while processing Catalog Entity (${e.key}) for scorecard evaluation`)),await c(e),await n()}catch(e){o.error("Error during poll in Scorecards Worker:",e),t||(t=setInterval(n,r))}}}export{y as startScorecardsWorker};
|
|
@@ -416,6 +416,25 @@ export declare const entitiesTable: import("drizzle-orm/sqlite-core").SQLiteTabl
|
|
|
416
416
|
identity: undefined;
|
|
417
417
|
generated: undefined;
|
|
418
418
|
}, {}, {}>;
|
|
419
|
+
scorecardsStatus: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
420
|
+
name: "scorecards_status";
|
|
421
|
+
tableName: "entities";
|
|
422
|
+
dataType: "string";
|
|
423
|
+
columnType: "SQLiteText";
|
|
424
|
+
data: string;
|
|
425
|
+
driverParam: string;
|
|
426
|
+
notNull: false;
|
|
427
|
+
hasDefault: false;
|
|
428
|
+
isPrimaryKey: false;
|
|
429
|
+
isAutoincrement: false;
|
|
430
|
+
hasRuntimeDefault: false;
|
|
431
|
+
enumValues: [string, ...string[]];
|
|
432
|
+
baseColumn: never;
|
|
433
|
+
identity: undefined;
|
|
434
|
+
generated: undefined;
|
|
435
|
+
}, {}, {
|
|
436
|
+
length: number | undefined;
|
|
437
|
+
}>;
|
|
419
438
|
};
|
|
420
439
|
dialect: "sqlite";
|
|
421
440
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sqliteTable as o,text as e,integer as
|
|
1
|
+
import{sqliteTable as o,text as e,integer as s,index as i,uniqueIndex as n}from"drizzle-orm/sqlite-core";const a=o("entities",{id:e("id").primaryKey(),organizationId:e("organization_id").notNull(),projectId:e("project_id").notNull(),key:e("key").notNull(),type:e("type").notNull(),title:e("title").notNull(),summary:e("summary"),tags:e("tags"),metadata:e("metadata"),git:e("git"),contact:e("contact"),links:e("links"),createdAt:e("created_at").notNull(),updatedAt:e("updated_at").notNull(),source:e("source").default("file"),sourceFile:e("source_file"),fileHash:e("file_hash"),version:e("version"),revision:e("revision"),hash:e("hash"),isCurrent:s("is_current",{mode:"boolean"}).default(!0),isDefaultVersion:s("is_default_version",{mode:"boolean"}).default(!1),scorecardsStatus:e("scorecards_status")},t=>[i("idx_entities_type").on(t.type),i("idx_entities_hash").on(t.hash),i("idx_entities_key_source_created_at").on(t.key,t.createdAt),i("idx_entities_key_source_is_current").on(t.key,t.isCurrent),i("idx_entities_key_source_is_default").on(t.key,t.isDefaultVersion),n("idx_entities_key_source").on(t.key,t.source,t.revision,t.version)]);export{a as entitiesTable};
|