UNPKG

nsgm-cli

Version:

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

304 lines (252 loc) 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResolverGenerator = void 0; const base_generator_1 = require("./base-generator"); /** * Resolver生成器 */ class ResolverGenerator extends base_generator_1.BaseGenerator { generate() { const selectFields = this.fields.map((f) => f.name).join(', '); const insertFields = this.getFormFields(); const searchableFields = this.getSearchableFields(); const insertFieldNames = insertFields.map((f) => f.name).join(', '); const insertPlaceholders = insertFields.map(() => '?').join(', '); const insertValues = insertFields.map((f) => `data.${f.name}`).join(', '); const searchConditions = this.generateSearchConditions(searchableFields); const validateFunctions = this.generateValidateFunctions(insertFields); const updateFields = insertFields.map((f) => `${f.name} = ?`).join(', '); const updateValues = insertFields.map((f) => `data.${f.name}`).join(', '); return `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参数无效'); } }; ${validateFunctions} module.exports = { // 获取${this.controller}列表(分页) ${this.controller}: async ({ page = 0, pageSize = 10 }) => { try { const pageNum = parseInt(page, 10) || 0; const pageSizeNum = parseInt(pageSize, 10) || 10; validatePagination(pageNum, pageSizeNum); const sql = 'SELECT ${selectFields} FROM ${this.controller} LIMIT ? OFFSET ?'; const countSql = 'SELECT COUNT(*) as counts FROM ${this.controller}'; const values = [pageSizeNum, pageNum * pageSizeNum]; console.log('执行分页查询:', { sql, values, countSql }); return await executePaginatedQuery(sql, countSql, values); } catch (error) { console.error('获取${this.controller}列表失败:', error.message); throw error; } }, // 根据ID获取${this.controller} ${this.controller}Get: async ({ id }) => { try { validateId(id); const sql = 'SELECT ${selectFields} FROM ${this.controller} WHERE id = ?'; const values = [id]; console.log('根据ID查询${this.controller}:', { sql, values }); const results = await executeQuery(sql, values); if (results.length === 0) { throw new Error(\`ID为 \${id} 的${this.controller}不存在\`); } return results[0]; } catch (error) { console.error('获取${this.controller}失败:', error.message); throw error; } }, // 搜索${this.controller}(分页) ${this.controller}Search: async ({ page = 0, pageSize = 10, data = {} }) => { try { validatePagination(page, pageSize); const values = []; const countValues = []; let whereSql = ''; ${searchConditions} const sql = \`SELECT ${selectFields} FROM ${this.controller} WHERE 1=1\${whereSql} LIMIT ? OFFSET ?\`; const countSql = \`SELECT COUNT(*) as counts FROM ${this.controller} WHERE 1=1\${whereSql}\`; values.push(pageSize, page * pageSize); console.log('搜索${this.controller}:', { sql, values, countSql, countValues }); return await executePaginatedQuery(sql, countSql, values, countValues); } catch (error) { console.error('搜索${this.controller}失败:', error.message); throw error; } }, // 添加${this.controller} ${this.controller}Add: async ({ data }) => { try { ${this.generateValidationCalls(insertFields)} const sql = 'INSERT INTO ${this.controller} (${insertFieldNames}) VALUES (${insertPlaceholders})'; const values = [${insertValues}]; console.log('添加${this.controller}:', { sql, values }); const results = await executeQuery(sql, values); return results.insertId; } catch (error) { console.error('添加${this.controller}失败:', error.message); throw error; } }, // 批量添加${this.controller} ${this.controller}BatchAdd: async ({ datas }) => { try { if (!Array.isArray(datas) || datas.length === 0) { throw new Error('批量添加数据不能为空'); } // 验证所有数据 datas.forEach(data => { ${this.generateBatchValidationCalls(insertFields)} }); const placeholders = datas.map(() => '(${insertPlaceholders})').join(','); const sql = \`INSERT INTO ${this.controller} (${insertFieldNames}) VALUES \${placeholders}\`; const values = datas.flatMap(data => [${insertValues}]); console.log('批量添加${this.controller}:', { sql, values }); const results = await executeQuery(sql, values); return results.insertId; } catch (error) { console.error('批量添加${this.controller}失败:', error.message); throw error; } }, // 更新${this.controller} ${this.controller}Update: async ({ id, data }) => { try { validateId(id); if (!data) { throw new Error('更新数据不能为空'); } ${this.generateUpdateValidationCalls(insertFields)} const sql = 'UPDATE ${this.controller} SET ${updateFields} WHERE id = ?'; const values = [${updateValues}, id]; console.log('更新${this.controller}:', { sql, values }); const results = await executeQuery(sql, values); if (results.affectedRows === 0) { throw new Error(\`ID为 \${id} 的${this.controller}不存在\`); } return true; } catch (error) { console.error('更新${this.controller}失败:', error.message); throw error; } }, // 删除${this.controller} ${this.controller}Delete: async ({ id }) => { try { validateId(id); const sql = 'DELETE FROM ${this.controller} WHERE id = ?'; const values = [id]; console.log('删除${this.controller}:', { sql, values }); const results = await executeQuery(sql, values); if (results.affectedRows === 0) { throw new Error(\`ID为 \${id} 的${this.controller}不存在\`); } return true; } catch (error) { console.error('删除${this.controller}失败:', error.message); throw error; } }, // 批量删除${this.controller} ${this.controller}BatchDelete: async ({ ids }) => { try { if (!Array.isArray(ids) || ids.length === 0) { throw new Error('批量删除的ID列表不能为空'); } ids.forEach(id => validateId(id)); const placeholders = ids.map(() => '?').join(','); const sql = \`DELETE FROM ${this.controller} WHERE id IN (\${placeholders})\`; console.log('批量删除${this.controller}:', { sql, values: ids }); const results = await executeQuery(sql, ids); if (results.affectedRows === 0) { throw new Error('没有找到要删除的${this.controller}'); } return true; } catch (error) { console.error('批量删除${this.controller}失败:', error.message); throw error; } } }`; } generateSearchConditions(searchableFields) { if (searchableFields.length === 0) return ''; const conditions = searchableFields.map((field) => { if (field.type === 'varchar' || field.type === 'text') { return ` if (data.${field.name} && data.${field.name}.trim() !== '') { whereSql += ' AND ${field.name} LIKE ?'; const ${field.name}Pattern = \`%\${data.${field.name}.trim()}%\`; values.push(${field.name}Pattern); countValues.push(${field.name}Pattern); }`; } else { return ` if (data.${field.name} !== undefined && data.${field.name} !== null) { whereSql += ' AND ${field.name} = ?'; values.push(data.${field.name}); countValues.push(data.${field.name}); }`; } }); return conditions.join('\n\n'); } generateValidateFunctions(insertFields) { return insertFields .filter((f) => f.required) .map((field) => { const capitalizedName = field.name.charAt(0).toUpperCase() + field.name.slice(1); if (field.type === 'varchar' || field.type === 'text') { return `const validate${capitalizedName} = (${field.name}) => { if (!${field.name} || typeof ${field.name} !== 'string' || ${field.name}.trim().length === 0) { throw new Error('${field.comment || field.name}参数无效'); } };`; } else { return `const validate${capitalizedName} = (${field.name}) => { if (${field.name} === undefined || ${field.name} === null) { throw new Error('${field.comment || field.name}参数无效'); } };`; } }) .join('\n\n'); } generateValidationCalls(insertFields) { return insertFields .filter((f) => f.required) .map((f) => { const capitalizedName = f.name.charAt(0).toUpperCase() + f.name.slice(1); return ` validate${capitalizedName}(data.${f.name});`; }) .join('\n'); } generateBatchValidationCalls(insertFields) { return insertFields .filter((f) => f.required) .map((f) => { const capitalizedName = f.name.charAt(0).toUpperCase() + f.name.slice(1); return ` validate${capitalizedName}(data.${f.name});`; }) .join('\n'); } generateUpdateValidationCalls(insertFields) { return insertFields .filter((f) => f.required) .map((f) => { const capitalizedName = f.name.charAt(0).toUpperCase() + f.name.slice(1); return ` if (data.${f.name} !== undefined) validate${capitalizedName}(data.${f.name});`; }) .join('\n'); } } exports.ResolverGenerator = ResolverGenerator;