From a77d2056f4b0f0bfc374cec71bdd9db899dc16ed Mon Sep 17 00:00:00 2001 From: Ivatra Date: Wed, 27 Dec 2023 09:27:22 +0700 Subject: [PATCH 1/2] [ADD] params.args spread --- src/lib/actionMiddleware.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/actionMiddleware.ts b/src/lib/actionMiddleware.ts index b42d2a3..1be67e6 100644 --- a/src/lib/actionMiddleware.ts +++ b/src/lib/actionMiddleware.ts @@ -53,6 +53,7 @@ function createDeleteParams( ...params, action: "update", args: { + ...params.args, __passUpdateThrough: true, [field]: createValue(true), }, @@ -63,6 +64,7 @@ function createDeleteParams( ...params, action: "update", args: { + ...params.args, where: params.args?.where || params.args, data: { [field]: createValue(true), From c45166b2cf99f882239e25225ce51de83829f099 Mon Sep 17 00:00:00 2001 From: Olivier Wilkinson Date: Mon, 15 Jan 2024 09:18:41 +0000 Subject: [PATCH 2/2] fix: adjust spreading of args in delete params --- src/lib/actionMiddleware.ts | 15 ++++++++++-- test/unit/include.test.ts | 43 ++++++++++++++++++++++++++++++--- test/unit/select.test.ts | 40 +++++++++++++++++++++++++++++- test/unit/utils/createParams.ts | 2 +- 4 files changed, 93 insertions(+), 7 deletions(-) diff --git a/src/lib/actionMiddleware.ts b/src/lib/actionMiddleware.ts index 1be67e6..fd5552b 100644 --- a/src/lib/actionMiddleware.ts +++ b/src/lib/actionMiddleware.ts @@ -53,19 +53,30 @@ function createDeleteParams( ...params, action: "update", args: { - ...params.args, __passUpdateThrough: true, [field]: createValue(true), }, }; } + if (!!params.scope) { + return { + ...params, + action: "update", + args: { + where: params.args, + data: { + [field]: createValue(true), + }, + }, + }; + } + return { ...params, action: "update", args: { ...params.args, - where: params.args?.where || params.args, data: { [field]: createValue(true), }, diff --git a/test/unit/include.test.ts b/test/unit/include.test.ts index 5f73339..dba2a3d 100644 --- a/test/unit/include.test.ts +++ b/test/unit/include.test.ts @@ -2,7 +2,7 @@ import { set } from "lodash"; import faker from "faker"; import { createSoftDeleteMiddleware } from "../../src"; -import { createParams } from "./utils/createParams"; +import { createParams, ActionByModel } from "./utils/createParams"; describe("include", () => { it("does not change include params if model is not in the list", async () => { @@ -21,6 +21,44 @@ describe("include", () => { expect(next).toHaveBeenCalledWith(params); }); + it.each([ + "delete", + "update", + "upsert", + "findFirst", + "findFirstOrThrow", + "findUnique", + "findUniqueOrThrow", + "findMany", + ] as Array>)( + "can include records for configured models in %s", + async (action) => { + const middleware = createSoftDeleteMiddleware({ + models: { User: true }, + }); + + const params = createParams("User", action, { + where: { id: 1 }, + include: { + comments: true, + }, + }); + + const next = jest.fn(() => + Promise.resolve({ + comments: [{ deleted: true }, { deleted: false }], + }) + ); + + await middleware(params, next); + + // @ts-expect-error - ts doesn't know there has been a call + expect(next.mock.calls[0][0]?.args?.include).toEqual({ + comments: true, + }); + } + ); + it("uses params to exclude deleted records from toMany includes", async () => { const middleware = createSoftDeleteMiddleware({ models: { Comment: true }, @@ -138,7 +176,7 @@ describe("include", () => { expect(next).toHaveBeenCalledWith(params); expect(result).toEqual({ author: null }); }); - + it("does not manually exclude non-deleted records from toOne include with nested includes", async () => { const middleware = createSoftDeleteMiddleware({ models: { User: true }, @@ -263,7 +301,6 @@ describe("include", () => { }); }); - it("allows explicitly including deleted records using include", async () => { const middleware = createSoftDeleteMiddleware({ models: { Comment: true }, diff --git a/test/unit/select.test.ts b/test/unit/select.test.ts index 82634fe..b0ebdc1 100644 --- a/test/unit/select.test.ts +++ b/test/unit/select.test.ts @@ -2,7 +2,7 @@ import { set } from "lodash"; import faker from "faker"; import { createSoftDeleteMiddleware } from "../../src"; -import { createParams } from "./utils/createParams"; +import { ActionByModel, createParams } from "./utils/createParams"; describe("select", () => { it("does not change select params if model is not in the list", async () => { @@ -21,6 +21,44 @@ describe("select", () => { expect(next).toHaveBeenCalledWith(params); }); + it.each([ + "delete", + "update", + "upsert", + "findFirst", + "findFirstOrThrow", + "findUnique", + "findUniqueOrThrow", + "findMany", + ] as Array>)( + "can select records for configured models in %s", + async (action) => { + const middleware = createSoftDeleteMiddleware({ + models: { User: true }, + }); + + const params = createParams("User", action, { + where: { id: 1 }, + select: { + comments: true, + }, + }); + + const next = jest.fn(() => + Promise.resolve({ + comments: [{ deleted: true }, { deleted: false }], + }) + ); + + await middleware(params, next); + + // @ts-expect-error - ts doesn't know there has been a call + expect(next.mock.calls[0][0]?.args?.select).toEqual({ + comments: true, + }); + } + ); + it("excludes deleted records from selects", async () => { const middleware = createSoftDeleteMiddleware({ models: { Comment: true }, diff --git a/test/unit/utils/createParams.ts b/test/unit/utils/createParams.ts index b3d2655..f9dc3cd 100644 --- a/test/unit/utils/createParams.ts +++ b/test/unit/utils/createParams.ts @@ -30,7 +30,7 @@ type IncludeByModel = Model extends "User" ? Prisma.CommentInclude : never; -type ActionByModel = +export type ActionByModel = | keyof DelegateByModel | "connectOrCreate" | "select"