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

@@ -12,6 +12,347 @@
}
],
"paths": {
"/api/jobs": {
"get": {
"operationId": "api_jobs_get_collection",
"tags": [
"Job"
],
"responses": {
"200": {
"description": "Job collection",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job"
}
}
},
"application/ld+json": {
"schema": {
"type": "object",
"properties": {
"hydra:member": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job.jsonld"
}
},
"hydra:totalItems": {
"type": "integer",
"minimum": 0
},
"hydra:view": {
"type": "object",
"properties": {
"@id": {
"type": "string",
"format": "iri-reference"
},
"@type": {
"type": "string"
},
"hydra:first": {
"type": "string",
"format": "iri-reference"
},
"hydra:last": {
"type": "string",
"format": "iri-reference"
},
"hydra:previous": {
"type": "string",
"format": "iri-reference"
},
"hydra:next": {
"type": "string",
"format": "iri-reference"
}
},
"example": {
"@id": "string",
"type": "string",
"hydra:first": "string",
"hydra:last": "string",
"hydra:previous": "string",
"hydra:next": "string"
}
},
"hydra:search": {
"type": "object",
"properties": {
"@type": {
"type": "string"
},
"hydra:template": {
"type": "string"
},
"hydra:variableRepresentation": {
"type": "string"
},
"hydra:mapping": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
},
"variable": {
"type": "string"
},
"property": {
"type": [
"string",
"null"
]
},
"required": {
"type": "boolean"
}
}
}
}
}
}
},
"required": [
"hydra:member"
]
}
},
"text/html": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job"
}
}
},
"application/hal+json": {
"schema": {
"type": "object",
"properties": {
"_embedded": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job.jsonhal"
}
},
"totalItems": {
"type": "integer",
"minimum": 0
},
"itemsPerPage": {
"type": "integer",
"minimum": 0
},
"_links": {
"type": "object",
"properties": {
"self": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
},
"first": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
},
"last": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
},
"next": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
},
"previous": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
}
}
}
},
"required": [
"_links",
"_embedded"
]
}
}
}
}
},
"summary": "Retrieves the collection of Job resources.",
"description": "Retrieves the collection of Job resources.",
"parameters": [
{
"name": "status",
"in": "query",
"description": "Filtrer par status",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string",
"enum": [
"pending",
"in_progress",
"completed",
"failed"
],
"example": "pending"
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "type",
"in": "query",
"description": "Filtrer par type de job (ex: scraping_job)",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string"
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "createdAfter",
"in": "query",
"description": "Date de cr\u00e9ation minimum (format ISO8601)",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string",
"format": "date-time"
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "createdBefore",
"in": "query",
"description": "Date de cr\u00e9ation maximum (format ISO8601)",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string",
"format": "date-time"
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "page",
"in": "query",
"description": "Num\u00e9ro de la page",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "integer",
"default": 1,
"minimum": 1
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "limit",
"in": "query",
"description": "Nombre d'\u00e9l\u00e9ments par page",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "integer",
"default": 20,
"minimum": 1
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "sortBy",
"in": "query",
"description": "Champ de tri",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string",
"enum": [
"createdAt",
"type",
"status"
],
"default": "createdAt"
},
"style": "form",
"explode": false,
"allowReserved": false
},
{
"name": "sortOrder",
"in": "query",
"description": "Ordre de tri",
"required": false,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string",
"enum": [
"ASC",
"DESC"
],
"default": "DESC"
},
"style": "form",
"explode": false,
"allowReserved": false
}
],
"deprecated": false
},
"parameters": []
},
"/api/manga/chapters/fetch": {
"post": {
"operationId": "api_mangachaptersfetch_post",
@@ -596,30 +937,24 @@
"description": "Creates a new manga by fetching its data from Mangadex using an external ID",
"parameters": [],
"requestBody": {
"description": "The new Manga resource",
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Manga"
}
},
"application/ld+json": {
"schema": {
"$ref": "#/components/schemas/Manga.jsonld"
}
},
"text/html": {
"schema": {
"$ref": "#/components/schemas/Manga"
}
},
"application/hal+json": {
"schema": {
"$ref": "#/components/schemas/Manga.jsonhal"
"type": "object",
"required": [
"externalId"
],
"properties": {
"externalId": {
"type": "string",
"description": "The Mangadex ID of the manga"
}
}
}
}
},
"required": true
"required": false
},
"deprecated": false
},
@@ -1177,64 +1512,6 @@
"deprecated": false
},
"parameters": []
},
"/api/scraping/jobs/{jobId}/status": {
"get": {
"operationId": "api_scrapingjobs_jobIdstatus_get",
"tags": [
"Scraping"
],
"responses": {
"200": {
"description": "Scraping resource",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Scraping"
}
},
"application/ld+json": {
"schema": {
"$ref": "#/components/schemas/Scraping.jsonld"
}
},
"text/html": {
"schema": {
"$ref": "#/components/schemas/Scraping"
}
},
"application/hal+json": {
"schema": {
"$ref": "#/components/schemas/Scraping.jsonhal"
}
}
}
},
"404": {
"description": "Resource not found"
}
},
"summary": "Retrieves a Scraping resource.",
"description": "Retrieves a Scraping resource.",
"parameters": [
{
"name": "jobId",
"in": "path",
"description": "ScrapingStatusResponse identifier",
"required": true,
"deprecated": false,
"allowEmptyValue": false,
"schema": {
"type": "string"
},
"style": "simple",
"explode": false,
"allowReserved": false
}
],
"deprecated": false
},
"parameters": []
}
},
"components": {
@@ -1265,6 +1542,9 @@
"isVisible": {
"type": "boolean"
},
"isAvailable": {
"type": "boolean"
},
"createdAt": {
"type": "string"
}
@@ -1296,6 +1576,9 @@
"isVisible": {
"type": "boolean"
},
"isAvailable": {
"type": "boolean"
},
"createdAt": {
"type": "string"
}
@@ -1362,11 +1645,264 @@
"isVisible": {
"type": "boolean"
},
"isAvailable": {
"type": "boolean"
},
"createdAt": {
"type": "string"
}
}
},
"Job": {
"type": "object",
"description": "Liste des jobs",
"deprecated": false,
"properties": {
"id": {
"description": "Identifiant unique du job",
"type": "string"
},
"type": {
"description": "Type du job (ex: scraping_job)",
"type": "string"
},
"status": {
"description": "Status du job",
"type": "string",
"enum": [
"pending",
"in_progress",
"completed",
"failed",
"cancelled"
]
},
"createdAt": {
"description": "Date de cr\u00e9ation du job",
"type": "string",
"format": "date-time"
},
"startedAt": {
"description": "Date de d\u00e9but d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"completedAt": {
"description": "Date de fin d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"failureReason": {
"description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9",
"type": [
"string",
"null"
]
},
"attempts": {
"minimum": 0,
"description": "Nombre de tentatives effectu\u00e9es",
"type": "integer"
},
"maxAttempts": {
"exclusiveMinimum": 0,
"description": "Nombre maximum de tentatives autoris\u00e9es",
"type": "integer"
},
"context": {
"description": "Donn\u00e9es contextuelles du job",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"type",
"status",
"createdAt"
]
},
"Job.jsonhal": {
"type": "object",
"description": "Liste des jobs",
"deprecated": false,
"properties": {
"_links": {
"type": "object",
"properties": {
"self": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "iri-reference"
}
}
}
}
},
"id": {
"description": "Identifiant unique du job",
"type": "string"
},
"type": {
"description": "Type du job (ex: scraping_job)",
"type": "string"
},
"status": {
"description": "Status du job",
"type": "string",
"enum": [
"pending",
"in_progress",
"completed",
"failed",
"cancelled"
]
},
"createdAt": {
"description": "Date de cr\u00e9ation du job",
"type": "string",
"format": "date-time"
},
"startedAt": {
"description": "Date de d\u00e9but d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"completedAt": {
"description": "Date de fin d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"failureReason": {
"description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9",
"type": [
"string",
"null"
]
},
"attempts": {
"minimum": 0,
"description": "Nombre de tentatives effectu\u00e9es",
"type": "integer"
},
"maxAttempts": {
"exclusiveMinimum": 0,
"description": "Nombre maximum de tentatives autoris\u00e9es",
"type": "integer"
},
"context": {
"description": "Donn\u00e9es contextuelles du job",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"type",
"status",
"createdAt"
]
},
"Job.jsonld": {
"type": "object",
"description": "Liste des jobs",
"deprecated": false,
"properties": {
"@id": {
"readOnly": true,
"type": "string"
},
"@type": {
"readOnly": true,
"type": "string"
},
"id": {
"description": "Identifiant unique du job",
"type": "string"
},
"type": {
"description": "Type du job (ex: scraping_job)",
"type": "string"
},
"status": {
"description": "Status du job",
"type": "string",
"enum": [
"pending",
"in_progress",
"completed",
"failed",
"cancelled"
]
},
"createdAt": {
"description": "Date de cr\u00e9ation du job",
"type": "string",
"format": "date-time"
},
"startedAt": {
"description": "Date de d\u00e9but d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"completedAt": {
"description": "Date de fin d'ex\u00e9cution du job",
"type": [
"string",
"null"
],
"format": "date-time"
},
"failureReason": {
"description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9",
"type": [
"string",
"null"
]
},
"attempts": {
"minimum": 0,
"description": "Nombre de tentatives effectu\u00e9es",
"type": "integer"
},
"maxAttempts": {
"exclusiveMinimum": 0,
"description": "Nombre maximum de tentatives autoris\u00e9es",
"type": "integer"
},
"context": {
"description": "Donn\u00e9es contextuelles du job",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"type",
"status",
"createdAt"
]
},
"Manga": {
"type": "object",
"description": "",
@@ -2284,6 +2820,12 @@
"null"
]
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"author": {
"type": "string"
},
@@ -2334,6 +2876,12 @@
"null"
]
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"author": {
"type": "string"
},
@@ -2419,6 +2967,12 @@
"null"
]
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"author": {
"type": "string"
},