Lesson Progress
0% Complete

Maintenant direction Visual Studio Code ou on va créer deux nouveaux fichiers « schema.js » ou va créer notre schema et « .env » ou en stockera notre clef API

Dans le fichier .env Créer une variable appelé « weatherAPIKEY » et affecté lui votre clef API.

Maintenant on passe a la création de notre schéma

Donc direction le fichier « schema.js » ou en commencera par importer les différents types de données qu’on va utiliser de « graphql » et importer aussi axios et dotenv pour avoir accès anotre API KEY

Notre schéma devra avoir la même structure que les données qu’on souhaite recevoir de l’API OPENWeatherMap. 

Comme mentionné précédemment les données pertinentes pour nous sont :

Donc notre schéma de données devra contenir les données suivantes :

  • Un objet « coord » avec 2 attribut de type Float (lon , lat)
  • Un objet « weather » qui est composé d’une liste d’objet avec comme attribut (main et description qui sont de type String
  • Un objet « main » qui est composé d’une attribut de type Float (temp) et 2 attribut de type Int (pressure et humidity)
  • 1 attribut de type Int (id) et un autre de type String (name)

Ceci peut être traduit avec le code suivant :

Les requêtes

Maintenant que nous avons défini les types de données qu’on va utiliser, il est temps de définir les différentes requêtes que le client peut utiliser pour accéder aux données météorologique. Comme mentionné précédemment il devra être capable de récupérer ces données selon la ville ou bien les cordonnées géographiques saisies.

Pour ce faire on créera un autre graphQl Object avec comme nom « RootQueryType ».

Voila notre schema est enfin terminé, il ne nous reste plus que de modifier le fichier « index.js » pour intégrer notre nouveau schéma et tester notre serveur.

Vous trouverez le code complet de “schema.js” ci-dessous

const {
   GraphQLObjectType,
   GraphQLFloat,
   GraphQLInt,
   GraphQLString,
   GraphQLSchema,
   GraphQLList,
 } = require("graphql");
 const axios = require("axios");
 const dotenv = require("dotenv");
 dotenv.config();
 const CoordType = new GraphQLObjectType({
   name: "Coord",
   fields: () => ({
     lon: { type: GraphQLFloat },
     lat: { type: GraphQLFloat },
   }),
 });
 const WeatherType = new GraphQLObjectType({
   name: "Weather",
   fields: () => ({
     main: { type: GraphQLString },
     description: { type: GraphQLString },
   }),
 });
 const MainType = new GraphQLObjectType({
   name: "Main",
   fields: () => ({
     temp: { type: GraphQLFloat },
     pressure: { type: GraphQLFloat },
     humidity: { type: GraphQLFloat },
   }),
 });
 // Global Object
 const OpenWeatherMapType = new GraphQLObjectType({
   name: "OpenWeatherMap",
   fields: () => ({
     coord: { type: CoordType },
     weather: { type: new GraphQLList(WeatherType) },
     main: { type: MainType },
     id: { type: GraphQLInt },
     name: { type: GraphQLString }, // City Name
   }),
 });
 // Root Query
 const RootQuery = new GraphQLObjectType({
   name: "RootQueryType",
   fields: {
     weatherByCity: {
       type: OpenWeatherMapType,
       args: {
         //argument to search the Weather by cityName
         cityName: {
           type: GraphQLString,
         },
       },
       resolve(parent, args) {
         return axios
           .get(
             http://api.openweathermap.org/data/2.5/weather?q=${args.cityName}&appid=${process.env.weatherAPIKEY}
           )
           .then((res) => res.data);
       },
     },
     weatherByCoord: {
       type: OpenWeatherMapType,
       args: {
         //argument to search the Weather by coordinates
         lon: {
           type: GraphQLFloat,
         },
         lat: {
           type: GraphQLFloat,
         },
       },
       resolve(parent, args) {
         return axios
           .get(
             http://api.openweathermap.org/data/2.5/weather?lat=${args.lat}&lon=${args.lon}&appid=${process.env.weatherAPIKEY}
           )
           .then((res) => res.data);
       },
     },
   },
 });
 module.exports = new GraphQLSchema({
   query: RootQuery,
 });