-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ feat(documents): manage document categories, find single document (#…
…762) * chore: add graphql queries * chore: update domain models * chore: add document categories to repo, find documents * chore: add categories to services * chore: lint * chore: cover error cases for delete
- Loading branch information
Showing
20 changed files
with
928 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
src/graphql/documents/resolvers/DeleteDocumentCategoryResponse.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
import type { DeleteDocumentCategoryResponseResolvers } from "./../../types.generated.js"; | ||
export const DeleteDocumentCategoryResponse: DeleteDocumentCategoryResponseResolvers = | ||
{ | ||
/* Implement DeleteDocumentCategoryResponse resolver logic here */ | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
import type { DocumentCategoryResponseResolvers } from "./../../types.generated.js"; | ||
export const DocumentCategoryResponse: DocumentCategoryResponseResolvers = { | ||
/* Implement DocumentCategoryResponse resolver logic here */ | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
import type { DocumentResponseResolvers } from "./../../types.generated.js"; | ||
export const DocumentResponse: DocumentResponseResolvers = { | ||
/* Implement DocumentResponse resolver logic here */ | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import type { QueryResolvers } from "./../../../types.generated.js"; | ||
export const document: NonNullable<QueryResolvers["document"]> = async ( | ||
_parent, | ||
{ data }, | ||
ctx, | ||
) => { | ||
const result = await ctx.documents.documents.find(ctx, { id: data.id }); | ||
if (!result.ok) { | ||
switch (result.error.name) { | ||
case "NotFoundError": | ||
case "PermissionDeniedError": | ||
case "UnauthorizedError": | ||
return { | ||
document: null, | ||
}; | ||
default: | ||
throw result.error; | ||
} | ||
} | ||
return { | ||
document: result.data.document, | ||
}; | ||
}; |
156 changes: 156 additions & 0 deletions
156
src/graphql/documents/resolvers/Query/document.unit.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
import { faker } from "@faker-js/faker"; | ||
import { Document } from "~/domain/documents.js"; | ||
import { | ||
InternalServerError, | ||
NotFoundError, | ||
PermissionDeniedError, | ||
UnauthorizedError, | ||
} from "~/domain/errors.js"; | ||
import { createMockApolloServer } from "~/graphql/test-clients/mock-apollo-server.js"; | ||
import { graphql } from "~/graphql/test-clients/unit/gql.js"; | ||
import { Result } from "~/lib/result.js"; | ||
|
||
describe("Document queries", () => { | ||
describe("{ document }", () => { | ||
it("returns a document", async () => { | ||
const { documents, client } = createMockApolloServer(); | ||
|
||
const expected = new Document({ | ||
id: faker.string.uuid(), | ||
createdAt: new Date(), | ||
fileId: faker.string.uuid(), | ||
name: faker.word.adjective(), | ||
updatedAt: new Date(), | ||
categories: [], | ||
description: faker.lorem.paragraph(), | ||
}); | ||
|
||
documents.documents.find.mockResolvedValue({ | ||
ok: true, | ||
data: { | ||
document: expected, | ||
}, | ||
}); | ||
|
||
const { data, errors } = await client.query({ | ||
query: graphql(` | ||
query Document { | ||
document(data: { id: "123"}) { | ||
document { | ||
id | ||
} | ||
} | ||
} | ||
`), | ||
}); | ||
|
||
expect(errors).toBeUndefined(); | ||
expect(data).toEqual({ | ||
document: { | ||
document: { | ||
id: expected.id, | ||
}, | ||
}, | ||
}); | ||
}); | ||
|
||
it("returns null if not found", async () => { | ||
const { documents, client } = createMockApolloServer(); | ||
documents.documents.find.mockResolvedValue( | ||
Result.error(new NotFoundError("")), | ||
); | ||
|
||
const { data, errors } = await client.query({ | ||
query: graphql(` | ||
query Document { | ||
document(data: { id: "123"}) { | ||
document { | ||
id | ||
} | ||
} | ||
} | ||
`), | ||
}); | ||
|
||
expect(errors).toBeUndefined(); | ||
expect(data).toEqual({ | ||
document: { | ||
document: null, | ||
}, | ||
}); | ||
}); | ||
|
||
it("returns null on unauthorized error", async () => { | ||
const { documents, client } = createMockApolloServer(); | ||
documents.documents.find.mockResolvedValue( | ||
Result.error(new UnauthorizedError("")), | ||
); | ||
|
||
const { data, errors } = await client.query({ | ||
query: graphql(` | ||
query Document { | ||
document(data: { id: "123"}) { | ||
document { | ||
id | ||
} | ||
} | ||
} | ||
`), | ||
}); | ||
|
||
expect(errors).toBeUndefined(); | ||
expect(data).toEqual({ | ||
document: { | ||
document: null, | ||
}, | ||
}); | ||
}); | ||
|
||
it("returns null on permission denied", async () => { | ||
const { documents, client } = createMockApolloServer(); | ||
documents.documents.find.mockResolvedValue( | ||
Result.error(new PermissionDeniedError("")), | ||
); | ||
|
||
const { data, errors } = await client.query({ | ||
query: graphql(` | ||
query Document { | ||
document(data: { id: "123"}) { | ||
document { | ||
id | ||
} | ||
} | ||
} | ||
`), | ||
}); | ||
|
||
expect(errors).toBeUndefined(); | ||
expect(data).toEqual({ | ||
document: { | ||
document: null, | ||
}, | ||
}); | ||
}); | ||
|
||
it("throws on internal server error", async () => { | ||
const { documents, client } = createMockApolloServer(); | ||
documents.documents.find.mockResolvedValue( | ||
Result.error(new InternalServerError("something went wrong")), | ||
); | ||
|
||
const { errors } = await client.query({ | ||
query: graphql(` | ||
query Document { | ||
document(data: { id: "123"}) { | ||
document { | ||
id | ||
} | ||
} | ||
} | ||
`), | ||
}); | ||
|
||
expect(errors).toBeDefined(); | ||
}); | ||
}); | ||
}); |
21 changes: 21 additions & 0 deletions
21
src/graphql/documents/resolvers/Query/documentCategories.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import type { QueryResolvers } from "./../../../types.generated.js"; | ||
export const documentCategories: NonNullable< | ||
QueryResolvers["documentCategories"] | ||
> = async (_parent, _arg, ctx) => { | ||
const result = await ctx.documents.categories.findMany(ctx); | ||
|
||
if (!result.ok) { | ||
switch (result.error.name) { | ||
case "PermissionDeniedError": | ||
case "UnauthorizedError": | ||
return { | ||
categories: [], | ||
total: 0, | ||
}; | ||
default: | ||
throw result.error; | ||
} | ||
} | ||
|
||
return result.data; | ||
}; |
Oops, something went wrong.