envanter-dokuman/models/categoryModel.js

133 lines
3.1 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';
/**
* categoryModel.js
* Kategori veri katmanı — JSON dosya depolama.
* data/categories.json üzerinde CRUD işlemleri.
*/
const fs = require('fs');
const path = require('path');
const DATA_DIR = path.join(__dirname, '..', 'data');
const FILE_PATH = path.join(DATA_DIR, 'categories.json');
const DEFAULT_CATEGORIES = [
{ id: 1, name: 'Elektronik', slug: 'elektronik' },
{ id: 2, name: 'Gıda', slug: 'gida' },
{ id: 3, name: 'Giyim', slug: 'giyim' },
{ id: 4, name: 'Diğer', slug: 'diger' }
];
function ensureDir() {
if (!fs.existsSync(DATA_DIR)) {
fs.mkdirSync(DATA_DIR, { recursive: true });
}
}
/** Türkçe karakterleri güvenli slug'a çevirir. */
function slugify(name) {
return String(name)
.toLowerCase()
.replace(/ğ/g, 'g')
.replace(/ü/g, 'u')
.replace(/ş/g, 's')
.replace(/ı/g, 'i')
.replace(/ö/g, 'o')
.replace(/ç/g, 'c')
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
/**
* Tüm kategorileri okur; dosya yoksa varsayılan kategorileri oluşturur.
* @returns {Array} kategori listesi
*/
function readAll() {
try {
ensureDir();
if (!fs.existsSync(FILE_PATH)) {
writeAll(DEFAULT_CATEGORIES);
return DEFAULT_CATEGORIES;
}
const raw = fs.readFileSync(FILE_PATH, 'utf8');
const data = JSON.parse(raw);
return Array.isArray(data) ? data : [];
} catch (err) {
console.error('Kategori dosyası okunamadı:', err.message);
return [];
}
}
/**
* Kategori listesini yazar.
* @param {Array} categories kategori listesi
*/
function writeAll(categories) {
ensureDir();
fs.writeFileSync(FILE_PATH, JSON.stringify(categories, null, 2), 'utf8');
}
/**
* ID'ye göre kategori bulur.
* @param {number} id kategori ID
* @returns {Object|null}
*/
function findById(id) {
const categories = readAll();
return categories.find((c) => c.id === Number(id)) || null;
}
/**
* Yeni kategori ekler.
* @param {string} name kategori adı
* @returns {Object} oluşturulan kategori
*/
function create(name) {
const categories = readAll();
const nextId =
categories.length > 0 ? Math.max(...categories.map((c) => Number(c.id) || 0)) + 1 : 1;
const category = { id: nextId, name: String(name).trim(), slug: slugify(name) };
categories.push(category);
writeAll(categories);
return category;
}
/**
* Kategori adını günceller.
* @param {number} id kategori ID
* @param {string} name yeni ad
* @returns {Object|null}
*/
function update(id, name) {
const categories = readAll();
const idx = categories.findIndex((c) => c.id === Number(id));
if (idx === -1) return null;
categories[idx].name = String(name).trim();
categories[idx].slug = slugify(name);
writeAll(categories);
return categories[idx];
}
/**
* Kategoriyi siler.
* @param {number} id kategori ID
* @returns {boolean}
*/
function remove(id) {
const categories = readAll();
const filtered = categories.filter((c) => c.id !== Number(id));
if (filtered.length === categories.length) return false;
writeAll(filtered);
return true;
}
module.exports = {
readAll,
writeAll,
findById,
create,
update,
remove
};