mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
Backend: Système complet RSS + OpenRouter + Administration améliorée
## Base de données: - Table settings (key-value pour paramètres globaux) - Table rss_feeds (url, title, description, enabled, last_fetched_at) - Table rss_articles (feed_id, title, link, description, pub_date, content) - Index optimisés pour performance ## Routes Settings (/api/settings): - GET /api/settings - Récupérer tous les paramètres - GET /api/settings/:key - Récupérer un paramètre - PUT /api/settings/:key - Mettre à jour un paramètre - DELETE /api/settings/:key - Supprimer un paramètre - Middleware requireAdmin sur toutes les routes ## Routes RSS (/api/rss): - GET /api/rss/feeds - Liste des flux RSS (admin) - POST /api/rss/feeds - Ajouter flux RSS avec parsing validation (admin) - PUT /api/rss/feeds/:id - Activer/désactiver flux (admin) - DELETE /api/rss/feeds/:id - Supprimer flux (admin) - POST /api/rss/fetch - Récupérer articles de tous flux actifs (admin) - GET /api/rss/articles - Récupérer 10 derniers articles (tous users) - POST /api/rss/summarize - Générer résumé OpenRouter (admin) - GET /api/rss/models - Liste modèles OpenRouter (admin) ## Intégration OpenRouter: - Appel API avec clé, modèle et prompt configurables - Résumé intelligent des 10 derniers articles - Prompt par défaut optimisé pour résumés d'actualités - Support GPT-4, Claude 3, Gemini, Llama 3, Mistral, etc. - Gestion erreurs et timeout ## Parser RSS: - rss-parser installé pour parsing flux - Gestion articles avec contenu, description, date - Détection doublons par URL - Update automatique infos flux ## Frontend HTML: - Modal admin avec système à onglets (Users/RSS/OpenRouter) - Modal changement mot de passe sans prompt navigateur - Box RSS dans page principale affichage 10 derniers articles - Bouton résumé IA dans header box RSS - Inputs pour gestion flux RSS - Configuration OpenRouter (API key, modèle, prompt, activation) - Sélecteur modèles avec recherche Prochaine étape: CSS + JavaScript pour fonctionnalités
This commit is contained in:
7 files changed
+744
-19
No files matched your search
+116
-18
@@ -146,6 +146,24 @@
|
||||
<!-- Todos will be inserted here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- RSS Box -->
|
||||
<div class="rss-box">
|
||||
<div class="rss-box-header">
|
||||
<h2 class="rss-box-title">📰 Actualités</h2>
|
||||
<button class="btn-summarize" id="summarizeRssBtn" title="Générer un résumé avec IA">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M12 2L2 7l10 5 10-5-10-5z"></path>
|
||||
<path d="M2 17l10 5 10-5"></path>
|
||||
<path d="M2 12l10 5 10-5"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="rss-articles-list" id="rssArticlesList">
|
||||
<p class="rss-empty">Aucun article pour le moment</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
@@ -153,29 +171,109 @@
|
||||
<div class="modal-backdrop" id="adminModal" style="display: none;">
|
||||
<div class="modal-content admin-modal">
|
||||
<div class="modal-header">
|
||||
<h2>Administration des utilisateurs</h2>
|
||||
<h2>Administration</h2>
|
||||
<button class="modal-close" id="closeAdminModal">✕</button>
|
||||
</div>
|
||||
|
||||
<div class="admin-actions">
|
||||
<button class="action-btn" id="createUserBtn">+ Créer un utilisateur</button>
|
||||
<div class="admin-tabs">
|
||||
<button class="admin-tab active" data-tab="users">👥 Utilisateurs</button>
|
||||
<button class="admin-tab" data-tab="rss">📰 Flux RSS</button>
|
||||
<button class="admin-tab" data-tab="openrouter">🤖 OpenRouter</button>
|
||||
</div>
|
||||
|
||||
<div class="users-table-container">
|
||||
<table class="users-table" id="usersTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Nom d'utilisateur</th>
|
||||
<th>Admin</th>
|
||||
<th>Créé le</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="usersTableBody">
|
||||
<!-- Users will be inserted here -->
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- Onglet Utilisateurs -->
|
||||
<div class="admin-tab-content" id="tab-users">
|
||||
<div class="admin-actions">
|
||||
<button class="action-btn" id="createUserBtn">+ Créer un utilisateur</button>
|
||||
</div>
|
||||
|
||||
<div class="users-table-container">
|
||||
<table class="users-table" id="usersTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Nom d'utilisateur</th>
|
||||
<th>Admin</th>
|
||||
<th>Créé le</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="usersTableBody">
|
||||
<!-- Users will be inserted here -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Onglet RSS -->
|
||||
<div class="admin-tab-content" id="tab-rss" style="display: none;">
|
||||
<div class="admin-actions">
|
||||
<input type="url" id="rssUrlInput" class="rss-url-input" placeholder="https://example.com/feed.xml">
|
||||
<button class="action-btn" id="addRssFeedBtn">+ Ajouter un flux</button>
|
||||
<button class="action-btn btn-secondary" id="fetchRssBtn">🔄 Récupérer les articles</button>
|
||||
</div>
|
||||
|
||||
<div class="rss-feeds-list" id="rssFeedsList">
|
||||
<!-- Feeds will be inserted here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Onglet OpenRouter -->
|
||||
<div class="admin-tab-content" id="tab-openrouter" style="display: none;">
|
||||
<div class="openrouter-settings">
|
||||
<div class="setting-group">
|
||||
<label for="openrouterApiKey">Clé API OpenRouter</label>
|
||||
<input type="password" id="openrouterApiKey" class="setting-input" placeholder="sk-or-...">
|
||||
<small>Obtenez votre clé sur <a href="https://openrouter.ai" target="_blank">openrouter.ai</a></small>
|
||||
</div>
|
||||
|
||||
<div class="setting-group">
|
||||
<label for="openrouterModel">Modèle</label>
|
||||
<input type="text" id="modelSearch" class="setting-input" placeholder="Rechercher un modèle...">
|
||||
<select id="openrouterModel" class="setting-select" size="8">
|
||||
<!-- Models will be inserted here -->
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="setting-group">
|
||||
<label for="rssSummaryEnabled">
|
||||
<input type="checkbox" id="rssSummaryEnabled">
|
||||
Activer les résumés automatiques
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-group">
|
||||
<label for="rssSummaryPrompt">Prompt de résumé</label>
|
||||
<textarea id="rssSummaryPrompt" class="setting-textarea" rows="10" placeholder="Le prompt sera chargé..."></textarea>
|
||||
</div>
|
||||
|
||||
<button class="action-btn" id="saveOpenRouterSettings">💾 Sauvegarder les paramètres</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal Change Password -->
|
||||
<div class="modal-backdrop" id="changePasswordModal" style="display: none;">
|
||||
<div class="modal-content small-modal">
|
||||
<div class="modal-header">
|
||||
<h3>Changer le mot de passe</h3>
|
||||
<button class="modal-close" id="closeChangePasswordModal">✕</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p id="changePasswordUsername"></p>
|
||||
<div class="form-group">
|
||||
<label for="newPassword">Nouveau mot de passe</label>
|
||||
<input type="password" id="newPassword" class="form-input" placeholder="Minimum 6 caractères">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="confirmPassword">Confirmer le mot de passe</label>
|
||||
<input type="password" id="confirmPassword" class="form-input">
|
||||
</div>
|
||||
<div class="modal-actions">
|
||||
<button class="btn-cancel" id="cancelChangePassword">Annuler</button>
|
||||
<button class="btn-confirm" id="confirmChangePassword">Changer</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user