graphql server

This commit is contained in:
Sergey Yarkov 2020-06-09 19:06:22 +03:00
parent 6f6cc2bdc9
commit 2f07fcce8f
21 changed files with 210 additions and 65 deletions

1
server/.gitignore vendored
View File

@ -1 +1,2 @@
/node_modules
/config

View File

@ -1,14 +0,0 @@
const books = [
{
title: 'Harry Potter and the Chamber of Secrets',
author: 'J.K. Rowling',
},
{
title: 'Jurassic Park',
author: 'Michael Crichton',
},
]
module.exports = {
books,
}

View File

@ -1,11 +0,0 @@
const { books } = require('../data/index')
class Book {
static all() {
return books
}
}
module.exports = {
Book,
}

10
server/models/Category.js Normal file
View File

@ -0,0 +1,10 @@
const mongoose = require('mongoose')
const categorySchema = new mongoose.Schema({
title: String,
description: String,
createdAt: String,
updatedAt: String,
})
module.exports = mongoose.model('Category', categorySchema)

11
server/models/Todo.js Normal file
View File

@ -0,0 +1,11 @@
const mongoose = require('mongoose')
const todoSchema = mongoose.Schema({
title: String,
createdAt: String,
updatedAt: String,
status: String,
categoryId: String,
})
module.exports = mongoose.model('Todo', todoSchema)

View File

@ -1,5 +1,7 @@
const { Book } = require('./Book')
const Todo = require('./Todo')
const Category = require('./Category')
module.exports = {
Book,
Todo,
Category,
}

View File

@ -869,6 +869,14 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"config": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/config/-/config-3.3.1.tgz",
"integrity": "sha512-+2/KaaaAzdwUBE3jgZON11L1ggLLhpf2FsGrfqYFHZW22ySGv/HqYIXrBwKKvn+XZh1UBUjHwAcrfsSkSygT+Q==",
"requires": {
"json5": "^2.1.1"
}
},
"configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
@ -1557,6 +1565,14 @@
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"json5": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"requires": {
"minimist": "^1.2.5"
}
},
"kareem": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
@ -1683,8 +1699,7 @@
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mongodb": {
"version": "3.5.8",

View File

@ -14,6 +14,7 @@
},
"dependencies": {
"apollo-server": "^2.14.2",
"config": "^3.3.1",
"graphql": "^15.0.0",
"mongoose": "^5.9.18"
}

16
server/readme.md Normal file
View File

@ -0,0 +1,16 @@
# 🚀 GraphQL API
### Start:
```bash
npm install
npm start
```
### Enviroment variables:
```json
{
"db": "mongodb://localhost:27017", // db url
"port": 3001 // server port
}
```

View File

@ -1,11 +0,0 @@
const { Book } = require('../models')
const bookResolvers = {
Query: {
books: () => Book.all(),
},
}
module.exports = {
bookResolvers,
}

View File

@ -0,0 +1,31 @@
const { Category, Todo } = require('../models')
const categoryResolvers = {
Query: {
categories: () => Category.find({}),
category: (_, { id }) => Category.findById(id),
},
Mutation: {
createCategory: (_, { title, description }) => {
const category = new Category({
title,
description,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
})
return category.save()
},
deleteCategory: async (_, { id }) => {
const deletedCategory = await Category.findByIdAndRemove(id)
return deletedCategory
},
updateCategory: (_, { id, title, description }) => Category.findByIdAndUpdate(id, { $set: { title, description, updatedAt: new Date().toISOString() } }, { new: true })
},
Category: {
todos: ({ id }) => Todo.find({ categoryId: id }),
},
}
module.exports = {
categoryResolvers,
}

View File

@ -1,6 +1,7 @@
const { bookResolvers } = require('./bookResolvers')
const { todoResolvers } = require('./todoResolvers')
const { categoryResolvers } = require('./categoryResolvers')
const resolvers = [bookResolvers]
const resolvers = [todoResolvers, categoryResolvers]
module.exports = {
resolvers,

View File

@ -0,0 +1,32 @@
const { Todo, Category } = require('../models')
const todoResolvers = {
Query: {
todos: () => Todo.find({}),
todo: (_, { id }) => Todo.findById(id),
},
Mutation: {
createTodo: (_, { title, categoryId }) => {
const todo = new Todo({
title,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
status: 'open',
categoryId,
})
return todo.save()
},
deleteTodo: async (_, { id }) => {
const deletedTodo = await Todo.findByIdAndRemove(id)
return deletedTodo
},
updateTodo: (_, { id, title, status, categoryId }) => Todo.findByIdAndUpdate(id, { $set: { title, updatedAt: new Date().toISOString(), status, categoryId } }, { new: true }),
},
Todo: {
category: ({ categoryId }) => Category.findById(categoryId),
},
}
module.exports = {
todoResolvers,
}

View File

@ -2,14 +2,27 @@ const { ApolloServer } = require('apollo-server')
const { typeDefs } = require('./typeDefs')
const { resolvers } = require('./resolvers')
const PORT = 3001
const mongoose = require('mongoose')
const config = require('config')
const port = config.get('port')
const startServer = async () => {
const server = new ApolloServer({ typeDefs, resolvers })
try {
const server = new ApolloServer({ typeDefs, resolvers })
await mongoose.connect(config.get('db'), {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
})
server.listen(PORT, () => {
console.log(`Apollo server is running on port: ${PORT}`)
})
console.log('✔️ Database connected!')
server.listen({ port }).then(() => {
console.log(`Apollo server is running on port: ${port}!`)
})
} catch (err) {
console.log(`❌ Something went wrong: \n ${err}`)
}
}
startServer()

View File

@ -1,7 +1,10 @@
const { query } = require('./query')
const { bookType } = require('./types/bookType')
const { mutation } = require('./mutation')
const typeDefs = [query, bookType]
const { todoType } = require('./types/todoType')
const { categoryType } = require('./types/categoryType')
const typeDefs = [query, mutation, todoType, categoryType]
module.exports = {
typeDefs,

View File

@ -0,0 +1,19 @@
const { gql } = require('apollo-server')
const mutation = gql`
type Mutation {
# Todo mutations
createTodo(title: String!, categoryId: String!): Todo
deleteTodo(id: ID!): Todo
updateTodo(id: ID! title: String! status: String! categoryId: String!): Todo
# Category mutations
createCategory(title: String!, description: String!): Category
deleteCategory(id: ID!): Category
updateCategory(id: ID! title: String! description: String!): Category
}
`
module.exports = {
mutation
}

View File

@ -2,7 +2,10 @@ const { gql } = require('apollo-server')
const query = gql`
type Query {
books: [Book]
todos: [Todo]
todo(id: ID!): Todo
categories: [Category]
category(id: ID!): Category
}
`

View File

@ -1,12 +0,0 @@
const { gql } = require('apollo-server')
const bookType = gql`
type Book {
title: String
author: String
}
`
module.exports = {
bookType,
}

View File

@ -0,0 +1,16 @@
const { gql } = require('apollo-server')
const categoryType = gql`
type Category {
id: ID
title: String
description: String
createdAt: String
updatedAt: String
todos: [Todo]
}
`
module.exports = {
categoryType,
}

View File

@ -1,5 +1,7 @@
const { bookType } = require('./bookType')
const { todoType } = require('./todoType')
const { categoryType } = require('./categoryType')
module.exports = {
bookType,
todoType,
categoryType,
}

View File

@ -0,0 +1,17 @@
const { gql } = require('apollo-server')
const todoType = gql`
type Todo {
id: ID
title: String
createdAt: String
updatedAt: String
status: String
categoryId: String
category: Category
}
`
module.exports = {
todoType,
}