Функциональные и иные требования в формате PDF доступны здесь.
Поскольку в требованиях не было ограничения по использованию СУБД, то выбрана MongoDB в виду быстродействия и простоты использования, а также поддержки geospatial индексов.
Для доступа к данным используется напрямую API Ruby-драйвера MongoDB.
В качестве источника данных об аэропортах использован сайт http://www.apinfo.ru/.
Данные в формате XML находятся в файле db/airports.xml, который парсится и экспортируется в базу посредством соответствующей Rake-задачи.
Получены:
- IATA-код
- ICAO-код
- Название аэропорта на русском
- Название аэропорта на английском
- Город на русском
- Город на английском
- Страна на русском
- Страна на английском
- ISO-код страны
- Географические координаты
9298 аэропортов.
Для каждого из аэропортов генерируется от 10 до 400 записей в коллекцияю с ценами (выбирается случайный пункт назначения, дата отправления + 2..365 дней от текущей, дата возвращения в интервале от 1 до 4-х недель, или же от 5 до 180-ти дней)
~1,9M записей с ценами.
Web-сервис имеет всего один вызов формата: search/:depart_name/:start_date/:period_type/:duration
Результаты сортируются по возрастанию цены.
Покрыты случаи:
- неккоретного формата запроса
- некорректных данных в запросе
- дат начала периода, выходящих за рамки имеющихся в базе
- соответствия дат вылета выбранному типу периода (месяц или сезон)
- соответствие даты обратного вылета выбранной длительности пребывания (1, 2, 3, 4) недели.
- общее количество вариантов перелетов должно превышать количество вариантов с датами возвращениям кратными 1, 2, 3, 4 неделям от даты вылета.
Посколько наш API очень простой, то он оформлен в виде GET-вызова с передачей всех параметров.
В реальных случаях уместно:
- более детальное (с группировками) дизайн URL-ов для запросов, так и передача параметров в теле запроса (XML или JSON).
- более детальные сообщения об ошибках (сейчас при некорректных данных всегда отдается {"ERROR":"TRUE"})
- декомпозиция (сейчас все выполняется в контроллере).
Парсер аэропортов и генерация данных оформлены в rake-задачу:
rake db:populate
Populate and generate all init data
Которая в свою очередь является оберткой для трех недокументированных задач:
rake db:populate:airports - экспорт данных об аэропортах
rake db:populate:prices - генерация цен
rake db:populate:create_indexes - создание индексов