pahomov / javascript-test

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Тестовое задание для javascript-разработчика

Пожалуйста, не пишите название компании в коде, названии проекта, readme.md, или где-либо еще, чтобы нельзя было найти простым поиском ваше решение.

Тестовое задание представляет из себя несколько задач, выполняемых в одной кодовой базе (для каждого модуля). Выполнение каждой задачи требует знания различных технологий, если на какой-то задаче у вас возникли трудности, ее можно пропустить и перейти к следующей.

Задачи делятся на 2 модуля: backend и frontend, и вы можете выполнить задачи из модуля, соответствующего позиции, на которую вы претендуете, либо выполнить задачи из обоих модулей.

Вы можете сделать столько задач, сколько сможете, либо сколько посчитаете нужным, но в зависимости от количества выполненных задач мы получим объективное представление о ваших навыках. Чем больше задач будет выполнено, тем выше мы оценим ваши навыки.

Решение может быть прислано ссылкой на открытый репозиторий на github / bitbucket / gitlab.

Для выполнения задач мы не ограничиваем вас никакими технологиями и библиотеками, если это не оговорено в задании. Выбирайте те инструменты, с которыми работали, или которые на ваш взгляд подходят для выполнения поставленной задачи.

backend

В партнерской программе IQ Option есть раздел с новостями, представляющий из себя ленту, в которой, с одной стороны, менеджер создает записи, а партнеры, с другой стороны, их читают. Вашей задачей будет создание отдельного сервера, обслуживающего эту функциональность.

Отдельным плюсом будет использование typescript для решения этого задания.

  1. Реализуйте простейший echo-сервер
  2. Реализуйте логирование всех http-запросов
  3. Добавьте rate limiter
  4. Реализуйте произвольный механизм сессий
  5. Реализуйте REST API интерфейс в котором предусмотрено:
    • создание новости
    • возврат всего списка новостей
    • возврат конкретной новости
    • обновление новости
    • замена новости
    • удаление новости
    • хранение всех новостей в памяти
  6. Создайте Dockerfile для сервера, чтобы иметь возможность запускать его в изолированной среде
  7. Добавьте docker-compose.yml файл для запуска командой docker-compose up
  8. Подключите к серверу любую SQL базу данных, и перенесите туда хранение новостей. Добавьте базу данных в docker-compose.yml
  9. Реализуйте произвольный механизм регистрации и авторизации
  10. Реализуйте произвольный механизм ролей, и добавьте ограничение на вызовы API, через которые можно менять данные
  11. Реализуйте API для отметки прочтения пользователем новости
  12. Реализуйте возможность подписки через web socket на событие добавления новости
  13. Реализуйте механизм запуска сервера в нескольких процессах с помощью модуля cluster, и не забудьте про уведомление подписчиков, висящих на других процессах, об добавлении новости
  14. Реализуйте graceful shutdown
  15. Напишите тесты, любые: unit, integration, end-to-end и так далее, которые сами посчитаете нужными
  16. Настройте любую облачную CI (CircleCI, TravisCI, CodeShip) для запуска ваших тестов в облаке на любое изменение в любой ветке
  17. Настройте автоматический деплой на heroku с помощью выбранной CI при обновлении master-ветки в случае успешного прогона тестов

frontend

Необходимо сделать приложение для оценки прибыльности портфеля ценных бумаг.

Практическая задача этого приложения - сравнить доходность диверсифицированного портфеля ценных бумаг (предполагается что доходность известна пользователю) с аналогичным по стоимости портфелем индексных ETF.

  1. Используйте create-react-app или вашу кастомную сборку webpack
  2. Сделайте форму редактирования портфеля. Это список активов, можно добавлять, редактировать, удалять активы. Пример данных ниже. Если в портфеле есть несколько одинаковых активов, и изменена его текущая цена в одной строке, то должны обновиться текущие цены того же актива и в других строках. Каждый актив имеет следующие поля:
    • название актива
    • дата покупки
    • количество
    • цена покупки (доллары, точность до 4 знака)
    • сумма (количество * цена, вычисляемое не редактируемое поле)
    • комиссия (доллары, любое число введенное пользователем)
    • цена текущая (доллары, точность до 4 знака)
  3. При перезагрузке страницы данные портфеля должны сохраняться
  4. Постройте график стоимости портфеля
  5. На основе API котировок NASDAQ (symbol=QQQ) и данных портфеля выведите таблицу (смысл которой в том, чтобы показать, сколько лотов индекса можно было бы купить на те же деньги вместо покупки какого-то актива) по дням, начиная от даты создания портфеля (дата первого купленного актива) до сегодняшнего, с колонками:
    • дата
    • стоимость активов, добавленных в этот день в портфель (сумма + комиссия)
    • цена закрытия индекса
    • количество лотов индекса (получаем делением стоимости активов на цену закрытия индекса в этот день)
  6. Под таблицей вывести:
    • вложения в портфель (сложить все суммы и комиссии из портфеля),
    • стоимость индексную (последнюю цену закрытия индекса умножить на сумму лотов индекса)
    • стоимость портфеля (сложите текущие стоимости каждого актива)
    • прибыльность индекса (разницу в процентах между вложениями и стоимостью индекса)
    • прибыльность портфеля (разницу в процентах между вложениями и стоимостью портфеля)
  7. Добавьте на график стоимость индексного портфеля (суммарная стоимость лотов индекса за каждый день)
  8. Добавьте select с выбором индекса для оценки. Варианты: S&P500 (symbol=SPY) и NASDAQ (symbol=QQQ)
  9. Задеплойте приложение на github pages или напишите как развернуть приложение локально

Постарайтесь не использовать css фреймворки, т.к. мы хотим увидеть ваш уровень верстки. Вы можете использовать любой css-препроцессор или же использовать css-in-js решения. В качестве js-фреймворка мы ожидаем увидеть react, в качестве сборщика - webpack, так как в компании используются именно эти технологии.

Для получения доступа к API котировок необходимо заполнить простую форму по адресу: https://www.alphavantage.co/support/#api-key

Пример вызова API:

https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=QQQ&outputsize=full&apikey=demo

Пример портфеля:

[
{symbol:'ABT',date:'2018-06-06',quantity:15,price:62.87,comission:0.28},
{symbol:'BABA',date:'2017-11-27',quantity:6,price:190.9,comission:4},
{symbol:'BABA',date:'2017-06-22',quantity:4,price:141.58,comission:1.7},
{symbol:'CSCO',date:'2018-05-18',quantity:25,price:43.68,comission:3.28},
{symbol:'CSCO',date:'2017-04-07',quantity:15,price:33.26,comission:2},
{symbol:'INTC',date:'2018-06-06',quantity:17,price:56.34,comission:0.29},
{symbol:'MA',date:'2018-06-06',quantity:5,price:200.89,comission:0.3},
{symbol:'NFLX',date:'2017-06-09',quantity:2,price:158.64,comission:1.74},
{symbol:'NFLX',date:'2017-05-11',quantity:4,price:158.99,comission:1.91},
{symbol:'NFLX',date:'2017-03-29',quantity:3,price:146.31,comission:2},
{symbol:'NVDA',date:'2017-11-24',quantity:5,price:215.83,comission:6},
{symbol:'NVDA',date:'2017-08-11',quantity:5,price:152,comission:3},
{symbol:'NVDA',date:'2017-06-02',quantity:5,price:143.95,comission:2.16},
{symbol:'NVDA',date:'2017-03-30',quantity:5,price:109.31,comission:2},
{symbol:'V',date:'2018-06-06',quantity:7,price:134.32,comission:0.28}
]

Пример текущей стоимости:

{
  ABT: 64.55,
  BABA: 181.99,
  CSCO: 42.24,
  INTC: 49.28,
  MA: 201.10,
  NFLX: 342.45,
  NVDA: 249.44,
  V: 138.57,
}

About