You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/client/shared/model/group.ts

534 lines
10 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { request } from '../api/request';
export enum GroupPanelType {
TEXT = 0,
GROUP = 1,
PLUGIN = 2,
}
export const groupConfigNames = [
// 隐藏群组成员标识位
'hideGroupMemberDiscriminator',
// 群组背景图
'groupBackgroundImage',
] as const;
export type GroupConfigNames = (typeof groupConfigNames)[number] | string; // string is plugin config
export interface GroupMember {
roles: string[]; // 角色组
userId: string;
/**
* 日期字符串 禁言到xxx
*/
muteUntil?: string;
}
/**
* 群组面板特性
*/
export type GroupPanelFeature =
| 'subscribe' // 订阅事件变更状态用于加入socket.io群组
| 'ack'; // 是否包含已读未读检查,如果包含的话需要同时开启 subscribe 特性
export interface GroupPanel {
/**
* 在群组中唯一
*/
id: string;
/**
* 用于显示的面板名
*/
name: string;
parentId?: string;
type: GroupPanelType;
provider?: string; // 面板提供者
pluginPanelName?: string; // 插件面板名
meta?: Record<string, unknown>;
}
export interface GroupRole {
_id: string;
/**
* 权限组名
*/
name: string;
/**
* 拥有的权限, 是一段字符串
*/
permissions: string[];
}
export interface GroupInfo {
_id: string;
name: string;
avatar?: string;
owner: string;
description?: string;
members: GroupMember[];
panels: GroupPanel[];
roles: GroupRole[];
config?: Partial<Record<GroupConfigNames, any>>;
/**
* 所有人的权限列表
* 为群组中的最低权限
*/
fallbackPermissions: string[];
/**
* 被钉选的面板Id
*/
pinnedPanelId?: string;
}
/**
* 访客级别获取群组信息
*/
export interface GroupBasicInfo {
name: string;
avatar?: string;
owner: string;
memberCount: number;
backgroundImage?: string;
}
export interface GroupInvite {
code: string;
groupId: string;
creator: string;
expiredAt?: string;
usage: number;
usageLimit?: number;
}
/**
* 获取群组设置信息
*/
export function getGroupConfigWithInfo(
groupInfo: GroupInfo | null | undefined
): {
hideGroupMemberDiscriminator: boolean;
[key: string]: unknown;
} {
const config = groupInfo?.config ?? {};
return {
...config,
hideGroupMemberDiscriminator: config.hideGroupMemberDiscriminator ?? false,
};
}
/**
* 创建群组
* @param name 群组名
* @param panels 初始面板
*/
export async function createGroup(
name: string,
panels: GroupPanel[]
): Promise<GroupInfo> {
const { data } = await request.post('/api/group/createGroup', {
name,
panels,
});
return data;
}
/**
* 获取群组基本信息
*/
export async function getGroupBasicInfo(
groupId: string
): Promise<GroupBasicInfo | null> {
const { data } = await request.get('/api/group/getGroupBasicInfo', {
params: {
groupId,
},
});
return data;
}
/**
* 修改群组属性
* @param groupId 群组ID
* @param fieldName 要修改的群组属性
* @param fieldValue 要修改的属性的值
*/
type AllowedModifyField =
| 'name'
| 'avatar'
| 'description'
| 'panels'
| 'roles'
| 'fallbackPermissions';
export async function modifyGroupField(
groupId: string,
fieldName: AllowedModifyField,
fieldValue: unknown
) {
await request.post('/api/group/updateGroupField', {
groupId,
fieldName,
fieldValue,
});
}
/**
* 修改群组配置
* @param groupId 群组ID
* @param configName 要修改的群组属性
* @param configValue 要修改的属性的值
*/
export async function modifyGroupConfig(
groupId: string,
configName: GroupConfigNames,
configValue: unknown
) {
await request.post('/api/group/updateGroupConfig', {
groupId,
configName,
configValue,
});
}
/**
* 退出群组(群组拥有者是解散群组)
* 这里必须是一个socket请求因为后端需要进行房间的退出操作
* @param groupId 群组ID
*/
export async function quitGroup(groupId: string) {
await request.post('/api/group/quitGroup', {
groupId,
});
}
/**
* 检查当前用户是否是群组成员
* @param groupId 群组ID
*/
export async function isMember(groupId: string): Promise<boolean> {
const { data } = await request.post('/api/group/isMember', {
groupId,
});
return data;
}
/**
* 更新用户所在的权限组
* @param groupId 群组ID
* @param memberIds 成员信息
* @param roles 权限组名
*/
export async function appendGroupMemberRoles(
groupId: string,
memberIds: string[],
roles: string[]
) {
await request.post('/api/group/appendGroupMemberRoles', {
groupId,
memberIds,
roles,
});
}
/**
* 更新用户所在的权限组
* @param groupId 群组ID
* @param memberIds 成员信息
* @param roles 权限组名
*/
export async function removeGroupMemberRoles(
groupId: string,
memberIds: string[],
roles: string[]
) {
await request.post('/api/group/removeGroupMemberRoles', {
groupId,
memberIds,
roles,
});
}
/**
* 创建群组邀请码
* 邀请码默认 7天有效期
* @param groupId 群组id
*/
export async function createGroupInviteCode(
groupId: string,
inviteType: 'normal' | 'permanent'
): Promise<GroupInvite> {
const { data } = await request.post('/api/group/invite/createGroupInvite', {
groupId,
inviteType,
});
return data;
}
/**
* 编辑群组邀请链接
* @param groupId 群组ID
* @param code 邀请码
* @param expiredAt 过期时间是一个时间戳单位ms为undefined则为不限制
* @param usageLimit 最大使用次数为undefined则不限制
*/
export async function editGroupInvite(
groupId: string,
code: string,
expiredAt?: number,
usageLimit?: number
) {
await request.post('/api/group/invite/editGroupInvite', {
groupId,
code,
expiredAt,
usageLimit,
});
}
/**
* 获取群组所有邀请码
* @param groupId 群组ID
*/
export async function getAllGroupInviteCode(
groupId: string
): Promise<GroupInvite[]> {
const { data } = await request.get(
'/api/group/invite/getAllGroupInviteCode',
{
params: {
groupId,
},
}
);
return data;
}
/**
* 根据邀请码查找邀请信息
* @param inviteCode 邀请码
*/
export async function findGroupInviteByCode(
inviteCode: string
): Promise<GroupInvite | null> {
const { data } = await request.get('/api/group/invite/findInviteByCode', {
params: {
code: inviteCode,
},
});
return data;
}
/**
* 使用群组邀请
* 即通过群组邀请加入群组
*/
export async function applyGroupInvite(inviteCode: string): Promise<void> {
await request.post('/api/group/invite/applyInvite', {
code: inviteCode,
});
}
/**
* 删除群组邀请
*/
export async function deleteGroupInvite(
groupId: string,
inviteId: string
): Promise<void> {
await request.post('/api/group/invite/deleteInvite', {
groupId,
inviteId,
});
}
/**
* 创建群组面板
*/
export async function createGroupPanel(
groupId: string,
options: {
name: string;
type: number;
parentId?: string;
provider?: string;
pluginPanelName?: string;
meta?: Record<string, unknown>;
}
) {
await request.post('/api/group/createGroupPanel', {
...options,
groupId,
});
}
/**
* 创建群组面板
*/
export async function modifyGroupPanel(
groupId: string,
panelId: string,
options: {
name: string;
type: number;
parentId?: string;
provider?: string;
pluginPanelName?: string;
meta?: Record<string, unknown>;
}
) {
await request.post('/api/group/modifyGroupPanel', {
...options,
groupId,
panelId,
});
}
/**
* 删除群组面板
* @param groupId 群组Id
* @param panelId 面板Id
*/
export async function deleteGroupPanel(groupId: string, panelId: string) {
await request.post('/api/group/deleteGroupPanel', {
groupId,
panelId,
});
}
/**
* 创建群组身份组
* @param groupId 群组id
* @param roleName 群组名
* @param permissions 初始权限
*/
export async function createGroupRole(
groupId: string,
roleName: string,
permissions: string[]
) {
await request.post('/api/group/createGroupRole', {
groupId,
roleName,
permissions,
});
}
/**
* 删除群组身份组
* @param groupId 群组Id
* @param roleId 身份组Id
*/
export async function deleteGroupRole(groupId: string, roleId: string) {
await request.post('/api/group/deleteGroupRole', {
groupId,
roleId,
});
}
/**
* 删除群组身份组
* @param groupId 群组Id
* @param roleId 身份组Id
* @param roleName 新身份组名
*/
export async function updateGroupRoleName(
groupId: string,
roleId: string,
roleName: string
) {
await request.post('/api/group/updateGroupRoleName', {
groupId,
roleId,
roleName,
});
}
/**
* 删除群组身份组
* @param groupId 群组Id
* @param roleId 身份组Id
* @param permissions 全量权限列表
*/
export async function updateGroupRolePermission(
groupId: string,
roleId: string,
permissions: string[]
) {
await request.post('/api/group/updateGroupRolePermission', {
groupId,
roleId,
permissions,
});
}
/**
* 禁言群组成员
* @param groupId 群组ID
* @param memberId 成员ID
* @param muteMs 禁言到xxx, 精确到毫秒
*/
export async function muteGroupMember(
groupId: string,
memberId: string,
muteMs: number
) {
await request.post('/api/group/muteGroupMember', {
groupId,
memberId,
muteMs,
});
}
/**
* 移出群组成员
* @param groupId 群组ID
* @param memberId 成员ID
*/
export async function deleteGroupMember(groupId: string, memberId: string) {
await request.post('/api/group/deleteGroupMember', {
groupId,
memberId,
});
}
/**
* Get Group Panel Data from group.extra service
*/
export async function getGroupPanelExtraData(
groupId: string,
panelId: string,
name: string
): Promise<string | null> {
const { data } = await request.post('/api/group/extra/getPanelData', {
groupId,
panelId,
name,
});
return data.data ?? null;
}
/**
* Save Group Panel Data to group.extra service
*/
export async function saveGroupPanelExtraData(
groupId: string,
panelId: string,
name: string,
data: any
): Promise<void> {
await request.post('/api/group/extra/savePanelData', {
groupId,
panelId,
name,
data: typeof data === 'string' ? data : JSON.stringify(data),
});
}