app.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. const express = require('express')
  2. const { sequelize } = require('./models')
  3. const { QueryTypes } = require('sequelize')
  4. const md5 = require('md5')
  5. const jwt = require('jsonwebtoken')
  6. const app = express()
  7. const port = 3000
  8. app.use(express.json())
  9. app.get('/api/menu-item', async (req, res) => {
  10. try {
  11. res.json(await sequelize.query(`
  12. SELECT *
  13. FROM MenuItem
  14. `, {
  15. logging: false,
  16. type: QueryTypes.SELECT
  17. }))
  18. } catch (error) {
  19. console.error(error)
  20. } finally {
  21. res.end()
  22. }
  23. })
  24. /**
  25. * Middleware авторизации
  26. */
  27. const authenticateJWT = (req, res, next) => {
  28. const authHeader = req.headers.authorization;
  29. if (authHeader) {
  30. const token = authHeader.split(' ')
  31. if (token[0].toLowerCase() != 'bearer')
  32. return res.status(400).send('не поддерживаемый тип авторизации')
  33. jwt.verify(token[1], JWT_SECRET, (err, user) => {
  34. if (err) return res.status(403).send(err)
  35. req.user = user
  36. next()
  37. })
  38. } else {
  39. res.status(401).send('нет заголовка авторизации')
  40. }
  41. }
  42. /**
  43. * Вторым параметром запроса можно добавить массив middleware
  44. */
  45. app.get('/api/cart', [authenticateJWT], async (req, res) => {
  46. try {
  47. res.json(await sequelize.query(`
  48. SELECT *
  49. FROM Cart
  50. -- WHERE userId=:userId
  51. `, {
  52. logging: false,
  53. type: QueryTypes.SELECT
  54. // replacements: {
  55. // userId: req.user.id
  56. // }
  57. }))
  58. } catch (error) {
  59. console.error(error)
  60. } finally {
  61. res.end()
  62. }
  63. })
  64. app.post('/api/cart', async (req, res) => {
  65. try {
  66. await sequelize.query(`
  67. INSERT INTO Cart (menuItemId, quantity)
  68. VALUES (:menuItemId, :quantity)
  69. `,{
  70. logging: false,
  71. type: QueryTypes.INSERT,
  72. replacements: {
  73. menuItemId: req.body.menuItemId,
  74. quantity: req.body.quantity
  75. }
  76. })
  77. } catch (error) {
  78. console.warn('ошибка при добавлении блюда в корзину:', error.message)
  79. res.status(500).send(error.message)
  80. } finally {
  81. res.end()
  82. }
  83. })
  84. app.patch('/api/cart/:id', async (req, res) => {
  85. try {
  86. await sequelize.query(`
  87. UPDATE Cart
  88. SET quantity=:quantity
  89. WHERE id=:id
  90. `,{
  91. logging: false,
  92. replacements: {
  93. id: req.params.id,
  94. quantity: req.body.quantity
  95. }
  96. })
  97. } catch (error) {
  98. console.warn('ошибка при редактировании корзины:', error.message)
  99. res.status(500).send(error.message)
  100. } finally {
  101. res.end()
  102. }
  103. })
  104. app.delete('/api/cart/:id', async (req, res) => {
  105. try {
  106. await sequelize.query(`
  107. DELETE
  108. FROM Cart
  109. WHERE id=:id
  110. `,{
  111. logging: false,
  112. replacements: {
  113. id: req.params.id
  114. }
  115. })
  116. } catch (error) {
  117. console.warn('ошибка при удалении блюда из корзины:', error.message)
  118. res.status(500).send(error.message)
  119. } finally {
  120. res.end()
  121. }
  122. })
  123. const JWT_SECRET = process.env.JWT_SECRET
  124. /**
  125. * В теле запроса должен быть объект с логином и паролем:
  126. * {
  127. * "login": "ваш логин",
  128. * "password": "пароль"
  129. * }
  130. */
  131. app.post('/api/user/login', async (req, res) => {
  132. try {
  133. // const user = await sequelize.query(`
  134. // SELECT *
  135. // FROM User
  136. // WHERE login=:login
  137. // `, {
  138. // // параметр plain нужен, чтобы запрос вернул не массив записей, а конкретную запись
  139. // // если записи с таким логином нет, то вернет null
  140. // plain: true,
  141. // logging: false,
  142. // type: QueryTypes.SELECT,
  143. // replacements: {
  144. // login: req.body.login
  145. // }
  146. // })
  147. const user = {
  148. password: md5('123456'),
  149. id: 1,
  150. roleId: 1
  151. }
  152. if (user) {
  153. // хешируем пароль
  154. const passwordMD5 = md5(req.body.password)
  155. if (user.password == passwordMD5) {
  156. // формируем токен
  157. const jwtToken = jwt.sign({
  158. id: user.id,
  159. firstName: user.firstName,
  160. roleId: user.roleId
  161. },
  162. JWT_SECRET
  163. )
  164. res.json(jwtToken)
  165. } else {
  166. res.status(401).send('не верный пароль')
  167. }
  168. } else {
  169. res.status(404).send('пользователь не найден')
  170. }
  171. } catch (error) {
  172. console.warn('ошибка при авторизации:', error.message)
  173. res.status(500).send(error.message)
  174. } finally {
  175. res.end()
  176. }
  177. })
  178. app.listen(port, () => {
  179. console.log(`Example app listening on port ${port}`)
  180. })