diff --git a/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts b/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts index 31a98da205..70e1e4ea47 100644 --- a/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts +++ b/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts @@ -99,3 +99,56 @@ e2e( t.is(result2.workspace.doc.public, true); } ); + +e2e('should get doc with title and summary', async t => { + const owner = await app.signup(); + + const workspace = await app.create(Mockers.Workspace, { + owner: { id: owner.id }, + }); + + const docSnapshot = await app.create(Mockers.DocSnapshot, { + workspaceId: workspace.id, + user: owner, + }); + const doc = await app.create(Mockers.DocMeta, { + workspaceId: workspace.id, + docId: docSnapshot.id, + title: 'doc1', + summary: 'summary1', + }); + + const result = await app.gql({ + query: getWorkspacePageByIdQuery, + variables: { workspaceId: workspace.id, pageId: doc.docId }, + }); + + t.is(result.workspace.doc.title, doc.title); + t.is(result.workspace.doc.summary, doc.summary); +}); + +e2e('should get doc with title and null summary', async t => { + const owner = await app.signup(); + + const workspace = await app.create(Mockers.Workspace, { + owner: { id: owner.id }, + }); + + const docSnapshot = await app.create(Mockers.DocSnapshot, { + workspaceId: workspace.id, + user: owner, + }); + const doc = await app.create(Mockers.DocMeta, { + workspaceId: workspace.id, + docId: docSnapshot.id, + title: 'doc1', + }); + + const result = await app.gql({ + query: getWorkspacePageByIdQuery, + variables: { workspaceId: workspace.id, pageId: doc.docId }, + }); + + t.is(result.workspace.doc.title, doc.title); + t.is(result.workspace.doc.summary, null); +}); diff --git a/packages/backend/server/src/__tests__/models/doc.spec.ts b/packages/backend/server/src/__tests__/models/doc.spec.ts index d47e089e5f..1d3b379529 100644 --- a/packages/backend/server/src/__tests__/models/doc.spec.ts +++ b/packages/backend/server/src/__tests__/models/doc.spec.ts @@ -669,7 +669,10 @@ test('should get doc info', async t => { }; await t.context.doc.upsert(snapshot); - await t.context.doc.upsertMeta(workspace.id, docId); + await t.context.doc.upsertMeta(workspace.id, docId, { + title: 'test title', + summary: 'test summary', + }); const docInfo = await t.context.doc.getDocInfo(workspace.id, docId); @@ -679,6 +682,8 @@ test('should get doc info', async t => { updatedAt: new Date(snapshot.timestamp), creatorId: user.id, lastUpdaterId: user.id, + title: 'test title', + summary: 'test summary', }); }); diff --git a/packages/backend/server/src/core/workspaces/resolvers/doc.ts b/packages/backend/server/src/core/workspaces/resolvers/doc.ts index c1b6e2eb5c..bd480e9727 100644 --- a/packages/backend/server/src/core/workspaces/resolvers/doc.ts +++ b/packages/backend/server/src/core/workspaces/resolvers/doc.ts @@ -79,6 +79,9 @@ class DocType { @Field(() => String, { nullable: true }) title?: string | null; + + @Field(() => String, { nullable: true }) + summary?: string | null; } @InputType() @@ -250,10 +253,11 @@ export class WorkspaceDocResolver { deprecationReason: 'use [WorkspaceType.doc] instead', }) async publicPage( + @CurrentUser() me: CurrentUser, @Parent() workspace: WorkspaceType, @Args('pageId') pageId: string ) { - return this.doc(workspace, pageId); + return this.doc(me, workspace, pageId); } @ResolveField(() => PaginatedDocType) @@ -294,11 +298,14 @@ export class WorkspaceDocResolver { complexity: 2, }) async doc( + @CurrentUser() me: CurrentUser, @Parent() workspace: WorkspaceType, @Args('docId') docId: string ): Promise { const doc = await this.models.doc.getDocInfo(workspace.id, docId); if (doc) { + // check if doc is readable + await this.ac.user(me.id).doc(workspace.id, docId).assert('Doc.Read'); return doc; } diff --git a/packages/backend/server/src/models/doc.ts b/packages/backend/server/src/models/doc.ts index 8e611da29c..dd2d0588c2 100644 --- a/packages/backend/server/src/models/doc.ts +++ b/packages/backend/server/src/models/doc.ts @@ -558,6 +558,8 @@ export class DocModel extends BaseModel { mode: PublicDocMode; public: boolean; defaultRole: DocRole; + title: string | null; + summary: string | null; createdAt: Date; updatedAt: Date; creatorId?: string; @@ -570,6 +572,8 @@ export class DocModel extends BaseModel { "workspace_pages"."mode" as "mode", "workspace_pages"."public" as "public", "workspace_pages"."defaultRole" as "defaultRole", + "workspace_pages"."title" as "title", + "workspace_pages"."summary" as "summary", "snapshots"."created_at" as "createdAt", "snapshots"."updated_at" as "updatedAt", "snapshots"."created_by" as "creatorId", diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index e3e70f260a..08adb84d1a 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -595,6 +595,7 @@ type DocType { mode: PublicDocMode! permissions: DocPermissions! public: Boolean! + summary: String title: String updatedAt: DateTime workspaceId: String! diff --git a/packages/common/graphql/src/graphql/get-workspace-page-by-id.gql b/packages/common/graphql/src/graphql/get-workspace-page-by-id.gql index d42a425d36..55080cac26 100644 --- a/packages/common/graphql/src/graphql/get-workspace-page-by-id.gql +++ b/packages/common/graphql/src/graphql/get-workspace-page-by-id.gql @@ -5,6 +5,8 @@ query getWorkspacePageById($workspaceId: String!, $pageId: String!) { mode defaultRole public + title + summary } } } diff --git a/packages/common/graphql/src/graphql/index.ts b/packages/common/graphql/src/graphql/index.ts index a81b0b3596..c9413d19b7 100644 --- a/packages/common/graphql/src/graphql/index.ts +++ b/packages/common/graphql/src/graphql/index.ts @@ -1584,6 +1584,8 @@ export const getWorkspacePageByIdQuery = { mode defaultRole public + title + summary } } }`, diff --git a/packages/common/graphql/src/schema.ts b/packages/common/graphql/src/schema.ts index e29422cfe9..46ae300198 100644 --- a/packages/common/graphql/src/schema.ts +++ b/packages/common/graphql/src/schema.ts @@ -703,6 +703,7 @@ export interface DocType { mode: PublicDocMode; permissions: DocPermissions; public: Scalars['Boolean']['output']; + summary: Maybe; title: Maybe; updatedAt: Maybe; workspaceId: Scalars['String']['output']; @@ -5147,6 +5148,8 @@ export type GetWorkspacePageByIdQuery = { mode: PublicDocMode; defaultRole: DocRole; public: boolean; + title: string | null; + summary: string | null; }; }; };