feat: add action group.extra for storage group extra data

pull/90/head
moonrailgun 2 years ago
parent 32875f8a72
commit 8aa5d93eea

@ -0,0 +1,51 @@
import {
getModelForClass,
prop,
DocumentType,
Ref,
modelOptions,
Severity,
index,
} from '@typegoose/typegoose';
import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
import type { Types } from 'mongoose';
/**
* Group Extra Data
* Use to storage large data when panel load or others
*/
@modelOptions({
options: {
allowMixed: Severity.ALLOW,
},
})
@index({ groupId: 1, panelId: 1, name: 1 })
export class GroupExtra extends TimeStamps implements Base {
_id: Types.ObjectId;
id: string;
@prop({
ref: () => GroupExtra,
})
groupId: Ref<GroupExtra>;
@prop()
panelId?: string;
@prop()
name: string;
/**
* Only allow string
*/
@prop()
data: string;
}
export type GroupExtraDocument = DocumentType<GroupExtra>;
const model = getModelForClass(GroupExtra);
export type GroupExtraModel = typeof model;
export default model;

@ -0,0 +1,79 @@
import _ from 'lodash';
import type {
GroupExtraDocument,
GroupExtraModel,
} from '../../../models/group/group-extra';
import { TcService, TcContext, TcDbService } from 'tailchat-server-sdk';
interface GroupExtraService
extends TcService,
TcDbService<GroupExtraDocument, GroupExtraModel> {}
class GroupExtraService extends TcService {
get serviceName(): string {
return 'group.extra';
}
onInit(): void {
this.registerLocalDb(require('../../../models/group/group-extra').default);
this.registerAction('getPanelData', this.getPanelData, {
params: {
groupId: 'string',
panelId: 'string',
name: 'string',
},
});
this.registerAction('savePanelData', this.savePanelData, {
params: {
groupId: 'string',
panelId: 'string',
name: 'string',
data: 'string',
},
});
}
async getPanelData(
ctx: TcContext<{
groupId: string;
panelId: string;
name: string;
}>
) {
const { groupId, panelId, name } = ctx.params;
const res = await this.adapter.findOne({
groupId,
panelId,
name,
});
return res?.data ?? null;
}
async savePanelData(
ctx: TcContext<{
groupId: string;
panelId: string;
name: string;
data: string;
}>
) {
const { groupId, panelId, name, data } = ctx.params;
await this.adapter.model.findOneAndUpdate(
{
groupId,
panelId,
name,
},
{
data: String(data),
}
);
return true;
}
}
export default GroupExtraService;
Loading…
Cancel
Save