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/server/plugins/com.msgbyte.github/services/repo.service.dev.ts

100 lines
2.1 KiB
TypeScript

import type { GroupStruct } from 'tailchat-server-sdk';
import { GroupPanelType, TcContext } from 'tailchat-server-sdk';
import { TcService, TcDbService } from 'tailchat-server-sdk';
import type { RepoDocument, RepoModel } from '../models/repo';
const ACTIVITY_PANEL_NAME = 'Activity';
const defaultGroupPanel = [
{
id: '00',
name: 'Default',
type: GroupPanelType.GROUP,
},
{
id: '01',
name: 'Lobby',
parentId: '00',
type: GroupPanelType.TEXT,
},
{
id: '02',
name: ACTIVITY_PANEL_NAME,
parentId: '00',
type: GroupPanelType.TEXT,
},
{
id: '10',
name: 'Project',
type: GroupPanelType.GROUP,
},
];
/**
* Github项目管理服务
*/
interface GithubRepoService
extends TcService,
TcDbService<RepoDocument, RepoModel> {}
class GithubRepoService extends TcService {
get serviceName() {
return 'plugin:com.msgbyte.github.repo';
}
onInit() {
this.registerLocalDb(require('../models/repo').default);
this.registerAction('ensure', this.ensure, {
params: {
repoName: 'string',
},
});
}
async ensure(ctx: TcContext<{ repoName: string }>): Promise<{
repoName: string;
groupId: string;
}> {
const { repoName } = ctx.params;
let doc = await this.adapter.model.findOne({
repoName,
});
if (!doc) {
// 不存在
const group = await this.systemCall<GroupStruct>(
ctx,
'group.createGroup',
{
name: repoName,
panels: defaultGroupPanel,
}
);
const groupId = String(group._id);
const activityPanel = group.panels.find(
(item) => item.name === ACTIVITY_PANEL_NAME
);
if (activityPanel) {
await this.systemCall(ctx, 'plugin:com.msgbyte.github.subscribe.add', {
groupId,
textPanelId: activityPanel.id,
repoName,
});
}
doc = await this.adapter.model.create({
repoName,
groupId,
});
}
const json = await this.transformDocuments(ctx, {}, doc);
return json;
}
}
export default GithubRepoService;