API GraphQL

Les données de Coutosuix peuvent être requêtées en utilisant le protocol GraphQL.

Pour activer l'accès GraphQL à votre instance, merci de nous contacter.

Acces depuis une interface Web

Une interface web est disponible à l'adresse :

https://moninstance.coutosuix.fr/graphql/

Si vous êtes connecté à Coutosuix vous aurez accès aux données mises à disposition à l'utilisateur connecté. Sinon vous pouvez utiliser le jeton d'API ci-dessous.

Authentification

L'authentification à l'API doit se faire à l'aide d'un jeton d'API. Celui-ci doit être généré depuis l'interface dans Administration / Jeton d'API

Ensuite ce jeton doit être transmis à chaque requête GraphQL dans l'en-tête HTTP "Authorization"

Exemple d'utilisation avec cURL:

curl -H "Authorization: a1367b53-45b2-4138-be95-b5c174463174" -H "Content-Type: application/json" -d '{"query": "{ projects {id}}"}' https://moninstance.coutosuix.fr/graphql/

 

Exemples de requêtes

Récupérer tous les projets et leurs tâches

query {
  projects {
    name
    shortname
    tasks {
      name
      shortname
    }
  }
}

Récupérer les heures passées mises à jour depuis une date

{
  workedHours(
    filters: {updatedAt: {gt: "2024-03-15"}}
  ) {
    user {
      id
    }
    recoverableQuantity
    quantity
    date
    updatedAt
  }
}

 

Pagination

L'API utilise une pagination par limit / offset. Par défault la limite est fixée à 1000. Il s'agit aussi d'un maximum possible.

Cela veut dire qu'il ne sera pas possible de récupérer plus de 1000 élément avec une seule requête. Il faudra refaire une requête est définissant offet.

Exemple

{
  workedHours(
    order: {updatedAt: DESC}
    pagination: {limit: 100, offset: 100}
  ) {
    user {
      id
    }
    recoverableQuantity
    quantity
    date
  }
}

 

Modifications

Il est possible de pousser des modifications dns coutosuix avec des Mutations GraphQL.

Projets / Tâches - createProject, updateProject, deleteProject

Ajouter, modifier ou supprimer un projet ou une tache

mutation {
  createProject(data: {name: "Super projet", shortname: "X22R"}) {
    ... on ProjectType {
      id
      name
    }
  }
}

Cette méthode créé le projet avec les informations données, et renvoi les informations du projet créé indiquées.

Pour update et delete, le fonctionnement est similaire mais il faut impérativement préciser "id" afin d'identifier le projet ou la tâche.

En cas d'erreur de validation, par défaut, aucun problème n'est remonté. Pour cela il faut demander à récupérer le type "OperationalInfo"

mutation {
  createProject(data: {name: "Super projet", shortname: "X22R"}) {
    ... on ProjectType {
      id
      name
    }
    ... on OperationInfo {
      __typename
      messages {
        code
        field
        kind
        message
      }
    }
  }
}

Exemple d'erreur renvoyée :

{
  "data": {
    "createProject": {
      "__typename": "OperationInfo",
      "messages": [
        {
          "code": "unique",
          "field": "shortname",
          "kind": "VALIDATION",
          "message": "Un objet Projet avec ce champ Nom court existe déjà."
        }
      ]
    }
  }
}

Projet / Tâche - updateOrCreateProject / updateOrCreateTask

Une méthode "update or create" existe pour les projets et tâches. Elle permet en une seule requête de crérer ou bien de mettre à jour l'objet selon s'il existe déjà en base ou pas.

mutation {
  updateOrCreateProject(
    select: {id: "42"}
    data: {name: "Super !"}
  ) {
    ... on ProjectType {
      id
      name
    }
  }
}

Dans "select" on indique les champ servant à identifier le projet ou la tâche (il faut que la sélection corresponde à un élément unique)

Puis les données "data" sont celles qui seront mises a jour. Si l'objet identifié par "select" n'existe pas, il sera créé avec les données de "select" et de "data".

Identifiant externe à Coutosuix

Il est possible de stocker un identifiant externe à Coutosuix. Pour cela il faut utiliser le champ "externalId" (qui doit être unique).

Il peut donc servir de sélecteur pour la méthode updateOrCreate.

 

Contingent / Estimated daily quota - updateOrCreate

Met à jour ou créé une journée d'un contingent d'un utilisateur.

mutation {
  estimatedDailyQuota {
    updateOrCreate(
      data: {userId: 10, quantity: 420, leave: FULL, date: "2024-01-01"}
    ) {
      ... on EstimatedDailyQuotaType {
        id
        user {
          id
        }
      }
    }
  }
}

Cette méthode renvoie l'objet créé ou modifié avec les champs voulus.

Contingent / Estimated daily quota - updateOrCreateBulk

Met à jour ou créé en ensemble de journées de contingent

mutation {
  estimatedDailyQuota {
    updateOrCreateBulk(data: [
      {userId: 10, date: "2024-01-01", quantity: 420, leave: NO},
      {userId: 11, date: "2024-01-01", quantity: 450, leave: HALF},
    ]) {
      ... on EstimatedDailyQuotaResultCountType {
        count
      }
    }
  }
}

L'API renverra le nombre d'éléments créés ou mis à jour :

{
  "data": {
    "estimatedDailyQuota": {
      "updateOrCreateBulk": {
        "count": 2
      }
    }
  }
}

Définir l'état de validation de l'année

Pour cela il est possible d'ajouter le paramètre yearValidationState: VALIDATED aux données.

Cela va mettre à jour l'état avec celui indiqué pour l'utilisateur et l'année.

Dans le cas d'une mise à jour multiple (bulk update), le dernier état de chaque utilisateur année sera prit en compte.

Exemple:

estimatedDailyQuota {
    updateOrCreateBulk(
      data: [
        {userId: 10, date: "2024-01-01", quantity: 10, leave: NO, yearValidationState: VALIDATED},
        {userId: 10, date: "2024-05-01", quantity: 20, leave: FULL, yearValidationState: DRAFT}
      ]
    ) {
      ... on EstimatedDailyQuotaResultCountType {
        count
      }
    }
  }

 

Utilisateur 10, année 2024 l'état sera modifié à DRAFT