envanter-dokuman/routes/categories.js

87 lines
2.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
/**
* routes/categories.js
* Kategori yönetim rotaları — CRUD + ürün sayısı.
*/
const express = require('express');
const router = express.Router();
const categoryModel = require('../models/categoryModel');
const productModel = require('../models/productModel');
/** Kategorilere ürün sayısını ekler. */
function withCounts(categories) {
const products = productModel.readAll();
return categories.map((c) => ({
...c,
products: products.filter((p) => Number(p.categoryId) === Number(c.id)).length
}));
}
/** GET /new — kategori ekleme formu */
router.get('/new', (req, res) => {
res.render('categories/new', {
title: 'Yeni Kategori',
bodyClass: 'form-page'
});
});
/** GET / — tüm kategoriler + ürün sayıları */
router.get('/', (req, res) => {
const categories = withCounts(categoryModel.readAll());
if (req.query.json !== undefined) {
return res.json(categories);
}
res.render('categories/list', {
title: 'Kategoriler',
categories,
bodyClass: 'list-page'
});
});
/** POST / — yeni kategori ekler */
router.post('/', (req, res) => {
const { name } = req.body || {};
if (!name || !String(name).trim()) {
return res.status(400).json({ error: 'Kategori adı zorunludur.' });
}
const existing = categoryModel.readAll().find(
(c) => c.name.toLowerCase() === String(name).trim().toLowerCase()
);
if (existing) {
return res.status(400).json({ error: 'Bu isimde bir kategori zaten var.' });
}
const category = categoryModel.create(name);
res.status(201).json(category);
});
/** PUT /:id — kategori günceller */
router.put('/:id', (req, res) => {
const { name } = req.body || {};
if (!name || !String(name).trim()) {
return res.status(400).json({ error: 'Kategori adı boş olamaz.' });
}
const updated = categoryModel.update(req.params.id, name);
if (!updated) return res.status(404).json({ error: 'Kategori bulunamadı' });
res.json(updated);
});
/** DELETE /:id — kategori siler (ürünü varsa engeller) */
router.delete('/:id', (req, res) => {
const id = Number(req.params.id);
const usedProducts = productModel
.readAll()
.filter((p) => Number(p.categoryId) === id).length;
if (usedProducts > 0) {
return res.status(400).json({
error: `Bu kategoriye ait ${usedProducts} ürün var. Önce ürünleri taşıyın/silin.`
});
}
const ok = categoryModel.remove(id);
if (!ok) return res.status(404).json({ error: 'Kategori bulunamadı' });
res.status(204).end();
});
module.exports = router;