index.js 5.0 KB

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