разработать 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 запущен
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 (возможно потребуется создать данные папки в папке приложения)
В браузере параметры запроса можно передавать с помощью адресной строки.
Например:
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, в котором генерируемые данные прописаны в явном виде (хардкод).
Аналогично запросы можно выполнять с помощью командной строки (терминала) - используя 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"}}]%
В корне проекта есть файл коллекции запросов 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-таск может быть выполнена неограниченное количество раз.