index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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', cors(), 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.body.email==undefined)
  45. throw new Error('Not found "email" param')
  46. if(req.body.password==undefined)
  47. throw new Error('Not found "password" param')
  48. if(req.body.firstName==undefined)
  49. throw new Error('Not found "firstName" param')
  50. if(req.body.lastName==undefined)
  51. throw new Error('Not found "lastName" param')
  52. const re = new RegExp(`^[a-z0-9]+@[a-z0-9]+\.[a-z]{1,3}$`)
  53. if (!re.test(req.body.email))
  54. throw new Error('Param "email" don`t match template')
  55. let user = findUserByEmail(req.body.email)
  56. if (user == null) {
  57. let user = null
  58. let token = null
  59. do {
  60. token = Math.ceil(Math.random() * 999998)
  61. user = findUserByToken(token)
  62. } while (user != null);
  63. registeredUsers.push({
  64. email: req.body.email,
  65. password: req.body.password,
  66. firstName: req.body.firstName,
  67. lastName: req.body.lastName,
  68. token: token
  69. })
  70. }
  71. res.status(201)
  72. } catch (error) {
  73. res.statusMessage = error.message
  74. res.status(400)
  75. }
  76. res.end()
  77. })
  78. app.options('/auth/login', cors())
  79. app.post('/auth/login', cors(), (req,res)=>{
  80. try {
  81. if(req.body.email==undefined)
  82. throw new Error('Not found "email" param')
  83. if(req.body.password==undefined)
  84. throw new Error('Not found "password" param')
  85. let user = findUserByEmail(req.body.email)
  86. if (user == null) res.status(404)
  87. else {
  88. if (user.password != req.body.password)
  89. throw new Error('Wrong password')
  90. res.json({token: user.token})
  91. }
  92. } catch (error) {
  93. res.statusMessage = error.message
  94. res.status(400)
  95. }
  96. res.end()
  97. })
  98. function checkAuth(req){
  99. if(req.headers.authorization==undefined)
  100. throw new Error('No Authorization header')
  101. let parts = req.headers.authorization.split(' ')
  102. if (parts.length == 2) {
  103. if (parts[0] == 'Bearer') {
  104. let user = findUserByToken(parts[1])
  105. if (user == null)
  106. throw new Error('User not found')
  107. } else
  108. throw new Error('Unsupported Authorization method')
  109. } else
  110. throw new Error('Bad Authorization content')
  111. }
  112. app.options('/movies', cors())
  113. app.get('/movies', cors(), (req,res)=>{
  114. try {
  115. if (typeof req.query.filter == 'undefined')
  116. throw new Error('Filter is required parameter')
  117. checkAuth(req)
  118. let filtered = movies
  119. .filter(m => m.filters.includes(req.query.filter))
  120. let mapped = filtered.map(m => {
  121. return {
  122. movieId: m.movieId,
  123. name: m.name,
  124. description: m.description,
  125. age: m.age,
  126. images: m.images,
  127. poster: m.poster,
  128. tags: m.tags
  129. }
  130. })
  131. res.json(mapped)
  132. } catch (error) {
  133. res.statusMessage = error.message
  134. res.status(400)
  135. }
  136. res.end()
  137. })
  138. // запуск сервера на порту 8080
  139. app.listen(3019, '0.0.0.0', ()=>{
  140. console_log('HTTP сервер успешно запущен на порту 3019')
  141. }).on('error', (err)=>{
  142. console_log('ошибка запуска HTTP сервера: %s', err)
  143. })