joblist front

This commit is contained in:
quasar 2025-05-30 13:52:45 +02:00
parent 08bb8deec5
commit 344fccac45
4 changed files with 48 additions and 8 deletions

View file

@ -9,7 +9,9 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@types/cors": "^2.8.18",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"cors": "^2.8.5",
"node-cron": "^4.0.7" "node-cron": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
@ -199,6 +201,15 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/cors": {
"version": "2.8.18",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz",
"integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/express": { "node_modules/@types/express": {
"version": "5.0.2", "version": "5.0.2",
"resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz",
@ -242,7 +253,6 @@
"version": "22.15.27", "version": "22.15.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.27.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.27.tgz",
"integrity": "sha512-5fF+eu5mwihV2BeVtX5vijhdaZOfkQTATrePEaXTcKqI16LhJ7gi2/Vhd9OZM0UojcdmiOCVg5rrax+i1MdoQQ==", "integrity": "sha512-5fF+eu5mwihV2BeVtX5vijhdaZOfkQTATrePEaXTcKqI16LhJ7gi2/Vhd9OZM0UojcdmiOCVg5rrax+i1MdoQQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
@ -586,6 +596,19 @@
"node": ">=6.6.0" "node": ">=6.6.0"
} }
}, },
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/create-require": { "node_modules/create-require": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@ -1350,6 +1373,15 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": { "node_modules/object-inspect": {
"version": "1.13.4", "version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@ -2112,7 +2144,6 @@
"version": "6.21.0", "version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/unpipe": { "node_modules/unpipe": {
@ -2136,7 +2167,6 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.8" "node": ">= 0.8"

View file

@ -26,7 +26,9 @@
"typescript": "^5.8.3" "typescript": "^5.8.3"
}, },
"dependencies": { "dependencies": {
"@types/cors": "^2.8.18",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"cors": "^2.8.5",
"node-cron": "^4.0.7" "node-cron": "^4.0.7"
} }
} }

View file

@ -1,15 +1,23 @@
import express from 'express'; import express from 'express';
import dotenv from 'dotenv'; import dotenv from 'dotenv';
import cors from 'cors';
import jobIngestionRoutes from './routes/jobIngestionRoutes'; import jobIngestionRoutes from './routes/jobIngestionRoutes';
import jobSearchRoutes from './routes/jobSearchRoutes'; import jobSearchRoutes from './routes/jobSearchRoutes';
import { ingestJobOffers } from './controllers/jobIngestionController'; import { ingestJobOffers } from './controllers/jobIngestionController';
import { startJobIngestionScheduler } from './utils/jobScheduler'; // <-- AJOUTE CETTE LIGNE import { startJobIngestionScheduler } from './utils/jobScheduler';
dotenv.config(); dotenv.config();
const app = express(); const app = express();
const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;
// Configuration CORS
app.use(cors({
origin: 'http://localhost:5173', // URL du frontend
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization'],
}));
app.use(express.json()); app.use(express.json());
app.use(jobIngestionRoutes); app.use(jobIngestionRoutes);
@ -18,5 +26,5 @@ app.post('/api/ingest-jobs', ingestJobOffers);
app.listen(PORT, () => { app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`); console.log(`Server is running on port ${PORT}`);
startJobIngestionScheduler(); // <-- AJOUTE CETTE LIGNE startJobIngestionScheduler();
}); });

View file

@ -13,7 +13,7 @@ import {
} from '@mui/material'; } from '@mui/material';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';
import type { JobOffer } from '../types'; import type { JobOffer, JobSearchResponse } from '../types';
const API_BASE_URL = 'http://localhost:3000/api/jobs'; const API_BASE_URL = 'http://localhost:3000/api/jobs';
@ -26,8 +26,8 @@ const JobList: React.FC = () => {
const fetchJobs = async () => { const fetchJobs = async () => {
try { try {
setLoading(true); setLoading(true);
const response = await axios.get<JobOffer[]>(API_BASE_URL); const response = await axios.get<JobSearchResponse>(API_BASE_URL);
setJobs(response.data); setJobs(response.data.jobs);
setError(null); setError(null);
} catch (err) { } catch (err) {
console.error("Erreur lors de la récupération des offres:", err); console.error("Erreur lors de la récupération des offres:", err);