diff --git a/server/models/Document.test.ts b/server/models/Document.test.ts index 70edb539b..b6842acce 100644 --- a/server/models/Document.test.ts +++ b/server/models/Document.test.ts @@ -1,3 +1,4 @@ +import { EmptyResultError } from "sequelize"; import slugify from "@shared/utils/slugify"; import Document from "@server/models/Document"; import { @@ -176,6 +177,34 @@ describe("#findByPk", () => { const response = await Document.findByPk(id); expect(response?.id).toBe(document.id); }); + + it("should test with rejectOnEmpty flag", async () => { + const user = await buildUser(); + const document = await buildDocument({ + teamId: user.teamId, + createdById: user.id, + }); + await expect( + Document.findByPk(document.id, { + userId: user.id, + rejectOnEmpty: true, + }) + ).resolves.not.toBeNull(); + + await expect( + Document.findByPk(document.urlId, { + userId: user.id, + rejectOnEmpty: true, + }) + ).resolves.not.toBeNull(); + + await expect( + Document.findByPk("0e8280ea-7b4c-40e5-98ba-ec8a2f00f5e8", { + userId: user.id, + rejectOnEmpty: true, + }) + ).rejects.toThrow(EmptyResultError); + }); }); describe("tasks", () => { diff --git a/server/models/Document.ts b/server/models/Document.ts index 3c79f2817..8cbaaeff1 100644 --- a/server/models/Document.ts +++ b/server/models/Document.ts @@ -11,6 +11,7 @@ import { FindOptions, ScopeOptions, WhereOptions, + EmptyResultError, } from "sequelize"; import { ForeignKey, @@ -58,6 +59,7 @@ export const DOCUMENT_VERSION = 2; type AdditionalFindOptions = { userId?: string; includeState?: boolean; + rejectOnEmpty?: boolean | Error; }; @DefaultScope(() => ({ @@ -513,22 +515,36 @@ class Document extends ParanoidModel { ]); if (isUUID(id)) { - return scope.findOne({ + const document = await scope.findOne({ where: { id, }, ...rest, + rejectOnEmpty: false, }); + + if (!document && rest.rejectOnEmpty) { + throw new EmptyResultError(`Document doesn't exist with id: ${id}`); + } + + return document; } const match = id.match(SLUG_URL_REGEX); if (match) { - return scope.findOne({ + const document = await scope.findOne({ where: { urlId: match[1], }, ...rest, + rejectOnEmpty: false, }); + + if (!document && rest.rejectOnEmpty) { + throw new EmptyResultError(`Document doesn't exist with id: ${id}`); + } + + return document; } return null;