feat: ajout de la gestion des jobs avec création, récupération, suppression et filtrage via l'API, incluant des entités, des composants Vue.js et des mises à jour de la documentation API

This commit is contained in:
ext.jeremy.guillot@maxicoffee.domains
2025-03-30 16:14:17 +02:00
parent 4d1d5b9f21
commit fd2d3cd640
21 changed files with 1538 additions and 184 deletions

View File

@@ -0,0 +1,124 @@
import { Job, JobCollection } from '../../domain/entities/job';
import { JobRepositoryInterface } from '../../domain/repository/JobRepositoryInterface';
export class ApiJobRepository extends JobRepositoryInterface {
/**
* Récupère la liste des jobs
* @param {Object} options Les options de filtrage et pagination
* @param {number} options.page Numéro de la page
* @param {number} options.limit Nombre d'éléments par page
* @param {string} options.sortBy Champ pour le tri
* @param {string} options.sortOrder Direction du tri ('ASC' ou 'DESC')
* @param {Array<string>} options.status Liste des statuts à filtrer
* @returns {Promise<JobCollection>} Collection de jobs
*/
async getJobs(options = {}) {
const { page = 1, limit = 100, sortBy = 'createdAt', sortOrder = 'DESC', status = [] } = options;
try {
let url = `/api/jobs?page=${page}&limit=${limit}&sortBy=${sortBy}&sortOrder=${sortOrder}`;
// Ajouter les filtres de statut s'ils sont fournis
if (status && status.length > 0) {
url += `&status=${status.join(',')}`;
}
const response = await fetch(url);
if (!response.ok) {
throw new Error('Failed to fetch jobs');
}
const data = await response.json();
return new JobCollection(
data.items || [],
data.total || 0,
data.page || 1,
data.limit || limit,
!!data.hasNextPage,
!!data.hasPreviousPage
);
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
/**
* Récupère un job par son ID
* @param {string} id Identifiant du job
* @returns {Promise<Job>} Job
*/
async getJobById(id) {
try {
const response = await fetch(`/api/jobs/${id}`);
if (!response.ok) {
throw new Error('Failed to fetch job');
}
const data = await response.json();
return Job.create(data);
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
/**
* Supprime un job
* @param {string} id Identifiant du job
* @returns {Promise<boolean>} Succès de l'opération
*/
async deleteJob(id) {
try {
const response = await fetch(`/api/jobs/${id}`, {
method: 'DELETE'
});
if (!response.ok) {
throw new Error('Failed to delete job');
}
return true;
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
/**
* Supprime tous les jobs correspondant aux critères
* @param {Object} criteria Critères de suppression
* @returns {Promise<number>} Nombre de jobs supprimés
*/
async deleteJobs(criteria = {}) {
try {
const queryParams = new URLSearchParams();
// Ajouter les critères à l'URL
Object.entries(criteria).forEach(([key, value]) => {
if (Array.isArray(value)) {
queryParams.append(key, value.join(','));
} else {
queryParams.append(key, value);
}
});
const response = await fetch(`/api/jobs?${queryParams.toString()}`, {
method: 'DELETE'
});
if (!response.ok) {
throw new Error('Failed to delete jobs');
}
const data = await response.json();
return data.deleted || 0;
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
}