Numex yayın: routes/categories.js
This commit is contained in:
parent
0879327e40
commit
6cb533c4e0
86
routes/categories.js
Normal file
86
routes/categories.js
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
'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;
|
||||||
Loading…
Reference in New Issue
Block a user