2022-06-23 14:41:46 +08:00

194 lines
6.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Tencent is pleased to support the open source community by making MagicEditor available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { cloneDeep } from 'lodash';
import { PageStatus } from '@src/config/config';
import { Page } from '@src/models/page';
import SequelizeHelper from '@src/sequelize/index';
import type { PageInfo } from '@src/typings';
import { configTransformDist, getFormatTime, serializeConfig } from '@src/utils/index';
import logger from '@src/utils/logger';
export default class PageService {
/**
* 新建页面
* @param {Page} page 页面参数
* @returns {Page} 新建页面
*/
create = (page?: Partial<Page>) => {
const newPage = {
pageCreateTime: getFormatTime(),
pageModifyTime: getFormatTime(),
pagePublishStatus: PageStatus.MODIFYING,
pageTitle: 'index',
pageName: 'index',
...page,
};
return Page.create(newPage as Page);
};
/**
* 判断是否buffer类型
* @param {any} val 待判定参数
* @returns {Boolean} 判断结果
*/
isBuffer = (val: any) => val && typeof val === 'object' && Buffer.isBuffer(val);
/**
* 格式化code将srcCode和distCode转化为string
* @param {PageInfo} page 待格式化的页面对象
* @returns {PageInfo} 格式化之后的结果
*/
formatCode = (page?: PageInfo): PageInfo => {
const newPage: PageInfo = cloneDeep(page);
if (this.isBuffer(page.distCode)) newPage.distCode = page.distCode.toString();
if (this.isBuffer(page.srcCode)) newPage.srcCode = page.srcCode.toString();
if (page.pageCreateTime) newPage.pageCreateTime = getFormatTime(page.pageCreateTime);
if (page.pageModifyTime) newPage.pageModifyTime = getFormatTime(page.pageModifyTime);
if (page.pagePublishTime) newPage.pagePublishTime = getFormatTime(page.pagePublishTime);
return newPage;
};
/**
* 更新页面信息
* @param {PageInfo} page 待更新页面数组
* @param {Boolean} isPublish 是否发布
* @param {String} operator 操作人
* @returns {Res} 结果返回
*/
update = async (pages: PageInfo[], isPublish = false, operator = '') => {
const sequelize = SequelizeHelper.getInstance();
const pageColUpdate: PageInfo = {};
if (!isPublish) {
pageColUpdate.pagePublishStatus = PageStatus.MODIFYING;
pageColUpdate.pageModifyTime = getFormatTime();
} else {
pageColUpdate.pagePublishStatus = PageStatus.PUBLISHED;
pageColUpdate.pagePublishTime = getFormatTime();
pageColUpdate.pagePublishOperator = operator;
}
try {
await sequelize.transaction(() => {
Promise.all(
pages.map(async (page: PageInfo) => {
// 如果page.id不是纯数字说明是新建的页面需要补入一些字段
const isNewPage = !/^\d+$/.test(page.id);
if (isNewPage) {
pageColUpdate.pageCreateTime = getFormatTime();
pageColUpdate.pageTitle = page.pageName;
}
const upsertPage = Object.assign(page, pageColUpdate) as Page;
// page更新到数据库
await Page.upsert(upsertPage);
if (isNewPage) {
// 将新分配的Pageid回写至srcCode,distCode
const newPageIdRes = await Page.findOne({
where: {
actId: page.actId,
pageTitle: page.pageTitle,
},
attributes: ['id'],
});
const newPageId = newPageIdRes.toJSON();
await this.updateCode(newPageId.id, page);
}
}),
);
});
return { ret: 0, msg: '页面配置更新成功' };
} catch (e) {
logger.error(`页面配置更新失败:${e}`);
throw new Error('页面配置更新失败');
}
};
/**
* 查询页面
* @param {number} actId 活动Id
* @param {string[]} publishPages 待发布页面数组
* @returns {PageInfo[]} 查询结果
*/
getPages = async (actId: number, publishPages: string[]): Promise<PageInfo[]> => {
SequelizeHelper.getInstance();
const pages = await Page.findAll(
publishPages.length > 0
? {
where: {
actId,
pageName: publishPages,
},
raw: true,
}
: {
where: {
actId,
},
raw: true,
},
);
return pages.map((page) => this.formatCode(page));
};
/**
* 查询页面数量
* @param {number} actId 活动Id
* @returns {number} 页面数量
*/
getPagesCount = async (actId: number): Promise<number> => {
SequelizeHelper.getInstance();
const pages = await Page.findAll({
where: {
actId,
},
raw: true,
});
return pages.length;
};
/**
* 将新分配的Pageid回写至srcCode,distCode
* @param {string} pageId 页面id
* @param {PageInfo} page 页面配置
* @returns void
*/
updateCode = async (pageId: string, page: PageInfo) => {
try {
// 不是真正的json对象可能包含组件自定义code代码
// eslint-disable-next-line no-eval
const srcCode = eval(`(${page.srcCode})`);
srcCode.items[0].id = pageId;
const newSrcCode = serializeConfig(srcCode);
const newDistCode = configTransformDist(newSrcCode);
await Page.update(
{
srcCode: newSrcCode,
distCode: newDistCode,
},
{
where: { id: pageId },
},
);
} catch (error) {
logger.error(error);
throw new Error('保存新添加的页面失败');
}
};
}