refactor(core): adjust merbers module apis (#9695)

This commit is contained in:
EYHN
2025-01-17 02:50:02 +00:00
parent 64335b9e0c
commit ca9c94861a
8 changed files with 215 additions and 248 deletions

View File

@@ -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<string[]>((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(

View File

@@ -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]);

View File

@@ -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 [

View File

@@ -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();
}

View File

@@ -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]);
}

View File

@@ -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
);
}
}

View File

@@ -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;
}
}

View File

@@ -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
*/