@redocly/revel-reef 0.130.0-next.2 → 0.130.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli/eject/resolveEjectParams.js +1 -1
  3. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +2 -2
  4. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  5. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
  6. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
  7. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  8. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +2 -2
  9. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +14 -14
  10. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +2 -2
  11. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +1 -1
  12. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +2 -2
  13. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  14. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +2 -1
  15. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  16. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  17. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  18. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  19. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +4 -3
  20. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  21. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  22. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
  23. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  24. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  25. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  26. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
  27. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  28. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +12 -0
  29. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  30. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +1 -0
  31. package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
  32. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  33. package/dist/server/plugins/default-theme/index.js +1 -1
  34. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  35. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  36. package/dist/server/plugins/sso/index.js +1 -1
  37. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
  38. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
  39. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +7 -0
  40. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
  41. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
  42. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
  43. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
  44. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +7 -0
  45. package/dist/server/utils/rbac.d.ts +11 -7
  46. package/dist/server/utils/rbac.js +1 -1
  47. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  48. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @redocly/revel-reef
2
2
 
3
+ ## 0.130.0-next.3
4
+
5
+ ### Minor Changes
6
+
7
+ - e24e828523: Added ejectable `DocumentationLayoutTop` and `DocumentationLayoutBottom` to customize component positions in `DocumentationLayout`.
8
+
9
+ ### Patch Changes
10
+
11
+ - d309b3d828: Fixed language icon rendering issues in API docs.
12
+ - 3af7a906b4: Fixed an issue where URLs of OpenAPI docs pages could automatically receive `-1` suffixes.
13
+ - Updated dependencies [9562d72bd7]
14
+ - Updated dependencies [d309b3d828]
15
+ - Updated dependencies [e24e828523]
16
+ - @redocly/openapi-docs@3.18.0-next.2
17
+ - @redocly/theme@0.62.0-next.1
18
+ - @redocly/asyncapi-docs@1.7.0-next.2
19
+ - @redocly/portal-plugin-mock-server@0.15.0-next.2
20
+ - @redocly/graphql-docs@1.7.0-next.0
21
+
22
+ ## 0.129.2
23
+
24
+ ### Patch Changes
25
+
26
+ - 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
27
+
3
28
  ## 0.130.0-next.2
4
29
 
5
30
  ### Minor Changes
@@ -1 +1 @@
1
- import*as a from"path";import{DEFAULT_THEME_NAME as i,USER_THEME_ALIAS as k}from"../../constants/common.js";import{logger as T}from"../../server/tools/notifiers/logger.js";import{reporter as F}from"../../server/tools/notifiers/reporter.js";import{resolveTheme as y}from"./resolveTheme.js";import{EntitlementsProvider as A}from"../../server/entitlements/entitlements-provider.js";const v=["markdoc/attributes/code-walkthrough-filesets.ts","markdoc/attributes/code-walkthrough-filters.ts","markdoc/components/CodeWalkthrough/**","markdoc/tags/code-step.ts","markdoc/tags/code-toggle.ts","markdoc/tags/code-walkthrough.ts"],m=["./core/**","./markdoc/**/default.*","**/__mocks__/**","**/index.*","**/utils/**/*","**/__tests__/**/*","**/__snapshots__/**/*","**/*.stories.*","**/variables.*",...v],C=["./components/CatalogClassic/CatalogClassicCard.*","./components/ColorModeSwitcher/**","./components/Feedback/**","./components/Filter/**","./components/Footer/**","./components/LanguagePicker/**","./components/Menu/**","./components/Navbar/**","./components/PageNavigation/**","./components/Product/**","./components/Search/**","./components/UserMenu/**","./layouts/RootLayout.*","./layouts/NotFound.*","./layouts/Forbidden.*","./icons/**","./markdoc/**","./ext/**"];async function j(t){const[p,n]=t._,{theme:l,force:d,onSuccess:g,onError:u,onOverride:h,config:E}=t,_=A.instance(),s=a.resolve(t["project-dir"]);let o=l;o||(o=i);const r=await y(s,E.plugins||[],o,n);r||await F.panicOnContentError(`Theme ${o} not found. Skipping eject.`);const e=r?.config.ejectIgnore;e&&!Array.isArray(e)&&T.warn("'ejectIgnore' must be of type Array. Skipping.");const c=await _.getPackageEjectIgnore(),f={force:d,onSuccess:g,onError:u,onOverride:h,onlyFiles:o===i?C:void 0,ignoreFiles:Array.isArray(e)?[...e,...c,...m]:[...c,...m]};return{objectType:p,pathToThemeFolder:r?.pluginDirAbsolutePath,pathToPortalCustomThemeFolder:a.resolve(s,k),componentToEject:n,theme:o,options:f}}export{m as DEFAULT_IGNORED_FILES,C as EJECTABLE_FILES,j as default};
1
+ import*as c from"path";import{DEFAULT_THEME_NAME as i,USER_THEME_ALIAS as k}from"../../constants/common.js";import{logger as y}from"../../server/tools/notifiers/logger.js";import{reporter as T}from"../../server/tools/notifiers/reporter.js";import{resolveTheme as F}from"./resolveTheme.js";import{EntitlementsProvider as A}from"../../server/entitlements/entitlements-provider.js";const L=["markdoc/attributes/code-walkthrough-filesets.ts","markdoc/attributes/code-walkthrough-filters.ts","markdoc/components/CodeWalkthrough/**","markdoc/tags/code-step.ts","markdoc/tags/code-toggle.ts","markdoc/tags/code-walkthrough.ts"],m=["./core/**","./markdoc/**/default.*","**/__mocks__/**","**/index.*","**/utils/**/*","**/__tests__/**/*","**/__snapshots__/**/*","**/*.stories.*","**/variables.*",...L],v=["./components/CatalogClassic/CatalogClassicCard.*","./components/ColorModeSwitcher/**","./components/Feedback/**","./components/Filter/**","./components/Footer/**","./components/LanguagePicker/**","./components/Menu/**","./components/Navbar/**","./components/PageNavigation/**","./components/Product/**","./components/Search/**","./components/UserMenu/**","./layouts/RootLayout.*","./layouts/NotFound.*","./layouts/Forbidden.*","./layouts/DocumentationLayoutTop.*","./layouts/DocumentationLayoutBottom.*","./icons/**","./markdoc/**","./ext/**"];async function C(t){const[p,n]=t._,{theme:l,force:d,onSuccess:u,onError:g,onOverride:h,config:E}=t,_=A.instance(),s=c.resolve(t["project-dir"]);let o=l;o||(o=i);const r=await F(s,E.plugins||[],o,n);r||await T.panicOnContentError(`Theme ${o} not found. Skipping eject.`);const e=r?.config.ejectIgnore;e&&!Array.isArray(e)&&y.warn("'ejectIgnore' must be of type Array. Skipping.");const a=await _.getPackageEjectIgnore(),f={force:d,onSuccess:u,onError:g,onOverride:h,onlyFiles:o===i?v:void 0,ignoreFiles:Array.isArray(e)?[...e,...a,...m]:[...a,...m]};return{objectType:p,pathToThemeFolder:r?.pluginDirAbsolutePath,pathToPortalCustomThemeFolder:c.resolve(s,k),componentToEject:n,theme:o,options:f}}export{m as DEFAULT_IGNORED_FILES,v as EJECTABLE_FILES,C as default};
@@ -123,11 +123,11 @@ export declare class CatalogEntitiesService {
123
123
  * @param filter - The conditions used to select which entity relations to delete.
124
124
  */
125
125
  deleteEntityRelationsInLocalDatabase(filter: Filter): Promise<void>;
126
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<BffCatalogEntityList>;
126
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<BffCatalogEntityList>;
127
127
  getEntityWithRelationsByKey(entityKey: string, filter?: {
128
128
  revision?: string | null;
129
129
  version?: string | null;
130
- }): Promise<BffCatalogEntity | null>;
130
+ }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
131
131
  getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogRelatedEntityList>;
132
132
  softDeleteEntitiesInLocalDatabase({ filter, revision, fileHash, }: {
133
133
  filter: Filter;
@@ -1 +1 @@
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?null: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 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){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){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 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 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 getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{n as CatalogEntitiesService};
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 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([m.getInstance(t),t.runOnlyLocalDatabase?null:R.getInstance(t)]),i=new s(e,a);a&&(process.env.NODE_ENV==="development"&&r.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||w(s.#i,t))&&await s.#n(t),s.#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 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){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){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 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),n=p(i);return await this.#e?.updateEntity({...n,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),n=f(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(t={},e){await this.#e?.sync();const{items:a,total:i,hasMore:n}=await this.#t.getEntitiesWithRelations(t,e);return o({data:a,params:t,totalCount:i,hasMore:n})}async getEntityWithRelationsByKey(t,e,a){return this.#t.getEntityWithRelationsByKey(t,e,a)}async getRelatedEntities(t,e={}){await this.#e?.sync();const{items:a,total:i,hasMore:n}=await this.#t.getRelatedEntities(t,e);return o({data:a,params:e,totalCount:i,nameTransformationsFromDatabase:l,hasMore:n})}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 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 getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{s as CatalogEntitiesService};
@@ -0,0 +1,8 @@
1
+ import type { DatabaseEntityAttributesDto } from '../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table';
2
+ export declare function createEntityAttributesDbRecord({ rbacTeams, entityKey, organizationId, projectId, }: {
3
+ rbacTeams: string[];
4
+ entityKey: string;
5
+ organizationId: string;
6
+ projectId: string;
7
+ }): DatabaseEntityAttributesDto;
8
+ //# sourceMappingURL=create-entity-attributes-db-record.d.ts.map
@@ -0,0 +1 @@
1
+ import{ulid as o}from"ulid";function c({rbacTeams:e,entityKey:r,organizationId:i,projectId:n}){const t=new Date().toISOString();return{id:`cea_${o()}`,organizationId:i,projectId:n,entityKey:r,rbacTeams:JSON.stringify(e),createdAt:t,updatedAt:t}}export{c as createEntityAttributesDbRecord};
@@ -1 +1 @@
1
- import{logger as l}from"../../../../tools/notifiers/logger.js";import{entityDatabaseSchema as r}from"../../schemas/database-schemas.js";import{validateWithResult as t}from"../../utils/ajv-validator.js";const o=a=>"project_id"in a&&"organization_id"in a&&"created_at"in a;function d(a){if(o(a)){const s=t(r,a);if(!s.success)return l.warn(`Invalid database catalog entity for entity ${a.key}, error: ${s.error}`),null;const e=s.data||{};return{id:e.id,type:e.type,key:e.key||"",title:e.title||"",summary:e.summary||null,tags:e.tags?JSON.parse(e.tags):null,metadata:e.metadata?JSON.parse(e.metadata):null,git:e.git?JSON.parse(e.git):null,contact:e.contact?JSON.parse(e.contact):null,links:e.links?JSON.parse(e.links):null,source:e.source||"file",sourceFile:e.source_file||null,version:e.version||null,revision:e.revision??"",hash:e.hash||null,isCurrent:e.is_current,isDefaultVersion:e.is_default_version??!1,createdAt:e.created_at||null,updatedAt:e.updated_at||null,isDeleted:e.is_deleted??!1,object:"catalogEntity"}}return{...a,tags:a.tags?JSON.parse(a.tags):null,metadata:a.metadata?JSON.parse(a.metadata):null,git:a.git?JSON.parse(a.git):null,contact:a.contact?JSON.parse(a.contact):null,links:a.links?JSON.parse(a.links):null,source:a.source||"file",version:a.version||null,revision:a.revision??"",hash:a.hash||null,isCurrent:a.isCurrent,isDefaultVersion:a.isDefaultVersion??!1,isDeleted:a.isDeleted??!1,object:"catalogEntity"}}export{d as createEntityReadModel};
1
+ import{logger as r}from"../../../../tools/notifiers/logger.js";import{entityDatabaseSchema as l}from"../../schemas/database-schemas.js";import{validateWithResult as t}from"../../utils/ajv-validator.js";const o=e=>"project_id"in e&&"organization_id"in e&&"created_at"in e;function d(e){if(o(e)){const s=t(l,e);if(!s.success)return r.warn(`Invalid database catalog entity for entity ${e.key}, error: ${s.error}`),null;const a=s.data||{};return{id:a.id,type:a.type,key:a.key||"",title:a.title||"",summary:a.summary||null,tags:a.tags?JSON.parse(a.tags):null,metadata:a.metadata?JSON.parse(a.metadata):null,git:a.git?JSON.parse(a.git):null,contact:a.contact?JSON.parse(a.contact):null,links:a.links?JSON.parse(a.links):null,source:a.source||"file",sourceFile:a.source_file||null,version:a.version||null,revision:a.revision??"",hash:a.hash||null,isCurrent:a.is_current,isDefaultVersion:a.is_default_version??!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDeleted:a.is_deleted??!1,object:"catalogEntity",rbacTeams:a.rbac_teams?JSON.parse(a.rbac_teams):[]}}return{...e,tags:e.tags?JSON.parse(e.tags):null,metadata:e.metadata?JSON.parse(e.metadata):null,git:e.git?JSON.parse(e.git):null,contact:e.contact?JSON.parse(e.contact):null,links:e.links?JSON.parse(e.links):null,source:e.source||"file",version:e.version||null,revision:e.revision??"",hash:e.hash||null,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion??!1,isDeleted:e.isDeleted??!1,object:"catalogEntity"}}export{d as createEntityReadModel};
@@ -5,10 +5,10 @@ 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?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
8
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
9
9
  getEntityWithRelationsByKey(entityKey: string, filter?: {
10
10
  revision?: string | null;
11
11
  version?: string | null;
12
- }): Promise<BffCatalogEntity | null>;
12
+ }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
13
13
  }
14
14
  //# sourceMappingURL=catalog-entities-bff-repository.d.ts.map
@@ -1,38 +1,38 @@
1
- import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";import{unionAll as C}from"drizzle-orm/sqlite-core";import{logger as Q}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as T}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{applyPagination as D}from"../../../../../providers/database/pagination/index.js";import{applyFilter as j,excludeFieldsFromFilter as H,getAllFilterFieldValues as S}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as O}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as n,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as R,createEntityFieldsForSelect as A}from"../utils.js";class U{#e;#t;constructor(t,o){this.#e=t,this.#t=o}async getEntitiesWithRelations(t={}){const o=S(t.filter,"owners");if(o.length>0)return this.#c(t,o);const d=S(t.filter,"domains");return d.length>0?this.#l(t,d):this.#a(t)}async#c(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
1
+ import{and as n,desc as H,eq as s,notExists as k,sql as e,or as B,isNull as z,exists as V,inArray as q}from"drizzle-orm";import{unionAll as p}from"drizzle-orm/sqlite-core";import{logger as j}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as i}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{entitiesAttributesTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{applyPagination as A}from"../../../../../providers/database/pagination/index.js";import{applyFilter as x,excludeFieldsFromFilter as J,getAllFilterFieldValues as W}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as F}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as a,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as N,createEntityFieldsForSelect as $}from"../utils.js";class re{#e;#t;constructor(t,o){this.#e=t,this.#t=o}async getEntitiesWithRelations(t={},o){const m=W(t.filter,"owners");if(m.length>0)return this.#l(t,m,o);const l=W(t.filter,"domains");return l.length>0?this.#a(t,l,o):this.#m(t,o)}async#l(t,o,m){const l=this.#n(m),c=this.#o(),h=this.#c(),w=c.as("combined_relations"),g=h.as("combined_target_entities"),u=o.map(r=>e`
2
2
  EXISTS (
3
- SELECT 1 FROM (${l}) cr
3
+ SELECT 1 FROM (${c}) cr
4
4
  WHERE cr.source_key = ${r}
5
5
  AND cr.source_to_target_relation = 'owns'
6
6
  AND cr.target_key = base_entities.key
7
7
  )
8
- `),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"domains");let w=_;if(b.length>0){const r=b.map(a=>e`
8
+ `),_=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,R=W(t.filter,"domains");let v=_;if(R.length>0){const r=R.map(d=>e`
9
9
  EXISTS (
10
- SELECT 1 FROM (${l}) cr
11
- JOIN (${m}) d ON d.key = ${a}
10
+ SELECT 1 FROM (${c}) cr
11
+ JOIN (${h}) d ON d.key = ${d}
12
12
  WHERE d.type = 'domain'
13
13
  AND d.is_current = 1
14
- AND cr.source_key = ${a}
14
+ AND cr.source_key = ${d}
15
15
  AND cr.target_key = base_entities.key
16
16
  AND cr.source_to_target_relation = 'hasParts'
17
17
  )
18
- `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["owners","domains"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (owner optimized path):",r),{items:[],hasMore:!1,total:0}}}async#l(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
18
+ `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;v=e`(${_} AND ${f})`}const T=J(t.filter,["owners","domains"]),b={...t,filter:T,baseWhereCondition:v},E=this.#e.client.select(a).from(l.as("base_entities")).$dynamic();try{const r=this.#e.client.select(a).from(l.as("base_entities")).$dynamic();A(r,{...b,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),d=t.limit||10;A(E,{...b,limit:d+1});const C=E.as("paged_entities"),I=this.#e.client.with(w,g,C).select({...$("paged_entities"),domains:this.#s("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(C),[L,Q]=await Promise.all([I.run(),f]),O=L.rows,M=O.length>d;return{items:O.slice(0,d).map(D=>F(D)).filter(D=>D!==null),hasMore:M,total:Q}}catch(r){return j.error("Error getting entities with relations (owner optimized path): "+r.message),{items:[],hasMore:!1,total:0}}}async#a(t,o,m){const l=this.#n(m),c=this.#o(),h=this.#c(),w=c.as("combined_relations"),g=h.as("combined_target_entities"),u=o.map(r=>e`
19
19
  EXISTS (
20
- SELECT 1 FROM (${l}) cr
21
- JOIN (${m}) d ON d.key = ${r}
20
+ SELECT 1 FROM (${c}) cr
21
+ JOIN (${h}) d ON d.key = ${r}
22
22
  WHERE d.type = 'domain'
23
23
  AND d.is_current = 1
24
24
  AND cr.source_key = ${r}
25
25
  AND cr.target_key = base_entities.key
26
26
  AND cr.source_to_target_relation = 'hasParts'
27
27
  )
28
- `),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"owners");let w=_;if(b.length>0){const r=b.map(a=>e`
28
+ `),_=u.length===1?u[0]:e`(${e.join(u,e` OR `)})`,R=W(t.filter,"owners");let v=_;if(R.length>0){const r=R.map(d=>e`
29
29
  EXISTS (
30
- SELECT 1 FROM (${l}) cr
31
- WHERE cr.source_key = ${a}
30
+ SELECT 1 FROM (${c}) cr
31
+ WHERE cr.source_key = ${d}
32
32
  AND cr.source_to_target_relation = 'owns'
33
33
  AND cr.target_key = base_entities.key
34
34
  )
35
- `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["domains","owners"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (domain optimized path):",r),{items:[],hasMore:!1,total:0}}}async#a(t){const o=this.#s(),d=this.#n(),l=this.#o(),m=d.as("combined_relations"),y=l.as("combined_target_entities"),u=this.#e.client.select(n).from(o.as("base_entities")).$dynamic(),{whereCondition:h}=j(u,t.filter);h&&u.where(h);try{const _=this.#e.client.select(n).from(o.as("base_entities")).$dynamic();h&&_.where(h);const b=this.#e.client.$count(_),w=t.limit||10;D(u,{...t,limit:w+1});const p=u.as("paged_entities"),g=this.#e.client.with(m,y,p).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(p),[E,r]=await Promise.all([g.run(),b]),f=E.rows,a=f.length>w;return{items:f.slice(0,w).map(v=>O(v)).filter(v=>v!==null),hasMore:a,total:r}}catch(_){return Q.error("Error getting entities with relations (optimized path):",_),{items:[],hasMore:!1,total:0}}}#s(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}#n(){return this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)}#o(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}async getEntityWithRelationsByKey(t,o){if(!t||t.trim()==="")return null;const d=o?.revision,l=o?.version,m=d?null:await this.#d(t,l||null),y=l??m?.version,u=d||m?.revision||null,_=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(s(i.key,t)),this.#e.client.select(n).from(i).where(c(s(i.key,t),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`))))):this.#e.client.select(n).from(i).where(s(i.key,t))).as("e"),w=(this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)).as("combined_relations"),g=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`),this.#e.client.select(n).from(i).where($(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(n).from(i)).as("combined_target_entities"),E=this.#e.client.with(_,w,g).select({...A("e"),domains:this.#i("e").as("domains"),owners:this.#r("e").as("owners")}).from(_).$dynamic();u?E.where(c(s(e.raw("revision"),u),y?s(e.raw("version"),y):void 0)):E.where(s(e.raw("is_current"),1)),E.limit(1);const r=await E.run();if(r.rows.length===0)return null;const f=r.rows[0];return O(f)}async#d(t,o){if(o){const y=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${o}`))))).orderBy(M(i.revision))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o))).orderBy(M(i.revision))).limit(1).run();if(y.rows.length>0){const u=y.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}const l=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`is_current = 1`)),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0)))).limit(1).run();if(l.rows.length>0){const m=l.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}#i(t){return e`
35
+ `),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;v=e`(${_} AND ${f})`}const T=J(t.filter,["domains","owners"]),b={...t,filter:T,baseWhereCondition:v},E=this.#e.client.select(a).from(l.as("base_entities")).$dynamic();try{const r=this.#e.client.select(a).from(l.as("base_entities")).$dynamic();A(r,{...b,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),d=t.limit||10;A(E,{...b,limit:d+1});const C=E.as("paged_entities"),I=this.#e.client.with(w,g,C).select({...$("paged_entities"),domains:this.#s("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(C),[L,Q]=await Promise.all([I.run(),f]),O=L.rows,M=O.length>d;return{items:O.slice(0,d).map(D=>F(D)).filter(D=>D!==null),hasMore:M,total:Q}}catch(r){return j.error("Error getting entities with relations (domain optimized path): "+r.message),{items:[],hasMore:!1,total:0}}}async#m(t,o){const m=this.#n(o),l=this.#o(),c=this.#c(),h=l.as("combined_relations"),w=c.as("combined_target_entities"),g=this.#e.client.select(a).from(m.as("base_entities")).$dynamic(),{whereCondition:u}=x(g,t.filter);u&&g.where(u);try{const _=this.#e.client.select(a).from(m.as("base_entities")).$dynamic();u&&_.where(u);const R=this.#e.client.$count(_),v=t.limit||10;A(g,{...t,limit:v+1});const T=g.as("paged_entities"),b=this.#e.client.with(h,w,T).select({...$("paged_entities"),domains:this.#s("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(T),[E,r]=await Promise.all([b.run(),R]),f=E.rows,d=f.length>v;return{items:f.slice(0,v).map(C=>F(C)).filter(C=>C!==null),hasMore:d,total:r}}catch(_){return j.error("Error getting entities with relations (optimized path): "+_.message),{items:[],hasMore:!1,total:0}}}#n(t){return this.#t?p(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,s(i.key,y.entityKey)).where(n(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1),this.#i(t))),this.#e.client.select($("entities")).from(i).leftJoin(y,s(i.key,y.entityKey)).where(n(s(i.isCurrent,!0),s(i.isDeleted,!1),this.#i(t),k(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(n(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select($("entities")).from(i).leftJoin(y,s(i.key,y.entityKey)).where(n(s(i.isCurrent,!0),s(i.isDeleted,!1),this.#i(t)))}#o(){return this.#t?p(this.#e.client.select(N).from(e`remote.entities_relations`),this.#e.client.select(N).from(S).where(k(this.#e.client.select({id:N.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${S.sourceKey}`)))):this.#e.client.select(N).from(S)}#c(){return this.#t?p(this.#e.client.select(a).from(e`remote.entities`).where(n(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(a).from(i).where(n(s(i.isCurrent,!0),s(i.isDeleted,!1),k(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(n(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(a).from(i).where(n(s(i.isCurrent,!0),s(i.isDeleted,!1)))}async getEntityWithRelationsByKey(t,o,m){if(!t||t.trim()==="")return null;const l=o?.revision,c=o?.version,h=l?null:await this.#d(t,c||null),w=c??h?.version,g=l||h?.revision||null,_=(this.#t?p(this.#e.client.select($("entities")).from(e`remote.entities`).leftJoin(e`remote.entities_attributes`,s(i.key,y.entityKey)).where(n(s(i.key,t),this.#i(m))),this.#e.client.select($("entities")).from(i).leftJoin(y,s(i.key,y.entityKey)).where(n(s(i.key,t),this.#i(m),k(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(n(e`remote.key = ${i.key}`,this.#i(m))))))):this.#e.client.select($("entities")).from(i).leftJoin(y,s(i.key,y.entityKey)).where(n(s(i.key,t),this.#i(m)))).as("e"),v=(this.#t?p(this.#e.client.select(N).from(e`remote.entities_relations`),this.#e.client.select(N).from(S).where(k(this.#e.client.select({id:N.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${S.sourceKey}`)))):this.#e.client.select(N).from(S)).as("combined_relations"),b=(this.#t?p(this.#e.client.select(a).from(e`remote.entities`),this.#e.client.select(a).from(i).where(k(this.#e.client.select({id:a.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(a).from(i)).as("combined_target_entities"),E=this.#e.client.with(_,v,b).select({...$("e"),domains:this.#s("e").as("domains"),owners:this.#r("e").as("owners")}).from(_).$dynamic();g?E.where(n(s(e.raw("revision"),g),w?s(e.raw("version"),w):void 0)):E.where(s(e.raw("is_current"),1)),E.limit(1);const r=await E.run();if(r.rows.length===0)return null;const f=r.rows[0];return F(f)}async#d(t,o){if(o){const h=await(this.#t?p(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(n(e`key = ${t}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(n(s(i.key,t),s(i.version,o),k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(n(e`remote.key = ${i.key}`,e`remote.version = ${o}`))))).orderBy(H(i.revision))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(n(s(i.key,t),s(i.version,o))).orderBy(H(i.revision))).limit(1).run();if(h.rows.length>0){const w=h.rows[0];return{version:w.version||null,revision:w.revision||null}}return null}const l=await(this.#t?p(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(n(e`key = ${t}`,e`is_current = 1`)),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(n(s(i.key,t),s(i.isCurrent,!0),k(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(n(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(n(s(i.key,t),s(i.isCurrent,!0)))).limit(1).run();if(l.rows.length>0){const c=l.rows[0];return{version:c.version||null,revision:c.revision||null}}return null}#s(t){return e`
36
36
  COALESCE(
37
37
  (
38
38
  SELECT json_group_array(
@@ -109,4 +109,4 @@ import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";impo
109
109
  ),
110
110
  json_array()
111
111
  )
112
- `}}export{U as CatalogEntitiesBffRepository};
112
+ `}#i(t){if(!(!t||t.length===0))return B(z(y.rbacTeams),e`json_array_length(${y.rbacTeams}) = 0`,V(this.#e.client.select({id:e.raw("1")}).from(e`json_each(${y.rbacTeams}) as entity_teams`).where(q(e`entity_teams.value`,t))))}}export{re as CatalogEntitiesBffRepository};
@@ -31,11 +31,11 @@ export declare class CatalogEntitiesLocalReadRepository {
31
31
  getOneOutdatedEntity(): Promise<EntityReadModelSchema | null>;
32
32
  getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
33
33
  getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
34
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
34
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<ListResult<BffCatalogEntity>>;
35
35
  getEntityWithRelationsByKey(entityKey: string, filter?: {
36
36
  revision?: string | null;
37
37
  version?: string | null;
38
- }): Promise<BffCatalogEntity | null>;
38
+ }, rbacTeams?: string[]): Promise<BffCatalogEntity | null>;
39
39
  getRelationsForEntity(key: string, version?: string | null, revision?: string | null): Promise<{
40
40
  targetKey: string;
41
41
  targetRevision: string;
@@ -1,4 +1,4 @@
1
- import{and as l,count as L,eq as n,isNotNull as v,notExists as y,or as D,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as b}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as k}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as O}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as E}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";class j{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new I(this.#e,this.#t||""),this.#s=new g(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 I(this.#e,i),this.#s=new g(this.#e,i))}async getEntities(i={}){const s=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=this.#e.client.select(c).from(s.as("combined_entities")),o=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=r.$dynamic(),d=i.limit||10,h=S(u,{...i,limit:d+1}),[T,N]=await Promise.all([h.run(),a]),p=T.rows,w=p.length>d;return{items:p.slice(0,d).map(R=>O(R)).filter(R=>R!==null),hasMore:w,total:N}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${k})`.as("keyVersion")}).from(e`remote.entities`).where(l(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),e`${t.key} IS NOT NULL`,y(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}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),v(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(o=>o.keyVersion))}async listEntityRevisions(i,s){const r=[n(t.key,i),n(t.isDeleted,!1),...s?[n(t.version,s)]:[]],o=this.#t?f(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(l(e`key = ${i}`,s?e`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(l(...r,y(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.version = ${t.version}`,e`remote.revision = ${t.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(l(...r));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(o.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(a=>({version:a.version||null,revision:a.revision??"",isCurrent:a.is_current!==null?!!a.is_current:!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDefaultVersion:a.is_default_version!==null?!!a.is_default_version:!1}))}async getEntitiesCountByTypes(){const i=this.#t?f(this.#e.client.select({type:e`type`}).from(e`remote.entities`).where(l(n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1),y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1)));return this.#e.client.select({type:t.type,count:L()}).from(i.as("combined_entities")).groupBy(t.type).where(n(t.isDeleted,!1))}async getEntityByKey(i){const o=(await(this.#t?f(this.#e.client.select(c).from(e`remote.entities`).where(l(n(t.key,i),n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1),y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1)))).run()).rows[0];return o?O(o):null}async getOneOutdatedEntity(){const i=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=(await this.#e.client.select(c).from(i.as("combined_entities")).where(D(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 r?O(r):null}async getEntitiesRelations(i={}){const s=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(E).where(y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${E.sourceKey}`)))):this.#e.client.select(m).from(E),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=i.limit||10,d=S(r,{...i,limit:u+1}),[h,T]=await Promise.all([d.run(),a]),N=h.rows,p=N.length>u;return{items:N.slice(0,u).map(w=>C(w)).filter(w=>w!==null),hasMore:p,total:T}}async getEntityRelationById(i){const o=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(n(E.id,i)),this.#e.client.select(m).from(E).where(l(n(E.id,i),y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${E.id}`))))):this.#e.client.select(m).from(E).where(n(E.id,i))).run()).rows[0];return o?C(o):null}async getEntitiesWithRelations(i={}){return this.#s.getEntitiesWithRelations(i)}async getEntityWithRelationsByKey(i,s){return this.#s.getEntityWithRelationsByKey(i,s)}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities(i,s={}){return this.#i.getRelatedEntities(i,s)}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#r(i),(s.includes("domains")||s.includes("owners"))&&await this.#n(),await this.#o(s)}catch(r){return console.error("Error fetching catalog filters:",r),{}}finally{await this.#l()}}async#r(i){if(this.#t?await this.#e.client.run(e`
1
+ import{and as l,count as L,eq as n,isNotNull as v,notExists as y,or as D,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as b}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as k}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as O}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as E}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";class j{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new I(this.#e,this.#t||""),this.#s=new g(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 I(this.#e,i),this.#s=new g(this.#e,i))}async getEntities(i={}){const s=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=this.#e.client.select(c).from(s.as("combined_entities")),o=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=r.$dynamic(),d=i.limit||10,h=S(u,{...i,limit:d+1}),[T,N]=await Promise.all([h.run(),a]),p=T.rows,w=p.length>d;return{items:p.slice(0,d).map(R=>O(R)).filter(R=>R!==null),hasMore:w,total:N}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${k})`.as("keyVersion")}).from(e`remote.entities`).where(l(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),e`${t.key} IS NOT NULL`,y(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}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),v(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(o=>o.keyVersion))}async listEntityRevisions(i,s){const r=[n(t.key,i),n(t.isDeleted,!1),...s?[n(t.version,s)]:[]],o=this.#t?f(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(l(e`key = ${i}`,s?e`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(l(...r,y(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.version = ${t.version}`,e`remote.revision = ${t.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(l(...r));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(o.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(a=>({version:a.version||null,revision:a.revision??"",isCurrent:a.is_current!==null?!!a.is_current:!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDefaultVersion:a.is_default_version!==null?!!a.is_default_version:!1}))}async getEntitiesCountByTypes(){const i=this.#t?f(this.#e.client.select({type:e`type`}).from(e`remote.entities`).where(l(n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1),y(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1)));return this.#e.client.select({type:t.type,count:L()}).from(i.as("combined_entities")).groupBy(t.type).where(n(t.isDeleted,!1))}async getEntityByKey(i){const o=(await(this.#t?f(this.#e.client.select(c).from(e`remote.entities`).where(l(n(t.key,i),n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1),y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1)))).run()).rows[0];return o?O(o):null}async getOneOutdatedEntity(){const i=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(y(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=(await this.#e.client.select(c).from(i.as("combined_entities")).where(D(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 r?O(r):null}async getEntitiesRelations(i={}){const s=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(E).where(y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${E.sourceKey}`)))):this.#e.client.select(m).from(E),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=i.limit||10,d=S(r,{...i,limit:u+1}),[h,T]=await Promise.all([d.run(),a]),N=h.rows,p=N.length>u;return{items:N.slice(0,u).map(w=>C(w)).filter(w=>w!==null),hasMore:p,total:T}}async getEntityRelationById(i){const o=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(n(E.id,i)),this.#e.client.select(m).from(E).where(l(n(E.id,i),y(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${E.id}`))))):this.#e.client.select(m).from(E).where(n(E.id,i))).run()).rows[0];return o?C(o):null}async getEntitiesWithRelations(i={},s){return this.#s.getEntitiesWithRelations(i,s)}async getEntityWithRelationsByKey(i,s,r){return this.#s.getEntityWithRelationsByKey(i,s,r)}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities(i,s={}){return this.#i.getRelatedEntities(i,s)}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#r(i),(s.includes("domains")||s.includes("owners"))&&await this.#n(),await this.#o(s)}catch(r){return console.error("Error fetching catalog filters:",r),{}}finally{await this.#l()}}async#r(i){if(this.#t?await this.#e.client.run(e`
2
2
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
3
3
  SELECT
4
4
  e.key,
@@ -49,11 +49,11 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
49
49
  sourceKey: string;
50
50
  targetKey: string;
51
51
  } | null>;
52
- getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
52
+ getEntitiesWithRelations(paginationParams?: PaginationParams, rbacTeams?: string[]): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogEntity>>;
53
53
  getEntityWithRelationsByKey(entityKey: string, filter?: {
54
54
  revision?: string | null;
55
55
  version?: string | null;
56
- }): Promise<import("@redocly/theme").BffCatalogEntity | null>;
56
+ }, rbacTeams?: string[]): Promise<import("@redocly/theme").BffCatalogEntity | null>;
57
57
  getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<import("./catalog-entities-local-read-repository.js").ListResult<import("@redocly/theme").BffCatalogRelatedEntity>>;
58
58
  createEntity(createEntityParams: CreateEntityParams): Promise<CreateEntityResult>;
59
59
  createEntities(createEntitiesParams: CreateEntityParams[]): Promise<void>;
@@ -1 +1 @@
1
- import{promiseMapLimit as o}from"../../../../../utils/async/promise-map-limit.js";import{logger as R}from"../../../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as f}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as p}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as m}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as w}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as E}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as C}from"../../../utils/has-options-changed.js";const l=50;class s extends p{static#i;static#n;#t;#e;#s={};constructor(t){super(t),this.#t=new m(this.databaseClient),this.#e=new w(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#s}static async getInstance(t){const e=C(s.#n,t);if(!s.#i||e){const n=await f.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");s.#i=new s(n),s.#n=t}return s.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntityKeysAndVersionsBySourceFile(t){return this.#t.getEntityKeysAndVersionsBySourceFile(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(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.#s[t.sourceFile]={key:t.entity.key,version:t.entity.version??void 0}),this.#e.createEntity(t)}async createEntities(t){await o(t,l,async e=>this.createEntity(e))}createEntityRelation(t){const e=E(t,this.organizationId,this.projectId);return this.#e.upsertEntityRelation(e)}async createEntityRelations(t){await o(t,l,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}async softDeleteEntities({filter:t,revision:e,fileHash:n}){const c=await this.getEntities({filter:t}),i=await this.#e.softDeleteEntities(c.items,e,n);await this.softDeleteEntitiesRelations(i,e)}async softDeleteEntitiesRelations(t,e){try{const n=t.filter(i=>i.result==="created");if(n.length===0)return!0;const c=await o(n,l,async i=>(await this.#t.getRelationsForEntity(i.entityKey,i.entityVersion,e)).map(r=>{if(!r)return null;const y=r.direction,a=r.sourceToTargetRelation,u=r.targetKey,d=y==="outgoing"?i.entityKey:u,h=y==="outgoing"?u:i.entityKey,g=y==="outgoing"?a:a.startsWith("reverse:")?a.slice(8):a;return!g||!d||!h?null:E({type:g,sourceKey:d,targetKey:h,sourceVersion:i.entityVersion,targetVersion:i.entityVersion,sourceRevision:e,targetRevision:e,isDeleted:!0},this.organizationId,this.projectId)}).filter(r=>r!==null));return await o(c.flat(),l,async i=>this.#e.upsertEntityRelation(i)),!0}catch(n){return R.error("Error soft deleting entity relations",n),!1}}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{s as CatalogEntitiesLocalRepository};
1
+ import{promiseMapLimit as o}from"../../../../../utils/async/promise-map-limit.js";import{logger as R}from"../../../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as f}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as p}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as m}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as w}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as E}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as C}from"../../../utils/has-options-changed.js";const l=50;class s extends p{static#i;static#n;#t;#e;#s={};constructor(t){super(t),this.#t=new m(this.databaseClient),this.#e=new w(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#s}static async getInstance(t){const e=C(s.#n,t);if(!s.#i||e){const n=await f.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");s.#i=new s(n),s.#n=t}return s.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntityKeysAndVersionsBySourceFile(t){return this.#t.getEntityKeysAndVersionsBySourceFile(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={},e){return this.#t.getEntitiesWithRelations(t,e)}getEntityWithRelationsByKey(t,e,n){return this.#t.getEntityWithRelationsByKey(t,e,n)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#s[t.sourceFile]={key:t.entity.key,version:t.entity.version??void 0}),this.#e.createEntity(t)}async createEntities(t){await o(t,l,async e=>this.createEntity(e))}createEntityRelation(t){const e=E(t,this.organizationId,this.projectId);return this.#e.upsertEntityRelation(e)}async createEntityRelations(t){await o(t,l,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}async softDeleteEntities({filter:t,revision:e,fileHash:n}){const c=await this.getEntities({filter:t}),i=await this.#e.softDeleteEntities(c.items,e,n);await this.softDeleteEntitiesRelations(i,e)}async softDeleteEntitiesRelations(t,e){try{const n=t.filter(i=>i.result==="created");if(n.length===0)return!0;const c=await o(n,l,async i=>(await this.#t.getRelationsForEntity(i.entityKey,i.entityVersion,e)).map(r=>{if(!r)return null;const y=r.direction,a=r.sourceToTargetRelation,u=r.targetKey,d=y==="outgoing"?i.entityKey:u,h=y==="outgoing"?u:i.entityKey,g=y==="outgoing"?a:a.startsWith("reverse:")?a.slice(8):a;return!g||!d||!h?null:E({type:g,sourceKey:d,targetKey:h,sourceVersion:i.entityVersion,targetVersion:i.entityVersion,sourceRevision:e,targetRevision:e,isDeleted:!0},this.organizationId,this.projectId)}).filter(r=>r!==null));return await o(c.flat(),l,async i=>this.#e.upsertEntityRelation(i)),!0}catch(n){return R.error("Error soft deleting entity relations",n),!1}}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{s as CatalogEntitiesLocalRepository};
@@ -11,6 +11,7 @@ export type CreateEntityParams = {
11
11
  isRootEntity?: boolean;
12
12
  revision?: string;
13
13
  isDeleted?: boolean;
14
+ rbacTeams?: string[];
14
15
  };
15
16
  export type CreateEntityResult = {
16
17
  result: 'created';
@@ -24,7 +25,7 @@ export type CreateEntityResult = {
24
25
  export declare class CatalogEntitiesLocalWriteRepository {
25
26
  #private;
26
27
  constructor(db: DatabaseClient, organizationId: string, projectId: string);
27
- createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, }: CreateEntityParams): Promise<CreateEntityResult>;
28
+ createEntity({ entity, fileHash, sourceFile, revision, isRootEntity, isDeleted, rbacTeams, }: CreateEntityParams): Promise<CreateEntityResult>;
28
29
  deleteEntity(entityKey: string): Promise<string | null>;
29
30
  /**
30
31
  * Deletes entities based on a filter.
@@ -1 +1 @@
1
- import{and as d,desc as k,eq as u,isNull as v,or as R,sql as D}from"drizzle-orm";import{logger as h}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as p}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as B}from"../../../../../utils/crypto/sha1.js";import{isWebView as O}from"../../../../../../utils/env/is-web-view.js";import{VERSION_NOT_SPECIFIED as S}from"@redocly/theme/core/constants";import{createEntityDbRecord as x}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as I}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 o}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as K}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as L}from"../../../utils/version-compare.js";const w=15;class Q{#e;#t;#r;constructor(t,r,s){this.#e=t,this.#t=r,this.#r=s}async createEntity({entity:t,fileHash:r,sourceFile:s,revision:a=new Date().toISOString(),isRootEntity:i=!1,isDeleted:n=!1}){try{const{relations:c=[],...l}=t,y=B(JSON.stringify(l)),f=t.version??S;if(await this.#s(t.key,f,y,i,n))return{result:"skipped",entityKey:t.key};const{shouldBeCurrent:g,shouldBeDefaultVersion:m}=await this.#o(t.key,f),E=x({entity:{...t,revision:a,hash:y,isCurrent:g,isDefaultVersion:m,isDeleted:n,version:f},sourceFile:s,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:A,source:U,...T}=E;if(await this.#a({key:A,isCurrent:g,isDefaultVersion:m}),O())return await this.#c(E,c),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f};const F=this.#e.client.insert(e).values(E).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:T}),N=c?.length&&c.length>0?this.#e.client.insert(o).values(c.map(V=>I({relation:V,sourceFile:s,fileHash:r,sourceKey:t.key,sourceVersion:f,sourceRevision:a??null,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation]}).run():Promise.resolve();return await p([F,N],w,async V=>V),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f}}catch(c){return h.error("Error adding entity",c),{result:"error",entityKey:t.key}}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(u(e.key,t)),t}catch(r){return h.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=K(t);if(!r)return!1;const s=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(s.length===0)return!0;const a=s.reduce((i,n)=>((n.isCurrent||n.isDefaultVersion)&&i.add(n.key),i),new Set);if(a.size===0)return!0;await p(Array.from(a),w,async i=>this.#u(i));for(const i of s)await this.#e.client.delete(o).where(R(d(u(o.sourceKey,i.key),...i.version?[u(o.sourceVersion,i.version)]:[v(o.sourceVersion)]),d(u(o.targetKey,i.key),...i.version?[u(o.targetVersion,i.version)]:[v(o.targetVersion)])));return!0}catch(r){return h.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(o).where(u(o.id,t)),t}catch{return null}}async softDeleteEntities(t,r,s){try{const a=t.map(n=>{const c={type:n.type,key:n.key,title:n.title,summary:n.summary??void 0,tags:n.tags??void 0,metadata:n.metadata??void 0,git:n.git??void 0,contact:n.contact??void 0,links:n.links??void 0,version:n.version??void 0};return this.createEntity({entity:c,revision:r,sourceFile:n.sourceFile??"",fileHash:s,isDeleted:!0})});return await p(a,w,async n=>n)}catch(a){return h.error("Error soft deleting entities",a),[]}}async deleteEntityRelations(t){try{const r=K(t);return r?(await this.#e.client.delete(o).where(r),!0):!1}catch(r){return h.error("Error deleting entity relations",r),!1}}async upsertEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:s,sourceVersion:a,targetVersion:i,sourceRevision:n,targetRevision:c,...l}=t,y=await this.#e.client.insert(o).values(t).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation],set:l}).returning();return y?.length?y[0]:null}catch(r){return h.error("Error creating entity relation",r),null}}async#s(t,r,s,a,i){if(a||i)return!1;const n=await this.#e.client.select({hash:e.hash,isDeleted:e.isDeleted}).from(e).where(d(u(e.key,t),u(e.source,"file"),r?u(e.version,r):v(e.version))).orderBy(k(e.revision)).limit(1).run();if(n.rows.length===0)return!1;const c=n.rows[0];return c.is_deleted?!1:c.hash===s}async#i(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(d(u(e.key,t),u(e.source,"file"))).orderBy(k(e.createdAt)).run()).rows.map(s=>({version:s.version,isDefaultVersion:!!s.isDefaultVersion,revision:s.revision,createdAt:new Date(s.createdAt)}))}#n(t){const r=t.find(i=>i.isDefaultVersion);if(r)return r;const{versionedEntities:s,unversionedEntities:a}=t.reduce((i,n)=>(n.version!==null&&n.version!==S?i.versionedEntities.push(n):i.unversionedEntities.push(n),i),{versionedEntities:[],unversionedEntities:[]});if(s.length>0){s.sort((c,l)=>L(c.version,l.version));const i=s[0].version,n=s.filter(c=>c.version===i);return n.sort((c,l)=>l.createdAt.getTime()-c.createdAt.getTime()),n[0]}return a.length>0?(a.sort((i,n)=>n.createdAt.getTime()-i.createdAt.getTime()),a[0]):null}async#o(t,r){const s=await this.#e.client.select({currentDefaultVersion:D`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:D`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(d(u(e.key,t),u(e.source,"file"))).get(),a=s?.currentDefaultVersion,i=(s?.versionMatchCount??0)>0;return r&&r===a?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!i,shouldBeDefaultVersion:!i}}async#a({key:t,isCurrent:r,isDefaultVersion:s}){if(!r&&!s)return;const a={},i=[];r&&(a.isCurrent=!1,i.push(u(e.isCurrent,!0))),s&&(a.isDefaultVersion=!1,i.push(u(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(a).where(d(u(e.key,t),u(e.source,"file"),R(...i))).run()}#u=async t=>{const r=await this.#i(t),s=this.#n(r);if(!s){h.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(d(u(e.key,t),u(e.revision,s.revision),s.version?u(e.version,s.version):v(e.version))).run()};async#c(t,r){const{key:s,source:a,version:i,isDefaultVersion:n,...c}=t,f=(await this.#e.client.select({id:e.id}).from(e).where(d(u(e.key,s),u(e.source,a??"file"),i?u(e.version,i):v(e.version))).limit(1).run()).rows.length>0?this.#e.client.update(e).set(c).where(d(u(e.key,s),u(e.source,a??"file"),i?u(e.version,i):v(e.version))).run():this.#e.client.insert(e).values(t).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:c}).run(),C=r?.map(g=>{const m=I({relation:g,sourceFile:t.sourceFile??"",fileHash:t.fileHash??"",sourceKey:t.key,sourceVersion:t.version??null,sourceRevision:t.revision??null,organizationId:this.#t,projectId:this.#r});return this.#e.client.insert(o).values(m).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation],set:m}).run()})??[];await p([f,...C],w,async g=>g)}async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(u(e.id,t)).returning()).length>0}catch(s){return h.error("Error updating entity scorecards status",s),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(D`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(s){return h.error("Error updating entity scorecards status if calculating",s),!1}}}export{Q as CatalogEntitiesLocalWriteRepository};
1
+ import{and as d,desc as I,eq as u,isNull as v,or as K,sql as k}from"drizzle-orm";import{logger as h}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as w}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as U}from"../../../../../utils/crypto/sha1.js";import{isWebView as x}from"../../../../../../utils/env/is-web-view.js";import{VERSION_NOT_SPECIFIED as S}from"@redocly/theme/core/constants";import{entitiesAttributesTable as E}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js";import{createEntityDbRecord as z}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as A}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 o}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as T}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as L}from"../../../utils/version-compare.js";import{createEntityAttributesDbRecord as N}from"../../mappers/create-entity-attributes-db-record.js";const D=15;class ie{#e;#t;#r;constructor(t,r,i){this.#e=t,this.#t=r,this.#r=i}async createEntity({entity:t,fileHash:r,sourceFile:i,revision:a=new Date().toISOString(),isRootEntity:n=!1,isDeleted:s=!1,rbacTeams:c=[]}){try{const{relations:l=[],...m}=t,V=U(JSON.stringify(m)),f=t.version??S;if(await this.#i(t.key,f,V,n,s))return{result:"skipped",entityKey:t.key};const{shouldBeCurrent:p,shouldBeDefaultVersion:y}=await this.#o(t.key,f),g=z({entity:{...t,revision:a,hash:V,isCurrent:p,isDefaultVersion:y,isDeleted:s,version:f},sourceFile:i,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:F,source:j,...b}=g;if(await this.#a({key:F,isCurrent:p,isDefaultVersion:y}),x())return await this.#c(g,l,c),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f};const O=this.#e.client.insert(e).values(g).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:b}),B=this.#e.client.insert(E).values(N({rbacTeams:c,entityKey:t.key,organizationId:this.#t,projectId:this.#r})).onConflictDoUpdate({target:[E.entityKey],set:{rbacTeams:JSON.stringify(c)}}),P=l?.length&&l.length>0?this.#e.client.insert(o).values(l.map(C=>A({relation:C,sourceFile:i,fileHash:r,sourceKey:t.key,sourceVersion:f,sourceRevision:a??null,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation]}).run():Promise.resolve();return await w([O,P,B],D,async C=>C),{result:"created",entityKey:t.key,entityRevision:a,entityVersion:f}}catch(l){return h.error("Error adding entity",l),{result:"error",entityKey:t.key}}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(u(e.key,t)),t}catch(r){return h.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=T(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 a=i.reduce((n,s)=>((s.isCurrent||s.isDefaultVersion)&&n.add(s.key),n),new Set);if(a.size===0)return!0;await w(Array.from(a),D,async n=>this.#u(n));for(const n of i)await this.#e.client.delete(o).where(K(d(u(o.sourceKey,n.key),...n.version?[u(o.sourceVersion,n.version)]:[v(o.sourceVersion)]),d(u(o.targetKey,n.key),...n.version?[u(o.targetVersion,n.version)]:[v(o.targetVersion)])));return!0}catch(r){return h.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(o).where(u(o.id,t)),t}catch{return null}}async softDeleteEntities(t,r,i){try{const a=t.map(s=>{const c={type:s.type,key:s.key,title:s.title,summary:s.summary??void 0,tags:s.tags??void 0,metadata:s.metadata??void 0,git:s.git??void 0,contact:s.contact??void 0,links:s.links??void 0,version:s.version??void 0};return this.createEntity({entity:c,revision:r,sourceFile:s.sourceFile??"",fileHash:i,isDeleted:!0})});return await w(a,D,async s=>s)}catch(a){return h.error("Error soft deleting entities",a),[]}}async deleteEntityRelations(t){try{const r=T(t);return r?(await this.#e.client.delete(o).where(r),!0):!1}catch(r){return h.error("Error deleting entity relations",r),!1}}async upsertEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:i,sourceVersion:a,targetVersion:n,sourceRevision:s,targetRevision:c,...l}=t,m=await this.#e.client.insert(o).values(t).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation],set:l}).returning();return m?.length?m[0]:null}catch(r){return h.error("Error creating entity relation",r),null}}async#i(t,r,i,a,n){if(a||n)return!1;const s=await this.#e.client.select({hash:e.hash,isDeleted:e.isDeleted}).from(e).where(d(u(e.key,t),u(e.source,"file"),r?u(e.version,r):v(e.version))).orderBy(I(e.revision)).limit(1).run();if(s.rows.length===0)return!1;const c=s.rows[0];return c.is_deleted?!1:c.hash===i}async#s(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(d(u(e.key,t),u(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)}))}#n(t){const r=t.find(n=>n.isDefaultVersion);if(r)return r;const{versionedEntities:i,unversionedEntities:a}=t.reduce((n,s)=>(s.version!==null&&s.version!==S?n.versionedEntities.push(s):n.unversionedEntities.push(s),n),{versionedEntities:[],unversionedEntities:[]});if(i.length>0){i.sort((c,l)=>L(c.version,l.version));const n=i[0].version,s=i.filter(c=>c.version===n);return s.sort((c,l)=>l.createdAt.getTime()-c.createdAt.getTime()),s[0]}return a.length>0?(a.sort((n,s)=>s.createdAt.getTime()-n.createdAt.getTime()),a[0]):null}async#o(t,r){const i=await this.#e.client.select({currentDefaultVersion:k`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:k`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(d(u(e.key,t),u(e.source,"file"))).get(),a=i?.currentDefaultVersion,n=(i?.versionMatchCount??0)>0;return r&&r===a?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!n,shouldBeDefaultVersion:!n}}async#a({key:t,isCurrent:r,isDefaultVersion:i}){if(!r&&!i)return;const a={},n=[];r&&(a.isCurrent=!1,n.push(u(e.isCurrent,!0))),i&&(a.isDefaultVersion=!1,n.push(u(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(a).where(d(u(e.key,t),u(e.source,"file"),K(...n))).run()}#u=async t=>{const r=await this.#s(t),i=this.#n(r);if(!i){h.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(d(u(e.key,t),u(e.revision,i.revision),i.version?u(e.version,i.version):v(e.version))).run()};async#c(t,r,i){const{key:a,source:n,version:s,isDefaultVersion:c,...l}=t,f=(await this.#e.client.select({id:e.id}).from(e).where(d(u(e.key,a),u(e.source,n??"file"),s?u(e.version,s):v(e.version))).limit(1).run()).rows.length>0?this.#e.client.update(e).set(l).where(d(u(e.key,a),u(e.source,n??"file"),s?u(e.version,s):v(e.version))).run():this.#e.client.insert(e).values(t).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:l}).run(),R=r?.map(y=>{const g=A({relation:y,sourceFile:t.sourceFile??"",fileHash:t.fileHash??"",sourceKey:t.key,sourceVersion:t.version??null,sourceRevision:t.revision??null,organizationId:this.#t,projectId:this.#r});return this.#e.client.insert(o).values(g).onConflictDoUpdate({target:[o.sourceKey,o.targetKey,o.sourceVersion,o.targetVersion,o.sourceRevision,o.targetRevision,o.sourceToTargetRelation],set:g}).run()})??[],p=this.#e.client.insert(E).values(N({rbacTeams:i,entityKey:t.key,organizationId:this.#t,projectId:this.#r})).onConflictDoUpdate({target:[E.entityKey],set:{rbacTeams:JSON.stringify(i)}});await w([f,...R,p],D,async y=>y)}async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(u(e.id,t)).returning()).length>0}catch(i){return h.error("Error updating entity scorecards status",i),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(k`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(i){return h.error("Error updating entity scorecards status if calculating",i),!1}}}export{ie as CatalogEntitiesLocalWriteRepository};
@@ -1 +1 @@
1
- import{unionAll as g}from"drizzle-orm/sqlite-core";import{and as u,desc as p,eq as y,notExists as C,sql as i}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as D}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{excludeFieldsFromFilter as B,getFirstFilterFieldValue as N}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as O}from"../../../../../providers/database/pagination/index.js";import{createBffRelatedEntityFromQueryRow as K}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as Q}from"../../mappers/map-entity-relation-row.js";class M{#e;#i;constructor(o,n){this.#e=o,this.#i=n}async getRelationsForEntity(o,n,d){const a=await this.#t(o,n,d);return a?(await this.#e.client.select().from(a).run()).rows.map(s=>Q(s)):[]}async getRelatedEntities(o,n={}){const d=N(n.filter,"version"),a=N(n.filter,"revision"),r=await this.#t(o,d,a);if(!r)return{items:[],total:0};const s=this.#e.client.select({relationType:r.relationName,direction:r.direction,key:e.key,revision:e.revision,id:e.id,type:e.type,title:e.title,summary:e.summary,metadata:e.metadata,createdAt:e.createdAt,updatedAt:e.updatedAt,source:e.source,sourceFile:e.sourceFile,version:e.version,isDeleted:e.isDeleted,isCurrent:e.isCurrent,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${r.entityKey} ORDER BY ${r.priority} ASC, CASE WHEN ${r.entityRevision} = ${e.revision} THEN 1 ELSE 0 END DESC, CASE WHEN ${r.entityVersion} = ${e.version} THEN 1 ELSE 0 END DESC, ${e.isCurrent} DESC, ${e.revision} DESC)`.as("dedupRn")}).from(r).innerJoin(e,i`${r.entityKey} = ${e.key} AND (${r.entityRevision} = ${e.revision} OR ${r.entityRevision} = '' OR ${e.isCurrent} = 1) AND (${r.entityVersion} = ${e.version} OR ${r.entityVersion} = '' OR ${e.version} = ${D})`).as("unique_relations"),m=i`${s.dedupRn} = 1 AND COALESCE(${s.isDeleted}, 0) = 0`,E=this.#e.client.select().from(s).$dynamic(),$=this.#e.client.select().from(s).$dynamic(),f=B(n.filter,["version","revision"]),R={...n,filter:f,baseWhereCondition:m},l=O($,{...R,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(l),h=n.limit||10,S=O(E,{...R,limit:h+1}),[V,A]=await Promise.all([S.run(),c]),w=V.rows.filter(v=>v.id!=null).map(v=>K(v)).filter(v=>v!==null),T=w.slice(0,h),F=w.length>h;return{items:T,hasMore:F,total:A}}async#r(o,n){if(n){const s=await(this.#i?g(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`version = ${n}`)).orderBy(i.raw("revision DESC")),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n),C(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.version = ${n}`))))).orderBy(p(e.revision))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n))).orderBy(p(e.revision))).limit(1).run();if(s.rows.length>0){const m=s.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}const a=await(this.#i?g(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`is_current = 1`)),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0),C(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.is_current = 1`)))))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0)))).limit(1).run();if(a.rows.length>0){const r=a.rows[0];return{version:r.version||null,revision:r.revision||null}}return null}async#t(o,n,d){const a=d?{version:n||null,revision:d}:await this.#r(o,n||null),r=n||a?.version||null,s=d||a?.revision||null,m=!r||r===D,E=m?i`1 = 1`:i`(${t.sourceVersion} = ${r} OR ${t.sourceVersion} = '')`,$=m?i`1 = 1`:i`(${t.targetVersion} = ${r} OR ${t.targetVersion} = '')`,f=s?i`(${t.sourceRevision} <= ${s} OR ${t.sourceRevision} = '')`:i`1 = 0`,R=s?i`(${t.targetRevision} <= ${s} OR ${t.targetRevision} = '')`:i`1 = 0`,l=this.#e.client.select({entityKey:t.targetKey,entityRevision:t.targetRevision,entityVersion:t.targetVersion,relationName:t.sourceToTargetRelation,direction:i`'outgoing'`.as("direction"),priority:i`1`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.targetKey}, ${t.sourceToTargetRelation} ORDER BY CASE WHEN ${t.sourceVersion} != '' THEN 1 ELSE 0 END DESC, ${t.sourceRevision} DESC)`.as("rn")}).from(t).where(u(y(t.sourceKey,o),E,f)).as("outgoing_filtered"),c=this.#e.client.select({entityKey:t.sourceKey,entityRevision:t.sourceRevision,entityVersion:t.sourceVersion,relationName:t.targetToSourceRelation,direction:i`'incoming'`.as("direction"),priority:i`2`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.sourceKey}, ${t.targetToSourceRelation} ORDER BY CASE WHEN ${t.targetVersion} != '' THEN 1 ELSE 0 END DESC, ${t.targetRevision} DESC)`.as("rn")}).from(t).where(u(y(t.targetKey,o),$,R)).as("incoming_filtered");return this.#e.client.select({entityKey:l.entityKey,entityRevision:l.entityRevision,entityVersion:l.entityVersion,relationName:l.relationName,direction:l.direction,priority:l.priority}).from(l).where(i`${l.rn} = 1 AND COALESCE(${l.isDeleted}, 0) = 0`).unionAll(this.#e.client.select({entityKey:c.entityKey,entityRevision:c.entityRevision,entityVersion:c.entityVersion,relationName:c.relationName,direction:c.direction,priority:c.priority}).from(c).where(i`${c.rn} = 1 AND COALESCE(${c.isDeleted}, 0) = 0`)).as("all_relations")}}export{M as CatalogEntitiesRelationsRepository};
1
+ import{unionAll as w}from"drizzle-orm/sqlite-core";import{and as u,desc as p,eq as y,notExists as C,sql as i}from"drizzle-orm";import{VERSION_NOT_SPECIFIED as D}from"@redocly/theme/core/constants";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{excludeFieldsFromFilter as B,getFirstFilterFieldValue as N}from"../../../../../providers/database/pagination/filter.js";import{applyPagination as O}from"../../../../../providers/database/pagination/index.js";import{createBffRelatedEntityFromQueryRow as K}from"../../mappers/create-bff-related-entity.js";import{mapEntityRelationRow as Q}from"../../mappers/map-entity-relation-row.js";class M{#e;#i;constructor(o,n){this.#e=o,this.#i=n}async getRelationsForEntity(o,n,d){const a=await this.#t(o,n,d);return a?(await this.#e.client.select().from(a).run()).rows.map(s=>Q(s)):[]}async getRelatedEntities(o,n={}){const d=N(n.filter,"version"),a=N(n.filter,"revision"),r=await this.#t(o,d,a);if(!r)return{items:[],total:0};const s=this.#e.client.select({relationType:r.relationName,direction:r.direction,key:e.key,revision:e.revision,id:e.id,type:e.type,title:e.title,summary:e.summary,tags:e.tags,metadata:e.metadata,createdAt:e.createdAt,updatedAt:e.updatedAt,source:e.source,sourceFile:e.sourceFile,version:e.version,isDeleted:e.isDeleted,isCurrent:e.isCurrent,dedupRn:i`ROW_NUMBER() OVER (PARTITION BY ${r.entityKey} ORDER BY ${r.priority} ASC, CASE WHEN ${r.entityRevision} = ${e.revision} THEN 1 ELSE 0 END DESC, CASE WHEN ${r.entityVersion} = ${e.version} THEN 1 ELSE 0 END DESC, ${e.isCurrent} DESC, ${e.revision} DESC)`.as("dedupRn")}).from(r).innerJoin(e,i`${r.entityKey} = ${e.key} AND (${r.entityRevision} = ${e.revision} OR ${r.entityRevision} = '' OR ${e.isCurrent} = 1) AND (${r.entityVersion} = ${e.version} OR ${r.entityVersion} = '' OR ${e.version} = ${D})`).as("unique_relations"),m=i`${s.dedupRn} = 1 AND COALESCE(${s.isDeleted}, 0) = 0`,E=this.#e.client.select().from(s).$dynamic(),$=this.#e.client.select().from(s).$dynamic(),f=B(n.filter,["version","revision"]),R={...n,filter:f,baseWhereCondition:m},l=O($,{...R,limit:void 0,skip:void 0,after:void 0,before:void 0}),c=this.#e.client.$count(l),h=n.limit||10,S=O(E,{...R,limit:h+1}),[V,A]=await Promise.all([S.run(),c]),g=V.rows.filter(v=>v.id!=null).map(v=>K(v)).filter(v=>v!==null),T=g.slice(0,h),F=g.length>h;return{items:T,hasMore:F,total:A}}async#r(o,n){if(n){const s=await(this.#i?w(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`version = ${n}`)).orderBy(i.raw("revision DESC")),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n),C(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.version = ${n}`))))).orderBy(p(e.revision))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.version,n))).orderBy(p(e.revision))).limit(1).run();if(s.rows.length>0){const m=s.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}const a=await(this.#i?w(this.#e.client.select({version:i.raw("version"),revision:i.raw("revision")}).from(i`remote.entities`).where(u(i`key = ${o}`,i`is_current = 1`)),this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0),C(this.#e.client.select({id:i.raw("id")}).from(i`remote.entities as remote`).where(u(i`remote.key = ${e.key}`,i`remote.is_current = 1`)))))):this.#e.client.select({version:e.version,revision:e.revision}).from(e).where(u(y(e.key,o),y(e.isCurrent,!0)))).limit(1).run();if(a.rows.length>0){const r=a.rows[0];return{version:r.version||null,revision:r.revision||null}}return null}async#t(o,n,d){const a=d?{version:n||null,revision:d}:await this.#r(o,n||null),r=n||a?.version||null,s=d||a?.revision||null,m=!r||r===D,E=m?i`1 = 1`:i`(${t.sourceVersion} = ${r} OR ${t.sourceVersion} = '')`,$=m?i`1 = 1`:i`(${t.targetVersion} = ${r} OR ${t.targetVersion} = '')`,f=s?i`(${t.sourceRevision} <= ${s} OR ${t.sourceRevision} = '')`:i`1 = 0`,R=s?i`(${t.targetRevision} <= ${s} OR ${t.targetRevision} = '')`:i`1 = 0`,l=this.#e.client.select({entityKey:t.targetKey,entityRevision:t.targetRevision,entityVersion:t.targetVersion,relationName:t.sourceToTargetRelation,direction:i`'outgoing'`.as("direction"),priority:i`1`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.targetKey}, ${t.sourceToTargetRelation} ORDER BY CASE WHEN ${t.sourceVersion} != '' THEN 1 ELSE 0 END DESC, ${t.sourceRevision} DESC)`.as("rn")}).from(t).where(u(y(t.sourceKey,o),E,f)).as("outgoing_filtered"),c=this.#e.client.select({entityKey:t.sourceKey,entityRevision:t.sourceRevision,entityVersion:t.sourceVersion,relationName:t.targetToSourceRelation,direction:i`'incoming'`.as("direction"),priority:i`2`.as("priority"),isDeleted:t.isDeleted,rn:i`ROW_NUMBER() OVER (PARTITION BY ${t.sourceKey}, ${t.targetToSourceRelation} ORDER BY CASE WHEN ${t.targetVersion} != '' THEN 1 ELSE 0 END DESC, ${t.targetRevision} DESC)`.as("rn")}).from(t).where(u(y(t.targetKey,o),$,R)).as("incoming_filtered");return this.#e.client.select({entityKey:l.entityKey,entityRevision:l.entityRevision,entityVersion:l.entityVersion,relationName:l.relationName,direction:l.direction,priority:l.priority}).from(l).where(i`${l.rn} = 1 AND COALESCE(${l.isDeleted}, 0) = 0`).unionAll(this.#e.client.select({entityKey:c.entityKey,entityRevision:c.entityRevision,entityVersion:c.entityVersion,relationName:c.relationName,direction:c.direction,priority:c.priority}).from(c).where(i`${c.rn} = 1 AND COALESCE(${c.isDeleted}, 0) = 0`)).as("all_relations")}}export{M as CatalogEntitiesRelationsRepository};
@@ -1 +1 @@
1
- import u from"node:path";import{removeLeadingSlash as m}from"@redocly/theme/core/utils";import{toKebabCase as y}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as f}from"../../../../../utils/async/promise-map-limit.js";import{removeMarkdocTags as d}from"../../../../markdown/markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as w}from"./base.js";const g=15;class k extends w{constructor(t){super("arazzo",t)}mapApiDescriptionToEntity(t,o){const r=m(t.realRelativePath),c=t.document.info.title,e=r.replace(/\.[^.]+$/,""),n=y(e.replace(/[\\/]/g,"-")),a=t.document["x-redocly-catalog-key"],i=typeof a=="string"&&a.trim()?y(a.trim()):n;return{type:this.type,key:i,title:c,summary:t.document.info.description?d(t.document.info.description):null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:r},version:o}}async loadApiDescriptions(){return(await this.context.cache.load(".","arazzo-docs")).data}async processApiDescription(t,o,r,c){if(!this.#t(t)){this.context.logger.warn(`Skipping Arazzo description without source descriptions: ${t.realRelativePath}`);return}const e=this.mapApiDescriptionToEntity(t,r);await this.catalogEntitiesService.createEntityInLocalDatabase({entity:e,sourceFile:t.realRelativePath,fileHash:t.hash,isRootEntity:!0,revision:o}),c.delete(`${e.key}:${r}`),await this.#e(t,e.key,e.version,r,o,c);const n=t.document.sourceDescriptions||[];await f(n,g,async a=>{if(!(a.type!=="openapi"||!a.url))try{const i=this.resolveSourceDescriptionUrl(a.url,t.realRelativePath);if(!i){!a.url.startsWith("http://")&&!a.url.startsWith("https://")&&this.context.logger.warn(`Could not resolve URL to local path: ${a.url}`);return}const l=await this.context.cache.load(i,"load-oas");if(!(l.data&&Array.isArray(l.data)&&l.data.length>0)){this.context.logger.warn(`No OpenAPI definition found at path: ${i}`);return}const s=l.data[0],p=y(m(s.realRelativePath).replace(/\.[^.]+$/,"").replace(/[\\/]/g,"-"));await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:e.key,type:"relatesTo",targetKey:p,fileHash:t.hash}),await this.#r(t,a.name,s,e.key,p,e.version,o)}catch(i){this.context.logger.warn(`Failed to create relation to OpenAPI source "${a.url}": ${i instanceof Error?i.message:"Unknown error"}`)}})}#t=t=>!!t?.document?.sourceDescriptions&&t.document.sourceDescriptions.length>0;#e=async(t,o,r,c,e,n)=>{try{const a=t.document.components?.inputs,i=a?Object.entries(a):[],l=[];for(const[h,s]of i)l.push(async()=>{const p=await this.#a({schemaName:h,schema:s,description:t,parentKey:o,parentVersion:r,parentRevision:e});n.delete(`${p.entityKey}:${c}`),p.result==="created"&&await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:o,type:"uses",targetKey:p.entityKey,fileHash:t.hash,sourceVersion:r,targetVersion:r,sourceRevision:e,targetRevision:e})});if(l.length===0)return;await f(l,g,h=>h())}catch(a){this.context.logger.warn(`Failed to create data schema entities for Arazzo description: ${a instanceof Error?a.message:"Unknown error"}`)}};#a=async({schemaName:t,schema:o,description:r,parentKey:c,parentVersion:e,parentRevision:n})=>{const a={type:"data-schema",key:`${c}-${y(t)}`,title:t,summary:o.description||o.title||null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:r.realRelativePath,schema:"{}"},version:e};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:a,sourceFile:r.realRelativePath,fileHash:r.hash,revision:n})};#r=async(t,o,r,c,e,n,a)=>{const i=t.document.workflows||[];if(i.length===0)return;const l=new Set;for(const h of i)for(const s of h.steps||[]){if(!s.operationId)continue;const p=s.operationId.startsWith(`${o}.`)?s.operationId.substring(`${o}.`.length):s.operationId;p&&l.add(p)}l.size!==0&&await f(Array.from(l),g,async h=>{try{const s=`${e}-${y(h)}`;await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:c,type:"uses",targetKey:s,fileHash:t.hash,sourceVersion:n,targetVersion:n,sourceRevision:a,targetRevision:a})}catch(s){this.context.logger.warn(`Failed to create relation to operation "${h}": ${s instanceof Error?s.message:"Unknown error"}`)}})};resolveSourceDescriptionUrl(t,o){try{const r=t.trim(),c=r.startsWith("@")?r.slice(1):r,[e]=c.split("#");if(e.startsWith("http://")||e.startsWith("https://"))return null;if(e.startsWith("/"))return m(u.posix.normalize(e));const n=u.posix.dirname(o);return e.startsWith(n+"/")?u.posix.normalize(e):u.posix.normalize(u.posix.join(n,e))}catch{return this.context.logger.warn(`Failed to resolve URL: ${t}`),null}}}export{k as ArazzoEntitiesExtractor};
1
+ import y from"node:path";import{removeLeadingSlash as f}from"@redocly/theme/core/utils";import{toKebabCase as m}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as g}from"../../../../../utils/async/promise-map-limit.js";import{removeMarkdocTags as w}from"../../../../markdown/markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as E}from"./base.js";const d=15;class D extends E{constructor(t){super("arazzo",t)}mapApiDescriptionToEntity(t,i){const a=f(t.realRelativePath),h=t.document.info.title,r=a.replace(/\.[^.]+$/,""),o=m(r.replace(/[\\/]/g,"-")),n=t.document["x-redocly-catalog-key"],e=typeof n=="string"&&n.trim()?m(n.trim()):o;return{type:this.type,key:e,title:h,summary:t.document.info.description?w(t.document.info.description):null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:a},version:i}}async loadApiDescriptions(){return(await this.context.cache.load(".","arazzo-docs")).data}async processApiDescription(t,i,a,h){if(!this.#t(t)){this.context.logger.warn(`Skipping Arazzo description without source descriptions: ${t.realRelativePath}`);return}const r=this.getRbacTeamsForDefinition(t.relativePath),o=this.mapApiDescriptionToEntity(t,a);await this.catalogEntitiesService.createEntityInLocalDatabase({entity:o,sourceFile:t.realRelativePath,fileHash:t.hash,isRootEntity:!0,revision:i,rbacTeams:r}),h.delete(`${o.key}:${a}`),await this.#e(t,o.key,o.version,a,i,h,r);const n=t.document.sourceDescriptions||[];await g(n,d,async e=>{if(!(e.type!=="openapi"||!e.url))try{const c=this.resolveSourceDescriptionUrl(e.url,t.realRelativePath);if(!c){!e.url.startsWith("http://")&&!e.url.startsWith("https://")&&this.context.logger.warn(`Could not resolve URL to local path: ${e.url}`);return}const l=await this.context.cache.load(c,"load-oas");if(!(l.data&&Array.isArray(l.data)&&l.data.length>0)){this.context.logger.warn(`No OpenAPI definition found at path: ${c}`);return}const p=l.data[0],u=m(f(p.realRelativePath).replace(/\.[^.]+$/,"").replace(/[\\/]/g,"-"));await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:o.key,type:"relatesTo",targetKey:u,fileHash:t.hash}),await this.#r(t,e.name,p,o.key,u,o.version,i)}catch(c){this.context.logger.warn(`Failed to create relation to OpenAPI source "${e.url}": ${c instanceof Error?c.message:"Unknown error"}`)}})}#t=t=>!!t?.document?.sourceDescriptions&&t.document.sourceDescriptions.length>0;#e=async(t,i,a,h,r,o,n)=>{try{const e=t.document.components?.inputs,c=e?Object.entries(e):[],l=[];for(const[s,p]of c)l.push(async()=>{const u=await this.#a({schemaName:s,schema:p,description:t,parentKey:i,parentVersion:a,parentRevision:r,rbacTeams:n});o.delete(`${u.entityKey}:${h}`),u.result==="created"&&await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:i,type:"uses",targetKey:u.entityKey,fileHash:t.hash,sourceVersion:a,targetVersion:a,sourceRevision:r,targetRevision:r})});if(l.length===0)return;await g(l,d,s=>s())}catch(e){this.context.logger.warn(`Failed to create data schema entities for Arazzo description: ${e instanceof Error?e.message:"Unknown error"}`)}};#a=async({schemaName:t,schema:i,description:a,parentKey:h,parentVersion:r,parentRevision:o,rbacTeams:n})=>{const e={type:"data-schema",key:`${h}-${m(t)}`,title:t,summary:i.description||i.title||null,tags:["arazzo"],metadata:{specType:this.specType,descriptionFile:a.realRelativePath,schema:"{}"},version:r};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:e,sourceFile:a.realRelativePath,fileHash:a.hash,revision:o,rbacTeams:n})};#r=async(t,i,a,h,r,o,n)=>{const e=t.document.workflows||[];if(e.length===0)return;const c=new Set;for(const l of e)for(const s of l.steps||[]){if(!s.operationId)continue;const p=s.operationId.startsWith(`${i}.`)?s.operationId.substring(`${i}.`.length):s.operationId;p&&c.add(p)}c.size!==0&&await g(Array.from(c),d,async l=>{try{const s=`${r}-${m(l)}`;await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:h,type:"uses",targetKey:s,fileHash:t.hash,sourceVersion:o,targetVersion:o,sourceRevision:n,targetRevision:n})}catch(s){this.context.logger.warn(`Failed to create relation to operation "${l}": ${s instanceof Error?s.message:"Unknown error"}`)}})};resolveSourceDescriptionUrl(t,i){try{const a=t.trim(),h=a.startsWith("@")?a.slice(1):a,[r]=h.split("#");if(r.startsWith("http://")||r.startsWith("https://"))return null;if(r.startsWith("/"))return f(y.posix.normalize(r));const o=y.posix.dirname(i);return r.startsWith(o+"/")?y.posix.normalize(r):y.posix.normalize(y.posix.join(o,r))}catch{return this.context.logger.warn(`Failed to resolve URL: ${t}`),null}}}export{D as ArazzoEntitiesExtractor};
@@ -1 +1 @@
1
- import{removeLeadingSlash as $}from"@redocly/theme/core/utils";import{toKebabCase as h}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as p}from"../../../../../utils/async/promise-map-limit.js";import{promiseMapLimitWithStatus as g}from"../../../../../utils/async/promise-map-limit-with-status.js";import{removeMarkdocTags as d}from"../../../../markdown/markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as R}from"./base.js";import{extractPartsFromComponentsRef as y}from"../../../utils/extract-parts-from-components-ref.js";import{validateEntityRelation as E}from"../../../entities/validate-entity.js";import{extractPartsFromChannelsMessageRef as w}from"../../../utils/extract-parts-from-channels-message-ref.js";const f=15;class k extends R{constructor(e){super("asyncapi",e)}mapApiDescriptionToEntity(e,a){const s=$(e.realRelativePath),n=e.document.info.title,t=s.replace(/\.[^.]+$/,""),r=h(t.replace(/[\\/]/g,"-")),o=e.document["x-redocly-catalog-key"],c=typeof o=="string"&&o.trim()?h(o.trim()):r;return{type:this.type,key:c,title:n,summary:d(e.document.info.description),tags:e.document.info.tags?.map(i=>i.name),metadata:{specType:this.specType,descriptionFile:s},version:a}}async loadApiDescriptions(){return(await this.context.cache.load(".","asyncapi-docs")).data}async processApiDescription(e,a,s,n){const t=this.mapApiDescriptionToEntity(e,s);await this.catalogEntitiesService.createEntityInLocalDatabase({entity:t,sourceFile:e.realRelativePath,fileHash:e.hash,isRootEntity:!0,revision:a}),n.delete(`${t.key}:${s}`);const r=this.#a(e),[o,c]=await Promise.allSettled([this.#s(e,t.key,t.version,s,a,n),this.#r(r,e,t.key,t.version,s,a,n)]);o.status!=="fulfilled"&&this.context.logger.error("Schema processing failed:",o.reason),c.status!=="fulfilled"&&this.context.logger.error("Operation processing failed:",c.reason)}#a=e=>{const a=e.documentWithReferences.operations;return a?Object.entries(a).map(([s,n])=>({operationName:s,operation:n})):[]};#s=async(e,a,s,n,t,r)=>{const o=e.document.components?.schemas;if(!o)return;const c=Object.entries(o);if(c.length===0)return;const i=await g(c,f,async([l,m])=>{const u=await this.#n({schemaName:l,schema:m,description:e,parentKey:a,parentVersion:s,parentRevision:t});r.delete(`${u.entityKey}:${n}`),u.result==="created"&&await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:"uses",targetKey:u.entityKey,fileHash:e.hash,sourceVersion:s,targetVersion:s,sourceRevision:t,targetRevision:t})},this.context.logger);i.count.failed>0&&this.context.logger.warn(`Schema processing completed with ${i.count.failed} failures out of ${c.length} schemas for ${e.realRelativePath}`)};#n=async({schemaName:e,schema:a,description:s,parentKey:n,parentVersion:t,parentRevision:r})=>{const o=`${n}-${h(e)}`,c="title"in a?a.title??a.description:null,i=JSON.stringify(a),l={type:"data-schema",key:o,title:e,summary:c,tags:[],metadata:{specType:this.specType,schema:i},version:t};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:l,sourceFile:s.realRelativePath,fileHash:s.hash,revision:r})};#r=async(e,a,s,n,t,r,o)=>{if(!e.length)return;const c=await g(e,f,async({operationName:i,operation:l})=>{const m=await this.#c(l,i,a,s,n,r);m&&o.delete(`${m}:${t}`)},this.context.logger);c.count.failed>0&&this.context.logger.warn(`Operation processing completed with ${c.count.failed} failures out of ${e.length} operations for ${a.realRelativePath}`)};#c=async(e,a,s,n,t,r)=>{const o=await this.#o(e.messages??[],s,n),c=await this.#i(a,e,o,s,n,t,r);return c.result==="created"&&await this.#l({apiOperationKey:c.entityKey,operation:e,descriptionUniqueKey:n,description:s,descriptionVersion:t,parentRevision:r}),c.entityKey??null};#o=async(e,a,s)=>{if(!e||e.length===0)return[];const n=new Set;for(const t of e){let r=null;if("$ref"in t){const o=t.$ref.startsWith("#/channels/")?this.#e(t.$ref,a):t.$ref;if(o){const c=y(o);if(c?.componentName&&c.componentType==="messages"){const i=a.documentWithReferences.components?.messages[c.componentName];i?.payload&&"$ref"in i.payload&&i.payload.$ref&&(r=i.payload.$ref)}}}else t.payload&&"$ref"in t.payload&&t.payload.$ref&&(r=t.payload.$ref);if(r){const o=y(r);o?.componentName&&o.componentType==="schemas"&&n.add(`${s}-${h(o.componentName)}`)}}return Array.from(n)};#i=async(e,a,s,n,t,r,o)=>{const c={type:"api-operation",key:`${t}-${h(e)}`,title:a.title||e,summary:a.summary??"",tags:a.tags?.map(l=>l.name)??[],metadata:{method:a.action==="send"?"PUBLISH":"SUBSCRIBE",path:a.channel.address??"",payload:a.action==="receive"?s:[],responses:a.action==="send"?s:[]},version:r};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:c,sourceFile:n.realRelativePath,fileHash:n.hash,revision:o})};#l=async({apiOperationKey:e,operation:a,descriptionUniqueKey:s,description:n,descriptionVersion:t,parentRevision:r})=>(await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:e,type:"partOf",targetKey:s,fileHash:n.hash,sourceVersion:t,targetVersion:t,sourceRevision:r,targetRevision:r}),await this.#h(a,e,t,r),!Array.isArray(a.messages)||!a.messages?.length?[]:await this.#m(a.messages,e,n,s,t,r));#h=async(e,a,s,n)=>{e["x-catalog-relations"]?.length&&await p(e["x-catalog-relations"],f,async t=>{try{E(t),await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:t.type,targetKey:t.key,sourceVersion:s,targetVersion:s,sourceRevision:n,targetRevision:n})}catch(r){this.context.logger.warn(`Error creating entity relation for operation ${a} based on custom property: ${r instanceof Error?r.message:"Unknown error"}`)}})};#m=async(e,a,s,n,t,r)=>e.length===0?[]:(await p(e,f,async c=>await this.#y(c,a,s,n,t,r)??"")).filter(c=>!!c);#y=async(e,a,s,n,t,r)=>"$ref"in e?this.#f(e,a,s,n,t,r):e.payload?this.#u(e,a,s,n,t,r):null;#f=async(e,a,s,n,t,r)=>{const o=e.$ref.startsWith("#/channels/")?this.#e(e.$ref,s):e.$ref;if(!o)return null;const c=y(o);if(!c||!c.componentName||c.componentType!=="messages")return null;const i=s.documentWithReferences.components?.messages[c.componentName];return!i?.payload||!("$ref"in i.payload)||!i.payload.$ref?null:this.#t(i.payload.$ref,a,s,n,t,r)};#e=(e,a)=>{const s=w(e);if(!s||!s.channelName||!s.messageName)return null;const n=a.documentWithReferences.channels?.[s.channelName];if(!n?.messages)return null;const t=n.messages[s.messageName];return!t||!("$ref"in t)||typeof t.$ref!="string"||!t.$ref.startsWith("#/components/messages/")?null:t.$ref};#u=async(e,a,s,n,t,r)=>!e.payload||!("$ref"in e.payload)||!e.payload.$ref?null:this.#t(e.payload.$ref,a,s,n,t,r);#t=async(e,a,s,n,t,r)=>{const o=y(e);if(!o||!o.componentName||o.componentType!=="schemas")return null;const c=`${n}-${h(o.componentName)}`;return await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:"uses",targetKey:c,fileHash:s.hash,sourceVersion:t,targetVersion:t,sourceRevision:r,targetRevision:r}),c}}export{k as AsyncApiEntitiesExtractor};
1
+ import{removeLeadingSlash as d}from"@redocly/theme/core/utils";import{toKebabCase as m}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as g}from"../../../../../utils/async/promise-map-limit.js";import{promiseMapLimitWithStatus as $}from"../../../../../utils/async/promise-map-limit-with-status.js";import{removeMarkdocTags as R}from"../../../../markdown/markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as E}from"./base.js";import{extractPartsFromComponentsRef as f}from"../../../utils/extract-parts-from-components-ref.js";import{validateEntityRelation as w}from"../../../entities/validate-entity.js";import{extractPartsFromChannelsMessageRef as S}from"../../../utils/extract-parts-from-channels-message-ref.js";const u=15;class L extends E{constructor(e){super("asyncapi",e)}mapApiDescriptionToEntity(e,a){const s=d(e.realRelativePath),r=e.document.info.title,t=s.replace(/\.[^.]+$/,""),n=m(t.replace(/[\\/]/g,"-")),c=e.document["x-redocly-catalog-key"],o=typeof c=="string"&&c.trim()?m(c.trim()):n;return{type:this.type,key:o,title:r,summary:R(e.document.info.description),tags:e.document.info.tags?.map(i=>i.name),metadata:{specType:this.specType,descriptionFile:s},version:a}}async loadApiDescriptions(){return(await this.context.cache.load(".","asyncapi-docs")).data}async processApiDescription(e,a,s,r){const t=this.getRbacTeamsForDefinition(e.relativePath),n=this.mapApiDescriptionToEntity(e,s);await this.catalogEntitiesService.createEntityInLocalDatabase({entity:n,sourceFile:e.realRelativePath,fileHash:e.hash,isRootEntity:!0,revision:a,rbacTeams:t}),r.delete(`${n.key}:${s}`);const c=this.#a(e),[o,i]=await Promise.allSettled([this.#s(e,n.key,n.version,s,a,r,t),this.#r(c,e,n.key,n.version,s,a,r,t)]);o.status!=="fulfilled"&&this.context.logger.error("Schema processing failed:",o.reason),i.status!=="fulfilled"&&this.context.logger.error("Operation processing failed:",i.reason)}#a=e=>{const a=e.documentWithReferences.operations;return a?Object.entries(a).map(([s,r])=>({operationName:s,operation:r})):[]};#s=async(e,a,s,r,t,n,c)=>{const o=e.document.components?.schemas;if(!o)return;const i=Object.entries(o);if(i.length===0)return;const l=await $(i,u,async([h,y])=>{const p=await this.#n({schemaName:h,schema:y,description:e,parentKey:a,parentVersion:s,parentRevision:t,rbacTeams:c});n.delete(`${p.entityKey}:${r}`),p.result==="created"&&await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:"uses",targetKey:p.entityKey,fileHash:e.hash,sourceVersion:s,targetVersion:s,sourceRevision:t,targetRevision:t})},this.context.logger);l.count.failed>0&&this.context.logger.warn(`Schema processing completed with ${l.count.failed} failures out of ${i.length} schemas for ${e.realRelativePath}`)};#n=async({schemaName:e,schema:a,description:s,parentKey:r,parentVersion:t,parentRevision:n,rbacTeams:c})=>{const o=`${r}-${m(e)}`,i="title"in a?a.title??a.description:null,l=JSON.stringify(a),h={type:"data-schema",key:o,title:e,summary:i,tags:[],metadata:{specType:this.specType,schema:l},version:t};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:h,sourceFile:s.realRelativePath,fileHash:s.hash,revision:n,rbacTeams:c})};#r=async(e,a,s,r,t,n,c,o)=>{if(!e.length)return;const i=await $(e,u,async({operationName:l,operation:h})=>{const y=await this.#c(h,l,a,s,r,n,o);y&&c.delete(`${y}:${t}`)},this.context.logger);i.count.failed>0&&this.context.logger.warn(`Operation processing completed with ${i.count.failed} failures out of ${e.length} operations for ${a.realRelativePath}`)};#c=async(e,a,s,r,t,n,c)=>{const o=await this.#o(e.messages??[],s,r),i=await this.#i(a,e,o,s,r,t,n,c);return i.result==="created"&&await this.#l({apiOperationKey:i.entityKey,operation:e,descriptionUniqueKey:r,description:s,descriptionVersion:t,parentRevision:n}),i.entityKey??null};#o=async(e,a,s)=>{if(!e||e.length===0)return[];const r=new Set;for(const t of e){let n=null;if("$ref"in t){const c=t.$ref.startsWith("#/channels/")?this.#e(t.$ref,a):t.$ref;if(c){const o=f(c);if(o?.componentName&&o.componentType==="messages"){const i=a.documentWithReferences.components?.messages[o.componentName];i?.payload&&"$ref"in i.payload&&i.payload.$ref&&(n=i.payload.$ref)}}}else t.payload&&"$ref"in t.payload&&t.payload.$ref&&(n=t.payload.$ref);if(n){const c=f(n);c?.componentName&&c.componentType==="schemas"&&r.add(`${s}-${m(c.componentName)}`)}}return Array.from(r)};#i=async(e,a,s,r,t,n,c,o)=>{const i={type:"api-operation",key:`${t}-${m(e)}`,title:a.title||e,summary:a.summary??"",tags:a.tags?.map(h=>h.name)??[],metadata:{method:a.action==="send"?"PUBLISH":"SUBSCRIBE",path:a.channel.address??"",payload:a.action==="receive"?s:[],responses:a.action==="send"?s:[]},version:n};return await this.catalogEntitiesService.createEntityInLocalDatabase({entity:i,sourceFile:r.realRelativePath,fileHash:r.hash,revision:c,rbacTeams:o})};#l=async({apiOperationKey:e,operation:a,descriptionUniqueKey:s,description:r,descriptionVersion:t,parentRevision:n})=>(await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:e,type:"partOf",targetKey:s,fileHash:r.hash,sourceVersion:t,targetVersion:t,sourceRevision:n,targetRevision:n}),await this.#h(a,e,t,n),!Array.isArray(a.messages)||!a.messages?.length?[]:await this.#m(a.messages,e,r,s,t,n));#h=async(e,a,s,r)=>{e["x-catalog-relations"]?.length&&await g(e["x-catalog-relations"],u,async t=>{try{w(t),await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:t.type,targetKey:t.key,sourceVersion:s,targetVersion:"",sourceRevision:r,targetRevision:""})}catch(n){this.context.logger.warn(`Error creating entity relation for operation ${a} based on custom property: ${n instanceof Error?n.message:"Unknown error"}`)}})};#m=async(e,a,s,r,t,n)=>e.length===0?[]:(await g(e,u,async o=>await this.#y(o,a,s,r,t,n)??"")).filter(o=>!!o);#y=async(e,a,s,r,t,n)=>"$ref"in e?this.#f(e,a,s,r,t,n):e.payload?this.#u(e,a,s,r,t,n):null;#f=async(e,a,s,r,t,n)=>{const c=e.$ref.startsWith("#/channels/")?this.#e(e.$ref,s):e.$ref;if(!c)return null;const o=f(c);if(!o||!o.componentName||o.componentType!=="messages")return null;const i=s.documentWithReferences.components?.messages[o.componentName];return!i?.payload||!("$ref"in i.payload)||!i.payload.$ref?null:this.#t(i.payload.$ref,a,s,r,t,n)};#e=(e,a)=>{const s=S(e);if(!s||!s.channelName||!s.messageName)return null;const r=a.documentWithReferences.channels?.[s.channelName];if(!r?.messages)return null;const t=r.messages[s.messageName];return!t||!("$ref"in t)||typeof t.$ref!="string"||!t.$ref.startsWith("#/components/messages/")?null:t.$ref};#u=async(e,a,s,r,t,n)=>!e.payload||!("$ref"in e.payload)||!e.payload.$ref?null:this.#t(e.payload.$ref,a,s,r,t,n);#t=async(e,a,s,r,t,n)=>{const c=f(e);if(!c||!c.componentName||c.componentType!=="schemas")return null;const o=`${r}-${m(c.componentName)}`;return await this.catalogEntitiesService.createEntityRelationInLocalDatabase({sourceKey:a,type:"uses",targetKey:o,fileHash:s.hash,sourceVersion:t,targetVersion:t,sourceRevision:n,targetRevision:n}),o}}export{L as AsyncApiEntitiesExtractor};
@@ -1,4 +1,4 @@
1
- import type { FileInfo, LifecycleContext, ProcessContentActions } from '../../../../../types';
1
+ import type { AfterRoutesCreatedActions, FileInfo, LifecycleContext } from '../../../../../types';
2
2
  import type { CatalogEntitiesService } from '../../../database/catalog-entities-service.js';
3
3
  import type { EntityFileSchema } from '@redocly/config';
4
4
  import type { BaseEntitiesExtractor } from '../base';
@@ -10,15 +10,16 @@ export declare abstract class BaseApiEntitiesExtractor<BundledApiDefinition exte
10
10
  protected type: "api-description";
11
11
  protected specType: SpecType;
12
12
  protected fileType: FileType;
13
- protected actions: ProcessContentActions;
13
+ protected actions: AfterRoutesCreatedActions;
14
14
  protected context: LifecycleContext;
15
15
  protected catalogEntitiesService: CatalogEntitiesService;
16
16
  protected fileHashManager: HashManager;
17
17
  protected entitySources: Record<string, string>;
18
18
  constructor(specType: SpecType, params: BaseApiEntitiesExtractorParams);
19
19
  extract(): Promise<void>;
20
+ protected getRbacTeamsForDefinition(relativePath: string): string[];
20
21
  protected abstract loadApiDescriptions(): Promise<BundledApiDefinition[]>;
21
- protected abstract mapApiDescriptionToEntity(definition: BundledApiDefinition, version: string): EntityFileSchema;
22
+ protected abstract mapApiDescriptionToEntity(definition: BundledApiDefinition, version: string, rbacTeams: string[]): EntityFileSchema;
22
23
  protected abstract processApiDescription(definition: BundledApiDefinition, revision: string, version: string, entitiesToRemoveFromFile: Set<string>): Promise<void>;
23
24
  }
24
25
  //# sourceMappingURL=base.d.ts.map