Created
December 27, 2018 06:42
-
-
Save kselax/8a2c24cd5b9b06bbbb95f26013dae020 to your computer and use it in GitHub Desktop.
graphql schema file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { buildSchema } = require('graphql') | |
const DB = require('../core/my_db/DB') | |
const schema = buildSchema(` | |
type Todo { | |
id: ID! | |
content: String! | |
completed: Boolean! | |
} | |
type Query { | |
allTodos: String | |
allTodosPag(p: String): String | |
} | |
type Mutation { | |
addTodo(content: String!): Todo | |
toggleTodo(id: ID!): Boolean | |
delTodo(id: ID!): Boolean | |
} | |
`) | |
class Todo { | |
constructor(id, content, completed) { | |
this.id = id | |
this.content = content | |
this.completed = completed | |
} | |
} | |
const root = { | |
allTodos: () => { | |
// 1 check the name an pass in the database | |
return new Promise((resolve, reject) => { | |
DB.pool.query( | |
'SELECT * FROM `todos`', | |
(err, res) => { | |
if (err) reject(err) | |
resolve(JSON.stringify(res)) | |
} | |
) | |
}) | |
}, | |
allTodosPag: ({ p }) => { | |
return new Promise((resolve, reject) => { | |
// number entries on the page | |
const num = 3 | |
// current page | |
console.log('p = ', p); | |
p = Number(p) | |
const cur_page = p || 1 | |
console.log('cur_page = ', cur_page); | |
// get current number messages in the database | |
DB.pool.query( | |
'SELECT COUNT(*) FROM `todos`', | |
(err, res) => { | |
if (err) throw err | |
// console.log('res = ', res[0]['COUNT(*)']); | |
const posts = res[0]['COUNT(*)'] | |
console.log('posts = ', posts); | |
const total = Math.floor(1 + (posts - 1) / num) | |
console.log('total = ', total); | |
// the beggining of messages for a current page | |
let page = cur_page | |
if (!page || page < 0) page = 1 | |
if(page > total) page = total | |
// number of the starting output messages | |
console.log('page = ', page); | |
const start = page * num - num | |
console.log('start = ', start, ' num = ', num); | |
DB.pool.query( | |
'SELECT * FROM `todos` LIMIT ?, ?', | |
[start, num], | |
(err, res) => { | |
if (err) reject(err) | |
let result = {} | |
console.log('res = ', res); | |
// make a navigation links | |
result['items'] = res | |
let pervpage = '' | |
let nextpage = '' | |
let page2left = '' | |
let page1left = '' | |
let page2right = '' | |
let page1right = '' | |
// check arrows back | |
if (page != 1) pervpage = '<a href = "./page?page=1"><<</a><a href="./page?page=' + (page-1) + '"' | |
// check arrows forward | |
if (page != total) nextpage = ' <a href="./page/?page="' + (page + 1) + '>></a><a href=".page?page=' + total + '>>></a>' | |
// find two the closest pages from both sides if they are | |
if (page - 2 > 0) page2left = ' <a href=".page?page=' + (page - 2) + '">' + (page - 2) + '</a> |' | |
if (page - 1 > 0) page1left = '<a href="./page?page=' + (page - 1) + '">' + (page -1) + '</a> |' | |
if (page + 2 <= total) page2right = ' | <a href="./page?page=' + (page + 2) + '">' + (page + 2) + '</a>' | |
if (page + 1 <= total) page1right = ' | <a href=".page?page=' + (page + 1) + '">' + (page + 1) + '</a>' | |
// output the menu | |
result['menu'] = pervpage + page2left + page1left + '<b>' + page + '</b>' + page1right + page2right + nextpage | |
console.log('result[\'menu\'] = ', result['menu']); | |
result['total'] = total | |
result['page'] = page | |
result = JSON.stringify(result) | |
resolve(result) | |
} | |
) | |
} | |
) | |
// return 'pagination' | |
}) | |
}, | |
addTodo: ({ content }) => { | |
return new Promise((resolve, reject) => { | |
DB.pool.query( | |
'INSERT INTO `todos` (content) VALUES (?)', | |
[content], | |
(err, res) => { | |
if (err) reject(err) | |
const obj = new Todo(res.insertId, content, false) | |
resolve(obj) | |
} | |
) | |
}) | |
}, | |
toggleTodo: ({ id }) => { | |
return new Promise((resolve, reject) => { | |
DB.pool.query( | |
'SELECT completed FROM `todos` WHERE `id` = ?', | |
[id], | |
(err, res) => { | |
if (err) reject(err) | |
DB.pool.query( | |
'UPDATE `todos` SET `completed` = ? WHERE `id` = ?', | |
[!res[0].completed, id], | |
(err, res) => { | |
if (err) throw err | |
resolve(true) | |
} | |
) | |
} | |
) | |
}) | |
}, | |
delTodo: ({ id }) => { | |
return new Promise((resolve, reject) => { | |
DB.pool.query( | |
'DELETE FROM `todos` WHERE `id` = ?', | |
[id], | |
(err, res) => { | |
if (err) reject(err) | |
resolve(true) | |
} | |
) | |
}) | |
} | |
} | |
module.exports = { schema, root } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment