Skip to content

Repository files navigation

Комментарии к тестовому заданию

Технический стек: Kotlin + coroutines, Android Architechture Components (Navigation, ViewModel, LiveData), Dagger2, Retrofit, Security

Инструменты для отладки: LeakCanary, Chucker (сниффер HTTP трафика с GUI)

Архитектура

Приложение состоит из двух модулей: [base] и [mobile].

[base] содержит код независимый от UI (работа с сетевыми запросами) и потенциально может быть вынесен в отдельную библиотеку и/или использоваться другими модулями.

[mobile] содержит мобильный клиент с указанной в задании функциональностью.

Работа с токенами

Полученные OAuth токены сохраняются в SharedPreferences в зашифрованном виде с мастер-ключом хранящимся в AndroidKeystore. Для этих целей используется библиотека androidx.security.crypto.

Все запросы к API проходят через прокси-класс com.zakaryan.myretailcrm.data.http.ExtendedHttpManager, задача которого перехватывать ситуации, когда запрос к API завершается ошибкой авторизации (HTTP 401). В этом случае класс пытается использовать refresh-токен, чтобы получить новый access-токен и автоматически повторить запрос к API. Если все попытки оказываются неудачными, он обновляет LiveData с состоянием авторизации, чтобы наблюдатель мог отреагировать (показать экран с вводом пароля). Так сделано, для того, чтобы вынести всю работу с токенами в один класс и автоматизировать переотправку запроса при истекшем токене.

Тесты

Тесты успел написать только на ExtendedHttpManager, но остальные в принципе делаются аналогично. (В ExtendedHttpManager сделал вызовы withContext, которые можно было бы убрать внутрь зависимости (TokenManager), чтобы тест был "поинтереснее" - с тестированием suspend функции).

Known issues

  1. Я плохо знаком с GraphQl, поэтому скорее всего неоптимально сделал парсинг данных приходящих от API - на данный момент там кастомные deserializer'ы (com.zakaryan.myretailcrm.base.http.model.deserializer). Возможно, можно обойтись без кастомных парсеров, или, возможно, нужно было использовать специльную библиотеку для работы с GraphQL вместо Retrofit.

  2. androidx.security.crypto не поддерживают работу с AndroidKeystore на Android-устройствах до 6ой версии (API 23) - защита токенов на этих устройствах слабее.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages