UNPKG

@exweiv/weiv-data

Version:

Custom API Library for Wix sites to connect MongoDB. Designed to easily switch from wix-data APIs.

91 lines (77 loc) 3.73 kB
import { getOwnerId } from '../Helpers/member_id_helpers'; import { connectionHandler } from '../Helpers/connection_helpers'; import { runDataHook } from '../Hooks/hook_manager'; import { prepareHookContext } from '../Helpers/hook_helpers'; import type { Document } from 'mongodb/mongodb'; import type { CollectionID, Item, BulkInsertResult, WeivDataOptionsWrite } from '@exweiv/weiv-data'; import { validateParams } from '../Helpers/validator'; import { kaptanLogar } from '../Errors/error_manager'; import { convertToStringId, recursivelyConvertIds } from '../Helpers/internal_id_converter'; import { getConvertIdsValue } from '../Config/weiv_data_config'; export async function bulkInsert(collectionId: CollectionID, items: Item[], options?: WeivDataOptionsWrite): Promise<BulkInsertResult<Item>> { try { const { safeItems, safeOptions } = await validateParams<"bulkInsert">( { collectionId, items, options }, ["collectionId", "items"], "bulkInsert" ); const context = prepareHookContext(collectionId); const { suppressAuth, suppressHooks, enableVisitorId, readConcern, convertIds } = { convertIds: getConvertIdsValue(), ...safeOptions }; let ownerId = await getOwnerId(enableVisitorId); let editedItems: Document[] | Promise<Document>[] = safeItems.map(async (item) => { item._updatedDate = new Date(); item._createdDate = new Date(); item._owner = ownerId; if (suppressHooks != true) { let editedItem = await runDataHook<'beforeInsert'>(collectionId, "beforeInsert", [item, context]).catch((err) => { kaptanLogar("00002", `beforeInsert (bulkInsert) Hook Failure ${err}`); }); if (editedItem) { item = editedItem; } } return item; }) editedItems = await Promise.all(editedItems); const writeOperations = editedItems.map((value) => { return { insertOne: { document: value } } }) const { collection } = await connectionHandler(collectionId, suppressAuth); const { insertedIds, insertedCount, ok } = await collection.bulkWrite( writeOperations, { readConcern, ordered: true } ); const insertedItemIds = Object.keys(insertedIds).map((key) => { return convertToStringId(insertedIds[key as any]); }); if (ok) { if (suppressHooks != true) { editedItems = convertIds ? recursivelyConvertIds(editedItems) : editedItems; editedItems = editedItems.map(async (item) => { const editedInsertItem = await runDataHook<'afterInsert'>(collectionId, "afterInsert", [item, context]).catch((err) => { kaptanLogar("00003", `afterInsert (bulkInsert) Hook Failure ${err}`); }); if (editedInsertItem) { return editedInsertItem; } else { return item; } }) editedItems = await Promise.all(editedItems); } return { insertedItems: convertIds ? recursivelyConvertIds(editedItems) : editedItems, inserted: insertedCount, insertedItemIds, }; } else { kaptanLogar("00016", `one or more items failed to be inserted`); } } catch (err) { kaptanLogar("00016", `when inserting items using bulkInsert: ${err}`); } }