diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx index 57fdd7a57..63df9df56 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx @@ -95,19 +95,18 @@ export const CloudWorkspaceMembersPanel = ({ const onGenerateInviteLink = useCallback( async (expireTime: WorkspaceInviteLinkExpireTime) => { - const { link } = - await permissionService.permission.generateInviteLink(expireTime); + const { link } = await membersService.generateInviteLink(expireTime); workspaceShareSettingService.sharePreview.revalidate(); return link; }, - [permissionService.permission, workspaceShareSettingService.sharePreview] + [membersService, workspaceShareSettingService.sharePreview] ); const onRevokeInviteLink = useCallback(async () => { - const success = await permissionService.permission.revokeInviteLink(); + const success = await membersService.revokeInviteLink(); workspaceShareSettingService.sharePreview.revalidate(); return success; - }, [permissionService.permission, workspaceShareSettingService.sharePreview]); + }, [membersService, workspaceShareSettingService.sharePreview]); const onInviteBatchConfirm = useAsyncCallback( async ({ @@ -125,10 +124,7 @@ export const CloudWorkspaceMembersPanel = ({ setIsMutating(false); return; } - const results = await permissionService.permission.inviteMembers( - uniqueEmails, - true - ); + const results = await membersService.inviteMembers(uniqueEmails, true); const unSuccessInvites = results.reduce((acc, result) => { if (!result.sentSuccess) { acc.push(result.email); @@ -151,14 +147,7 @@ export const CloudWorkspaceMembersPanel = ({ } setIsMutating(false); }, - [ - isTeam, - membersService.members, - permissionService.permission, - t, - workspaceQuota, - workspaceQuotaService.quota, - ] + [isTeam, membersService, t, workspaceQuota, workspaceQuotaService.quota] ); const onImportCSV = useAsyncCallback( diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx index 3ca49f255..91be4aeaa 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx @@ -4,7 +4,6 @@ import { type AuthAccountInfo, AuthService } from '@affine/core/modules/cloud'; import { type Member, WorkspaceMembersService, - WorkspacePermissionService, } from '@affine/core/modules/permissions'; import { WorkspaceService } from '@affine/core/modules/workspace'; import { @@ -143,7 +142,6 @@ const MemberItem = ({ const membersService = useService(WorkspaceMembersService); const workspace = useService(WorkspaceService).workspace; const workspaceName = useLiveData(workspace.name$); - const permission = useService(WorkspacePermissionService).permission; const isEquals = workspaceName === inputValue; const show = useMemo( @@ -163,7 +161,7 @@ const MemberItem = ({ }, []); const confirmAssign = useCallback(() => { - permission + membersService .adjustMemberPermission(member.id, Permission.Owner) .then(result => { if (result) { @@ -183,7 +181,7 @@ const MemberItem = ({ message: error.message, }); }); - }, [permission, member, t, membersService]); + }, [member, t, membersService]); const memberStatus = useMemo(() => getMemberStatus(member), [member]); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx index 10a0923d1..12a366bdf 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx @@ -39,7 +39,7 @@ export const MemberOptions = ({ variant: 'error', }, onConfirm: () => - permission + membersService .revokeMember(member.id) .then(result => { if (result) { @@ -58,7 +58,7 @@ export const MemberOptions = ({ }), }); }, - [member, membersService, openConfirmModal, permission, t] + [member, membersService, openConfirmModal, t] ); const handleAssignOwner = useCallback(() => { @@ -75,7 +75,7 @@ export const MemberOptions = ({ }, [openRemoveConfirmModal, member, t]); const handleApprove = useCallback(() => { - permission + membersService .approveMember(member.id) .then(result => { if (result) { @@ -96,7 +96,7 @@ export const MemberOptions = ({ message: error.message, }); }); - }, [member, membersService, permission, t]); + }, [member, membersService, t]); const handleDecline = useCallback(() => { openRemoveConfirmModal({ @@ -117,7 +117,7 @@ export const MemberOptions = ({ }, [member, openRemoveConfirmModal, t]); const handleChangeToAdmin = useCallback(() => { - permission + membersService .adjustMemberPermission(member.id, Permission.Admin) .then(result => { if (result) { @@ -138,9 +138,9 @@ export const MemberOptions = ({ message: error.message, }); }); - }, [member, membersService, permission, t]); + }, [member, membersService, t]); const handleChangeToCollaborator = useCallback(() => { - permission + membersService .adjustMemberPermission(member.id, Permission.Write) .then(result => { if (result) { @@ -161,7 +161,7 @@ export const MemberOptions = ({ message: error.message, }); }); - }, [member, membersService, permission, t]); + }, [member, membersService, t]); const operationButtonInfo = useMemo(() => { return [ diff --git a/packages/frontend/core/src/modules/permissions/entities/permission.ts b/packages/frontend/core/src/modules/permissions/entities/permission.ts index 58855a1aa..0b12f81c5 100644 --- a/packages/frontend/core/src/modules/permissions/entities/permission.ts +++ b/packages/frontend/core/src/modules/permissions/entities/permission.ts @@ -1,8 +1,4 @@ import { DebugLogger } from '@affine/debug'; -import type { - Permission, - WorkspaceInviteLinkExpireTime, -} from '@affine/graphql'; import { backoffRetry, catchErrorInto, @@ -75,65 +71,6 @@ export class WorkspacePermission extends Entity { }) ); - async inviteMember(email: string, sendInviteMail?: boolean) { - return await this.store.inviteMember( - this.workspaceService.workspace.id, - email, - sendInviteMail - ); - } - - async inviteMembers(emails: string[], sendInviteMail?: boolean) { - return await this.store.inviteBatch( - this.workspaceService.workspace.id, - emails, - sendInviteMail - ); - } - - async generateInviteLink(expireTime: WorkspaceInviteLinkExpireTime) { - return await this.store.generateInviteLink( - this.workspaceService.workspace.id, - expireTime - ); - } - - async revokeInviteLink() { - return await this.store.revokeInviteLink( - this.workspaceService.workspace.id - ); - } - - async revokeMember(userId: string) { - return await this.store.revokeMemberPermission( - this.workspaceService.workspace.id, - userId - ); - } - - async acceptInvite(inviteId: string, sendAcceptMail?: boolean) { - return await this.store.acceptInvite( - this.workspaceService.workspace.id, - inviteId, - sendAcceptMail - ); - } - - async approveMember(userId: string) { - return await this.store.approveMember( - this.workspaceService.workspace.id, - userId - ); - } - - async adjustMemberPermission(userId: string, permission: Permission) { - return await this.store.adjustMemberPermission( - this.workspaceService.workspace.id, - userId, - permission - ); - } - override dispose(): void { this.revalidate.unsubscribe(); } diff --git a/packages/frontend/core/src/modules/permissions/index.ts b/packages/frontend/core/src/modules/permissions/index.ts index feefe3a7b..9e855fca3 100644 --- a/packages/frontend/core/src/modules/permissions/index.ts +++ b/packages/frontend/core/src/modules/permissions/index.ts @@ -27,7 +27,7 @@ export function configurePermissionsModule(framework: Framework) { ]) .store(WorkspacePermissionStore, [WorkspaceServerService]) .entity(WorkspacePermission, [WorkspaceService, WorkspacePermissionStore]) - .service(WorkspaceMembersService) + .service(WorkspaceMembersService, [WorkspaceMembersStore, WorkspaceService]) .store(WorkspaceMembersStore, [WorkspaceServerService]) .entity(WorkspaceMembers, [WorkspaceMembersStore, WorkspaceService]); } diff --git a/packages/frontend/core/src/modules/permissions/services/members.ts b/packages/frontend/core/src/modules/permissions/services/members.ts index 1e53a9cb3..a5433aa98 100644 --- a/packages/frontend/core/src/modules/permissions/services/members.ts +++ b/packages/frontend/core/src/modules/permissions/services/members.ts @@ -1,7 +1,71 @@ +import type { + Permission, + WorkspaceInviteLinkExpireTime, +} from '@affine/graphql'; import { Service } from '@toeverything/infra'; +import type { WorkspaceService } from '../../workspace'; import { WorkspaceMembers } from '../entities/members'; +import type { WorkspaceMembersStore } from '../stores/members'; export class WorkspaceMembersService extends Service { + constructor( + private readonly store: WorkspaceMembersStore, + private readonly workspaceService: WorkspaceService + ) { + super(); + } + members = this.framework.createEntity(WorkspaceMembers); + + async inviteMember(email: string, sendInviteMail?: boolean) { + return await this.store.inviteMember( + this.workspaceService.workspace.id, + email, + sendInviteMail + ); + } + + async inviteMembers(emails: string[], sendInviteMail?: boolean) { + return await this.store.inviteBatch( + this.workspaceService.workspace.id, + emails, + sendInviteMail + ); + } + + async generateInviteLink(expireTime: WorkspaceInviteLinkExpireTime) { + return await this.store.generateInviteLink( + this.workspaceService.workspace.id, + expireTime + ); + } + + async revokeInviteLink() { + return await this.store.revokeInviteLink( + this.workspaceService.workspace.id + ); + } + + async revokeMember(userId: string) { + return await this.store.revokeMemberPermission( + this.workspaceService.workspace.id, + userId + ); + } + + async approveMember(userId: string) { + return await this.store.approveMember( + this.workspaceService.workspace.id, + userId + ); + } + + async adjustMemberPermission(userId: string, permission: Permission) { + return await this.store.adjustMemberPermission( + this.workspaceService.workspace.id, + userId, + permission + ); + } } diff --git a/packages/frontend/core/src/modules/permissions/stores/members.ts b/packages/frontend/core/src/modules/permissions/stores/members.ts index 25b146354..660d21b9c 100644 --- a/packages/frontend/core/src/modules/permissions/stores/members.ts +++ b/packages/frontend/core/src/modules/permissions/stores/members.ts @@ -1,4 +1,15 @@ -import { getMembersByWorkspaceIdQuery } from '@affine/graphql'; +import { + approveWorkspaceTeamMemberMutation, + createInviteLinkMutation, + getMembersByWorkspaceIdQuery, + grantWorkspaceTeamMemberMutation, + inviteByEmailMutation, + inviteByEmailsMutation, + type Permission, + revokeInviteLinkMutation, + revokeMemberPermissionMutation, + type WorkspaceInviteLinkExpireTime, +} from '@affine/graphql'; import { Store } from '@toeverything/infra'; import type { WorkspaceServerService } from '../../cloud'; @@ -31,4 +42,125 @@ export class WorkspaceMembersStore extends Store { return data.workspace; } + + async inviteMember( + workspaceId: string, + email: string, + sendInviteMail = false + ) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const invite = await this.workspaceServerService.server.gql({ + query: inviteByEmailMutation, + variables: { + workspaceId, + email, + sendInviteMail, + }, + }); + return invite.invite; + } + + async inviteBatch( + workspaceId: string, + emails: string[], + sendInviteMail = false + ) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const inviteBatch = await this.workspaceServerService.server.gql({ + query: inviteByEmailsMutation, + variables: { + workspaceId, + emails, + sendInviteMail, + }, + }); + return inviteBatch.inviteBatch; + } + + async generateInviteLink( + workspaceId: string, + expireTime: WorkspaceInviteLinkExpireTime + ) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const inviteLink = await this.workspaceServerService.server.gql({ + query: createInviteLinkMutation, + variables: { + workspaceId, + expireTime, + }, + }); + return inviteLink.createInviteLink; + } + + async revokeInviteLink(workspaceId: string, signal?: AbortSignal) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const revoke = await this.workspaceServerService.server.gql({ + query: revokeInviteLinkMutation, + variables: { + workspaceId, + }, + context: { signal }, + }); + return revoke.revokeInviteLink; + } + + async revokeMemberPermission( + workspaceId: string, + userId: string, + signal?: AbortSignal + ) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const revoke = await this.workspaceServerService.server.gql({ + query: revokeMemberPermissionMutation, + variables: { + workspaceId, + userId, + }, + context: { signal }, + }); + return revoke.revoke; + } + + async approveMember(workspaceId: string, userId: string) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const member = await this.workspaceServerService.server.gql({ + query: approveWorkspaceTeamMemberMutation, + variables: { + workspaceId, + userId, + }, + }); + return member.approveMember; + } + + async adjustMemberPermission( + workspaceId: string, + userId: string, + permission: Permission + ) { + if (!this.workspaceServerService.server) { + throw new Error('No Server'); + } + const member = await this.workspaceServerService.server.gql({ + query: grantWorkspaceTeamMemberMutation, + variables: { + workspaceId, + userId, + permission, + }, + }); + return member.grantMember; + } } diff --git a/packages/frontend/core/src/modules/permissions/stores/permission.ts b/packages/frontend/core/src/modules/permissions/stores/permission.ts index b7f61d56d..2c61e4fc4 100644 --- a/packages/frontend/core/src/modules/permissions/stores/permission.ts +++ b/packages/frontend/core/src/modules/permissions/stores/permission.ts @@ -1,18 +1,5 @@ import type { WorkspaceServerService } from '@affine/core/modules/cloud'; -import { - acceptInviteByInviteIdMutation, - approveWorkspaceTeamMemberMutation, - createInviteLinkMutation, - getWorkspaceInfoQuery, - grantWorkspaceTeamMemberMutation, - inviteByEmailMutation, - inviteByEmailsMutation, - leaveWorkspaceMutation, - type Permission, - revokeInviteLinkMutation, - revokeMemberPermissionMutation, - type WorkspaceInviteLinkExpireTime, -} from '@affine/graphql'; +import { getWorkspaceInfoQuery, leaveWorkspaceMutation } from '@affine/graphql'; import { Store } from '@toeverything/infra'; export class WorkspacePermissionStore extends Store { @@ -35,146 +22,6 @@ export class WorkspacePermissionStore extends Store { return info; } - async inviteMember( - workspaceId: string, - email: string, - sendInviteMail = false - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const invite = await this.workspaceServerService.server.gql({ - query: inviteByEmailMutation, - variables: { - workspaceId, - email, - sendInviteMail, - }, - }); - return invite.invite; - } - - async inviteBatch( - workspaceId: string, - emails: string[], - sendInviteMail = false - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const inviteBatch = await this.workspaceServerService.server.gql({ - query: inviteByEmailsMutation, - variables: { - workspaceId, - emails, - sendInviteMail, - }, - }); - return inviteBatch.inviteBatch; - } - - async generateInviteLink( - workspaceId: string, - expireTime: WorkspaceInviteLinkExpireTime - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const inviteLink = await this.workspaceServerService.server.gql({ - query: createInviteLinkMutation, - variables: { - workspaceId, - expireTime, - }, - }); - return inviteLink.createInviteLink; - } - - async revokeInviteLink(workspaceId: string, signal?: AbortSignal) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const revoke = await this.workspaceServerService.server.gql({ - query: revokeInviteLinkMutation, - variables: { - workspaceId, - }, - context: { signal }, - }); - return revoke.revokeInviteLink; - } - - async revokeMemberPermission( - workspaceId: string, - userId: string, - signal?: AbortSignal - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const revoke = await this.workspaceServerService.server.gql({ - query: revokeMemberPermissionMutation, - variables: { - workspaceId, - userId, - }, - context: { signal }, - }); - return revoke.revoke; - } - - async acceptInvite( - workspaceId: string, - inviteId: string, - sendAcceptMail = false - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const accept = await this.workspaceServerService.server.gql({ - query: acceptInviteByInviteIdMutation, - variables: { - workspaceId, - inviteId, - sendAcceptMail, - }, - }); - return accept.acceptInviteById; - } - - async approveMember(workspaceId: string, userId: string) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const member = await this.workspaceServerService.server.gql({ - query: approveWorkspaceTeamMemberMutation, - variables: { - workspaceId, - userId, - }, - }); - return member.approveMember; - } - - async adjustMemberPermission( - workspaceId: string, - userId: string, - permission: Permission - ) { - if (!this.workspaceServerService.server) { - throw new Error('No Server'); - } - const member = await this.workspaceServerService.server.gql({ - query: grantWorkspaceTeamMemberMutation, - variables: { - workspaceId, - userId, - permission, - }, - }); - return member.grantMember; - } - /** * @param workspaceName for send email */