Files
TK-FB-Project/api.hyungi.net/controllers/pipeSpecController.js

127 lines
3.6 KiB
JavaScript

const { getDb } = require('../dbPool');
// ✅ 전체 스펙 목록 (프론트 드롭다운용 label 포함)
exports.getAll = async (req, res) => {
try {
const db = await getDb();
const [rows] = await db.query(`
SELECT spec_id, material, diameter_in, schedule
FROM PipeSpecs
ORDER BY material, diameter_in
`);
const result = rows.map(row => ({
spec_id: row.spec_id,
label: `${row.material} / ${row.diameter_in} / ${row.schedule}`
}));
res.json(result);
} catch (err) {
console.error('[getAll 오류]', err);
res.status(500).json({ error: '파이프 스펙 전체 조회 실패' });
}
};
// ✅ 등록
exports.create = async (req, res) => {
try {
const { material, diameter_in, schedule } = req.body;
if (!material || !diameter_in || !schedule) {
return res.status(400).json({ error: '모든 항목이 필요합니다.' });
}
const db = await getDb();
// 중복 체크
const [existing] = await db.query(
`SELECT * FROM PipeSpecs WHERE material = ? AND diameter_in = ? AND schedule = ?`,
[material.trim(), diameter_in.trim(), schedule.trim()]
);
if (existing.length > 0) {
return res.status(409).json({ error: '이미 등록된 스펙입니다.' });
}
await db.query(
`INSERT INTO PipeSpecs (material, diameter_in, schedule) VALUES (?, ?, ?)`,
[material.trim(), diameter_in.trim(), schedule.trim()]
);
res.json({ success: true });
} catch (err) {
console.error('[create 오류]', err);
res.status(500).json({ error: '파이프 스펙 등록 실패' });
}
};
// ✅ 삭제
exports.remove = async (req, res) => {
const { spec_id } = req.params;
try {
const db = await getDb();
const [result] = await db.query(
`DELETE FROM PipeSpecs WHERE spec_id = ?`,
[spec_id]
);
if (result.affectedRows === 0) {
return res.status(404).json({ error: '해당 스펙이 존재하지 않습니다.' });
}
res.json({ success: true });
} catch (err) {
console.error('[remove 오류]', err);
res.status(500).json({ error: '파이프 스펙 삭제 실패' });
}
};
// ✅ 재질 목록
exports.getMaterials = async (req, res) => {
try {
const db = await getDb();
const [rows] = await db.query(
`SELECT DISTINCT material FROM PipeSpecs ORDER BY material`
);
res.json(rows.map(row => row.material));
} catch (err) {
res.status(500).json({ error: '재질 목록 조회 실패' });
}
};
// ✅ 직경 목록 (material 기준)
exports.getDiameters = async (req, res) => {
const { material } = req.query;
if (!material) {
return res.status(400).json({ error: 'material 파라미터가 필요합니다.' });
}
try {
const db = await getDb();
const [rows] = await db.query(
`SELECT DISTINCT diameter_in FROM PipeSpecs WHERE material = ? ORDER BY diameter_in`,
[material]
);
res.json(rows.map(row => row.diameter_in));
} catch (err) {
res.status(500).json({ error: '직경 목록 조회 실패' });
}
};
// ✅ 스케줄 목록 (material + 직경 기준)
exports.getSchedules = async (req, res) => {
const { material, diameter_in } = req.query;
if (!material || !diameter_in) {
return res.status(400).json({ error: 'material과 diameter_in이 필요합니다.' });
}
try {
const db = await getDb();
const [rows] = await db.query(
`SELECT DISTINCT schedule FROM PipeSpecs
WHERE material = ? AND diameter_in = ?
ORDER BY schedule`,
[material, diameter_in]
);
res.json(rows.map(row => row.schedule));
} catch (err) {
res.status(500).json({ error: '스케줄 목록 조회 실패' });
}
};