feat: worksheet发布功能开发
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
const cloud = require('wx-server-sdk');
|
||||
|
||||
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
|
||||
|
||||
const VALID_STATUS = new Set(['draft', 'active', 'hidden']);
|
||||
const VALID_DIFFICULTY = new Set([1, 2, 3, 4]);
|
||||
|
||||
function toInt(value, fallback = 0) {
|
||||
const number = Number(value);
|
||||
if (!Number.isFinite(number)) return fallback;
|
||||
return Math.round(number);
|
||||
}
|
||||
|
||||
function toStringArray(value) {
|
||||
if (!Array.isArray(value)) return [];
|
||||
return value.map((item) => String(item || '').trim()).filter(Boolean);
|
||||
}
|
||||
|
||||
async function ensureCategoryExists(db, category) {
|
||||
try {
|
||||
await db.collection('categories').doc(category).get();
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function validatePayload(event, db) {
|
||||
const id = String(event.id || '').trim();
|
||||
const title = String(event.title || '').trim();
|
||||
const subtitle = String(event.subtitle || '').trim();
|
||||
const category = String(event.category || '').trim();
|
||||
const subcategory = String(event.subcategory || '').trim();
|
||||
const path = String(event.path || '').trim();
|
||||
const previewImg = String(event.previewImg || '').trim();
|
||||
const ageMin = toInt(event.ageMin, 0);
|
||||
const ageMax = toInt(event.ageMax, 0);
|
||||
const grade = toInt(event.grade, 0);
|
||||
const difficulty = toInt(event.difficulty, 0);
|
||||
const tags = toStringArray(event.tags);
|
||||
const isNew = !!event.isNew;
|
||||
const isHot = !!event.isHot;
|
||||
const sortOrder = toInt(event.sortOrder, 0);
|
||||
const downloads = toInt(event.downloads, 0);
|
||||
const likes = toInt(event.likes, 0);
|
||||
const status = String(event.status || 'draft').trim();
|
||||
|
||||
if (!id) throw new Error('题型 id 不能为空');
|
||||
if (!title) throw new Error('标题不能为空');
|
||||
if (!subtitle) throw new Error('副标题不能为空');
|
||||
if (!category) throw new Error('分类不能为空');
|
||||
if (!path) throw new Error('页面路径不能为空');
|
||||
if (!previewImg) throw new Error('预览图不能为空');
|
||||
if (ageMin < 0 || ageMax < ageMin) throw new Error('年龄范围不合法');
|
||||
if (!VALID_DIFFICULTY.has(difficulty)) throw new Error('难度不合法');
|
||||
if (!VALID_STATUS.has(status)) throw new Error('状态不合法');
|
||||
if (!(await ensureCategoryExists(db, category))) {
|
||||
throw new Error('分类不合法,categories 集合中不存在该分类');
|
||||
}
|
||||
|
||||
return {
|
||||
id,
|
||||
title,
|
||||
subtitle,
|
||||
category,
|
||||
subcategory,
|
||||
path,
|
||||
previewImg,
|
||||
ageMin,
|
||||
ageMax,
|
||||
grade,
|
||||
difficulty,
|
||||
tags,
|
||||
isNew,
|
||||
isHot,
|
||||
sortOrder,
|
||||
downloads,
|
||||
likes,
|
||||
status,
|
||||
};
|
||||
}
|
||||
|
||||
exports.main = async (event) => {
|
||||
try {
|
||||
const db = cloud.database();
|
||||
const payload = await validatePayload(event, db);
|
||||
const collection = db.collection('worksheets');
|
||||
|
||||
const record = {
|
||||
title: payload.title,
|
||||
subtitle: payload.subtitle,
|
||||
category: payload.category,
|
||||
subcategory: payload.subcategory,
|
||||
path: payload.path,
|
||||
ageMin: payload.ageMin,
|
||||
ageMax: payload.ageMax,
|
||||
grade: payload.grade,
|
||||
difficulty: payload.difficulty,
|
||||
previewImg: payload.previewImg,
|
||||
tags: payload.tags,
|
||||
isNew: payload.isNew,
|
||||
isHot: payload.isHot,
|
||||
sortOrder: payload.sortOrder,
|
||||
downloads: payload.downloads,
|
||||
likes: payload.likes,
|
||||
status: payload.status,
|
||||
updatedAt: db.serverDate(),
|
||||
};
|
||||
|
||||
try {
|
||||
const { data } = await collection.doc(payload.id).get();
|
||||
|
||||
await collection.doc(payload.id).update({
|
||||
data: record,
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: {
|
||||
_id: payload.id,
|
||||
createdAt: data.createdAt,
|
||||
...record,
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
await collection.doc(payload.id).set({
|
||||
data: {
|
||||
...record,
|
||||
createdAt: db.serverDate(),
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: {
|
||||
_id: payload.id,
|
||||
...record,
|
||||
},
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
message: error instanceof Error ? error.message : '发布题型失败',
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "worksheets-publish",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"wx-server-sdk": "^3.0.4"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user