index.js 5.2 KB

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