Giter VIP home page Giter VIP logo

ruby_api_2020's Introduction

Тестовое задание:

разработать API для веб-формы параметризованного поиска штрафов по владельцу и госномеру по базе ("информация о штрафах": госномер, марка автомобиля, модель автомобиля, владелец, тип начисленного штрафа). Одному владельцу может принадлежать несколько автомобилей. Справочник типов штрафов и пошлины по его оплате размещается в отдельной таблице-справочнике. В качестве БД для хранения данных можно использовать любую БД, при этом, для создания базы и справочника, и заполнения их данными нужно использовать встроенные средства фреймворка Ruby on Rails. Необходимо снабдить результат инструкцией по развертыванию и настройке, а так же коллекцией запросов для Postman с примерами использования разработанного API.

Итоговый результат:

Разработан сервис, отвечающий указанным требованиям. Было реализовано:

  • API для полнотекстового поиска по записям в БД (поиск по точному вводимому слову, либо по его части, т.е. при неполном вводе слова). Поиск является регистронезависимым - поиск по фамилии "Ким" и "ким" даст одинаковый результат
  • Нарушения выводятся по 10 на страницу (номер запрашиваемой страницы необходимо передавать в параметре page)
  • Разработан модуль для генерации случайных данных (см. примечание ниже).

Особенности реализации и системные требования:

ruby - 2.7.1
Rails - версия >= 6.0.2.1, но < 6.1
БД - PostgreSQL
Пагинация - гем 'kaminari'
Генерация данных:

  • гем 'realistic-russian-names' (для генерации случайных ФИО граждан)
  • собственные методы для генерации прочих данных.

Основные сущности:

  • Ticket - нарушение (штраф)
  • TicketType - тип нарушения
  • Citizen - гражданин
  • Car - автомобиль, ТС (транспортное средство). Формат гос.номера: р125ах-77(7).

Поля в таблицах БД - см. файл db/schema.rb

Установка необходимых пакетов и утилит:

rvm install 2.7.1 && rvm use 2.7.1                   - обновляем информацию о доступных пакетах
sudo apt-get -y install bundler                      - установка менеджера управления гемами Bundler
sudo apt -y install postgresql postgresql-contrib    - установка PostgreSQL
sudo systemctl start postgresql.service              - удостоверимся, что Postgres запущен

Настройка PG:

sudo -i -u postgres                                       - переключаемся на учетную запись postgres
  psql                                                    - получаем доступ к командной строке Postgres
    CREATE ROLE api2020 WITH LOGIN PASSWORD 'api2020';    - создаём юзера api2020
    ALTER USER api2020 CREATEDB;                          - предоставляем юзеру api2020 право на создание БД
  exit                                                    - выход из командной строки Postgres
exit                                                      - переключаемся обратно на текущего пользователя

Развертывание приложения:

Для скачивания на компьютер необходимо выполнить команду:
git clone https://github.com/semensid2020/ruby_api_2020.git

Далее выполняем команды:

cd ruby_api_2020
bundle install
yarn install --check-files
rails db:create         - создание БД
rails db:migrate        - изменение структуры БД (создание таблиц)
rails db:seed           - заполнение таблиц данными
puma                    - запуск приложения

Опционально:

mkdir tmp && mkdir tmp/pids	  (возможно потребуется создать данные папки в папке приложения)

Тестирование API из браузера:

В браузере параметры запроса можно передавать с помощью адресной строки.
Например:

http://localhost:7777/tickets                             - вывод первой страницы выдачи данных о штрафах
http://localhost:7777/tickets?page=3                      - вывод третьей страницы выдачи данных о штрафах
http://localhost:7777/tickets?car_number=2                - поиск по штрафам с учетом госномера авто (включающего цифру 2)
http://localhost:7777/tickets?surname=ким&first_name=а    - поиск по штрафам с ФИО гражданина (фамилия содержит строку 'ким', имя содержит букву 'а')

При тестировании можно сверяться с содержимым соответствующих таблиц в БД,
либо с содержимым файла db/seeds.rb, в котором генерируемые данные прописаны в явном виде (хардкод).

Тестирование API с помощью утилиты curl (выполняется в терминале):

Аналогично запросы можно выполнять с помощью командной строки (терминала) - используя curl:
curl -X GET "http://localhost:7777/tickets?page=3"

Результат:

ruby_api_2020 git:(develop)  curl -X GET "http://localhost:7777/tickets?page=3"
[{"ticket":{"id":21,"ticket_number":"20200616999888","ticket_date":"2020-06-16","ticket_name":"Нелегальная перевозка пассажиров","penalty":5000},"car":{"car_number":"а358хо-70","car_company":"Лада","car_model":"Гранта"},"citizen":{"passport":"1234567890","sex":"муж","surname":"Иванов","first_name":"Иван","second_name":"Иванович","birth_date":"1978-05-17"}},{"ticket":{"id":22,"ticket_number":"20200701777666","ticket_date":"2020-07-01","ticket_name":"Передача ТС лицу без документов","penalty":3000},"car":{"car_number":"н100рм-70","car_company":"Toyota","car_model":"Caldina"},"citizen":{"passport":"1234567890","sex":"муж","surname":"Иванов","first_name":"Иван","second_name":"Иванович","birth_date":"1978-05-17"}},{"ticket":{"id":23,"ticket_number":"20200814555444","ticket_date":"2020-08-14","ticket_name":"Нарушение требований к перевозке детей","penalty":3000},"car":{"car_number":"н100рм-70","car_company":"Toyota","car_model":"Caldina"},"citizen":{"passport":"1234567890","sex":"муж","surname":"Иванов","first_name":"Иван","second_name":"Иванович","birth_date":"1978-05-17"}}]% 

Тестирование API с помощью POSTMAN:

В корне проекта есть файл коллекции запросов POSTMAN, необходимый для тестирования и демонстрации работы созданного API.

Примечание:

Был создан модуль SeedGenerator app/lib/seed_generator.rb, предоставляющий методы для генерации случайных данных:

  • ФИО граждан, дату рождения
  • Данные об автомобилях: фирму-производитель, модель, гос.номер (с учетом государственного стандарта регистрационных номеров ТС)
  • Данные о нарушениях (штрафах): дата нарушения, номер штрафа

Также добавлена rake-таск для множественной генерации записей в БД (lib/tasks/more_random_seeds.rake), генерирующая 100 записей каждого вида (кроме видов нарушений - ввиду их специфичности):

  • 100 граждан
  • 100 автомобилей
  • 100 штрафов

Для запуска rake-таск необходимо выполнить команду:
rails seeding:more_random_seeds


Данная rake-таск может быть выполнена неограниченное количество раз.

Благодарю за внимание!

ruby_api_2020's People

Contributors

semensid2020 avatar

Watchers

 avatar

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.