UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

71 lines (69 loc) 3.25 kB
import { ItemsService } from "../../services/items.js"; import { sanitizeQuery } from "../../utils/sanitize-query.js"; import { getAccountabilityForRole } from "../../utils/get-accountability-for-role.js"; import { InvalidPayloadError } from "@directus/errors"; import { optionToObject, toArray } from "@directus/utils"; import { isEmpty, isNil } from "lodash-es"; import { z as z$1 } from "zod"; import { defineOperationApi } from "@directus/extensions"; //#region src/operations/item-update/index.ts const inputSchema = z$1.object({ keys: z$1.array(z$1.union([z$1.string(), z$1.number()])).nullable(), query: z$1.record(z$1.string(), z$1.any()).nullable(), payload: z$1.union([z$1.record(z$1.string(), z$1.any()), z$1.array(z$1.record(z$1.string(), z$1.any()))]).nullable() }); var item_update_default = defineOperationApi({ id: "item-update", handler: async ({ collection, key, payload, query, emitEvents, permissions }, { accountability, database, getSchema }) => { const payloadObject = optionToObject(payload) ?? null; const queryObject = query ? optionToObject(query) : null; const keys = isNil(key) || key === "" ? null : toArray(key); const validation = inputSchema.safeParse({ keys, query: queryObject, payload: payloadObject }); if (!validation.success) throw new InvalidPayloadError({ reason: validation.error.issues[0]?.message ?? "Invalid input" }); const isBatch = Array.isArray(payloadObject); const hasKeys = keys !== null && keys.length > 0; const hasQuery = queryObject !== null && Object.keys(queryObject).length > 0; if (hasKeys && hasQuery) throw new InvalidPayloadError({ reason: "Cannot use both \"key\" and \"query\"" }); if (isBatch && (hasKeys || hasQuery)) throw new InvalidPayloadError({ reason: "Cannot use \"key\" or \"query\" with a batch payload" }); if (!payloadObject || isEmpty(payloadObject) || !isBatch && !hasKeys && !hasQuery) return null; const schema = await getSchema({ database }); let customAccountability; if (!permissions || permissions === "$trigger") customAccountability = accountability; else if (permissions === "$full") customAccountability = await getAccountabilityForRole("system", { database, schema, accountability }); else if (permissions === "$public") customAccountability = await getAccountabilityForRole(null, { database, schema, accountability }); else customAccountability = await getAccountabilityForRole(permissions, { database, schema, accountability }); const itemsService = new ItemsService(collection, { schema, accountability: customAccountability, knex: database }); let result = null; if (isBatch) result = await itemsService.updateBatch(payloadObject, { emitEvents: !!emitEvents }); else if (hasQuery) { const sanitizedQueryObject = await sanitizeQuery(queryObject, schema, customAccountability); result = await itemsService.updateByQuery(sanitizedQueryObject, payloadObject, { emitEvents: !!emitEvents }); } else if (hasKeys) { const updated = await itemsService.updateMany(keys, payloadObject, { emitEvents: !!emitEvents }); result = keys.length === 1 ? keys[0] : updated; } return result; } }); //#endregion export { item_update_default as default };