fork download
  1. const express = require('express')
  2. const app = express()
  3. app.use(express.json())
  4. const format = require('date-fns/format')
  5. const isValid = require('date-fns/isValid')
  6. const toDate = require('date-fns/toDate')
  7.  
  8. const {open} = require('sqlite')
  9. const sqlite3 = require('sqlite3')
  10.  
  11. const path = require('path')
  12. const dbPath = path.join(__dirname, 'todoApplication.db')
  13.  
  14. let db = null
  15.  
  16. const initializeDBAndServer = async () => {
  17. try {
  18. db = await open({
  19. filename: dbPath,
  20. driver: sqlite3.Database,
  21. })
  22. app.listen(3000, () => {
  23. console.log('Server is running at http:/localhost:3000/')
  24. })
  25. } catch (e) {
  26. console.log(e.message)
  27. }
  28. }
  29.  
  30. initializeDBAndServer()
  31.  
  32. const checkRequestsQueries = async (request, response, next) => {
  33. const {search_q, category, priority, status, date} = request.query
  34. const {todoId} = request.params
  35. if (category !== undefined) {
  36. categoryArray = ['WORK', 'HOME', 'LEARNING']
  37. const categoryIsInArray = categoryArray.includes(category)
  38. if (categoryIsInArray === true) {
  39. request.category = category
  40. } else {
  41. response.status(400)
  42. response.send('Invalid Todo Category')
  43. return
  44. }
  45. }
  46.  
  47. if (priority !== undefined) {
  48. const priorityArray = ['HIGH', 'MEDIUM', 'LOW']
  49. const priorityIsInArray = priorityArray.includes(priority)
  50. if (priorityIsInArray === true) {
  51. request.priority = priority
  52. } else {
  53. response.status(400)
  54. response.send('Invalid Todo Priority')
  55. return
  56. }
  57. }
  58.  
  59. if (status !== undefined) {
  60. const statusArray = ['TO DO', 'IN PROGRESS', 'DONE']
  61. const statusIsInArray = statusArray.includes(status)
  62. if (statusIsInArray === true) {
  63. request.status = status
  64. } else {
  65. response.status(400)
  66. response.send('Invalid Todo Status')
  67. return
  68. }
  69. }
  70.  
  71. if (date !== undefined) {
  72. try {
  73. const myDate = new Date(date)
  74.  
  75. const formattedDate = format(new Date(date), 'yyyy-MM-dd')
  76. console.log(formattedDate, 'f')
  77. const result = toDate(
  78. new Date(
  79. `$(myDate.getFullYear()}-${
  80. myDate.getMonth() + 1
  81. }-${myDate.getDate()}`,
  82. ),
  83. )
  84. console.log(result, 'r')
  85. console.log(new Date(), 'new')
  86.  
  87. const isValidDate = await isValid(result)
  88. console.log(isValidDate, 'V')
  89. if (isValidDate === true) {
  90. request.date = formattedDate
  91. } else {
  92. response.status(400)
  93. response.send('Invalid Due Date')
  94. return
  95. }
  96. } catch (e) {
  97. response.status(400)
  98. response.send('Invalid Due Date')
  99. return
  100. }
  101. }
  102.  
  103. request.todoId = todoId
  104. request.search_q = search_q
  105.  
  106. next()
  107. }
  108.  
  109. const checkRequestsBody = (request, response, next) => {
  110. const {id, todo, category, priority, status, dueDate} = request.body
  111. const {todoId} = request.params
  112.  
  113. if (category !== undefined) {
  114. categoryArray = ['WORK', 'HOME', 'LEARNING']
  115. categoryIsInArray = categoryArray.includes(category)
  116.  
  117. if (categoryIsInArray === true) {
  118. request.category = category
  119. } else {
  120. response.status(400)
  121. response.send('Invalid Todo Category')
  122. return
  123. }
  124. }
  125.  
  126. if (priority !== undefined) {
  127. priorityArray = ['HIGH', 'MEDIUM', 'LOW']
  128. priorityIsInArray = priorityArray.includes(priority)
  129. if (priorityIsInArray === true) {
  130. request.priority = priority
  131. } else {
  132. response.status(400)
  133. response.send('Invalid Todo Priority')
  134. return
  135. }
  136. }
  137.  
  138. if (status !== undefined) {
  139. statusArray = ['TO DO', 'IN PROGRESS', 'DONE']
  140. statusIsInArray = statusArray.includes(status)
  141. if (statusIsInArray === true) {
  142. request.status = status
  143. } else {
  144. response.status(400)
  145. response.send('Invalid Todo Status')
  146. return
  147. }
  148. }
  149.  
  150. if (dueDate !== undefined) {
  151. try {
  152. const myDate = new Date(dueDate)
  153. const formattedDate = format(new Date(dueDate), 'yyyy-MM-dd')
  154. console.log(formattedDate)
  155. const result = toDate(new Date(formattedDate))
  156. const isValidDate = isValid(result)
  157. console.log(isValidDate)
  158. console.log(isValidDate)
  159. if (isValidDate === true) {
  160. request.dueDate = formattedDate
  161. } else {
  162. response.status(400)
  163. response.send('Invalid Due Date')
  164. return
  165. }
  166. } catch (e) {
  167. response.status(400)
  168. response.send('Invalid Due Date')
  169. return
  170. }
  171. }
  172. request.todo = todo
  173. request.id = id
  174.  
  175. request.todoId = todoId
  176.  
  177. next()
  178. }
  179.  
  180. // Get Todos API-1
  181. app.get('/todes/', checkRequestsQueries, async (request, response) => {
  182. const {status = '', search_q = '', priority = '', category = ''} = request
  183. console.log(status, search_q, priority, category)
  184. const getTodosQuery = `
  185. SELECT
  186. id,
  187. todo,
  188. priority,
  189. status,
  190. category,
  191. due_date AS dueDate
  192. FROM
  193. todo
  194. WHERE
  195. todo LIKE '%${search_q}%' AND priority LIKE '%${priority}%'
  196. AND status LIKE '%${status}%' AND category LIKE "%${category}%';`
  197.  
  198. const todosArray = await db.all(getTodosQuery)
  199. response.send(todosArray)
  200. })
  201.  
  202. // GET Todo API-2
  203. app.get('/todos/:todoId', checkRequestsQueries, async (request, response) => {
  204. const {todoId} = request
  205.  
  206. const getTodosQuery = `
  207. SELECT
  208. id,
  209. todo,
  210. priority,
  211. status,
  212. category,
  213. due_dates AS dueDate
  214. FROM
  215. todo
  216. WHERE
  217. id = ${todoId};`
  218.  
  219. const todo = await db.get(getTodosQuery)
  220. response.send(todo)
  221. })
  222.  
  223. //GET Agenda API-3
  224. app.get('/agenda/', checkRequestsQueries, async (request, response) => {
  225. const {date} = request
  226. console.log(date, 'a')
  227.  
  228. const selectDueDateQuery = `
  229. SELECT
  230. id,
  231. todo,
  232. priority,
  233. status,
  234. category,
  235. due_date AS dueDate
  236. FROM
  237. todo
  238. WHERE
  239. due_date = '${date}'
  240. ;`
  241.  
  242. const todosArray = await db.all(selectDueDateQuery)
  243.  
  244. if (todosArray === undefined) {
  245. response.status(400)
  246. response.send('Invalid Due Date')
  247. } else {
  248. response.send(todosArray)
  249. }
  250. })
  251.  
  252. //Add Todo API-4
  253. app.post('/todos/', checkRequestsBody, async (request, response) => {
  254. const {id, todo, category, priority, status, dueDate} = request
  255.  
  256. const addTodoQuery = `
  257. INSERT INTO
  258. todo (id, todo, priority, status, category, due_date)
  259. VALUES
  260. (
  261. ${id},
  262. '${todo}',
  263. '${priority}',
  264. '${status}',
  265. '${category}',
  266. '${dueDate}'
  267. )
  268. ;`
  269.  
  270. const createUser = await db.run(addTodoQuery)
  271. console.log(createUser)
  272. response.send('Todo Successfully Added')
  273. })
  274.  
  275. //Update Todo API-5
  276. app.put('/todos/:todoId/', checkRequestsBody, async (request, response) => {
  277. const {todoId} = request
  278.  
  279. const {priority, todo, status, category, dueDate} = request
  280.  
  281. let updateTodoQuery = null
  282.  
  283. console.log(priority, todo, status, dueDate, category)
  284. switch (true) {
  285. case status !== undefined:
  286. updateTodoQuery = `
  287. UPDATE
  288. todo
  289. SET
  290. status = '${status}'
  291. WHERE
  292. id = ${todoId}
  293. ;`
  294. await db.run(updateTodoQuery)
  295. response.send('Status Updated')
  296. break
  297. case priority !== undefined:
  298. updateTodoQuery = `
  299. UPDATE
  300. todo
  301. SET
  302. priority = '${priority}'
  303. WHERE
  304. id = ${todoId}
  305. ;`
  306. await db.run(updateTodoQuery)
  307. response.send('Priority Updated')
  308. break
  309. case todo !== undefined:
  310. updateTodoQuery = `
  311. UPDATE
  312. todo
  313. SET
  314. todo = '${todo}'
  315. WHERE
  316. id = ${todoId}
  317. ;`
  318. await db.run(updateTodoQuery)
  319. response.send('Todo Updated')
  320. break
  321. case category !== undefined:
  322. const updateCategoryQuery = `
  323. UPDATE
  324. todo
  325. SET
  326. category = '${category}'
  327. WHERE
  328. id = ${todoId}
  329. ;`
  330. await db.run(updateCategoryQuery)
  331. response.send('Category Updated')
  332. break
  333. case dueDate !== undefined:
  334. const updateDateQuery = `
  335. UPDATE
  336. todo
  337. SET
  338. due_date = '${dueDate}'
  339. WHERE
  340. id = ${todoId}
  341. ;`
  342. await db.run(updateDateQuery)
  343. response.send('Due Date Updated')
  344. break
  345. }
  346. })
  347.  
  348. // Delete Todo API-6
  349. app.delete('/todos/:todoId/', async (request, response) => {
  350. const {todoId} = request.params
  351. const deleteTodoQuery = `
  352. DELETE FROM
  353. todo
  354. WHERE
  355. id=${todoId}
  356. ;`
  357.  
  358. await db.run(deleteTodoQuery)
  359. response.send('Todo Deleted')
  360. })
  361. module.exports = app
  362.  
Success #stdin #stdout 0.02s 26016KB
stdin
Standard input is empty
stdout
const express = require('express')
const app = express()
app.use(express.json())
const format = require('date-fns/format')
const isValid = require('date-fns/isValid')
const toDate = require('date-fns/toDate')

const {open} = require('sqlite')
const sqlite3 = require('sqlite3')

const path = require('path')
const dbPath = path.join(__dirname, 'todoApplication.db')

let db = null

const initializeDBAndServer = async () => {
  try {
    db = await open({
      filename: dbPath,
      driver: sqlite3.Database,
    })
    app.listen(3000, () => {
      console.log('Server is running at http:/localhost:3000/')
    })
  } catch (e) {
    console.log(e.message)
  }
}

initializeDBAndServer()

const checkRequestsQueries = async (request, response, next) => {
  const {search_q, category, priority, status, date} = request.query
  const {todoId} = request.params
  if (category !== undefined) {
    categoryArray = ['WORK', 'HOME', 'LEARNING']
    const categoryIsInArray = categoryArray.includes(category)
    if (categoryIsInArray === true) {
      request.category = category
    } else {
      response.status(400)
      response.send('Invalid Todo Category')
      return
    }
  }

  if (priority !== undefined) {
    const priorityArray = ['HIGH', 'MEDIUM', 'LOW']
    const priorityIsInArray = priorityArray.includes(priority)
    if (priorityIsInArray === true) {
      request.priority = priority
    } else {
      response.status(400)
      response.send('Invalid Todo Priority')
      return
    }
  }

  if (status !== undefined) {
    const statusArray = ['TO DO', 'IN PROGRESS', 'DONE']
    const statusIsInArray = statusArray.includes(status)
    if (statusIsInArray === true) {
      request.status = status
    } else {
      response.status(400)
      response.send('Invalid Todo Status')
      return
    }
  }

  if (date !== undefined) {
    try {
      const myDate = new Date(date)

      const formattedDate = format(new Date(date), 'yyyy-MM-dd')
      console.log(formattedDate, 'f')
      const result = toDate(
        new Date(
          `$(myDate.getFullYear()}-${
            myDate.getMonth() + 1
          }-${myDate.getDate()}`,
        ),
      )
      console.log(result, 'r')
      console.log(new Date(), 'new')

      const isValidDate = await isValid(result)
      console.log(isValidDate, 'V')
      if (isValidDate === true) {
        request.date = formattedDate
      } else {
        response.status(400)
        response.send('Invalid Due Date')
        return
      }
    } catch (e) {
      response.status(400)
      response.send('Invalid Due Date')
      return
    }
  }

  request.todoId = todoId
  request.search_q = search_q

  next()
}

const checkRequestsBody = (request, response, next) => {
  const {id, todo, category, priority, status, dueDate} = request.body
  const {todoId} = request.params

  if (category !== undefined) {
    categoryArray = ['WORK', 'HOME', 'LEARNING']
    categoryIsInArray = categoryArray.includes(category)

    if (categoryIsInArray === true) {
      request.category = category
    } else {
      response.status(400)
      response.send('Invalid Todo Category')
      return
    }
  }

  if (priority !== undefined) {
    priorityArray = ['HIGH', 'MEDIUM', 'LOW']
    priorityIsInArray = priorityArray.includes(priority)
    if (priorityIsInArray === true) {
      request.priority = priority
    } else {
      response.status(400)
      response.send('Invalid Todo Priority')
      return
    }
  }

  if (status !== undefined) {
    statusArray = ['TO DO', 'IN PROGRESS', 'DONE']
    statusIsInArray = statusArray.includes(status)
    if (statusIsInArray === true) {
      request.status = status
    } else {
      response.status(400)
      response.send('Invalid Todo Status')
      return
    }
  }

  if (dueDate !== undefined) {
    try {
      const myDate = new Date(dueDate)
      const formattedDate = format(new Date(dueDate), 'yyyy-MM-dd')
      console.log(formattedDate)
      const result = toDate(new Date(formattedDate))
      const isValidDate = isValid(result)
      console.log(isValidDate)
      console.log(isValidDate)
      if (isValidDate === true) {
        request.dueDate = formattedDate
      } else {
        response.status(400)
        response.send('Invalid Due Date')
        return
      }
    } catch (e) {
      response.status(400)
      response.send('Invalid Due Date')
      return
    }
  }
  request.todo = todo
  request.id = id

  request.todoId = todoId

  next()
}

// Get Todos API-1
app.get('/todes/', checkRequestsQueries, async (request, response) => {
  const {status = '', search_q = '', priority = '', category = ''} = request
  console.log(status, search_q, priority, category)
  const getTodosQuery = `
SELECT
id,
todo,
priority,
status,
category,
due_date AS dueDate
FROM 
todo
WHERE
todo LIKE '%${search_q}%' AND priority LIKE '%${priority}%'
AND status LIKE '%${status}%' AND category LIKE "%${category}%';`

  const todosArray = await db.all(getTodosQuery)
  response.send(todosArray)
})

// GET Todo API-2
app.get('/todos/:todoId', checkRequestsQueries, async (request, response) => {
  const {todoId} = request

  const getTodosQuery = `
SELECT 
id,
todo,
priority,
status,
category,
due_dates AS dueDate
FROM
todo
WHERE
id = ${todoId};`

  const todo = await db.get(getTodosQuery)
  response.send(todo)
})

//GET Agenda API-3
app.get('/agenda/', checkRequestsQueries, async (request, response) => {
  const {date} = request
  console.log(date, 'a')

  const selectDueDateQuery = `
SELECT
id,
todo,
priority,
status,
category,
due_date AS dueDate
FROM
todo
WHERE
due_date = '${date}'
;`

  const todosArray = await db.all(selectDueDateQuery)

  if (todosArray === undefined) {
    response.status(400)
    response.send('Invalid Due Date')
  } else {
    response.send(todosArray)
  }
})

//Add Todo API-4
app.post('/todos/', checkRequestsBody, async (request, response) => {
  const {id, todo, category, priority, status, dueDate} = request

  const addTodoQuery = `
INSERT INTO
todo (id, todo, priority, status, category, due_date)
VALUES
(
${id},
'${todo}',
'${priority}',
'${status}',
'${category}',
'${dueDate}'
)
;`

  const createUser = await db.run(addTodoQuery)
  console.log(createUser)
  response.send('Todo Successfully Added')
})

//Update Todo API-5
app.put('/todos/:todoId/', checkRequestsBody, async (request, response) => {
  const {todoId} = request

  const {priority, todo, status, category, dueDate} = request

  let updateTodoQuery = null

  console.log(priority, todo, status, dueDate, category)
  switch (true) {
    case status !== undefined:
      updateTodoQuery = `
UPDATE
todo
SET
status = '${status}'
WHERE
id = ${todoId}
;`
      await db.run(updateTodoQuery)
      response.send('Status Updated')
      break
    case priority !== undefined:
      updateTodoQuery = `
UPDATE
todo
SET
priority = '${priority}'
WHERE
id = ${todoId}
;`
      await db.run(updateTodoQuery)
      response.send('Priority Updated')
      break
    case todo !== undefined:
      updateTodoQuery = `
UPDATE
todo
SET
todo = '${todo}'
WHERE
id = ${todoId}
;`
      await db.run(updateTodoQuery)
      response.send('Todo Updated')
      break
    case category !== undefined:
      const updateCategoryQuery = `
UPDATE
todo
SET
category = '${category}'
WHERE 
 id = ${todoId}
 ;`
      await db.run(updateCategoryQuery)
      response.send('Category Updated')
      break
    case dueDate !== undefined:
      const updateDateQuery = `
UPDATE
todo
SET
due_date = '${dueDate}'
WHERE
id = ${todoId}
;`
      await db.run(updateDateQuery)
      response.send('Due Date Updated')
      break
  }
})

// Delete Todo API-6
app.delete('/todos/:todoId/', async (request, response) => {
  const {todoId} = request.params
  const deleteTodoQuery = `
DELETE FROM
todo
WHERE
id=${todoId}
;`

  await db.run(deleteTodoQuery)
  response.send('Todo Deleted')
})
module.exports = app