numex-ilan/server.js

129 lines
4.4 KiB
JavaScript
Raw Permalink 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.

const express = require('express');
const path = require('path');
const db = require('./server/data/db');
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
// ===== KATEGORİLER =====
app.get('/api/kategoriler', (req, res) => {
res.json(db.hepsiniGetir('kategoriler'));
});
// ===== İLANLAR =====
app.get('/api/ilanlar', (req, res) => {
let ilanlar = db.hepsiniGetir('ilanlar');
const { kategori, il, min, max, arama, model, km } = req.query;
if (kategori) ilanlar = ilanlar.filter((i) => String(i.kategoriId) === String(kategori));
if (il) ilanlar = ilanlar.filter((i) => i.il === il);
if (min) ilanlar = ilanlar.filter((i) => i.fiyat >= Number(min));
if (max) ilanlar = ilanlar.filter((i) => i.fiyat <= Number(max));
if (km) ilanlar = ilanlar.filter((i) => i.ozellikler?.km && i.ozellikler.km <= Number(km));
if (arama) {
const q = arama.toLowerCase();
ilanlar = ilanlar.filter((i) =>
(i.baslik + ' ' + i.aciklama + ' ' + (i.kategori || '')).toLowerCase().includes(q)
);
}
res.json(ilanlar);
});
app.get('/api/ilanlar/:id', (req, res) => {
const ilan = db.idIleGetir('ilanlar', req.params.id);
if (!ilan) return res.status(404).json({ hata: 'İlan bulunamadı' });
res.json(ilan);
});
app.post('/api/ilanlar', (req, res) => {
const gerekli = ['baslik', 'fiyat', 'kategoriId', 'il', 'sahip', 'telefon'];
for (const alan of gerekli) {
if (!req.body[alan]) return res.status(400).json({ hata: `${alan} zorunludur` });
}
const kategori = db.hepsiniGetir('kategoriler').find((k) => k.id === Number(req.body.kategoriId));
const yeniIlan = {
...req.body,
kategori: kategori ? kategori.ad : 'Diğer',
fiyat: Number(req.body.fiyat),
kainat: req.body.aciklama || '',
tarih: new Date().toISOString().slice(0, 10),
};
const cevap = db.ekle('ilanlar', yeniIlan);
res.status(201).json(cevap);
});
app.put('/api/ilanlar/:id', (req, res) => {
const guncel = db.guncelle('ilanlar', req.params.id, req.body);
if (!guncel) return res.status(404).json({ hata: 'İlan bulunamadı' });
res.json(guncel);
});
app.delete('/api/ilanlar/:id', (req, res) => {
const silindi = db.sil('ilanlar', req.params.id);
if (!silindi) return res.status(404).json({ hata: 'İlan bulunamadı' });
res.json({ mesaj: 'İlan silindi', id: Number(req.params.id) });
});
// ===== MESAJLAR =====
app.get('/api/mesajlar/:ilanId', (req, res) => {
const mesajlar = db.hepsiniGetir('mesajlar').filter((m) => String(m.ilanId) === String(req.params.ilanId));
res.json(mesajlar);
});
app.post('/api/mesajlar', (req, res) => {
const { ilanId, gonderen, mesaj } = req.body;
if (!ilanId || !mesaj) return res.status(400).json({ hata: 'ilanId ve mesaj zorunludur' });
const kayit = db.ekle('mesajlar', {
ilanId,
gonderen: gonderen || 'Anonim',
mesaj,
tarih: new Date().toISOString(),
});
res.status(201).json(kayit);
});
// ===== FAVORİLER (session-free: localStorage tabanlı, sunucu uçları da açık) =====
app.get('/api/favoriler', (req, res) => {
res.json(db.hepsiniGetir('favoriler'));
});
app.post('/api/favoriler', (req, res) => {
const { ilanId } = req.body;
if (!ilanId) return res.status(400).json({ hata: 'ilanId zorunludur' });
const mevcut = db.hepsiniGetir('favoriler').some((f) => String(f.ilanId) === String(ilanId));
if (mevcut) return res.status(409).json({ hata: 'İlan zaten favoride' });
const kayit = db.ekle('favoriler', { ilanId, tarih: new Date().toISOString() });
res.status(201).json(kayit);
});
app.delete('/api/favoriler/:ilanId', (req, res) => {
const favoriler = db.hepsiniGetir('favoriler');
const kayit = favoriler.find((f) => String(f.ilanId) === String(req.params.ilanId));
if (kayit) db.sil('favoriler', kayit.id);
res.json({ mesaj: 'Favoriden çıkarıldı' });
});
// ===== ANA SAYFA =====
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
const server = app.listen(PORT);
server.on('error', (err) => {
if (err.code === 'EADDRINUSE') {
console.error(`${PORT} portu zaten kullanımda. Çözüm: portu tutan süreci kapatın ya da:\n set PORT=4000&& node server.js`);
} else {
console.error('❌ Sunucu başlatılamadı:', err.message);
}
process.exit(1);
});
server.on('listening', () => {
console.log(`🚀 Numex İlan Platformu ${PORT} portunda çalışıyor`);
console.log(` → http://localhost:${PORT}`);
});