54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { db } = require('../db');
|
|
|
|
router.get('/', (req, res) => {
|
|
const category = req.query.category;
|
|
const sort = req.query.sort || 'desc';
|
|
const lang = req.query.lang;
|
|
|
|
let query = `SELECT * FROM articles WHERE status = 'published'`;
|
|
const params = [];
|
|
|
|
if (category) {
|
|
query += ` AND categories LIKE ?`;
|
|
params.push(`%"${category}"%`);
|
|
}
|
|
|
|
if (lang) {
|
|
query += ` AND COALESCE(language, source_language, 'fr') = ?`;
|
|
params.push(lang);
|
|
}
|
|
|
|
query += ` ORDER BY datetime(published_at) ${sort === 'asc' ? 'ASC' : 'DESC'}, datetime(created_at) DESC`;
|
|
|
|
const articles = db.prepare(query).all(...params);
|
|
|
|
// Récupérer les catégories uniques
|
|
let catQuery = `SELECT categories FROM articles WHERE status = 'published' AND categories IS NOT NULL`;
|
|
const catParams = [];
|
|
if (lang) {
|
|
catQuery += ` AND COALESCE(language, source_language, 'fr') = ?`;
|
|
catParams.push(lang);
|
|
}
|
|
const allArticles = db.prepare(catQuery).all(...catParams);
|
|
const categoriesSet = new Set();
|
|
allArticles.forEach(a => {
|
|
try {
|
|
const cats = JSON.parse(a.categories);
|
|
if (Array.isArray(cats)) {
|
|
cats.forEach(c => categoriesSet.add(c));
|
|
}
|
|
} catch(e) {}
|
|
});
|
|
const categories = Array.from(categoriesSet).sort();
|
|
|
|
// Récupérer les langues disponibles
|
|
const langRows = db.prepare(`SELECT DISTINCT COALESCE(language, source_language, 'fr') as lang FROM articles WHERE status = 'published' ORDER BY lang`).all();
|
|
const languages = langRows.map(r => r.lang).filter(Boolean);
|
|
|
|
res.render('index', { articles, categories, selectedCategory: category, sort, languages, selectedLang: lang });
|
|
});
|
|
|
|
module.exports = router;
|