fix(editor): update doc role instead of workspace role when invite in mention panel (#11588)

Close [BS-3048: mention 时检测的是文档权限不是 workspace 权限](https://linear.app/affine-design/issue/BS-3048/mention-时检测的是文档权限不是-workspace-权限)
This commit is contained in:
Flrande
2025-04-10 05:52:38 +00:00
parent 0302bd43cb
commit 0ce5a9544b
5 changed files with 52 additions and 12 deletions

View File

@@ -2,11 +2,12 @@ import { type Framework } from '@toeverything/infra';
import { WorkspaceServerService } from '../cloud';
import { WorkspaceDialogService } from '../dialogs';
import { DocsService } from '../doc';
import { DocScope, DocsService } from '../doc';
import { DocDisplayMetaService } from '../doc-display-meta';
import { EditorSettingService } from '../editor-setting';
import { JournalService } from '../journal';
import { GuardService, MemberSearchService } from '../permissions';
import { DocGrantedUsersService } from '../permissions/services/doc-granted-users';
import { SearchMenuService } from '../search-menu/services';
import { WorkspaceScope } from '../workspace';
import { AtMenuConfigService } from './services';
@@ -14,6 +15,7 @@ import { AtMenuConfigService } from './services';
export function configAtMenuConfigModule(framework: Framework) {
framework
.scope(WorkspaceScope)
.scope(DocScope)
.service(AtMenuConfigService, [
JournalService,
DocDisplayMetaService,
@@ -24,5 +26,6 @@ export function configAtMenuConfigModule(framework: Framework) {
WorkspaceServerService,
MemberSearchService,
GuardService,
DocGrantedUsersService,
]);
}

View File

@@ -1,6 +1,10 @@
import { notify } from '@affine/component';
import { UserFriendlyError } from '@affine/error';
import { type DocMode as GraphqlDocMode, ErrorNames } from '@affine/graphql';
import {
type DocMode as GraphqlDocMode,
DocRole,
ErrorNames,
} from '@affine/graphql';
import { I18n, i18nTime } from '@affine/i18n';
import track from '@affine/track';
import {
@@ -43,6 +47,7 @@ import type { EditorSettingService } from '../../editor-setting';
import { type JournalService, suggestJournalDate } from '../../journal';
import { NotificationService } from '../../notification';
import type { GuardService, MemberSearchService } from '../../permissions';
import type { DocGrantedUsersService } from '../../permissions/services/doc-granted-users';
import type { SearchMenuService } from '../../search-menu/services';
function resolveSignal<T>(data: T | Signal<T>): T {
@@ -65,7 +70,8 @@ export class AtMenuConfigService extends Service {
private readonly searchMenuService: SearchMenuService,
private readonly workspaceServerService: WorkspaceServerService,
private readonly memberSearchService: MemberSearchService,
private readonly guardService: GuardService
private readonly guardService: GuardService,
private readonly docGrantedUsersService: DocGrantedUsersService
) {
super();
}
@@ -433,11 +439,11 @@ export class AtMenuConfigService extends Service {
.catch(error => {
const err = UserFriendlyError.fromAny(error);
const canUserManage = this.guardService.can$(
'Workspace_Users_Manage'
).signal.value;
if (err.is(ErrorNames.MENTION_USER_DOC_ACCESS_DENIED)) {
const canUserManage = this.guardService.can$(
'Doc_Users_Manage',
docId
).signal.value;
if (canUserManage) {
const username = name ?? 'Unknown';
notify.error({
@@ -449,10 +455,36 @@ export class AtMenuConfigService extends Service {
}),
action: {
label: 'Invite',
onClick: () => {
this.dialogService.open('setting', {
activeTab: 'workspace:members',
});
onClick: async () => {
try {
await this.docGrantedUsersService.updateUserRole(
id,
DocRole.Reader
);
await notificationService.mentionUser(
id,
workspaceId,
{
id: docId,
title:
this.docDisplayMetaService.title$(docId).value,
blockId: block.blockId,
mode: mode as GraphqlDocMode,
}
);
notify.success({
title: I18n.t(
'com.affine.editor.at-menu.invited-and-notified'
),
});
} catch (error) {
const err = UserFriendlyError.fromAny(error);
notify.error({
title: I18n[`error.${err.name}`](err.data),
});
}
},
},
});