technopark-db-api

Суть задания заключается в реализации API к базе данных проекта «Форумы» по документации к, собственно, этому API, т.е. эдакий реверс-инжиниринг. Таким образом, на входе:

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

На выходе:

  • поднятый и настроенный MySQL
  • БД где будет хранится информация об основных сущностях системы
  • вэб-сервер, который будет отвечать на внешние запросы, обращаясь к БД

После написания API правильность реализации будет проверяться с помощью автоматического функционального тестирования. Методика тестирования:

  • запускается скрипт на python, который будет проводить тестирование
  • он опрашивает все методы, определенные в API, по шаблону http://{{student_ip}}/db/api//{{entity}}/{{method}}/ с заранее заданными\случайными параметрами, корректными относительно документации (в POST-запросах передается json, GET - как обычно)
  • ответы вашей системы сравниваются с эталонами
  • если код http ответа не 200, то тест считается проваленным
  • если в ответе не хватает каких-то полей или значение каких-то полей не совпадает, то тест считается проваленным
  • если нет ни одного неправильного ответа, то тест считается пройденным
  • результат тест отправляется вам на почту

##FAQ

  1. Что нужно ответить, если создаваемый объект\связь уже существует?
  • Нужно ответить этим уже созданным объектом для всех сущностей, кроме юзера. В случае юзера вернуть ошибку (см. п. 4 и 2)
  1. Что такое code в ответах на запросы?
  • Код возврата:
    • 0 — ОК,
    • 1 — запрашиваемый объект не найден,
    • 2 — невалидный запрос (например, не парсится json),
    • 3 — некорректный запрос (семантически),
    • 4 — неизвестная ошибка.
    • 5 — такой юзер уже существует
  1. Юзер может несколько раз голосовать за один и тот же пост или тред?
  • Да
  1. Что отвечать в случае ошибки?
  • {"code": code, "response": error message}
  1. Что делать при удалении треда\поста?
  • Сущность помечается, как isDeleted. Для поста помечается только он сам, для треда - все его внутренности. При этом удаленные сущности не учитываются при подсчете, например, количества постов в треде, но передаются в теле ответа.
  1. Уникален ли username?
  • Нет, уникален email
  1. Уникален ли name у Forum?
  • да, как и shortname
  1. Что такое related user у Forums.details?
  • Показать полную информацию о создателе форума (вместо просто его email-а)
  1. Что за типы сортировок для постов ['flat', 'tree', 'parent_tree']?
  • Есть три вида сортировок с пагинацией, они оказываются очень интересными:
    • по дате (flat), комментарии выводятся простым списком по дате,
    • древовидный (tree), комментарии выводятся отсортированные в дереве по N штук,
    • древовидные с пагинацией по родительским (parent_tree), на странице N родительских комментов и все комментарии прикрепленные к ним, в древвидном отображение,

У всех вариантов есть asc и desc сортировки. Подробнее тут: https://tech-mail.ru/blog/database/2027.html 10. Как запускать тесты локально?

  • python func_test.py -l --address=127.0.0.1:5000 . Другие опции смотри по ключу -h
  1. Как провести нагрузочное тестирование локально?
  • python perf_test.py -l --address=127.0.0.1:5000 заполнит вашу базу согласно опциям из конфига (см. test.conf) и создаст файлик me_httperf_scenario. Его нужно подавать на вход httperf так: httperf --hog --client=0/1 --server=127.0.0.1 --port=5000 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='Content-Type:application/json\n' --wsesslog=100,0.000,me_httperf_scenario . Запускать на 5 минут, смотреть на Reply rate -> avg

#API Documentation

##Общие

##Forum

##Post

##User

##Thread