@redocly/redoc-reef 0.130.0-next.10 → 0.130.0-next.11
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 +22 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +32 -9
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +16 -5
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +21 -17
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +35 -9
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +24 -21
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +31 -8
- 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.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +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/build-entities-exclusion-filter.d.ts +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
- package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/types/params.js +0 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
- package/dist/server/plugins/search/llmstxt/index.js +4 -4
- package/dist/server/utils/rbac.d.ts +65 -0
- package/dist/server/web-server/auth.js +3 -3
- package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
- package/dist/server/web-server/middleware/catalogAuthMiddleware.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.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
- package/dist/server/web-server/routes/index.js +1 -1
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @redocly/redoc-reef
|
|
2
2
|
|
|
3
|
+
## 0.130.0-next.11
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 85818157d8: Added bundling support for OpenAPI 3.2 `components/mediaTypes` references used in request and response content.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- e135881ebc: Updated `@redocly/openapi-core` to version `2.15.2`.
|
|
12
|
+
- c585ce5de8: Improved tooltip positioning and performance.
|
|
13
|
+
- 4015d8d229: Fixed an issue where the `llms.txt` page ignored path prefix in links.
|
|
14
|
+
- Updated dependencies [e135881ebc]
|
|
15
|
+
- Updated dependencies [c585ce5de8]
|
|
16
|
+
- Updated dependencies [a759cf76c7]
|
|
17
|
+
- Updated dependencies [85818157d8]
|
|
18
|
+
- @redocly/openapi-docs@3.18.0-next.10
|
|
19
|
+
- @redocly/theme@0.62.0-next.7
|
|
20
|
+
- @redocly/realm-asyncapi-sdk@0.8.0-next.3
|
|
21
|
+
- @redocly/asyncapi-docs@1.7.0-next.10
|
|
22
|
+
- @redocly/portal-plugin-mock-server@0.15.0-next.10
|
|
23
|
+
- @redocly/graphql-docs@1.7.0-next.2
|
|
24
|
+
|
|
3
25
|
## 0.130.0-next.10
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
|
@@ -8,6 +8,7 @@ import type { TransactionsManager } from '../../../providers/database/transactio
|
|
|
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
10
|
import type { ScorecardsStatus } from '../entities/types.js';
|
|
11
|
+
import type { GetEntityByIdParams } from '../types/params.js';
|
|
11
12
|
import { type EntityDtoSchema, type EntityRelationDtoSchema } from '../schemas/dto-schemas.js';
|
|
12
13
|
import { CatalogEntitiesLocalRepository } from './repositories/local/catalog-entities-local-repository.js';
|
|
13
14
|
import { CatalogEntitiesRemoteRepository } from './repositories/remote/catalog-entities-remote-repository.js';
|
|
@@ -25,8 +26,13 @@ export declare class CatalogEntitiesService {
|
|
|
25
26
|
constructor(localRepository: CatalogEntitiesLocalRepository, remoteRepository: CatalogEntitiesRemoteRepository | null);
|
|
26
27
|
static getInstance(options: ServiceInstanceOptions): Promise<CatalogEntitiesService>;
|
|
27
28
|
transaction<T>(...args: Parameters<TransactionsManager['transaction']>): Promise<T>;
|
|
28
|
-
getEntities(paginationParams
|
|
29
|
-
|
|
29
|
+
getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
30
|
+
paginationParams: PaginationParams;
|
|
31
|
+
rbacTeams?: string[];
|
|
32
|
+
excludedTypes?: string[];
|
|
33
|
+
excludedEntities?: string[];
|
|
34
|
+
}): Promise<ListResponseResult<EntityReadModelSchema>>;
|
|
35
|
+
getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
|
|
30
36
|
getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
|
|
31
37
|
getEntitiesCountByTypes(): Promise<{
|
|
32
38
|
type: string;
|
|
@@ -57,7 +63,7 @@ export declare class CatalogEntitiesService {
|
|
|
57
63
|
*/
|
|
58
64
|
createEntityRelationsInLocalDatabase(relations: EntityRelationDtoSchema[]): Promise<void>;
|
|
59
65
|
updateEntity(incomingEntity: Partial<EntityDtoSchema>, entityToBeUpdated: EntityReadModelSchema): Promise<EntityReadModelSchema | null | undefined>;
|
|
60
|
-
deleteEntity(
|
|
66
|
+
deleteEntity(entityToBeRemoved: EntityReadModelSchema): Promise<string | null | undefined>;
|
|
61
67
|
/**
|
|
62
68
|
* Use only internally, everything that is created via API should be created in the remote database.
|
|
63
69
|
* @param filter - The conditions used to select which entities to delete.
|
|
@@ -121,12 +127,29 @@ export declare class CatalogEntitiesService {
|
|
|
121
127
|
* @param filter - The conditions used to select which entity relations to delete.
|
|
122
128
|
*/
|
|
123
129
|
deleteEntityRelationsInLocalDatabase(filter: Filter): Promise<void>;
|
|
124
|
-
getEntitiesWithRelations(paginationParams
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
131
|
+
paginationParams: PaginationParams;
|
|
132
|
+
rbacTeams?: string[];
|
|
133
|
+
excludedTypes?: string[];
|
|
134
|
+
excludedEntities?: string[];
|
|
135
|
+
}): Promise<BffCatalogEntityList>;
|
|
136
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
137
|
+
entityKey: string;
|
|
138
|
+
filter?: {
|
|
139
|
+
revision?: string | null;
|
|
140
|
+
version?: string | null;
|
|
141
|
+
};
|
|
142
|
+
rbacTeams?: string[];
|
|
143
|
+
excludedTypes?: string[];
|
|
144
|
+
excludedEntities?: string[];
|
|
145
|
+
}): Promise<BffCatalogEntity | null>;
|
|
146
|
+
getRelatedEntities({ entityKey, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
147
|
+
entityKey: string;
|
|
148
|
+
paginationParams: PaginationParams;
|
|
149
|
+
rbacTeams?: string[];
|
|
150
|
+
excludedTypes?: string[];
|
|
151
|
+
excludedEntities?: string[];
|
|
152
|
+
}): Promise<BffCatalogRelatedEntityList>;
|
|
130
153
|
softDeleteEntitiesInLocalDatabase({ filter, revision, fileHash, }: {
|
|
131
154
|
filter: Filter;
|
|
132
155
|
revision: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{deepMerge as
|
|
1
|
+
import{deepMerge as w}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as u}from"../../../utils/async/promise-map-limit.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{isWebView as y}from"../../../../utils/env/is-web-view.js";import{entityRelationDtoSchema as m}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as R}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as p}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as l}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as E}from"./mappers/field-transformations.js";import{createValidator as f}from"../utils/ajv-validator.js";import{hasOptionsChanged as g}from"../utils/has-options-changed.js";const h=15,I=f(m,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"});class s{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([R.getInstance(t),t.runOnlyLocalDatabase?null:p.getInstance(t)]),i=new s(e,a);a&&(process.env.NODE_ENV==="development"&&c.info("Attaching remote database to local database"),await i.#t.attachDatabase(a.path)),s.#a=i,s.#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),(!s.#a||g(s.#i,t))&&await s.#n(t),s.#a}async transaction(...t){return this.#t.transactionsManager.transaction(...t)}async getEntities({paginationParams:t,rbacTeams:e,excludedTypes:a,excludedEntities:i}){await this.#e?.sync();const{items:n,total:r,hasMore:o}=await this.#t.getEntities({paginationParams:t,rbacTeams:e,excludedTypes:a,excludedEntities:i});return l({data:n,params:t,totalCount:r,hasMore:o})}async getEntityById(t,e){return await this.#e?.sync(),await this.#t.getEntityById(t,e)}async getEntityKeysAndVersionsBySourceFile(t){return await this.#e?.sync(),this.#t.getEntityKeysAndVersionsBySourceFile(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){if(y())throw new Error("Entity creation is not supported in the WebView");return this.#e?this.#e.createEntity(t):(c.warn("No remote database found"),null)}async createEntities(t){if(y())throw new Error("Entity creation is not supported in the WebView");const e=this.#e;return e?await u(t,h,async a=>e.createEntity(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.key,status:"error",error:i}))):(c.warn("No remote database found"),[])}getEntitySources(){return this.#t.getEntitySources()}async createEntityInLocalDatabase(t){return 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 updateEntity(t,e){if(y())throw new Error("Entity update is not supported in the WebView");return await this.#e?.updateEntity(t,e)}async deleteEntity(t){if(y())throw new Error("Entity deletion is not supported in the WebView");return await this.#e?.deleteEntity(t)}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 l({data:e,params:t,totalCount:a,nameTransformationsFromDatabase:E,hasMore:i})}async createEntityRelation(t){return this.#e?.createEntityRelation(t)}async createEntitiesRelations(t){const e=this.#e;return e?await u(t,h,async a=>e.createEntityRelation(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.sourceKey,status:"error",error:i}))):(c.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=w(a,e),n=I(i);return this.#e?.createEntityRelation(n)}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({paginationParams:t,rbacTeams:e,excludedTypes:a,excludedEntities:i}){await this.#e?.sync();const{items:n,total:r,hasMore:o}=await this.#t.getEntitiesWithRelations({paginationParams:t,rbacTeams:e,excludedTypes:a,excludedEntities:i});return l({data:n,params:t,totalCount:r,hasMore:o})}async getEntityWithRelationsByKey({entityKey:t,filter:e,rbacTeams:a,excludedTypes:i,excludedEntities:n}){return this.#t.getEntityWithRelationsByKey({entityKey:t,filter:e,rbacTeams:a,excludedTypes:i,excludedEntities:n})}async getRelatedEntities({entityKey:t,paginationParams:e,rbacTeams:a,excludedTypes:i,excludedEntities:n}){await this.#e?.sync();const{items:r,total:o,hasMore:d}=await this.#t.getRelatedEntities({key:t,paginationParams:e,rbacTeams:a,excludedTypes:i,excludedEntities:n});return l({data:r,params:e,totalCount:o,nameTransformationsFromDatabase:E,hasMore:d})}async softDeleteEntitiesInLocalDatabase({filter:t,revision:e,fileHash:a}){await this.#t.softDeleteEntities({filter:t,revision:e,fileHash:a})}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 getOutdatedEntities(t){return await this.#e?.sync(),this.#t.getOutdatedEntities(t)}async setEntitiesAsOutdated(t){await this.#e?.sync(),await this.#t.setEntitiesAsOutdated(t)}}export{s as CatalogEntitiesService};
|
|
@@ -5,10 +5,21 @@ import type { ListResult } from './catalog-entities-local-read-repository.js';
|
|
|
5
5
|
export declare class CatalogEntitiesBffRepository {
|
|
6
6
|
#private;
|
|
7
7
|
constructor(db: DatabaseClient, attachedDatabasePath: string);
|
|
8
|
-
getEntitiesWithRelations(paginationParams
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
|
|
9
|
+
paginationParams: PaginationParams;
|
|
10
|
+
rbacTeams?: string[];
|
|
11
|
+
excludedEntities?: string[];
|
|
12
|
+
excludedTypes?: string[];
|
|
13
|
+
}): Promise<ListResult<BffCatalogEntity>>;
|
|
14
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
15
|
+
entityKey: string;
|
|
16
|
+
filter?: {
|
|
17
|
+
revision?: string | null;
|
|
18
|
+
version?: string | null;
|
|
19
|
+
};
|
|
20
|
+
rbacTeams?: string[];
|
|
21
|
+
excludedTypes?: string[];
|
|
22
|
+
excludedEntities?: string[];
|
|
23
|
+
}): Promise<BffCatalogEntity | null>;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=catalog-entities-bff-repository.d.ts.map
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as a,desc as U,eq as r,notExists as k,sql as e,or as j}from"drizzle-orm";import{unionAll as W}from"drizzle-orm/sqlite-core";import{logger as z}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as L}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as d}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as J}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Z,excludeFieldsFromFilter as P,getAllFilterFieldValues as B}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as V}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as f,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as F,createEntityFieldsForSelect as C}from"../utils.js";import{createMergedEntityFieldsForSelect as X}from"../utils/create-merged-entity-fields-for-select.js";import{buildNoHigherVersionExistsFilter as Y,buildSemanticVersionSortExpr as x}from"../utils/semantic-version-sort.js";import{buildEntitiesExclusionFilter as N}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as p,buildSubqueryRbacJoinAndFilter as G}from"../utils/build-rbac-filter.js";class ye{#e;#t;constructor(i,s){this.#e=i,this.#t=s}async getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:n,excludedTypes:o}){const l=B(i.filter,"owners");if(l.length>0)return this.#c(i,l,s,o,n);const u=B(i.filter,"domains");return u.length>0?this.#a(i,u,s,o,n):this.#m(i,s,o,n)}async#c(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
|
|
2
2
|
EXISTS (
|
|
3
|
-
SELECT 1 FROM (${
|
|
4
|
-
WHERE cr.source_key = ${
|
|
3
|
+
SELECT 1 FROM (${h}) cr
|
|
4
|
+
WHERE cr.source_key = ${c}
|
|
5
5
|
AND cr.source_to_target_relation = 'owns'
|
|
6
6
|
AND cr.target_key = base_entities.key
|
|
7
7
|
)
|
|
8
|
-
`),
|
|
8
|
+
`),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"domains");let $=v;if(g.length>0){const c=g.map(m=>e`
|
|
9
9
|
EXISTS (
|
|
10
|
-
SELECT 1 FROM (${
|
|
11
|
-
JOIN (${
|
|
10
|
+
SELECT 1 FROM (${h}) cr
|
|
11
|
+
JOIN (${b}) d ON d.key = ${m}
|
|
12
12
|
WHERE d.type = 'domain'
|
|
13
13
|
AND d.is_current = 1
|
|
14
14
|
AND cr.source_key = ${m}
|
|
15
15
|
AND cr.target_key = base_entities.key
|
|
16
16
|
AND cr.source_to_target_relation = 'hasParts'
|
|
17
17
|
)
|
|
18
|
-
`),
|
|
18
|
+
`),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["owners","domains"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (owner optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#a(i,s,n,o,l){const u=this.#o(n,o,l),h=this.#l(),b=this.#i(o,l),A=h.as("combined_relations"),T=b.as("combined_target_entities"),w=this.#n().as("combined_target_attributes"),_=s.map(c=>e`
|
|
19
19
|
EXISTS (
|
|
20
|
-
SELECT 1 FROM (${
|
|
21
|
-
JOIN (${
|
|
20
|
+
SELECT 1 FROM (${h}) cr
|
|
21
|
+
JOIN (${b}) d ON d.key = ${c}
|
|
22
22
|
WHERE d.type = 'domain'
|
|
23
23
|
AND d.is_current = 1
|
|
24
|
-
AND cr.source_key = ${
|
|
24
|
+
AND cr.source_key = ${c}
|
|
25
25
|
AND cr.target_key = base_entities.key
|
|
26
26
|
AND cr.source_to_target_relation = 'hasParts'
|
|
27
27
|
)
|
|
28
|
-
`),
|
|
28
|
+
`),v=_.length===1?_[0]:e`(${e.join(_,e` OR `)})`,g=B(i.filter,"owners");let $=v;if(g.length>0){const c=g.map(m=>e`
|
|
29
29
|
EXISTS (
|
|
30
|
-
SELECT 1 FROM (${
|
|
30
|
+
SELECT 1 FROM (${h}) cr
|
|
31
31
|
WHERE cr.source_key = ${m}
|
|
32
32
|
AND cr.source_to_target_relation = 'owns'
|
|
33
33
|
AND cr.target_key = base_entities.key
|
|
34
34
|
)
|
|
35
|
-
`),
|
|
36
|
-
SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${
|
|
35
|
+
`),y=c.length===1?c[0]:e`(${e.join(c,e` OR `)})`;$=e`(${v} AND ${y})`}const D=P(i.filter,["domains","owners"]),S={...i,filter:D,baseWhereCondition:$},R=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();try{const c=this.#e.client.select(f).from(u.as("base_entities")).$dynamic();J(c,{...S,limit:void 0,skip:void 0,after:void 0,before:void 0});const y=this.#e.client.$count(c),m=i.limit||10;J(R,{...S,limit:m+1});const E=R.as("paged_entities"),M=this.#e.client.with(A,T,w,E).select({...C("paged_entities"),domains:this.#r("paged_entities",n).as("domains"),owners:this.#s("paged_entities",n).as("owners")}).from(E),[H,K]=await Promise.all([M.run(),y]),Q=H.rows,q=Q.length>m;return{items:Q.slice(0,m).map(O=>V(O)).filter(O=>O!==null),hasMore:q,total:K}}catch(c){return z.error("Error getting entities with relations (domain optimized path): "+c.message),{items:[],hasMore:!1,total:0}}}async#m(i,s,n,o){const l=this.#o(s,n,o),u=this.#l(),h=this.#i(n,o),b=u.as("combined_relations"),A=h.as("combined_target_entities"),I=this.#n().as("combined_target_attributes"),w=this.#e.client.select(f).from(l.as("base_entities")).$dynamic(),{whereCondition:_}=Z(w,i.filter);_&&w.where(_);try{const v=this.#e.client.select(f).from(l.as("base_entities")).$dynamic();_&&v.where(_);const g=this.#e.client.$count(v),$=i.limit||10;J(w,{...i,limit:$+1});const D=w.as("paged_entities"),S=this.#e.client.with(b,A,I,D).select({...C("paged_entities"),domains:this.#r("paged_entities",s).as("domains"),owners:this.#s("paged_entities",s).as("owners")}).from(D),[R,c]=await Promise.all([S.run(),g]),y=R.rows,m=y.length>$;return{items:y.slice(0,$).map(E=>V(E)).filter(E=>E!==null),hasMore:m,total:c}}catch(v){return z.error("Error getting entities with relations (optimized path): "+v.message),{items:[],hasMore:!1,total:0}}}#o(i,s,n){const o=N(s,n,"remote.entities"),l=N(s,n,"entities"),u=N(s,n,"r");return this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),p(i,"remote.entities_attributes"),o,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))),Y("remote.entities.key","remote.entities.version","remote.entities.revision"))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))),Y("entities.key","entities.version","entities.revision"))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),p(i,"ea"),u,Y("r.key","r.version","r.revision")))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),p(i,"entities_attributes"),l))}#l(){return this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)}#i(i,s){const n=N(i,s,"remote.entities"),o=N(i,s,"entities"),l=N(i,s,"r");return this.#t?W(this.#e.client.select(f).from(e`remote.entities`).where(a(r(e.raw("is_current"),1),r(e.raw("is_deleted"),!1),n,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(a(j(r(e.raw("r.is_current"),1),r(e.raw("l.is_current"),1)),j(r(e.raw("r.is_deleted"),!1),r(e.raw("l.is_deleted"),!1)),l))):this.#e.client.select(f).from(t).where(a(r(t.isCurrent,!0),r(t.isDeleted,!1),o))}async getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:n,excludedTypes:o,excludedEntities:l}){if(!i||i.trim()==="")return null;const u=s?.revision,h=s?.version,b=u?null:await this.#u(i,h||null),A=h??b?.version,T=u||b?.revision||null,I=N(o,l,"remote.entities"),w=N(o,l,"entities"),_=N(o,l,"r"),g=(this.#t?W(this.#e.client.select(C("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,r(t.key,d.entityKey)).where(a(e`remote.entities.key = ${i}`,p(n,"remote.entities_attributes"),I,k(this.#e.client.select({id:f.id}).from(t).where(a(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w,k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(a(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(X("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(a(e`r.key = ${i}`,p(n,"ea"),_))):this.#e.client.select(C("entities")).from(t).leftJoin(d,r(t.key,d.entityKey)).where(a(r(t.key,i),p(n,"entities_attributes"),w))).as("e"),D=(this.#t?W(this.#e.client.select(F).from(e`remote.entities_relations`),this.#e.client.select(F).from(L).where(k(this.#e.client.select({id:F.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${L.sourceKey}`)))):this.#e.client.select(F).from(L)).as("combined_relations"),R=this.#i(o,l).as("combined_target_entities"),y=this.#n().as("combined_target_attributes"),m=this.#e.client.with(g,D,R,y).select({...C("e"),domains:this.#r("e",n).as("domains"),owners:this.#s("e",n).as("owners")}).from(g).$dynamic();T?m.where(a(r(e.raw("revision"),T),A?r(e.raw("version"),A):void 0)):m.where(r(e.raw("is_current"),1)),m.limit(1);const E=await m.run();if(E.rows.length===0)return null;const M=E.rows[0];return V(M)}async#u(i,s){if(s){const l=await(this.#t?W(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(a(e`key = ${i}`,e`version = ${s}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s),k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(a(e`remote.key = ${t.key}`,e`remote.version = ${s}`))))).orderBy(U(t.revision))):this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.version,s))).orderBy(U(t.revision))).limit(1).run();if(l.rows.length>0){const u=l.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}if(this.#t){const o=await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`(
|
|
36
|
+
SELECT version, revision, ROW_NUMBER() OVER (ORDER BY ${x("version")} DESC, revision DESC) as rn
|
|
37
37
|
FROM (
|
|
38
38
|
SELECT version, revision FROM remote.entities WHERE key = ${i} AND is_current = 1
|
|
39
39
|
UNION ALL
|
|
40
40
|
SELECT version, revision FROM entities WHERE key = ${i} AND is_current = 1
|
|
41
41
|
)
|
|
42
|
-
) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(
|
|
42
|
+
) as ranked_entities`).where(e`rn = 1`).limit(1).run();if(o.rows.length>0){const l=o.rows[0];return{version:l.version||null,revision:l.revision||null}}return null}const n=await this.#e.client.select({version:t.version,revision:t.revision}).from(t).where(a(r(t.key,i),r(t.isCurrent,!0))).limit(1).run();if(n.rows.length>0){const o=n.rows[0];return{version:o.version||null,revision:o.revision||null}}return null}#r(i,s){const{join:n,filter:o}=G(s,"d.key");return e`
|
|
43
43
|
COALESCE(
|
|
44
44
|
(
|
|
45
45
|
SELECT json_group_array(
|
|
@@ -59,10 +59,12 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
|
|
|
59
59
|
SELECT DISTINCT d.*
|
|
60
60
|
FROM combined_relations er
|
|
61
61
|
JOIN combined_target_entities d ON d.key = er.source_key
|
|
62
|
+
${n}
|
|
62
63
|
WHERE er.source_to_target_relation = 'hasParts'
|
|
63
64
|
AND er.target_key = ${e.raw(`${i}.key`)}
|
|
64
65
|
AND d.type = 'domain'
|
|
65
66
|
AND d.is_current = 1
|
|
67
|
+
${o}
|
|
66
68
|
AND CASE
|
|
67
69
|
WHEN ${e.raw(`${i}.version`)} = ''
|
|
68
70
|
THEN er.target_version = ''
|
|
@@ -78,7 +80,7 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
|
|
|
78
80
|
),
|
|
79
81
|
json_array()
|
|
80
82
|
)
|
|
81
|
-
`}#s(i){return e`
|
|
83
|
+
`}#s(i,s){const{join:n,filter:o}=G(s,"o.key");return e`
|
|
82
84
|
COALESCE(
|
|
83
85
|
(
|
|
84
86
|
SELECT json_group_array(
|
|
@@ -98,9 +100,11 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
|
|
|
98
100
|
SELECT DISTINCT o.*
|
|
99
101
|
FROM combined_relations er
|
|
100
102
|
JOIN combined_target_entities o ON o.key = er.source_key
|
|
103
|
+
${n}
|
|
101
104
|
WHERE er.source_to_target_relation = 'owns'
|
|
102
105
|
AND er.target_key = ${e.raw(`${i}.key`)}
|
|
103
106
|
AND o.is_current = 1
|
|
107
|
+
${o}
|
|
104
108
|
AND CASE
|
|
105
109
|
WHEN ${e.raw(`${i}.version`)} = ''
|
|
106
110
|
THEN er.target_version = ''
|
|
@@ -116,4 +120,4 @@ import{and as n,desc as V,eq as r,notExists as g,sql as e,or as A,isNull as X,ex
|
|
|
116
120
|
),
|
|
117
121
|
json_array()
|
|
118
122
|
)
|
|
119
|
-
`}#
|
|
123
|
+
`}#n(){return this.#t?W(this.#e.client.select({entityKey:e.raw("entity_key"),rbacTeams:e.raw("rbac_teams")}).from(e`remote.entities_attributes`),this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d).where(k(this.#e.client.select({id:e.raw("1")}).from(e`remote.entities_attributes as remote`).where(e`remote.entity_key = ${d.entityKey}`)))):this.#e.client.select({entityKey:d.entityKey,rbacTeams:d.rbacTeams}).from(d)}}export{ye as CatalogEntitiesBffRepository};
|
|
@@ -3,6 +3,7 @@ import type { PaginationParams } from '../../../../../providers/database/paginat
|
|
|
3
3
|
import type { EntityRelationReadModelSchema } from '../../../schemas/read-model-schemas.js';
|
|
4
4
|
import type { DatabaseClient } from '../../../../../providers/database/client.js';
|
|
5
5
|
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
6
|
+
import type { GetEntityByIdParams } from '../../../types/params.js';
|
|
6
7
|
import { type EntityReadModelSchema, type EntityRevisionSummary } from '../../../schemas/read-model-schemas.js';
|
|
7
8
|
export type ListResult<T> = {
|
|
8
9
|
items: T[];
|
|
@@ -12,6 +13,9 @@ export type ListResult<T> = {
|
|
|
12
13
|
export type CatalogFiltersParams = {
|
|
13
14
|
entitiesTypes?: string[];
|
|
14
15
|
emptyFilters?: string[];
|
|
16
|
+
rbacTeams?: string[];
|
|
17
|
+
excludedTypes?: string[];
|
|
18
|
+
excludedEntities?: string[];
|
|
15
19
|
};
|
|
16
20
|
export type FilterOption = {
|
|
17
21
|
value: string;
|
|
@@ -21,22 +25,38 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
21
25
|
#private;
|
|
22
26
|
constructor(db: DatabaseClient);
|
|
23
27
|
attachDatabase(databasePath: string): Promise<void>;
|
|
24
|
-
getEntities(paginationParams
|
|
28
|
+
getEntities({ paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
29
|
+
paginationParams: PaginationParams;
|
|
30
|
+
rbacTeams?: string[];
|
|
31
|
+
excludedTypes?: string[];
|
|
32
|
+
excludedEntities?: string[];
|
|
33
|
+
}): Promise<ListResult<EntityReadModelSchema>>;
|
|
25
34
|
getEntityKeysAndVersionsBySourceFile(sourceFile: string): Promise<Set<string>>;
|
|
26
35
|
listEntityRevisions(entityKey: string, version?: string | null): Promise<EntityRevisionSummary[]>;
|
|
27
36
|
getEntitiesCountByTypes(): Promise<{
|
|
28
37
|
type: string;
|
|
29
38
|
count: number;
|
|
30
39
|
}[]>;
|
|
31
|
-
getEntityById(id: string): Promise<EntityReadModelSchema | null>;
|
|
40
|
+
getEntityById(id: string, params?: GetEntityByIdParams): Promise<EntityReadModelSchema | null>;
|
|
32
41
|
getOutdatedEntities(filter?: Filter): Promise<EntityReadModelSchema[]>;
|
|
33
42
|
getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
|
|
34
43
|
getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
|
|
35
|
-
getEntitiesWithRelations(paginationParams
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
getEntitiesWithRelations({ paginationParams, rbacTeams, excludedEntities, excludedTypes, }: {
|
|
45
|
+
paginationParams: PaginationParams;
|
|
46
|
+
rbacTeams?: string[];
|
|
47
|
+
excludedEntities?: string[];
|
|
48
|
+
excludedTypes?: string[];
|
|
49
|
+
}): Promise<ListResult<BffCatalogEntity>>;
|
|
50
|
+
getEntityWithRelationsByKey({ entityKey, filter, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
51
|
+
entityKey: string;
|
|
52
|
+
filter?: {
|
|
53
|
+
revision?: string | null;
|
|
54
|
+
version?: string | null;
|
|
55
|
+
};
|
|
56
|
+
rbacTeams?: string[];
|
|
57
|
+
excludedTypes?: string[];
|
|
58
|
+
excludedEntities?: string[];
|
|
59
|
+
}): Promise<BffCatalogEntity | null>;
|
|
40
60
|
getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
|
|
41
61
|
targetKey: string;
|
|
42
62
|
targetRevision: string;
|
|
@@ -44,7 +64,13 @@ export declare class CatalogEntitiesLocalReadRepository {
|
|
|
44
64
|
direction: "outgoing" | "incoming";
|
|
45
65
|
priority: number;
|
|
46
66
|
}[]>;
|
|
47
|
-
getRelatedEntities(key
|
|
48
|
-
|
|
67
|
+
getRelatedEntities({ key, paginationParams, rbacTeams, excludedTypes, excludedEntities, }: {
|
|
68
|
+
key: string;
|
|
69
|
+
paginationParams: PaginationParams;
|
|
70
|
+
rbacTeams?: string[];
|
|
71
|
+
excludedTypes?: string[];
|
|
72
|
+
excludedEntities?: string[];
|
|
73
|
+
}): Promise<ListResult<BffCatalogRelatedEntity>>;
|
|
74
|
+
getCatalogFilters({ entitiesTypes, emptyFilters, rbacTeams, excludedTypes, excludedEntities, }: CatalogFiltersParams): Promise<Record<string, FilterOption[]>>;
|
|
49
75
|
}
|
|
50
76
|
//# sourceMappingURL=catalog-entities-local-read-repository.d.ts.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as u,count as F,eq as _,isNotNull as X,notExists as f,or as J,sql as e}from"drizzle-orm";import{unionAll as p}from"drizzle-orm/sqlite-core";import{logger as q}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as v}from"@redocly/theme/core/constants";import{applyPagination as R}from"../../../../../providers/database/pagination/index.js";import{applyFilter as P}from"../../../../../providers/database/pagination/filter.js";import{createEntityFieldsForSelect as S,FIELDS_TO_SELECT_FOR_ENTITY as h,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as g}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as b}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{entitiesAttributesTable as d}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{CatalogEntitiesRelationsRepository as $}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as B}from"./catalog-entities-bff-repository.js";import{createMergedEntityFieldsForSelect as j}from"../utils/create-merged-entity-fields-for-select.js";import{buildSemanticVersionSortExpr as M}from"../utils/semantic-version-sort.js";import{normalizeRevisionFlags as x}from"../utils/normalize-revision-flags.js";import{buildEntitiesExclusionFilter as A}from"../utils/build-entities-exclusion-filter.js";import{buildRbacFilter as T,buildRbacFilterRaw as Y}from"../utils/build-rbac-filter.js";class Ee{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new $(this.#e,this.#t||""),this.#s=new B(this.#e,this.#t||"")}async attachDatabase(i){this.#t!==i&&(this.#t=i,await this.#e.client.run(e`ATTACH DATABASE ${i} AS remote`),this.#i=new $(this.#e,i),this.#s=new B(this.#e,i))}async getEntities({paginationParams:i,rbacTeams:s,excludedTypes:r,excludedEntities:n}){const o=A(r,n,"remote.entities"),c=A(r,n,"entities"),a=A(r,n,"r"),l=this.#t?p(this.#e.client.select(S("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,_(t.key,d.entityKey)).where(u(T(s,"remote.entities_attributes"),o,f(this.#e.client.select({id:h.id}).from(t).where(u(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(T(s,"entities_attributes"),c,f(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select(j("r","l")).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).leftJoin(e`entities_attributes as ea`,e`l.key = ea.entity_key`).where(u(T(s,"ea"),a))):this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(T(s,"entities_attributes"),c)),N=this.#e.client.select(h).from(l.as("combined_entities")),E=this.#e.client.select(h).from(l.as("combined_entities")).$dynamic(),k=R(E,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),O=this.#e.client.$count(k),w=N.$dynamic(),I=i.limit||10,U=R(w,{...i,limit:I+1}),[W,V]=await Promise.all([U.run(),O]),D=W.rows,H=D.length>I;return{items:D.slice(0,I).map(C=>g(C)).filter(C=>C!==null),hasMore:H,total:V}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?p(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${v})`.as("keyVersion")}).from(e`remote.entities`).where(u(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${v})`.as("keyVersion")}).from(t).where(u(_(t.sourceFile,i),_(t.source,"file"),e`${t.key} IS NOT NULL`,f(this.#e.client.select({key:e.raw("key")}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`))))):this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${v})`.as("keyVersion")}).from(t).where(u(_(t.sourceFile,i),_(t.source,"file"),X(t.key))),r=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(r.rows.map(n=>n.keyVersion))}async listEntityRevisions(i,s){const r=[_(t.key,i),_(t.isDeleted,!1),...s?[_(t.version,s)]:[]],n={version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")},o=this.#t?p(this.#e.client.select(n).from(e`remote.entities`).where(u(e`key = ${i}`,e`is_deleted = 0`,s?e`version = ${s}`:void 0,f(this.#e.client.select({id:e.raw("id")}).from(t).where(u(e`${t.key} = remote.entities.key`,e`${t.version} = remote.entities.version`,e`${t.revision} = remote.entities.revision`))))),this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(u(...r,f(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as r`).where(u(e`r.key = ${t.key}`,e`r.version = ${t.version}`,e`r.revision = ${t.revision}`))))),this.#e.client.select({version:e.raw("r.version AS version"),revision:e.raw("r.revision AS revision"),isCurrent:e.raw("MAX(r.is_current, l.is_current) AS is_current"),createdAt:e.raw("MIN(r.created_at, l.created_at) AS created_at"),updatedAt:e.raw("MAX(r.updated_at, l.updated_at) AS updated_at"),isDefaultVersion:e.raw("MAX(r.is_default_version, l.is_default_version) AS is_default_version")}).from(e`remote.entities as r`).innerJoin(e`entities as l`,e`l.key = r.key AND l.version = r.version AND l.revision = r.revision`).where(u(e`r.key = ${i}`,e`r.is_deleted = 0`,e`l.is_deleted = 0`,s?e`r.version = ${s}`:void 0))):this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(u(...r)),a=(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(o.as("combined_revisions")).orderBy(e`${M("version")} DESC`,e.raw("revision DESC")).run()).rows.map(l=>({version:l.version||null,revision:l.revision??"",isCurrent:l.is_current!==null?!!l.is_current:!1,createdAt:l.created_at||null,updatedAt:l.updated_at||null,isDefaultVersion:l.is_default_version!==null?!!l.is_default_version:!1}));return x(a),a}async getEntitiesCountByTypes(){if(this.#t){const i=e`
|
|
2
2
|
SELECT key, type, version,
|
|
3
3
|
ROW_NUMBER() OVER (
|
|
4
4
|
PARTITION BY key
|
|
5
|
-
ORDER BY ${
|
|
5
|
+
ORDER BY ${M("version")} DESC
|
|
6
6
|
) as rn
|
|
7
7
|
FROM (
|
|
8
8
|
SELECT key, type, version FROM remote.entities WHERE is_current = 1 AND is_deleted = 0
|
|
9
9
|
UNION ALL
|
|
10
10
|
SELECT key, type, version FROM entities WHERE is_current = 1 AND is_deleted = 0
|
|
11
11
|
)
|
|
12
|
-
`;return this.#e.client.select({type:e`type`,count:
|
|
12
|
+
`;return this.#e.client.select({type:e`type`,count:F()}).from(e`(SELECT * FROM (${i}) WHERE rn = 1) as highest_version_entities`).groupBy(e`type`)}return this.#e.client.select({type:t.type,count:F()}).from(t).where(u(_(t.isCurrent,!0),_(t.isDeleted,!1))).groupBy(t.type)}async getEntityById(i,s){const{rbacTeams:r,excludedTypes:n,excludedEntities:o}=s||{},c=A(n,o,"remote.entities"),a=A(n,o,"entities"),E=(await(this.#t?p(this.#e.client.select(S("remote.entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,_(t.key,d.entityKey)).where(u(e`remote.entities.id = ${i}`,T(r,"remote.entities_attributes"),c)),this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(_(t.id,i),T(r,"entities_attributes"),a))):this.#e.client.select(S("entities")).from(t).leftJoin(d,_(t.key,d.entityKey)).where(u(_(t.id,i),T(r,"entities_attributes"),a))).run()).rows[0];return E?g(E):null}async getOutdatedEntities(i){const s=this.#t?p(this.#e.client.select(h).from(e`remote.entities`),this.#e.client.select(h).from(t).where(f(this.#e.client.select({id:h.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(h).from(t),r=this.#e.client.select(h).from(s.as("combined_entities")).$dynamic(),{whereCondition:n}=P(r,i),o=J(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`),c=n?u(n,o):o;return(await r.where(c).run()).rows.map(l=>g(l)).filter(l=>l!==null)}async getEntitiesRelations(i={}){const s=this.#t?p(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(y).where(f(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${y.sourceKey}`)))):this.#e.client.select(m).from(y),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),n=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=R(n,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(o),a=i.limit||10,l=R(r,{...i,limit:a+1}),[N,E]=await Promise.all([l.run(),c]),k=N.rows,O=k.length>a;return{items:k.slice(0,a).map(w=>b(w)).filter(w=>w!==null),hasMore:O,total:E}}async getEntityRelationById(i){const n=(await(this.#t?p(this.#e.client.select(m).from(e`remote.entities_relations`).where(_(y.id,i)),this.#e.client.select(m).from(y).where(u(_(y.id,i),f(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${y.id}`))))):this.#e.client.select(m).from(y).where(_(y.id,i))).run()).rows[0];return n?b(n):null}async getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:r,excludedTypes:n}){return this.#s.getEntitiesWithRelations({paginationParams:i,rbacTeams:s,excludedEntities:r,excludedTypes:n})}async getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:r,excludedTypes:n,excludedEntities:o}){return this.#s.getEntityWithRelationsByKey({entityKey:i,filter:s,rbacTeams:r,excludedTypes:n,excludedEntities:o})}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities({key:i,paginationParams:s,rbacTeams:r,excludedTypes:n,excludedEntities:o}){return this.#i.getRelatedEntities({key:i,paginationParams:s,rbacTeams:r,excludedTypes:n,excludedEntities:o})}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[],rbacTeams:r,excludedTypes:n,excludedEntities:o}){if(!s.length)return{};try{return await this.#r({entitiesTypes:i,rbacTeams:r,excludedTypes:n,excludedEntities:o}),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#a(s)}catch(c){return console.error("Error fetching catalog filters:",c),{}}finally{await this.#c()}}async#r({entitiesTypes:i,rbacTeams:s,excludedTypes:r,excludedEntities:n}){const o=Y(s,"ea"),c=this.#n(r,n);if(this.#t){const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),c&&a.push(c.replace(/ENTITY_ALIAS/g,"e"));const l=["r.key IS NULL","e.is_current = 1","e.is_deleted = 0"];o&&l.push(o),c&&l.push(c.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
|
|
13
13
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
14
14
|
SELECT
|
|
15
15
|
e.key,
|
|
@@ -17,7 +17,8 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
17
17
|
e.tags,
|
|
18
18
|
e.metadata
|
|
19
19
|
FROM remote.entities e
|
|
20
|
-
|
|
20
|
+
LEFT JOIN remote.entities_attributes ea ON ea.entity_key = e.key
|
|
21
|
+
WHERE ${a.join(" AND ")}
|
|
21
22
|
UNION ALL
|
|
22
23
|
SELECT
|
|
23
24
|
e.key,
|
|
@@ -26,26 +27,28 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
26
27
|
e.metadata
|
|
27
28
|
FROM entities e
|
|
28
29
|
LEFT JOIN remote.entities r ON r.key = e.key AND r.is_current = 1
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
|
|
31
|
+
WHERE ${l.join(" AND ")}
|
|
32
|
+
`))}else{const a=["e.is_current = 1","e.is_deleted = 0"];o&&a.push(o),c&&a.push(c.replace(/ENTITY_ALIAS/g,"e")),await this.#e.client.run(e.raw(`
|
|
31
33
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
32
34
|
SELECT
|
|
33
|
-
key,
|
|
34
|
-
type,
|
|
35
|
-
tags,
|
|
36
|
-
metadata
|
|
37
|
-
FROM entities
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
e.key,
|
|
36
|
+
e.type,
|
|
37
|
+
e.tags,
|
|
38
|
+
e.metadata
|
|
39
|
+
FROM entities e
|
|
40
|
+
LEFT JOIN entities_attributes ea ON ea.entity_key = e.key
|
|
41
|
+
WHERE ${a.join(" AND ")}
|
|
42
|
+
`))}if(i.length){const a=i.map(l=>`'${l.replace(/'/g,"''")}'`).join(",");await this.#e.client.run(e.raw(`
|
|
40
43
|
CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
|
|
41
44
|
SELECT * FROM temp_combined_entities
|
|
42
|
-
WHERE type IN (${
|
|
45
|
+
WHERE type IN (${a})
|
|
43
46
|
`))}else await this.#e.client.run(e`
|
|
44
47
|
CREATE TEMP TABLE IF NOT EXISTS temp_filtered_entities AS
|
|
45
48
|
SELECT * FROM temp_combined_entities
|
|
46
49
|
`);await this.#e.client.run(e`
|
|
47
50
|
CREATE INDEX IF NOT EXISTS idx_temp_filtered_type ON temp_filtered_entities(type)
|
|
48
|
-
`)}
|
|
51
|
+
`)}#n(i,s){const r=[];if(i&&i.length>0){const n=i.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");r.push(`ENTITY_ALIAS.type NOT IN (${n})`)}if(s&&s.length>0){const n=s.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ");r.push(`ENTITY_ALIAS.key NOT IN (${n})`)}return r.length>0?`(${r.join(" AND ")})`:null}async#o(){this.#t?await this.#e.client.run(e`
|
|
49
52
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_relations AS
|
|
50
53
|
SELECT
|
|
51
54
|
source_key,
|
|
@@ -75,12 +78,12 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
75
78
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
|
|
76
79
|
`),await this.#e.client.run(e`
|
|
77
80
|
CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
|
|
78
|
-
`)}async#
|
|
81
|
+
`)}async#a(i){const s={},r=[],n=i.filter(a=>a.startsWith("metadata."));i.includes("type")&&r.push(`
|
|
79
82
|
SELECT 'type' as filter_name, type as value, COUNT(*) as count
|
|
80
83
|
FROM temp_filtered_entities
|
|
81
84
|
WHERE type IS NOT NULL
|
|
82
85
|
GROUP BY type
|
|
83
|
-
`),
|
|
86
|
+
`),i.includes("tags")&&r.push(`
|
|
84
87
|
SELECT 'tags' as filter_name, tag.value as value, COUNT(DISTINCT tfe.key) as count
|
|
85
88
|
FROM temp_filtered_entities tfe,
|
|
86
89
|
json_each(COALESCE(tfe.tags, json_array())) as tag
|
|
@@ -89,7 +92,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
89
92
|
AND tag.value IS NOT NULL
|
|
90
93
|
AND tag.value != ''
|
|
91
94
|
GROUP BY tag.value
|
|
92
|
-
`),
|
|
95
|
+
`),i.includes("domains")&&r.push(`
|
|
93
96
|
SELECT 'domains' as filter_name, tcr.source_key as value, COUNT(DISTINCT tfe.key) as count
|
|
94
97
|
FROM temp_combined_relations tcr
|
|
95
98
|
INNER JOIN temp_filtered_entities tfe ON tfe.key = tcr.target_key
|
|
@@ -97,7 +100,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
97
100
|
WHERE tce.type = 'domain'
|
|
98
101
|
AND tcr.source_to_target_relation = 'hasParts'
|
|
99
102
|
GROUP BY tcr.source_key
|
|
100
|
-
`),
|
|
103
|
+
`),i.includes("owners")&&r.push(`
|
|
101
104
|
SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
|
|
102
105
|
FROM (
|
|
103
106
|
SELECT
|
|
@@ -117,7 +120,7 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
117
120
|
INNER JOIN temp_combined_entities tce ON tce.key = owner_key
|
|
118
121
|
WHERE owner_key IS NOT NULL
|
|
119
122
|
GROUP BY owner_key
|
|
120
|
-
`);for(const a of n)await this.#
|
|
123
|
+
`);for(const a of n)await this.#l(a,s);if(r.length===0)return s;const o=r.join(" UNION ALL "),c=await this.#e.client.run(e.raw(o));if(c?.rows)for(const a of c.rows){const l=a.filter_name,N=a.value,E=Number(a.count)||0;s[l]||(s[l]=[]),N&&s[l].push({value:N,count:E})}return s}async#l(i,s){const r=i.substring(9),n=`$.${Q(r)}`,o=await this.#e.client.run(e.raw(`
|
|
121
124
|
SELECT json_extract(metadata, '${n}') as value, COUNT(*) as count
|
|
122
125
|
FROM temp_filtered_entities
|
|
123
126
|
WHERE metadata IS NOT NULL
|
|
@@ -125,4 +128,4 @@ import{and as c,count as v,eq as u,isNotNull as D,notExists as y,or as $,sql as
|
|
|
125
128
|
AND json_extract(metadata, '${n}') IS NOT NULL
|
|
126
129
|
AND json_extract(metadata, '${n}') != ''
|
|
127
130
|
GROUP BY value
|
|
128
|
-
`));
|
|
131
|
+
`));o?.rows&&(s[i]=o.rows.map(c=>({value:c.value,count:Number(c.count)||0})).filter(c=>c.value))}async#c(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(i){q.error("Error cleaning up temp tables:",i)}}}function Q(L){return L.replace(/[^a-zA-Z0-9._-]/g,"")}export{Ee as CatalogEntitiesLocalReadRepository};
|