From 22c9730efc508fe7ad1c330b9067331b0ecca21b Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 22 Apr 2022 11:51:53 +0800 Subject: [PATCH] fix: page macor --- src/modules/page/page.service.ts | 35 ++++++++++++++----- src/processors/helper/helper.macro.service.ts | 19 ++++++---- src/utils/safe-eval.util.ts | 3 +- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/modules/page/page.service.ts b/src/modules/page/page.service.ts index 4a0fc072..55ed76f8 100644 --- a/src/modules/page/page.service.ts +++ b/src/modules/page/page.service.ts @@ -4,9 +4,11 @@ import slugify from 'slugify' import { Injectable } from '@nestjs/common' +import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { BusinessEvents, EventScope } from '~/constants/business-event.constant' import { EventManagerService } from '~/processors/helper/helper.event.service' import { ImageService } from '~/processors/helper/helper.image.service' +import { TextMacroService } from '~/processors/helper/helper.macro.service' import { InjectModel } from '~/transformers/model.transformer' import { PageModel } from './page.model' @@ -18,6 +20,7 @@ export class PageService { private readonly pageModel: MongooseModel, private readonly imageService: ImageService, private readonly eventManager: EventManagerService, + private readonly macroService: TextMacroService, ) {} public get model() { @@ -46,17 +49,33 @@ export class PageService { doc.slug = slugify(doc.slug) } - await this.model.updateOne( - { _id: id }, - { ...omit(doc, PageModel.protectedKeys) }, - ) + const newDoc = await this.model + .findOneAndUpdate( + { _id: id }, + { ...omit(doc, PageModel.protectedKeys) }, + { new: true }, + ) + .lean() + + if (!newDoc) { + throw new CannotFindException() + } + process.nextTick(async () => { await Promise.all([ this.imageService.recordImageDimensions(this.pageModel, id), - this.pageModel.findById(id).then((doc) => - this.eventManager.broadcast(BusinessEvents.PAGE_UPDATED, doc, { - scope: EventScope.TO_SYSTEM_VISITOR, - }), + this.eventManager.broadcast(BusinessEvents.PAGE_UPDATED, newDoc, { + scope: EventScope.TO_SYSTEM, + }), + this.eventManager.broadcast( + BusinessEvents.PAGE_UPDATED, + { + ...newDoc, + text: this.macroService.replaceTextMacro(newDoc.text, newDoc), + }, + { + scope: EventScope.TO_VISITOR, + }, ), ]) }) diff --git a/src/processors/helper/helper.macro.service.ts b/src/processors/helper/helper.macro.service.ts index f5aeb6e1..651f863d 100644 --- a/src/processors/helper/helper.macro.service.ts +++ b/src/processors/helper/helper.macro.service.ts @@ -102,13 +102,20 @@ export class TextMacroService { {}, ) - // TODO catch error - return safeEval(`return ${functions}`, { - dayjs: deepCloneWithFunction(dayjs), - fromNow: (time: Date | string) => dayjs(time).fromNow(), + try { + return safeEval( + `return ${functions}`, + { + dayjs: deepCloneWithFunction(dayjs), + fromNow: (time: Date | string) => dayjs(time).fromNow(), - ...variables, - }) + ...variables, + }, + { timeout: 1000 }, + ) + } catch { + return match + } } }) } diff --git a/src/utils/safe-eval.util.ts b/src/utils/safe-eval.util.ts index 13f407aa..e0de5509 100644 --- a/src/utils/safe-eval.util.ts +++ b/src/utils/safe-eval.util.ts @@ -1,6 +1,6 @@ import vm2 from 'vm2' -export function safeEval(code: string, context = {}) { +export function safeEval(code: string, context = {}, options?: vm2.VMOptions) { const sandbox = { global: {}, } @@ -17,6 +17,7 @@ export function safeEval(code: string, context = {}) { sandbox, eval: false, + ...options, }) return VM.run(code)