Séances

GET /api/workouts

Obtenir les séances de l’utilisateur authentifié.

Scope : workouts:read

Exemple de requêtes :

  • sans paramètres :

GET /api/workouts/ HTTP/1.1
  • avec quelques paramètres de requête :

GET /api/workouts?from=2019-07-02&to=2019-07-31&sport_id=1  HTTP/1.1

Exemple de réponses :

  • renvoyant au moins une séance :

HTTP/1.1 200 OK
Content-Type: application/json

  {
    "data": {
      "workouts": [
        {
          "ascent": null,
          "ave_speed": 10.0,
          "bounds": [],
          "creation_date": "Sun, 14 Jul 2019 13:51:01 GMT",
          "descent": null,
          "description": null,
          "distance": 10.0,
          "duration": "0:17:04",
          "equipments": [],
          "id": "kjxavSTUrJvoAh2wvCeGEF",
          "map": null,
          "max_alt": null,
          "max_speed": 10.0,
          "min_alt": null,
          "modification_date": null,
          "moving": "0:17:04",
          "next_workout": 3,
          "notes": null,
          "pauses": null,
          "previous_workout": null,
          "records": [
            {
              "id": 4,
              "record_type": "MS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 13,
              "record_type": "HA",
              "sport_id": 1,
              "user": "Sam",
              "value": 43.97,
              "workout_date": "Sun, 07 Jul 2019 08:00:00 GMT",
              "workout_id": "hvYBqYBRa7wwXpaStWR4V2"
            },
            {
              "id": 3,
              "record_type": "LD",
              "sport_id": 1,
              "user": "admin",
              "value": "0:17:04",
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 2,
              "record_type": "FD",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 1,
              "record_type": "AS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            }
          ],
          "segments": [],
          "sport_id": 1,
          "title": null,
          "user": "admin",
          "weather_end": null,
          "weather_start": null,
          "with_gpx": false,
          "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT"
        }
      ]
    },
    "status": "success"
  }
  • renvoyant aucune séance

HTTP/1.1 200 OK
Content-Type: application/json

  {
      "data": {
          "workouts": []
      },
      "status": "success"
  }
Paramètres de requête:
  • page (integer) – page si pagination (par défaut : 1)

  • per_page (integer) – nombre d’entraînements par page (par défaut : 5, max : 100)

  • sport_id (integer) – identifiant du sport

  • title (string) – une partie (ou la totalité) du titre de la séance, la correspondance avec le titre ne tient pas compte des majuscules et des minuscules

  • from (string) – date de début (format : %Y-%m-%d)

  • to (string) – date de fin (format : %Y-%m-%d)

  • distance_from (float) – distance minimale

  • distance_to (float) – distance maximale

  • duration_from (string) – durée minimale (format : %H:%M)

  • duration_to (string) – distance maximale (format : %H:%M)

  • ave_speed_from (float) – vitesse moyenne minimale

  • ave_speed_to (float) – vitesse moyenne maximale

  • max_speed_from (float) – vitesse max. minimale

  • max_speed_to (float) – vitesse max. maximale

  • order (string) – ordre de tri : asc, desc (par défaut : desc)

  • order_by (string) – sorting criteria: ave_speed, distance, duration, workout_date (default: workout_date)

  • equipment_id (string) – id de l’équipement (si valeur à “none”, seules les séances sans équipements seront renvoyées)

  • notes (string) – une partie (ou la totalité) des notes de la séance, la correspondance avec les notes ne tient pas compte des majuscules et des minuscules

  • description (string) – une partie de la description de la séance, la correspondance avec la description ne tient pas compte des majuscules et des minuscules

En-têtes de requête:
Codes d’état:
GET /api/workouts/(string: workout_short_id)

Obtenir une séance.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1

Exemple de réponses :

  • succès :

HTTP/1.1 200 OK
Content-Type: application/json

  {
    "data": {
      "workouts": [
        {
          "ascent": null,
          "ave_speed": 16,
          "bounds": [],
          "creation_date": "Sun, 14 Jul 2019 18:57:14 GMT",
          "descent": null,
          "description": null,
          "distance": 12,
          "duration": "0:45:00",
          "equipments": [],
          "id": "kjxavSTUrJvoAh2wvCeGEF",
          "map": null,
          "max_alt": null,
          "max_speed": 16,
          "min_alt": null,
          "modification_date": "Sun, 14 Jul 2019 18:57:22 GMT",
          "moving": "0:45:00",
          "next_workout": 4,
          "notes": "workout without gpx",
          "pauses": null,
          "previous_workout": 3,
          "records": [],
          "segments": [],
          "sport_id": 1,
          "title": "biking on sunday morning",
          "user": "admin",
          "weather_end": null,
          "weather_start": null,
          "with_gpx": false,
          "workout_date": "Sun, 07 Jul 2019 07:00:00 GMT"
        }
      ]
    },
    "status": "success"
  }
  • séance non trouvé :

HTTP/1.1 404 NOT FOUND
Content-Type: application/json

  {
    "data": {
      "workouts": []
    },
    "status": "not found"
  }
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

En-têtes de requête:
Codes d’état:
GET /api/workouts/(string: workout_short_id)/gpx

Obtenir un fichier gpx pour une séance affichée sur une carte avec Leaflet.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/json

{
  "data": {
    "gpx": "gpx file content"
  },
  "message": "",
  "status": "success"
}
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

En-têtes de requête:
Codes d’état:
GET /api/workouts/(string: workout_short_id)/chart_data

Récupérer les données d’une séance avec gpx pour les afficher avec Chart.js.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/json

{
  "data": {
    "chart_data": [
      {
        "distance": 0,
        "duration": 0,
        "elevation": 279.4,
        "latitude": 51.5078118,
        "longitude": -0.1232004,
        "speed": 8.63,
        "time": "Fri, 14 Jul 2017 13:44:03 GMT"
      },
      {
        "distance": 7.5,
        "duration": 7380,
        "elevation": 280,
        "latitude": 51.5079733,
        "longitude": -0.1234538,
        "speed": 6.39,
        "time": "Fri, 14 Jul 2017 15:47:03 GMT"
      }
    ]
  },
  "message": "",
  "status": "success"
}
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

En-têtes de requête:
Codes d’état:
GET /api/workouts/(string: workout_short_id)/chart_data/segment/(int: segment_id)

Récupérer les données d’une séance avec gpx pour les afficher avec Chart.js.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart/segment/0 HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/json

{
  "data": {
    "chart_data": [
      {
        "distance": 0,
        "duration": 0,
        "elevation": 279.4,
        "latitude": 51.5078118,
        "longitude": -0.1232004,
        "speed": 8.63,
        "time": "Fri, 14 Jul 2017 13:44:03 GMT"
      },
      {
        "distance": 7.5,
        "duration": 7380,
        "elevation": 280,
        "latitude": 51.5079733,
        "longitude": -0.1234538,
        "speed": 6.39,
        "time": "Fri, 14 Jul 2017 15:47:03 GMT"
      }
    ]
  },
  "message": "",
  "status": "success"
}
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

  • segment_id (integer) – identifiant du segment

En-têtes de requête:
Codes d’état:
GET /api/workouts/(string: workout_short_id)/gpx/segment/(int: segment_id)

Obtenir un fichier gpx pour le segment d’une séance pour l’afficher sur la carte avec Leaflet.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/segment/0 HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/json

{
  "data": {
    "gpx": "gpx file content"
  },
  "message": "",
  "status": "success"
}
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

  • segment_id (integer) – identifiant du segment

En-têtes de requête:
Codes d’état:
GET /api/workouts/map/(map_id)

Obtenir l’image de la carte pour les séances avec gpx.

Exemple de requête :

GET /api/workouts/map/fa33f4d996844a5c73ecd1ae24456ab8?1563529507772
  HTTP/1.1

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: image/png
Paramètres:
  • map_id (string) – identifiant de la carte de la séance

Codes d’état:
GET /api/workouts/map_tile/(s)/(z)/(x)/(y).png

Obtenir une tuile de la carte à partir du serveur de tuiles.

Exemple de requête :

GET /api/workouts/map_tile/c/13/4109/2930.png HTTP/1.1

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: image/png
Paramètres:
  • s (string) – sous-domaine

  • z (string) – zoom

  • x (string) – index de la tuile sur l’axe x de la carte

  • y (string) – index de la tuile sur l’axe y de la carte

Les codes d’état sont des codes d’état renvoyés par le serveur de tuiles

GET /api/workouts/(string: workout_short_id)/gpx/download

Télécharger le fichier gpx.

Scope : workouts:read

Exemple de requête :

GET /api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/download HTTP/1.1

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/gpx+xml
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

Codes d’état:
  • 200 OKsuccess

  • 401 Unauthorized

    • provide a valid auth token

    • signature expired, please log in again

    • invalid token, please log in again

  • 404 Not Found

    • workout not found

    • no gpx file for workout

POST /api/workouts

Créer une séance à partir d’un fichier gpx.

Scope : workouts:write

Exemple de requête :

POST /api/workouts/ HTTP/1.1
Content-Type: multipart/form-data

Exemple de réponse :

HTTP/1.1 201 CREATED
Content-Type: application/json

 {
    "data": {
      "workouts": [
        {
          "ascent": null,
          "ave_speed": 10.0,
          "bounds": [],
          "creation_date": "Sun, 14 Jul 2019 13:51:01 GMT",
          "descent": null,
          "description": null,
          "distance": 10.0,
          "duration": "0:17:04",
          "equipments": [],
          "id": "kjxavSTUrJvoAh2wvCeGEF",
          "map": null,
          "max_alt": null,
          "max_speed": 10.0,
          "min_alt": null,
          "modification_date": null,
          "moving": "0:17:04",
          "next_workout": 3,
          "notes": null,
          "pauses": null,
          "previous_workout": null,
          "records": [
            {
              "id": 4,
              "record_type": "MS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 3,
              "record_type": "LD",
              "sport_id": 1,
              "user": "admin",
              "value": "0:17:04",
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF",
            },
            {
              "id": 2,
              "record_type": "FD",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 1,
              "record_type": "AS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            }
          ],
          "segments": [],
          "sport_id": 1,
          "title": null,
          "user": "admin",
          "weather_end": null,
          "weather_start": null,
          "with_gpx": false,
          "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT"
        }
      ]
    },
    "status": "success"
  }
Paramètres de la forme:
  • file – fichier gpx (extensions autorisées : .gpx, .zip)

  • data – id du sport, id de l’équipement, description, titre et notes, par exemple: {"sport_id": 1, "notes": "", "title": "", "description": "", "equipment_ids": []}. Les guillemets doubles dans les notes, la description et le titre doivent être échappés. La longueur maximale est de 500 caractères pour les notes, de 10000 caractères pour la description et de 255 caractères pour le titre. Dans le cas contraire, ils seront tronqués. Pour equipment_ids, l’id de l’équipement à associer à la séance. Note: pour le moment, seul un équipement peut être associé. Si non fourni et qu’il existe un équipement par défaut pour le sport, l’équipement par défaut sera associé. Les notes, la description, le titre et l’id de l’équipement ne sont pas obligatoires.

En-têtes de requête:
Codes d’état:
  • 201 Created – séance créée

  • 400 Bad Request

    • invalid payload

    • no file part

    • no selected file

    • file extension not allowed

    • equipment_ids must be an array of strings

    • only one equipment can be added

    • equipment with id <equipment_id> does not exist

    • invalid equipment id <equipment_id> for sport

    • equipment with id <equipment_id> is inactive

  • 401 Unauthorized

    • provide a valid auth token

    • signature expired, please log in again

    • invalid token, please log in again

  • 413 Request Entity Too Largeerror during picture update: file size exceeds 1.0MB

  • 500 Internal Server Errorerror, please try again or contact the administrator

POST /api/workouts/no_gpx

Créer une séance sans fichier gpx.

Scope : workouts:write

Exemple de requête :

POST /api/workouts/no_gpx HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 201 CREATED
Content-Type: application/json

 {
    "data": {
      "workouts": [
        {
          "ascent": null,
          "ave_speed": 10.0,
          "bounds": [],
          "creation_date": "Sun, 14 Jul 2019 13:51:01 GMT",
          "descent": null,
          "description": null,
          "distance": 10.0,
          "duration": "0:17:04",
          "equipments": [],
          "map": null,
          "max_alt": null,
          "max_speed": 10.0,
          "min_alt": null,
          "modification_date": null,
          "moving": "0:17:04",
          "next_workout": 3,
          "notes": null,
          "pauses": null,
          "previous_workout": null,
          "records": [
            {
              "id": 4,
              "record_type": "MS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 3,
              "record_type": "LD",
              "sport_id": 1,
              "user": "admin",
              "value": "0:17:04",
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 2,
              "record_type": "FD",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 1,
              "record_type": "AS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            }
          ],
          "segments": [],
          "sport_id": 1,
          "title": null,
          "user": "admin",
          "uuid": "kjxavSTUrJvoAh2wvCeGEF"
          "weather_end": null,
          "weather_start": null,
          "with_gpx": false,
          "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT"
        }
      ]
    },
    "status": "success"
  }
Objet JSON de requête:
  • ascent (float) – dénivelé positif de la séance (non obligatoire, à fournir avec le dénivelé positif)

  • descent (float) – dénivelé négatif de la séance (non obligatoire, à fournir avec le dénivelé positif)

  • description (string) – description de la séance (non obligatoire, longueur max. : 10000 caractères, dans le cas contraire elle sera tronquée)

  • distance (float) – distance de la séance en km

  • duration (integer) – durée de la séance en secondes

  • equipment_ids (array of strings) – l’id de l’équipement à associer à cette séance. Note: pour le moment, un seul équipement peut être associé. Si non fourni et qu’il existe un équipement par défaut pour le sport, l’équipement par défaut sera associé.

  • notes (string) – notes (non obligatoire, longueur max. : 500 caractères, dans le cas contraire elles seront tronquées)

  • sport_id (integer) – identifiant du sport de la séance

  • title (string) – titre de la séance (non obligatoire, longueur max. : 255 caractères, dans le cas contraire il sera tronqué)

  • workout_date (string) – date de la séance, dans le fuseau horaire de l’utilisateur (format : %Y-%m-%d %H:%M)

En-têtes de requête:
Codes d’état:
  • 201 Created – séance créée

  • 400 Bad Request

    • invalid payload

    • equipment_ids must be an array of strings

    • only one equipment can be added

    • equipment with id <equipment_id> does not exist

    • invalid equipment id <equipment_id> for sport

    • equipment with id <equipment_id> is inactive

  • 401 Unauthorized

    • provide a valid auth token

    • signature expired, please log in again

    • invalid token, please log in again

  • 500 Internal Server Errorerror, please try again or contact the administrator

PATCH /api/workouts/(string: workout_short_id)

Mettre à jour une séance.

Scope : workouts:write

Exemple de requête :

PATCH /api/workouts/1 HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 200 OK
Content-Type: application/json

 {
    "data": {
      "workouts": [
        {
          "ascent": null,
          "ave_speed": 10.0,
          "bounds": [],
          "creation_date": "Sun, 14 Jul 2019 13:51:01 GMT",
          "descent": null,
          "description": null,
          "distance": 10.0,
          "duration": "0:17:04",
          "equipments": [],
          "map": null,
          "max_alt": null,
          "max_speed": 10.0,
          "min_alt": null,
          "modification_date": null,
          "moving": "0:17:04",
          "next_workout": 3,
          "notes": null,
          "pauses": null,
          "previous_workout": null,
          "records": [
            {
              "id": 4,
              "record_type": "MS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 3,
              "record_type": "LD",
              "sport_id": 1,
              "user": "admin",
              "value": "0:17:04",
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF"
            },
            {
              "id": 2,
              "record_type": "FD",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF",
            },
            {
              "id": 1,
              "record_type": "AS",
              "sport_id": 1,
              "user": "admin",
              "value": 10.0,
              "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT",
              "workout_id": "kjxavSTUrJvoAh2wvCeGEF",
            }
          ],
          "segments": [],
          "sport_id": 1,
          "title": null,
          "user": "admin",
          "uuid": "kjxavSTUrJvoAh2wvCeGEF"
          "weather_end": null,
          "weather_start": null,
          "with_gpx": false,
          "workout_date": "Mon, 01 Jan 2018 00:00:00 GMT"
        }
      ]
    },
    "status": "success"
  }
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

Objet JSON de requête:
  • ascent (float) – dénivelé positif de la séance (seulement pour les séances sans gpx, doit être fourni avec le dénivelé négatif)

  • descent (float) – dénivelé négatif de la séance (seulement pour les séances sans gpx, doit être fourni avec le dénivelé positif)

  • description (string) – description de la séance (longueur max. : 10000 caractères, dans le cas contraire elle sera tronquée)

  • distance (float) – distance de la séance en km (seulement pour les séances sans gpx)

  • duration (integer) – durée de la séance en secondes (seulement pour les séances sans gpx)

  • notes (string) – notes (longueur max. : 500 caractères, dans le cas contraire elles seront tronquées)

  • sport_id (integer) – identifiant du sport de la séance

  • title (string) – titre de la séance (longueur max. : 255 caractères, dans le cas contraire il sera tronqué)

  • equipment_ids (array of strings) – l’id de l’équipement à associer à cette séance (si un équipement est déjà associé, il sera remplacé). Note: pour le moment, un seul équipement peut être associé. Si la liste est vide, l’équipement sera supprimé.

  • workout_date (string) – date de la séance dans le fuseau horaire de l’utilisateur (format : %Y-%m-%d %H:%M) (seulement pour les séances sans gpx)

En-têtes de requête:
Codes d’état:
  • 200 OK – séance mise à jour

  • 400 Bad Request

    • invalid payload

    • equipment_ids must be an array of strings

    • only one equipment can be added

    • equipment with id <equipment_id> does not exist

    • invalid equipment id <equipment_id> for sport

    • equipment with id <equipment_id> is inactive

  • 401 Unauthorized

    • provide a valid auth token

    • signature expired, please log in again

    • invalid token, please log in again

  • 404 Not Foundworkout not found

  • 500 Internal Server Errorerror, please try again or contact the administrator

DELETE /api/workouts/(string: workout_short_id)

Supprimer la séance.

Scope : workouts:write

Exemple de requête :

DELETE /api/workouts/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1
Content-Type: application/json

Exemple de réponse :

HTTP/1.1 204 NO CONTENT
Content-Type: application/json
Paramètres:
  • workout_short_id (string) – identifiant court de la séance

En-têtes de requête:
Codes d’état: