diff --git a/index.js b/index.js index 6ccaed7..4452820 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,6 @@ -import {ApolloServer, gql} from 'apollo-server'; +import resolvers from './resolvers'; +import typeDefs from './schema'; +import {ApolloServer} from 'apollo-server'; import {continents, countries, languages} from 'countries-list'; function toArray(object) { @@ -8,61 +10,18 @@ function toArray(object) { })); } -const data = { - continents: Object.entries(continents).map(([code, name]) => ({code, name})), - countries: toArray(countries), - languages: toArray(languages) -}; - -const typeDefs = gql` - type Continent { - code: String - name: String +const server = new ApolloServer({ + typeDefs, + resolvers, + context: { + continents: Object.entries(continents).map(([code, name]) => ({ + code, + name + })), + countries: toArray(countries), + languages: toArray(languages) } - - type Country { - code: String - name: String - native: String - phone: String - continent: Continent - currency: String - languages: [Language] - emoji: String - emojiU: String - } - - type Language { - code: String - name: String - native: String - rtl: Int - } - - type Query { - continents: [Continent] - countries: [Country] - languages: [Language] - } -`; - -const resolvers = { - Country: { - continent: country => - data.continents.find(continent => continent.code === country.continent), - languages: country => - data.languages.filter(language => - country.languages.includes(language.code) - ) - }, - Query: { - continents: () => data.continents, - countries: () => data.countries, - languages: () => data.languages - } -}; - -const server = new ApolloServer({typeDefs, resolvers}); +}); server.listen({port: process.env.PORT}).then(({url}) => { console.log(`🚀 Server ready at ${url}`); diff --git a/resolvers.js b/resolvers.js new file mode 100644 index 0000000..0aabfc7 --- /dev/null +++ b/resolvers.js @@ -0,0 +1,21 @@ +function byCode(code) { + return item => item.code === code; +} + +export default { + Country: { + continent: (country, args, {continents}) => + continents.find(continent => continent.code === country.continent), + languages: (country, args, {languages}) => + languages.filter(language => country.languages.includes(language.code)) + }, + Query: { + continent: (parent, args, {continents}) => + continents.find(byCode(args.code)), + continents: (parent, args, {continents}) => continents, + country: (parent, args, {countries}) => countries.find(byCode(args.code)), + countries: (parent, args, {countries}) => countries, + language: (parent, args, {languages}) => languages.find(byCode(args.code)), + languages: (parent, args, {languages}) => languages + } +}; diff --git a/schema.js b/schema.js new file mode 100644 index 0000000..7e79aa6 --- /dev/null +++ b/schema.js @@ -0,0 +1,36 @@ +import {gql} from 'apollo-server'; + +export default gql` + type Continent { + code: String + name: String + } + + type Country { + code: String + name: String + native: String + phone: String + continent: Continent + currency: String + languages: [Language] + emoji: String + emojiU: String + } + + type Language { + code: String + name: String + native: String + rtl: Int + } + + type Query { + continents: [Continent] + continent(code: String): Continent + countries: [Country] + country(code: String): Country + languages: [Language] + language(code: String): Language + } +`;