Code Monkey home page Code Monkey logo

movies-explorer-api's Introduction

🍿 Movie Explorer (backend)

Backend для проекта Movie Explorer — приложения, в котором можно найти фильмы из архива BeatFilm Festival по запросу и сохранить в свою коллекцию.

Techs

  • Javascript
  • Node.js
  • Express
  • MongoDB
  • mongoose

Документация к API

POST /users/signup

создаёт пользователя с переданными в теле email, password и name

POST /users/signin

проверяет переданные в теле email и password и возвращает JWT

POST /users/signout

удаляет JWT из куков пользователя

GET /users/me

возвращает информацию о пользователе, его email и name - роут защищен авторизацией

PATCH /users/me

обновляет информацию о пользователе, его email и name - роут защищен авторизацией

GET /movies

возвращает все сохранённые пользователем фильмы - роут защищен авторизацией

POST /movies

создаёт фильм с переданными в теле country, director, duration, year, description, image, trailer, nameRU, nameEN и thumbnail, movieId - роут защищен авторизацией

DELETE /movies/_id

удаляет сохранённый фильм по id - роут защищен авторизацией

Фичи

  • REST API
  • все роуты, кроме signup и signin, защищены авторизацией
  • JWT надежно хранится в httpOnly куках
  • бережное хранение пароля в виде хэша
  • валидация запросов к серверу (через Joi и Celebrate)
  • валидация запросов к базе данных (через Mongoose)
  • мидлвары безопасности:
    • контроль заголовков с helmet
    • контроль числа запросов с express-rate-limit
    • контроль кросс-доменных запросов с cors
  • логирование запросов и ошибок

URL

https://api.beatfilmlist.nomoredomains.work

IP 130.193.41.88

Как запустить проект

movies-explorer-api's People

Contributors

dzhaneta avatar

Stargazers

Danila Legkobytov avatar Aleksei Usov avatar

Watchers

 avatar

movies-explorer-api's Issues

деплой / сервер и домен

  • - Создайте сервер. Затем установите всё необходимое и разверните на нём API.

Важно реализовать возможность обращаться к API по публичному IP-адресу. Раньше мы обращались к серверу локально — по адресу localhost. Для разработки это нормально, но в продакшене не годится: к вашему localhost можете обратиться только вы. Поэтому сервер нужно где-то разместить.
Мы рекомендуем использовать Яндекс Облако для создания облачного сервера. Оно предоставляет грант для новых пользователей — что-то вроде бесплатного периода. Если вы уже пользовались Яндекс Облаком и входного гранта у вас нет, обратитесь к куратору.

  • - Создайте домен и прикрепите его к серверу.

Закрепите за доменом публичный IP-адрес своего сервера. Подойдёт и бесплатный домен. Его вы можете зарегистрировать на нашем сервисе. Ссылку на него получите у куратора. Вы уже создавали домен в последнем спринте, сделайте это снова.
Критерий готовности: к API можно обратиться по доменному имени.

схемы и модели / movies

Поля схемы movie:
country — страна создания фильма. Обязательное поле-строка.
director — режиссёр фильма. Обязательное поле-строка.
duration — длительность фильма. Обязательное поле-число.
year — год выпуска фильма. Обязательное поле-строка.
description — описание фильма. Обязательное поле-строка.
image — ссылка на постер к фильму. Обязательное поле-строка. Запишите её URL-адресом.
trailerLink — ссылка на трейлер фильма. Обязательное поле-строка. Запишите её URL-адресом.
thumbnail — миниатюрное изображение постера к фильму. Обязательное поле-строка. Запишите её URL-адресом.
owner — _id пользователя, который сохранил фильм. Обязательное поле.
movieId — id фильма, который содержится в ответе сервиса MoviesExplorer. Обязательное поле.
nameRU — название фильма на русском языке. Обязательное поле-строка.
nameEN — название фильма на английском языке. Обязательное поле-строка.

роуты и контроллеры / аутентификация и авторизация

// создаёт пользователя с переданными в теле email, password и name
POST /signup

// проверяет переданные в теле почту и пароль и возвращает JWT
POST /signin

Эти два роута не нужно защищать авторизацией.
Обратите внимание: если сохранять JWT в куках, понадобится дополнительный роут POST /signout. При запросе к роуту удалится JWT из куков пользователя.

роуты и контроллеры / movies

// возвращает все сохранённые текущим пользователем фильмы
GET /movies

// создаёт фильм с переданными в теле
// country, director, duration, year, description, image, trailer, nameRU, nameEN и thumbnail, movieId
POST /movies

// удаляет сохранённый фильм по id
DELETE /movies/_id

Создайте контроллер для каждого роута. Защитите роуты авторизацией: если клиент не прислал JWT, доступ к роутам ему должен быть закрыт.

логирование

Настройте два файла для хранения логов:
request.log, чтобы хранить информацию о всех запросах к API;
error.log, чтобы хранить информацию об ошибках, которые возвращает API.

Логи должны быть в формате JSON. Файлы логов не должны добавляться в репозиторий.

подготовка / репа, ветки, кор.файлы

  • Клонируйте репозиторий для бэкенда на свой компьютер. Локально создайте ветку для кода первого этапа. Назовите её level-1. Весь код первого этапа пишите в этой ветке.

  • Добавьте все необходимые инфраструктурные файлы:
    .gitignore, .editorconfig, .eslintrc. Можете взять эти файлы из проекта Mesto.

  • Инициализируйте package.json:
    Поля name и author заполните на своё усмотрение.
    Заполните раздел scripts. В нём должны быть команды dev и start. dev запускает проект в режиме разработки с хот-релоадом, а start — в продакшн-режиме без хот-релоада.

схемы и модели / user

В проекте две сущности: пользователи и сохранённые фильмы (users и movies). Создайте схему и модель для каждой. Саму базу данных назовите в единообразном формате, например /bitfilmsdb.

  • Поля схемы user:
    email — почта пользователя, по которой он регистрируется. Это обязательное поле, уникальное для каждого пользователя. Также оно должно валидироваться на соответствие схеме электронной почты.
    password — хеш пароля. Обязательное поле-строка. Нужно задать поведение по умолчанию, чтобы база данных не возвращала это поле.
    name — имя пользователя, например: Александр или Мария. Это обязательное поле-строка от 2 до 30 символов.

роуты и контроллеры / users

// возвращает информацию о пользователе (email и имя)
GET /users/me

// обновляет информацию о пользователе (email и имя)
PATCH /users/me

Создайте контроллер для каждого роута. Защитите роуты авторизацией: если клиент не прислал JWT, доступ к роутам ему должен быть закрыт.

деплой / серты, env, readme

  • - Выпустите сертификаты и подключите их.

Должна быть возможность обратиться к серверу по https.

  • - Создайте на сервере .env файл.

Добавьте в этот файл переменные окружения:
NODE_ENV=production;
JWT_SECRET с секретным ключом для создания и верификации JWT.
.env файл должен храниться только на сервере. В репозитории хранить переменные окружения нельзя — это небезопасно.
В режиме разработки код должен запускаться и работать без этого файла. Задайте условие, чтобы dev-сборка запускалась, когда process.env.NODE_ENV !== 'production'.

  • - Расскажите, как найти ваш публичный сервер.

Добавьте в файл README.md домен, по которому можно обратиться к вашему серверу.

дополнительно / перепроверить

  • Храните пароль в зашифрованном виде.
  • Валидируйте данные, которые приходят в теле и параметрах запроса. Если с телом что-то не так, обработка запроса вообще не должна передаваться в контроллер. Клиенту при этом следует вернуть ошибку.
  • Обрабатывайте ошибки централизованно. В конце файла app.js создайте для этого мидлвэр. При возникновении ошибок не возвращайте их клиенту. Вместо этого передавайте обработку в централизованный мидлвэр.
  • Внимательно отнеситесь к статусам ошибок. Вам пригодятся: 400, 401, 403, 404, 409, 500.
  • Проследите, что у пользователя нет возможности удалять фильмы других пользователей.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.