From f0671cf2dd4f80f56e42ca089e0c78b5b639d27f Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 24 Jun 2025 19:40:21 +0800 Subject: [PATCH] fix(server): should check doc public attribute when snapshot not exists (#12913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close CLOUD-232 #### PR Dependency Tree * **PR #12913** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) ## Summary by CodeRabbit - **Bug Fixes** - The visibility status of documents now accurately reflects their public status instead of always showing as private. - **Tests** - Added an end-to-end test to verify correct handling of the public attribute for documents without snapshots. --- .../src/__tests__/e2e/doc/resolver.spec.ts | 41 ++++++++++++++++++- .../src/core/workspaces/resolvers/doc.ts | 4 +- 2 files changed, 43 insertions(+), 2 deletions(-) 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 48285b5d5b..31a98da205 100644 --- a/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts +++ b/packages/backend/server/src/__tests__/e2e/doc/resolver.spec.ts @@ -1,4 +1,10 @@ -import { getRecentlyUpdatedDocsQuery } from '@affine/graphql'; +import { randomUUID } from 'node:crypto'; + +import { + getRecentlyUpdatedDocsQuery, + getWorkspacePageByIdQuery, + publishPageMutation, +} from '@affine/graphql'; import { Mockers } from '../../mocks'; import { app, e2e } from '../test'; @@ -60,3 +66,36 @@ e2e('should get recently updated docs', async t => { t.is(recentlyUpdatedDocs.edges[2].node.id, doc1.docId); t.is(recentlyUpdatedDocs.edges[2].node.title, doc1.title); }); + +e2e( + 'should get doc with public attribute when doc snapshot not exists', + async t => { + const owner = await app.signup(); + + const workspace = await app.create(Mockers.Workspace, { + owner: { id: owner.id }, + }); + + const docId = randomUUID(); + + // default public is false + const result1 = await app.gql({ + query: getWorkspacePageByIdQuery, + variables: { workspaceId: workspace.id, pageId: docId }, + }); + + t.is(result1.workspace.doc.public, false); + + await app.gql({ + query: publishPageMutation, + variables: { workspaceId: workspace.id, pageId: docId }, + }); + + const result2 = await app.gql({ + query: getWorkspacePageByIdQuery, + variables: { workspaceId: workspace.id, pageId: docId }, + }); + + t.is(result2.workspace.doc.public, true); + } +); diff --git a/packages/backend/server/src/core/workspaces/resolvers/doc.ts b/packages/backend/server/src/core/workspaces/resolvers/doc.ts index c3fc04369f..c1b6e2eb5c 100644 --- a/packages/backend/server/src/core/workspaces/resolvers/doc.ts +++ b/packages/backend/server/src/core/workspaces/resolvers/doc.ts @@ -304,11 +304,13 @@ export class WorkspaceDocResolver { await this.tryFixDocOwner(workspace.id, docId); + const isPublic = await this.models.doc.isPublic(workspace.id, docId); + return { docId, workspaceId: workspace.id, mode: PublicDocMode.Page, - public: false, + public: isPublic, defaultRole: DocRole.Manager, }; }