feat(setting): étendre ContentSource avec champs de test et domain model
- Ajouter testSlug, testChapterNumber, baseUrl sur ContentSource (entité, domain model, migration) - Exposer ces champs dans les Resources, Processors, Providers et Mapper - Mettre à jour store Pinia, repository API et composants Vue (form, card, liste)
This commit is contained in:
parent
b0ce36096f
commit
795cbeccc3
@@ -91,10 +91,11 @@ import {
|
||||
ArrowPathIcon,
|
||||
ArrowUpTrayIcon,
|
||||
ExclamationTriangleIcon,
|
||||
HeartIcon,
|
||||
PlusIcon
|
||||
} from '@heroicons/vue/24/outline';
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { computed, onMounted, ref } from 'vue';
|
||||
import { computed, onMounted, onUnmounted, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import Toolbar from '../../../../shared/components/ui/Toolbar.vue';
|
||||
import { useContentSourceStore } from '../../application/store/contentSourceStore';
|
||||
@@ -108,9 +109,13 @@ const {
|
||||
loadingSources,
|
||||
sourcesError,
|
||||
importing,
|
||||
exporting
|
||||
exporting,
|
||||
checkingHealth,
|
||||
} = storeToRefs(contentSourceStore);
|
||||
|
||||
// Mercure — écoute des mises à jour health
|
||||
let mercureEventSource = null;
|
||||
|
||||
// Local state
|
||||
const showImportModal = ref(false);
|
||||
const showExportSuccess = ref(false);
|
||||
@@ -120,12 +125,32 @@ const importData = ref('');
|
||||
// Load sources on mount and clear current source
|
||||
onMounted(async () => {
|
||||
try {
|
||||
contentSourceStore.clearCurrentSource(); // Clear any previously loaded source
|
||||
contentSourceStore.clearErrors(); // Clear any previous errors
|
||||
contentSourceStore.clearCurrentSource();
|
||||
contentSourceStore.clearErrors();
|
||||
await contentSourceStore.loadSources();
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement des sources:', error);
|
||||
}
|
||||
|
||||
// Écoute Mercure pour les mises à jour de health status
|
||||
const url = new URL('/.well-known/mercure', window.location.href);
|
||||
sources.value.forEach(source => {
|
||||
url.searchParams.append('topic', `scrapers/health/${source.id}`);
|
||||
});
|
||||
|
||||
mercureEventSource = new EventSource(url.toString());
|
||||
mercureEventSource.onmessage = (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data);
|
||||
contentSourceStore.updateSourceHealth(data.sourceId, data.status, data.error);
|
||||
} catch (e) {
|
||||
console.error('Erreur parsing Mercure event:', e);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
mercureEventSource?.close();
|
||||
});
|
||||
|
||||
// Toolbar configuration
|
||||
@@ -135,6 +160,7 @@ const toolbarConfig = computed(() => ({
|
||||
],
|
||||
rightSection: [
|
||||
{ type: 'button', icon: ArrowPathIcon, label: 'Actualiser', onClick: () => contentSourceStore.loadSources(), disabled: loadingSources.value },
|
||||
{ type: 'button', icon: HeartIcon, label: 'Tester tous', onClick: handleCheckAllHealth, disabled: checkingHealth.value },
|
||||
{ type: 'button', icon: ArrowDownTrayIcon, label: 'Exporter', onClick: handleExport, disabled: exporting.value },
|
||||
{ type: 'button', icon: ArrowUpTrayIcon, label: 'Importer', onClick: () => showImportModal.value = true },
|
||||
],
|
||||
@@ -156,6 +182,14 @@ const openSourceLink = (url) => {
|
||||
window.open(url, '_blank');
|
||||
};
|
||||
|
||||
async function handleCheckAllHealth() {
|
||||
try {
|
||||
await contentSourceStore.checkAllHealth();
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du health check:', error);
|
||||
}
|
||||
}
|
||||
|
||||
async function handleExport() {
|
||||
try {
|
||||
const exportData = await contentSourceStore.exportSources();
|
||||
|
||||
Reference in New Issue
Block a user