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.tasks/services/tasks.service.ts

183 lines
3.7 KiB
TypeScript

import {
TcService,
TcDbService,
TcContext,
NoPermissionError,
} from 'tailchat-server-sdk';
import type { TaskDocument, TaskModel } from '../models/task';
/**
* 任务管理服务
*/
interface TasksService
extends TcService,
TcDbService<TaskDocument, TaskModel> {}
class TasksService extends TcService {
get serviceName() {
return 'plugin:com.msgbyte.tasks';
}
onInit() {
this.registerLocalDb(require('../models/task').default);
this.registerAction('all', this.all);
this.registerAction('add', this.add, {
params: {
title: 'string',
assignee: { optional: true, type: 'array', items: 'string' },
description: { optional: true, type: 'string' },
expiredAt: { optional: true, type: 'string' },
},
});
this.registerAction('done', this.done, {
params: {
taskId: 'string',
},
});
this.registerAction('undone', this.undone, {
params: {
taskId: 'string',
},
});
this.registerAction('update', this.update, {
params: {
taskId: 'string',
title: { optional: true, type: 'string' },
assignee: { optional: true, type: 'string' },
description: { optional: true, type: 'string' },
expiredAt: { optional: true, type: 'string' },
},
});
}
/**
* 列出所有任务
*/
private async all(ctx: TcContext) {
const docs = await this.adapter.model
.find({
creator: ctx.meta.userId,
})
.sort({
_id: 'desc',
})
.exec();
return await this.transformDocuments(ctx, {}, docs);
}
/**
* 新增任务
*/
private async add(
ctx: TcContext<{
title: string;
assignee?: string[];
description?: string;
expiredAt?: string;
}>
) {
const { title, assignee, description, expiredAt } = ctx.params;
const docs = await this.adapter.model.create({
creator: ctx.meta.userId,
title,
assignee,
description,
expiredAt,
done: false,
});
return await this.transformDocuments(ctx, {}, docs);
}
/**
* 完成任务
*/
private async done(
ctx: TcContext<{
taskId: string;
}>
) {
const taskId = ctx.params.taskId;
const t = ctx.meta.t;
const res = await this.adapter.model.updateOne(
{
_id: taskId,
creator: ctx.meta.userId,
},
{
done: true,
}
);
if (res.matchedCount === 0) {
throw new NoPermissionError(t('没有修改权限'));
}
}
/**
* 完成任务
*/
private async undone(
ctx: TcContext<{
taskId: string;
}>
) {
const taskId = ctx.params.taskId;
const t = ctx.meta.t;
const res = await this.adapter.model.updateOne(
{
_id: taskId,
creator: ctx.meta.userId,
},
{
done: false,
}
);
if (res.matchedCount === 0) {
throw new NoPermissionError(t('没有修改权限'));
}
}
/**
* 更新任务信息
*/
private async update(
ctx: TcContext<{
taskId: string;
title: string;
assignee?: string[];
description?: string;
expiredAt?: Date;
}>
) {
const { taskId, title, assignee, description, expiredAt } = ctx.params;
const t = ctx.meta.t;
const docs = await this.adapter.model.findOneAndUpdate(
{
_id: taskId,
creator: ctx.meta.userId,
},
{
title,
assignee,
description,
expiredAt,
},
{ new: true }
);
if (!docs) {
throw new NoPermissionError(t('没有修改权限'));
}
return await this.transformDocuments(ctx, {}, docs);
}
}
export default TasksService;