diff --git a/CHANGELOG.md b/CHANGELOG.md index 8967106..765fe2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## [0.5.19](https://github.com/dennemark/prisma-extension-casl/compare/0.5.18...0.5.19) (2024-09-20) + + +### Bug Fixes + +* :bug: retransform data query on updateMany query ([a327b0e](https://github.com/dennemark/prisma-extension-casl/commit/a327b0e7d8f5b8987fd18281cc5330f5ab29d8b9)) + ## [0.5.18](https://github.com/dennemark/prisma-extension-casl/compare/0.5.17...0.5.18) (2024-09-19) diff --git a/dist/index.js b/dist/index.js index 01f98e6..a3ccb9f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1204,6 +1204,38 @@ function getNestedQueryRelations(args, abilities, action, model, creationSelectQ return queryRelations; } +// src/transformDataToWhereQuery.ts +function transformDataToWhereQuery(args, model) { + ; + ["connect", "disconnect"].forEach((action) => { + Object.entries(args.data).forEach(([relation, obj]) => { + if (typeof obj === "object" && !Array.isArray(obj) && obj[action]) { + const ANDArgs = { AND: [...obj[action].AND ?? [], ...args.where[relation]?.AND ?? []] }; + const relationTo = relationFieldsByModel[model][relation].relationToFields?.[0]; + const relationFrom = relationFieldsByModel[model][relation].relationFromFields?.[0]; + if (!relationTo || !relationFrom) { + throw new Error("Cannot find correct relations to transform updateMany to casl query."); + } + args.where = { + ...args.where ?? {}, + [relation]: { + ...args.where[relation] ?? {}, + ...obj[action], + ...ANDArgs.AND.length > 0 ? ANDArgs : {} + } + }; + args.data = { + ...args.data, + [relationFrom]: obj[action][relationTo] + }; + delete args.data[relation]; + delete args.where[relation][relationTo]; + } + }); + }); + return args; +} + // src/applyCaslToQuery.ts function applyCaslToQuery(operation, args, abilities, model) { const operationAbility = caslOperationDict[operation]; @@ -1213,6 +1245,9 @@ function applyCaslToQuery(operation, args, abilities, model) { const { args: dataArgs, creationTree: dataCreationTree } = applyDataQuery(abilities, args.data, operationAbility.action, model); creationTree = dataCreationTree; args.data = dataArgs; + if (operation === "updateMany") { + args = transformDataToWhereQuery(args, model); + } } if (operationAbility.whereQuery) { args = applyWhereQuery(abilities, args, operationAbility.action, model); diff --git a/dist/index.mjs b/dist/index.mjs index 57acbd8..827fdcd 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1179,6 +1179,38 @@ function getNestedQueryRelations(args, abilities, action, model, creationSelectQ return queryRelations; } +// src/transformDataToWhereQuery.ts +function transformDataToWhereQuery(args, model) { + ; + ["connect", "disconnect"].forEach((action) => { + Object.entries(args.data).forEach(([relation, obj]) => { + if (typeof obj === "object" && !Array.isArray(obj) && obj[action]) { + const ANDArgs = { AND: [...obj[action].AND ?? [], ...args.where[relation]?.AND ?? []] }; + const relationTo = relationFieldsByModel[model][relation].relationToFields?.[0]; + const relationFrom = relationFieldsByModel[model][relation].relationFromFields?.[0]; + if (!relationTo || !relationFrom) { + throw new Error("Cannot find correct relations to transform updateMany to casl query."); + } + args.where = { + ...args.where ?? {}, + [relation]: { + ...args.where[relation] ?? {}, + ...obj[action], + ...ANDArgs.AND.length > 0 ? ANDArgs : {} + } + }; + args.data = { + ...args.data, + [relationFrom]: obj[action][relationTo] + }; + delete args.data[relation]; + delete args.where[relation][relationTo]; + } + }); + }); + return args; +} + // src/applyCaslToQuery.ts function applyCaslToQuery(operation, args, abilities, model) { const operationAbility = caslOperationDict[operation]; @@ -1188,6 +1220,9 @@ function applyCaslToQuery(operation, args, abilities, model) { const { args: dataArgs, creationTree: dataCreationTree } = applyDataQuery(abilities, args.data, operationAbility.action, model); creationTree = dataCreationTree; args.data = dataArgs; + if (operation === "updateMany") { + args = transformDataToWhereQuery(args, model); + } } if (operationAbility.whereQuery) { args = applyWhereQuery(abilities, args, operationAbility.action, model); diff --git a/package.json b/package.json index 8603ba2..cbd9378 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-extension-casl", - "version": "0.5.18", + "version": "0.5.19", "description": "Enforce casl abilities on prisma client ", "main": "dist/index.js", "types": "dist/index.d.ts",