Тестовое задание JAVA-разработчика
Исходные данные представлены выгрузками Московской биржи (описание API: https://fs.moex.com/files/6523):
- информация о ценных бумагах (securities_*.xml);
- история торгов за произвольную дату (history_*.xml). Поле для связи объектов: SECID. В приложении допускается существование ценной бумаги без истории, истории без описания бумаги - нет.
Необходимо реализовать сервис, покрывающий задачи:
- Импорт объектов из приложенных файлов (состав сохраняемых данных определить самостоятельно);
- Предоставить API для CRUD операций по объектам;
- При ручном сохранении ценной бумаги проводить валидацию передаваемых данных в поле name - только кириллица, цифры и пробел;
- Отдельным методом реализовать вывод таблицы с данными из тегов:
- secid
- regnumber
- name
- emitent_title
- tradedate
- numtrades
- open
- close
Предусмотреть возможность задать параметрами столбцы для сортировки и фильтрацию по полям emitent_title и tradedate; 5. Выбранную архитектуру решения и инструкцию по запуску приложения описать в Readme файле.
Дополнительные задачи «со звездочкой» в порядке уменьшения их значимости
при оценке:
- Реализовать хранение и работу с данными в БД;
- Реализовать MVC приложение, позволяющее через интерфейс импортировать файлы и работать с таблицей п.4 и CRUD операциями. Не стоит акцентировать внимание на ux/ui, нам интересно посмотреть на ваш навык работы с html/js;
- Доработать импорт данных: при импорте истории по отсутствующей ценной бумаге выполнять rest запрос к API биржи (роут метода http://iss.moex.com/iss/securities.xml?q=SEARCH_STRING). Обратить внимание на оптимизацию обращений;
- Реализовать фоновое выполнение парсинга данных по расписанию. Исходный код необходимо выложить на github (или аналогичном сервисе) или аналогичном сервисе) или прислать архивом с комментариями.
Что сделано:
-
Back-end Rest API (Java 8, Spring Boot, Liquibase, Stax, Swagger), Front-end (js, React.js), слой БД (PostgresQL)
-
БД: две основные таблицы: Securities и Histories, в таблице Securities выбрал поля для первичного ключа secid, в Histories композитный первичный ключ secid и tradedate, связаны таблицы по полю secid. Возможно, стоило бы использовать ClickHouse для хранения histories, т.к много статистических данных по дням. С ClickHouse не работал, но меня смущает хранение статистических данных по сделкам в обычной реляционной БД
-
Back-end: слой контроллеров, сервисов, сущностей, репозиториев, утилит(парсинг xml-файлов при помощи Stax (т.к он "поточный")) Есть своя аннотация @CyrillicConstraint для проверки на соответствие кириллице, пробелам и цифрам. Работа с сущностями через репозиторий, используется Specification для фильтрации. По расписанию (по будням) загружается история бумаг (первая страница)
-
Front-End: React.js, react-bootstrap
-
Прикручен Swagger https://tot-systems.herokuapp.com/swagger-ui.html#
- Проект задеплоен на Heroku https://tot-systems.herokuapp.com
- Есть немного тестов на бэке
Проблемы:
- Не понятно как сделать работу клиента на heroku стаибильным, а именно в "Provisional headers are shown". При этом сборка работает, а через какое-то время запросы перестают работать