| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- 'use strict'
- const express = require('express')
- var cors = require('cors')
- //добавляю к консольному выводу дату и время
- function console_log(fmt, ...aparams){
- fmt = (new Date()).toJSON().substr(0, 19)+' '+fmt
- console.log(fmt, ...aparams)
- }
- // создание экземпляра http-сервера
- const app = express()
- // метод .use задает команды, которые будут выполнены до разбора GET/POST команд
- // декодирует параметры запроса
- app.use( express.urlencoded() )
- app.use( express.json() )
- app.use('/up/images', cors(), express.static(__dirname +'/images') )
- app.use('/swagger', cors(), express.static(__dirname +'/swagger') )
- // логгирую все входящие запросы
- app.use((req, res, next)=>{
- console_log('[express] %s %s request from %s, body: %s', req.method, req.path, req.ip, JSON.stringify(req.body))
- next()
- })
- const registeredUsers = []
- const movies = [
- {movieId: 1, name: 'Дюна', description: 'Атрейдесы прибывают на планету, где им никто не рад. Фантастический эпос Дени Вильнёва с шестью «Оскарами»', age: 12, images: [], poster: 'duna.webp', tags: [], filters: ['new','inTrend','forMe']},
- {movieId: 2, name: 'Легенда о Зелёном Рыцаре', description: 'Наследник короля принимает вызов таинственного рыцаря. Захватывающее фэнтези по мотивам средневековой поэмы', age: 18, images: [], poster: 'green.webp', tags: [], filters: ['new','inTrend','forMe']}
- ]
- function findUserByEmail(email) {
- for (let i = 0; i < registeredUsers.length; i++) {
- if (registeredUsers[i].email == email)
- return registeredUsers[i]
- }
- return null
- }
- function findUserByToken(token) {
- for (let i = 0; i < registeredUsers.length; i++) {
- if (registeredUsers[i].token == token)
- return registeredUsers[i]
- }
- return null
- }
- app.options('/auth/register', cors())
- app.post('/auth/register', cors(), (req,res)=>{
- try {
- if(req.body.email==undefined)
- throw new Error('Not found "email" param')
- if(req.body.password==undefined)
- throw new Error('Not found "password" param')
- if(req.body.firstName==undefined)
- throw new Error('Not found "firstName" param')
- if(req.body.lastName==undefined)
- throw new Error('Not found "lastName" param')
- const re = new RegExp(`^[a-z0-9]+@[a-z0-9]+\.[a-z]{1,3}$`)
- if (!re.test(req.body.email))
- throw new Error('Param "email" don`t match template')
- let user = findUserByEmail(req.body.email)
- if (user == null) {
- let user = null
- let token = null
- do {
- token = Math.ceil(Math.random() * 999998)
- user = findUserByToken(token)
- } while (user != null);
- registeredUsers.push({
- email: req.body.email,
- password: req.body.password,
- firstName: req.body.firstName,
- lastName: req.body.lastName,
- token: token
- })
- }
- res.status(201)
- } catch (error) {
- res.statusMessage = error.message
- res.status(400)
- }
- res.end()
- })
- app.options('/auth/login', cors())
- app.post('/auth/login', cors(), (req,res)=>{
- try {
- if(req.body.email==undefined)
- throw new Error('Not found "email" param')
- if(req.body.password==undefined)
- throw new Error('Not found "password" param')
- let user = findUserByEmail(req.body.email)
- if (user == null) res.status(404)
- else {
- if (user.password != req.body.password)
- throw new Error('Wrong password')
- res.json({token: user.token})
- }
- } catch (error) {
- res.statusMessage = error.message
- res.status(400)
- }
- res.end()
- })
- function checkAuth(req){
- if(req.headers.authorization==undefined)
- throw new Error('No Authorization header')
- let parts = req.headers.authorization.split(' ')
- if (parts.length == 2) {
- if (parts[0] == 'Bearer') {
- let user = findUserByToken(parts[1])
- if (user == null)
- throw new Error('User not found')
- } else
- throw new Error('Unsupported Authorization method')
- } else
- throw new Error('Bad Authorization content')
- }
- app.options('/movies', cors())
- app.get('/movies', cors(), (req,res)=>{
- try {
- if (typeof req.query.filter == 'undefined')
- throw new Error('Filter is required parameter')
- checkAuth(req)
- let filtered = movies
- .filter(m => m.filters.includes(req.query.filter))
- let mapped = filtered.map(m => {
- return {
- movieId: m.movieId,
- name: m.name,
- description: m.description,
- age: m.age,
- images: m.images,
- poster: m.poster,
- tags: m.tags
- }
- })
- res.json(mapped)
- } catch (error) {
- res.statusMessage = error.message
- res.status(400)
- }
- res.end()
- })
- // запуск сервера на порту 8080
- app.listen(3019, '0.0.0.0', ()=>{
- console_log('HTTP сервер успешно запущен на порту 3019')
- }).on('error', (err)=>{
- console_log('ошибка запуска HTTP сервера: %s', err)
- })
|