UNPKG

nsgm-cli

Version:

A CLI tool to run Next/Style-components and Graphql/Mysql fullstack project

309 lines (244 loc) 11.3 kB
const { executeQuery, executePaginatedQuery } = require('../../utils/common') // 输入验证函数 const validatePagination = (page, pageSize) => { if (page < 0 || pageSize <= 0 || pageSize > 100) { throw new Error('分页参数无效'); } }; const validateId = (id) => { if (!id || !Number.isInteger(Number(id)) || Number(id) <= 0) { throw new Error('ID参数无效'); } }; const validateName = (name) => { if (!name || typeof name !== 'string' || name.trim().length === 0) { throw new Error('名称参数无效'); } }; module.exports = { // 获取模板列表(分页) template: async ({ page = 0, pageSize = 10 }) => { try { // 确保参数是数字类型 const pageNum = parseInt(page, 10) || 0; const pageSizeNum = parseInt(pageSize, 10) || 10; validatePagination(pageNum, pageSizeNum); const sql = 'SELECT id, name FROM template LIMIT ? OFFSET ?'; const countSql = 'SELECT COUNT(*) as counts FROM template'; const values = [pageSizeNum, pageNum * pageSizeNum]; console.log('执行分页查询:', { sql, values, valueTypes: values.map(v => typeof v), countSql }); return await executePaginatedQuery(sql, countSql, values); } catch (error) { console.error('获取模板列表失败:', error.message); throw error; } }, // 根据ID获取模板 - 使用 DataLoader 优化 templateGet: async ({ id }, context) => { try { validateId(id); console.log('🚀 使用 DataLoader 根据ID查询模板:', { id }); // 使用 DataLoader 批量加载,自动去重和缓存 const result = await context.dataloaders.template.byId.load(Number(id)); if (!result) { throw new Error(`ID为 ${id} 的模板不存在`); } return result; } catch (error) { console.error('获取模板失败:', error.message); throw error; } }, // 批量获取模板 - 新增方法,展示 DataLoader 批量能力 templateBatchGet: async ({ ids }, context) => { try { if (!Array.isArray(ids) || ids.length === 0) { throw new Error('ID列表不能为空'); } // 验证所有ID const validIds = ids.map(id => { validateId(id); return Number(id); }); console.log('🚀 使用 DataLoader 批量查询模板:', { ids: validIds }); // DataLoader 自动批量处理,一次查询获取所有数据 const results = await context.dataloaders.template.byId.loadMany(validIds); // 过滤掉 null 结果(未找到的记录) return results.filter(result => result !== null && !(result instanceof Error)); } catch (error) { console.error('批量获取模板失败:', error.message); throw error; } }, // 搜索模板(分页)- 使用 DataLoader 优化搜索 templateSearch: async ({ page = 0, pageSize = 10, data = {} }, context) => { try { validatePagination(page, pageSize); const { name } = data; // 如果有名称搜索,尝试使用 DataLoader 搜索缓存 if (name && name.trim() !== '') { console.log('🚀 使用 DataLoader 搜索模板:', { searchTerm: name.trim() }); try { // 使用 DataLoader 进行搜索(这里会缓存搜索结果) const searchResults = await context.dataloaders.template.searchByName.load(name.trim()); // 手动分页处理 const totalCounts = searchResults.length; const startIndex = page * pageSize; const endIndex = startIndex + pageSize; const items = searchResults.slice(startIndex, endIndex); return { totalCounts, items }; } catch (dataLoaderError) { console.warn('DataLoader 搜索失败,回退到直接查询:', dataLoaderError.message); // 如果 DataLoader 失败,回退到原始查询方式 } } // 原始查询方式(作为备用) const values = []; const countValues = []; let whereSql = ''; if (name && name.trim() !== '') { whereSql = ' AND name LIKE ?'; const namePattern = `%${name.trim()}%`; values.push(namePattern); countValues.push(namePattern); } const sql = `SELECT id, name FROM template WHERE 1=1${whereSql} LIMIT ? OFFSET ?`; const countSql = `SELECT COUNT(*) as counts FROM template WHERE 1=1${whereSql}`; values.push(pageSize, page * pageSize); console.log('搜索模板(备用查询):', { sql, values, countSql, countValues }); return await executePaginatedQuery(sql, countSql, values, countValues); } catch (error) { console.error('搜索模板失败:', error.message); throw error; } }, // 添加模板 - 添加 DataLoader 缓存清理 templateAdd: async ({ data }, context) => { try { const { name } = data || {}; validateName(name); const sql = 'INSERT INTO template (name) VALUES (?)'; const values = [name.trim()]; console.log('添加模板:', { sql, values }); const results = await executeQuery(sql, values); const insertId = results.insertId; // 预加载新数据到 DataLoader 缓存 if (insertId && context?.dataloaders?.template) { const newTemplate = { id: insertId, name: name.trim() }; context.dataloaders.template.prime(insertId, newTemplate); console.log('🚀 新模板已预加载到 DataLoader 缓存:', newTemplate); } return insertId; } catch (error) { console.error('添加模板失败:', error.message); throw error; } }, // 批量添加模板 templateBatchAdd: async ({ datas }) => { try { if (!Array.isArray(datas) || datas.length === 0) { throw new Error('批量添加数据不能为空'); } // 验证所有名称 const names = datas.map(item => { const { name } = item || {}; validateName(name); return name.trim(); }); const placeholders = names.map(() => '(?)').join(','); const sql = `INSERT INTO template (name) VALUES ${placeholders}`; console.log('批量添加模板:', { sql, values: names }); const results = await executeQuery(sql, names); return results.insertId; } catch (error) { console.error('批量添加模板失败:', error.message); throw error; } }, // 更新模板 - 添加 DataLoader 缓存清理 templateUpdate: async ({ id, data }, context) => { try { validateId(id); const { name } = data || {}; if (!name) { throw new Error('更新数据不能为空'); } validateName(name); const sql = 'UPDATE template SET name = ? WHERE id = ?'; const values = [name.trim(), id]; console.log('更新模板:', { sql, values }); const results = await executeQuery(sql, values); if (results.affectedRows === 0) { throw new Error(`ID为 ${id} 的模板不存在`); } // 清除 DataLoader 缓存,确保下次查询获取最新数据 if (context?.dataloaders?.template) { context.dataloaders.template.clearById(Number(id)); console.log('🧹 已清除 DataLoader 缓存:', { id }); } return true; } catch (error) { console.error('更新模板失败:', error.message); throw error; } }, // 删除模板 - 添加 DataLoader 缓存清理 templateDelete: async ({ id }, context) => { try { validateId(id); const sql = 'DELETE FROM template WHERE id = ?'; const values = [id]; console.log('删除模板:', { sql, values }); const results = await executeQuery(sql, values); if (results.affectedRows === 0) { throw new Error(`ID为 ${id} 的模板不存在`); } // 清除 DataLoader 缓存 if (context?.dataloaders?.template) { context.dataloaders.template.clearById(Number(id)); console.log('🧹 已清除 DataLoader 缓存:', { id }); } return true; } catch (error) { console.error('删除模板失败:', error.message); throw error; } }, // 批量删除模板 - 添加 DataLoader 缓存清理 templateBatchDelete: async ({ ids }, context) => { try { if (!Array.isArray(ids) || ids.length === 0) { throw new Error('批量删除的ID列表不能为空'); } // 验证所有ID ids.forEach(id => validateId(id)); const placeholders = ids.map(() => '?').join(','); const sql = `DELETE FROM template WHERE id IN (${placeholders})`; console.log('批量删除模板:', { sql, values: ids }); const results = await executeQuery(sql, ids); if (results.affectedRows === 0) { throw new Error('没有找到要删除的模板'); } // 批量清除 DataLoader 缓存 if (context?.dataloaders?.template) { ids.forEach(id => { context.dataloaders.template.clearById(Number(id)); }); console.log('🧹 已批量清除 DataLoader 缓存:', { ids }); } return true; } catch (error) { console.error('批量删除模板失败:', error.message); throw error; } } }