From 40c6a732eb3429d6525bab73a219ee477df2158d Mon Sep 17 00:00:00 2001 From: Sergei Samokhvalov Date: Thu, 14 Nov 2024 11:55:55 +0300 Subject: [PATCH] Add new methods for make collections and workbooks map (#205) * Add new method for make map collections and workbooks * Refactor * Refactor --- api/services.ts | 7 +- .../new/collection/delete-collections.ts | 33 ++------ .../new/collection/utils/get-parents.ts | 83 +++++++++++++++++++ .../new/workbook/get-workbooks-list-by-ids.ts | 38 +-------- 4 files changed, 98 insertions(+), 63 deletions(-) diff --git a/api/services.ts b/api/services.ts index 614ce9a4..8d576223 100644 --- a/api/services.ts +++ b/api/services.ts @@ -8,7 +8,12 @@ export { } from '../src/services/entry/actions/get-related-entries'; export {getCollection} from '../src/services/new/collection/get-collection'; -export {getParentIds} from '../src/services/new/collection/utils/get-parents'; +export { + getParentIds, + makeWorkbooksWithParentsMap, + makeCollectionsWithParentsMap, +} from '../src/services/new/collection/utils/get-parents'; + export {getWorkbook, createWorkbook, setWorkbookIsTemplate} from '../src/services/new/workbook'; export {checkWorkbookPermission} from '../src/services/new/workbook/utils/check-workbook-permission'; export {copyEntriesToWorkbook} from '../src/services/new/entry'; diff --git a/src/services/new/collection/delete-collections.ts b/src/services/new/collection/delete-collections.ts index 88b3ceb2..42524462 100644 --- a/src/services/new/collection/delete-collections.ts +++ b/src/services/new/collection/delete-collections.ts @@ -11,9 +11,7 @@ import {CollectionPermission} from '../../../entities/collection'; import {AppError} from '@gravity-ui/nodekit'; import {getCollectionsListByIds} from './get-collections-list-by-ids'; import {markCollectionsAsDeleted} from './utils/mark-collections-as-deleted'; -import {getParents, getParentsIdsFromMap} from './utils'; -import {registry} from '../../../registry'; -import {CollectionInstance} from '../../../registry/common/entities/collection/types'; +import {makeCollectionsWithParentsMap} from './utils'; const validateArgs = makeSchemaValidator({ type: 'object', @@ -89,31 +87,10 @@ export const deleteCollections = async ( const collectionsForDeleteIds = collectionsForDelete.map((item) => item.collectionId); - const collectionsMap = new Map(); - - const parents = await getParents({ - ctx, - trx: getReplica(trx), - collectionIds: collectionsForDeleteIds, - }); - - const parentsMap = new Map>(); - - parents.forEach((parent: CollectionModel) => { - parentsMap.set(parent.collectionId, parent.parentId); - }); - - const {Collection} = registry.common.classes.get(); - - collectionsForDelete.forEach((model) => { - const parentId = model.parentId; - - const parentsForCollection = getParentsIdsFromMap(parentId, parentsMap); - - const collection = new Collection({ctx, model}); - - collectionsMap.set(collection, parentsForCollection); - }); + const collectionsMap = await makeCollectionsWithParentsMap( + {ctx, trx}, + {models: collectionsForDelete}, + ); const workbooksForDelete = await WorkbookModel.query(getReplica(trx)) .select() diff --git a/src/services/new/collection/utils/get-parents.ts b/src/services/new/collection/utils/get-parents.ts index 446652d8..f694f9ba 100644 --- a/src/services/new/collection/utils/get-parents.ts +++ b/src/services/new/collection/utils/get-parents.ts @@ -2,6 +2,11 @@ import {TransactionOrKnex} from 'objection'; import {AppContext} from '@gravity-ui/nodekit'; import {getReplica} from '../../utils'; import {CollectionModel, CollectionModelColumn} from '../../../../db/models/new/collection'; +import {WorkbookInstance} from '../../../../registry/common/entities/workbook/types'; +import {CollectionInstance} from '../../../../registry/common/entities/collection/types'; +import {ServiceArgs} from '../../types'; +import {registry} from '../../../../registry'; +import {WorkbookModel} from '../../../../db/models/new/workbook'; interface Ctx { ctx: AppContext; @@ -93,3 +98,81 @@ export const getParentsIdsFromMap = ( return arr; }; + +const makeParentsMap = (collectionModels: CollectionModel[]) => { + const parentsMap = new Map>(); + + collectionModels.forEach((parent: CollectionModel) => { + parentsMap.set(parent.collectionId, parent.parentId); + }); + + return parentsMap; +}; + +export const makeWorkbooksWithParentsMap = async ( + {trx, ctx}: ServiceArgs, + { + models, + }: { + models: WorkbookModel[]; + }, +): Promise> => { + const workbooksWithParentsMap = new Map(); + const collectionIds = models.map((item) => item.collectionId).filter((item) => Boolean(item)); + + const parents = await getParents({ + ctx, + trx: getReplica(trx), + collectionIds, + }); + + const parentsMap = makeParentsMap(parents); + + const {Workbook} = registry.common.classes.get(); + + models.forEach((model) => { + const collectionId = model.collectionId; + + const parentsForWorkbook = getParentsIdsFromMap(collectionId, parentsMap); + + const workbook = new Workbook({ctx, model}); + + workbooksWithParentsMap.set(workbook, parentsForWorkbook); + }); + + return workbooksWithParentsMap; +}; + +export const makeCollectionsWithParentsMap = async ( + {ctx, trx}: ServiceArgs, + { + models, + }: { + models: CollectionModel[]; + }, +): Promise> => { + const collectionsWithParentsMap = new Map(); + const collectionIds = models.map((item) => item.collectionId).filter((item) => Boolean(item)); + + const parents = await getParents({ + ctx, + trx: getReplica(trx), + collectionIds, + }); + + const parentsMap = makeParentsMap(parents); + + const {Collection} = registry.common.classes.get(); + + models.forEach((model) => { + const parentId = model.parentId; + + const parentsForCollection = getParentsIdsFromMap(parentId, parentsMap); + + const collection = new Collection({ctx, model}); + + collectionsWithParentsMap.set(collection, parentsForCollection); + }); + + return collectionsWithParentsMap; +}; diff --git a/src/services/new/workbook/get-workbooks-list-by-ids.ts b/src/services/new/workbook/get-workbooks-list-by-ids.ts index 7317d85b..3a2c312c 100644 --- a/src/services/new/workbook/get-workbooks-list-by-ids.ts +++ b/src/services/new/workbook/get-workbooks-list-by-ids.ts @@ -5,13 +5,12 @@ import {getReplica} from '../utils'; import Utils from '../../../utils'; import {registry} from '../../../registry'; -import {getParents, getParentsIdsFromMap} from '../collection/utils'; +import {makeWorkbooksWithParentsMap} from '../collection/utils'; import {WorkbookPermission} from '../../../entities/workbook'; import {Feature, isEnabledFeature} from '../../../components/features'; -import {CollectionModel} from '../../../db/models/new/collection'; import {WorkbookInstance} from '../../../registry/common/entities/workbook/types'; const validateArgs = makeSchemaValidator({ @@ -76,41 +75,12 @@ export const getWorkbooksListByIds = async ( return workbookList.map((model) => new Workbook({ctx, model})); } - const collectionIds = workbookList - .map((workbook) => workbook.collectionId) - .filter((item) => Boolean(item)); - - const parents = await getParents({ - ctx, - trx: targetTrx, - collectionIds, - }); - - const workbooksMap = new Map(); + const workbooksMap = await makeWorkbooksWithParentsMap({ctx, trx}, {models: workbookList}); const acceptedWorkbooksMap = new Map(); - const parentsMap = new Map>(); - - parents.forEach((parent: CollectionModel) => { - parentsMap.set(parent.collectionId, parent.parentId); - }); - - workbookList.forEach((model) => { - const collectionId = model.collectionId; - - const parentsforWorkbook = getParentsIdsFromMap(collectionId, parentsMap); - - workbooksMap.set(model, parentsforWorkbook); - }); - const checkPermissionPromises: Promise[] = []; - workbooksMap.forEach((parentIds, workbookModel) => { - const workbook = new Workbook({ - ctx, - model: workbookModel, - }); - + workbooksMap.forEach((parentIds, workbook) => { const promise = workbook .checkPermission({ parentIds, @@ -119,7 +89,7 @@ export const getWorkbooksListByIds = async ( : WorkbookPermission.View, }) .then(() => { - acceptedWorkbooksMap.set(workbookModel, parentIds); + acceptedWorkbooksMap.set(workbook.model, parentIds); return workbook; })