Тестовое задание на позицию Sr Java Developer
Необходимо разработать RESTful веб-сервис с использованием Spring Boot для воображаемой компании из сферы разработки онлайн-игр. Сервис хранит в in-memory структуре внутри JVM данные о набранных на текущем уровне очках опыта (поле exp, тип int) и уровне (поле level, тип int) пользовательских персонажей. Персонаж идентифицируется целым 32-битным числом больше нуля.
Сервис должен обслуживать такие запросы:
- Добавить указанное количество очков опыта указанному персонажу, и вернуть уровень персонажа и количество очков опыта набранных на текущем уровне после обновления. Если очков опыта набрано больше или равно необходимому для перехода на следующий уровень, то уровень увеличивается на 1, а очки опыта уменьшаются на количество очков необходимых для перехода.
- Для указанного персонажа вернуть уровень и количество очков опыта набранных на текущем уровне
Ответы ожидаются в формате JSON.
Персонаж создается с level=1, exp=0. Конфигурация того сколько опыта нужно набрать чтобы перейти на следующий уровень читается из отдельного файла конфигурации (формат можно выбирать самостоятельно) при запуске сервиса. После запуска сервиса конфигурация не обновляется. Конфигурация представляет из себя Map<Integer, Integer>. Product owner в качестве примера конфигурации предоставил такую таблицу, и добавил что количество уровней и необходимый опыт для перехода на следующий уровень в реальной конфигурации могут отличаться.
1+ | 100 10+ | 110 20+ | 120 30+ | 150 40+ | 190 50+ | 240 60+ | 300 70+ | 370 80+ | 450 90+ | 540 100 | -
Мы не хотим заставлять product owner-а заполнять промежуточные уровни, поэтому в конфигурации должно быть сравнимое с таблицей количество записей. Мы также не можем быть уверены что product owner в процессе последующих правок не наделает ошибок в конфигурации, поэтому неплохо бы иметь от этого защиту в виде завершения процесса в случае невалидной конфигурации. Невалидной конфигурацией можно считать такую, где levelup exp <= 0 (кроме последнего уровня) или если нам в этой конфигурации не хватает информации для полноценной работы.
Дополнительные вводные данные:
- Мы предполагаем что у нас идеальная сеть без обрывов соединений
- Предполагаемый уровень нагрузки на сервис очень высокий, запросы на добавление опыта одному и тому же персонажу могут приходить одновременно
- У заказчика высокие требования к качеству. Сделать нужно настолько качественно насколько можете.