index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. 'use strict'
  2. const express = require('express')
  3. var cors = require('cors')
  4. //добавляю к консольному выводу дату и время
  5. function console_log(fmt, ...aparams){
  6. fmt = (new Date()).toJSON().substr(0, 19)+' '+fmt
  7. console.log(fmt, ...aparams)
  8. }
  9. // создание экземпляра http-сервера
  10. const app = express()
  11. // метод .use задает команды, которые будут выполнены до разбора GET/POST команд
  12. // декодирует параметры запроса
  13. app.use( express.urlencoded() )
  14. app.use( express.json() )
  15. app.use('/up/images', express.static(__dirname +'/images') )
  16. // логгирую все входящие запросы
  17. app.use((req, res, next)=>{
  18. console_log('[express] %s request from %s, body: %s', req.path, req.ip, JSON.stringify(req.body))
  19. next()
  20. })
  21. const registeredUsers = []
  22. const movies = [
  23. {movieId: 1, name: 'Дюна', description: 'Атрейдесы прибывают на планету, где им никто не рад. Фантастический эпос Дени Вильнёва с шестью «Оскарами»', age: 12, images: [], poster: 'duna.webp', tags: [], filters: ['new','inTrend','forMe']},
  24. {movieId: 2, name: 'Легенда о Зелёном Рыцаре', description: 'Наследник короля принимает вызов таинственного рыцаря. Захватывающее фэнтези по мотивам средневековой поэмы', age: 18, images: [], poster: 'green.webp', tags: [], filters: ['new','inTrend','forMe']}
  25. ]
  26. function findUserByEmail(email) {
  27. for (let i = 0; i < registeredUsers.length; i++) {
  28. if (registeredUsers[i].email == email)
  29. return registeredUsers[i]
  30. }
  31. return null
  32. }
  33. function findUserByToken(token) {
  34. for (let i = 0; i < registeredUsers.length; i++) {
  35. if (registeredUsers[i].token == token)
  36. return registeredUsers[i]
  37. }
  38. return null
  39. }
  40. app.options('/auth/register', cors())
  41. app.post('/auth/register', cors(), (req,res)=>{
  42. try {
  43. // if(req.headers.token==undefined)
  44. // throw new Error("В заголовке запроса нет токена")
  45. if(req.body.email==undefined)
  46. throw new Error('Not found "email" param')
  47. if(req.body.password==undefined)
  48. throw new Error('Not found "password" param')
  49. if(req.body.firstName==undefined)
  50. throw new Error('Not found "firstName" param')
  51. if(req.body.lastName==undefined)
  52. throw new Error('Not found "lastName" param')
  53. const re = new RegExp(`^[a-z0-9]+@[a-z0-9]+\.[a-z]{1,3}$`)
  54. if (!re.test(req.body.email))
  55. throw new Error('Param "email" don`t match template')
  56. let user = findUserByEmail(req.body.email)
  57. if (user == null)
  58. registeredUsers.push({
  59. email: req.body.email,
  60. password: req.body.password,
  61. firstName: req.body.firstName,
  62. lastName: req.body.lastName,
  63. token: registeredUsers.length + 1
  64. })
  65. res.status(201)
  66. } catch (error) {
  67. res.statusMessage = error.message
  68. res.status(400)
  69. }
  70. res.end()
  71. })
  72. app.options('/auth/login', cors())
  73. app.post('/auth/login', cors(), (req,res)=>{
  74. try {
  75. if(req.body.email==undefined)
  76. throw new Error('Not found "email" param')
  77. if(req.body.password==undefined)
  78. throw new Error('Not found "password" param')
  79. let user = findUserByEmail(req.body.email)
  80. if (user == null) res.status(404)
  81. else {
  82. if (user.password != req.body.password)
  83. throw new Error('Wrong password')
  84. res.json({token: user.token})
  85. }
  86. } catch (error) {
  87. res.statusMessage = error.message
  88. res.status(400)
  89. }
  90. res.end()
  91. })
  92. app.options('/movies', cors())
  93. app.get('/movies', cors(), (req,res)=>{
  94. try {
  95. if (typeof req.query.filter == 'undefined')
  96. throw new Error('Filter is required parameter')
  97. if(req.headers.authorization==undefined)
  98. throw new Error('No Authorization header')
  99. let parts = req.headers.authorization.split(' ')
  100. if (parts.length == 2) {
  101. if (parts[0] == 'Bearer') {
  102. let user = findUserByToken(parts[1])
  103. if (user == null)
  104. throw new Error('User not found')
  105. else {
  106. let filtered = movies
  107. .filter(m => m.filters.includes(req.query.filter))
  108. let mapped = filtered.map(m => {
  109. return {
  110. movieId: m.movieId,
  111. name: m.name,
  112. description: m.description,
  113. age: m.age,
  114. images: m.images,
  115. poster: m.poster,
  116. tags: m.tags
  117. }
  118. })
  119. res.json(mapped)
  120. }
  121. } else
  122. throw new Error('Unsupported Authorization method')
  123. } else
  124. throw new Error('Bad Authorization content')
  125. } catch (error) {
  126. res.statusMessage = error.message
  127. res.status(400)
  128. }
  129. res.end()
  130. })
  131. // запуск сервера на порту 8080
  132. app.listen(3019, '0.0.0.0', ()=>{
  133. console_log('HTTP сервер успешно запущен на порту 3019')
  134. }).on('error', (err)=>{
  135. console_log('ошибка запуска HTTP сервера: %s', err)
  136. })