Пришло время заняться серверной частью и клиент-серверным взаимодействием.
На бэкэнде всё почти обычно: Java-приложение, Spring Boot, Jackson, в ближайшем будущем добавится Hibernate.
Довольно странным получился Maven-layout приложения. Предполагается, что новые функциональные возможности (features) будут проходить сквозь все слои приложения (по сути являясь под-приложениями), все они будут наследоваться от абстрактного Maven-проекта Feature, и подключаться к основному приложению будут как runtime
-зависимости.
Андроидная часть реализована отвратительно. Сейчас получилось, что я рассчитываю, что во время обработки ответа фрагмент для аутентификации всё ещё отображается, что активити для этого фрагмента всё ещё существует. Это повод для будущих улучшений; когда таких фрагментов наберется 3-4, станет возможным выделить их общие проблемы и предложить какой-то паттерн для их решения (а может быть кто-нибудь подскажет что-нибудь умное к тому моменту). Нагромождение вырожденных AsyncTask
ов усилилось, добавился ValidateTokenTask
. Общение с игровым сервером реализовано хардкорно — через HttpURLConnection
. Классы, описывающие ответы сервера, дублируются (и могут привести к сложно выявляемым ошибкам, если забыть скопировать изменения между проектами).
Изначально я думал, что можно было бы попробовать вообще не описывать игровые сущности как Java-классы самому, а генерировать их по какой-нибудь схеме (и делать это как при сборке сервера, так и для клиента); Hibernate тоже можно было бы подключить через XML-конфигурацию. Но всё-таки между тем, с чем удобно работать на сервисном уровне, и объектами, пригодными для клиент-серверного общения, нередко целая пропасть.
Серверная проверка корректности гугл-токена и получение информации о пользователе тоже сделаны хардкорно, тоже через HttpURLConnection
. Возможно, если когда-нибудь на бэкэнде появится необходимость более тесной интеграции с сервисами Гугла, то и получение информации о пользователе можно будет заменить на библиотечный.
Сложным оказался вопрос о том, что возвращать клиенту в случае успешной аутентификации. Поэтому пока что возвращается только результат: success
/fail
/error
.
Удостоверившись, что весь цикл аутентификации работает, я отправил изменения в соответствующие ветки и решил немного заняться инфраструктурными вещами в андроидной части игры.