Skip to content

Instantly share code, notes, and snippets.

@kselax
Created December 27, 2018 06:42
Show Gist options
  • Save kselax/8a2c24cd5b9b06bbbb95f26013dae020 to your computer and use it in GitHub Desktop.
Save kselax/8a2c24cd5b9b06bbbb95f26013dae020 to your computer and use it in GitHub Desktop.
graphql schema file
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