diff --git a/src/lib/actionMiddleware.ts b/src/lib/actionMiddleware.ts index b42d2a3..fd5552b 100644 --- a/src/lib/actionMiddleware.ts +++ b/src/lib/actionMiddleware.ts @@ -59,11 +59,24 @@ function createDeleteParams( }; } + if (!!params.scope) { + return { + ...params, + action: "update", + args: { + where: params.args, + data: { + [field]: createValue(true), + }, + }, + }; + } + return { ...params, action: "update", args: { - where: params.args?.where || params.args, + ...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"