mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-14 21:27:20 +00:00
refactor(core): adjust merbers module apis (#9695)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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 [
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user