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, });