tachybase_todo/packages/samples/shop-actions/src/server/index.ts
2022-10-02 09:07:03 +08:00

108 lines
2.6 KiB
TypeScript

import path from 'path';
import { InstallOptions, Plugin } from '@nocobase/server';
export class ShopPlugin extends Plugin {
getName(): string {
return this.getPackageName(__dirname);
}
beforeLoad() {
// TODO
}
async load() {
await this.db.import({
directory: path.resolve(__dirname, 'collections'),
});
this.app.resource({
name: 'orders',
actions: {
create: {
blacklist: ['id', 'totalPrice', 'status', 'createdAt', 'updatedAt'],
values: {
status: 0
},
middlewares: [
async (ctx, next) => {
const { productId } = ctx.action.params.values;
const product = await ctx.db.getRepository('products').findOne({
filterByTk: productId,
filter: {
enabled: true,
inventory: {
$gt: 0
}
}
});
if (!product) {
return ctx.throw(404);
}
ctx.state.product = product;
await next();
}
],
async handler(ctx, next) {
const { product } = ctx.state;
const order = await ctx.db.getRepository('orders').create({
values: {
...ctx.action.params.values,
productId: product.id,
quantity: 1,
totalPrice: product.price
}
});
ctx.body = order;
}
},
list: {
filter: {
// 由 users 插件扩展的过滤器运算符
$isCurrentUser: true,
status: {
$ne: -1
}
},
fields: ['id', 'status', 'createdAt', 'updatedAt']
},
async deliver(ctx, next) {
const { resourceIndex } = ctx.action.params;
const orderRepo = ctx.db.getRepository('orders');
const [order] = await orderRepo.update({
filterByTk: resourceIndex,
values: {
status: 2,
delivery: {
...ctx.action.params.values,
status: 0
}
}
});
order.delivery = await order.getDelivery();
ctx.body = order;
next();
}
}
});
this.app.acl.allow('products', '*');
this.app.acl.allow('categories', '*');
this.app.acl.allow('orders', '*');
}
async install(options: InstallOptions) {
// TODO
}
}
export default ShopPlugin;