chore: prepare project for server deployment

This commit is contained in:
amb
2026-09-09 17:43:07 +08:00
commit d0bcff2311
83 changed files with 24163 additions and 0 deletions
+142
View File
@@ -0,0 +1,142 @@
const EntityContentJoin = require('../models/EntityContentJoin');
const Entity = require('../models/Entity');
const Content = require('../models/Content');
const Joi = require('joi');
class EntityContentJoinService {
// 验证关联数据
static validateJoin(data, isUpdate = false) {
const schema = Joi.object({
entity_id: isUpdate ? Joi.string().uuid() : Joi.string().uuid().required(),
content_id: isUpdate ? Joi.string().uuid() : Joi.string().uuid().required(),
join_note: Joi.string().allow(null, '')
});
return schema.validate(data, { abortEarly: false });
}
// 创建关联
static create(data) {
const { error, value } = this.validateJoin(data);
if (error) {
throw new Error(`验证失败: ${error.details.map(d => d.message).join(', ')}`);
}
// 检查实体是否存在
const entity = Entity.findById(value.entity_id);
if (!entity) {
throw new Error('实体不存在');
}
// 检查内容是否存在
const content = Content.findById(value.content_id);
if (!content) {
throw new Error('内容不存在');
}
// 检查是否已存在相同的关联
const existingJoins = EntityContentJoin.findByEntityId(value.entity_id);
const duplicateJoin = existingJoins.find(join => join.content_id === value.content_id);
if (duplicateJoin) {
throw new Error('该实体与内容的关联已存在');
}
return EntityContentJoin.create(value);
}
// 获取关联详情
static getById(joinId) {
const join = EntityContentJoin.findById(joinId);
if (!join) {
throw new Error('关联不存在');
}
return join;
}
// 获取实体的所有关联
static getByEntityId(entityId) {
return EntityContentJoin.findByEntityId(entityId);
}
// 获取内容的所有关联
static getByContentId(contentId) {
return EntityContentJoin.findByContentId(contentId);
}
// 获取所有关联
static getList(options = {}) {
return EntityContentJoin.findAll(options);
}
// 更新关联
static update(joinId, data) {
// 检查关联是否存在
const existingJoin = EntityContentJoin.findById(joinId);
if (!existingJoin) {
throw new Error('关联不存在');
}
// 如果要修改实体或内容,检查新实体或内容是否存在
if (data.entity_id && data.entity_id !== existingJoin.entity_id) {
const entity = Entity.findById(data.entity_id);
if (!entity) {
throw new Error('实体不存在');
}
}
if (data.content_id && data.content_id !== existingJoin.content_id) {
const content = Content.findById(data.content_id);
if (!content) {
throw new Error('内容不存在');
}
}
const { error, value } = this.validateJoin(data, true);
if (error) {
throw new Error(`验证失败: ${error.details.map(d => d.message).join(', ')}`);
}
return EntityContentJoin.update(joinId, value);
}
// 删除关联
static delete(joinId) {
const join = EntityContentJoin.findById(joinId);
if (!join) {
throw new Error('关联不存在');
}
return EntityContentJoin.delete(joinId);
}
// 删除实体与内容的关联
static deleteByEntityAndContent(entityId, contentId) {
return EntityContentJoin.deleteByEntityAndContent(entityId, contentId);
}
// 获取关联总数
static count() {
return EntityContentJoin.count();
}
// 分页查询
static paginate(page = 1, pageSize = 10, options = {}) {
const offset = (page - 1) * pageSize;
const list = EntityContentJoin.findAll({
...options,
limit: pageSize,
offset
});
const total = this.count();
return {
list,
total,
page,
pageSize,
totalPages: Math.ceil(total / pageSize)
};
}
}
module.exports = EntityContentJoinService;