'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 };