Skip to content

shtreb/simple_chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Цели задания

  • Ввести разработчика в архитектуру разрабатываемых приложений
  • Продемонстрировать способы решения стандартных задач с использованием применяемого в разработке набора инструментов
  • Предоставить кандидатам, не имеющим опыта разработки на языке Dart, учебно-практические задания для быстрого входа в разработку
  • Проверка знаний, умений и навыков кандидата по следующим направлениям:
    • самостоятельно добывать необходимые знания
    • самостоятельно находить решение
    • разбираться в коде
    • писать понятный код
    • ООП
    • паттерны проектирования
    • автоматизированное тестирование

Предварительные указания

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

  1. Запустить предоставленное приложение
  2. Изучить необходимые для выполнения работы материалы
  3. Разобраться в коде и выполнить предложенное ТЗ на разработку функционала.
  4. Самостоятельно сформулировать задачу по улучшению функционала и реализовать ее в коде
  5. Предоставить отчет о проделанной работе вместе с кодом

Запуск приложения

Предварительные требования

Для запуска приложения необходимо:

  • Установить на рабочем компьютере Dart SDK версии не ниже 2.7.0
  • Для сборки мобильного приложения необходимо установить Flutter
  • Получить копию данного репозитория на своем рабочем компьютере
  • Для запуска серверной части необходимо предварительно запустить сервер MongoDb так, чтобы к нему можно было подключиться на localhost:27017. Это можно сделать, либо установив локально сервер MongoDb, либо запустив сервер в docker-контейнере

Приложение состоит из двух частей: клиентской, которая запускается в браузере или на мобильном устройстве, и серверной (API-сервер).

Запуск API-сервера

  1. cd /path/to/chat_api
  2. pub get
  3. pub run build_runner build
  4. dart bin/main.dart

Запуск web-клиента

  1. cd /path/to/chat_web
  2. pub get
  3. pub run webdev serve

После этого приложение будет доступно на localhost:8080

Запуск мобильного клиента

  1. cd /path/to/chat_mobile
  2. flutter pub get
  3. Запустить эмулятор IOS или Android
  4. flutter run

Структура приложения

Приложение состоит из пяти пакетов:

  • chat_api - API-сервер
  • chat_web - web-клиент
  • chat_mobile - мобильный клиент
  • chat_api_client - пакет предоставляет средства взаимодействия с API-сервером; используется в web- и мобильном клиентах
  • chat_models - модели данных; используется во всех перечисленных выше пакетах

Техническое задание на разработку

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

Функциональные требования для соискателя на должность мобильного разработчика

  1. Проведите рефакторинг проекта chat_mobile: сгруппируйте файлы по подходящим директориям, удалите неиспользуемые виджеты, компоненты, файлы.
  2. Расширьте модель пользователя (в chat_models), чтобы она также содержала email и телефон.
  3. На главном экране после логина должно быть 2 таба: «Пользователи» и «Чаты». При первой загрузке появляется индикатор загрузки. При переходе между табами сохраняется состояние прокрутки. В карточках пользователя выводится емейл и имя, в круглой аватаре пользователя должны содержаться первые буквы из имени и фамилии. По клику на карточку пользователя выделяем её цветом и появляется Кнопка «+» по нажатию на которую создается чат с выбранными пользователями. При переходе на вкладку с чатами выбранные пользователи во всех чатах должны подсвечиваться. На табе с чатами кнопки «+» быть не должно.
  4. На обоих вкладках сделайте обновление списка через свайп сверху вниз, чтобы подгрузить новые данные, которые могли быть созданы за это время.
  5. На любой странице приложения, которая доступна после авторизации, должно приходить уведомление о новом сообщение, клик на которое должен открывать нужный чат.
  6. Необходимо сохранять авторизационные данные (токен), чтобы при перезагрузке приложения не требовался повторный ввод логина/пароля.
  7. Если действие авторизационного токена истекло, но при этом пользователь не выходил из своей учетной записи - автоматически выполнять повторную попытку логина с введенными ранее данными (логин/пароль). Такую ситуацию можно проверить, перезапустив серверную часть приложения.
  8. Добавьте в апп бар кнопку с иконкой, по нажатию на которую необходимо перенаправлять пользователя на экран с профилем, где он сможет добавить/изменить информацию о себе. В частности, email и телефон. Для почты и телефона должны валидироваться значения перед отправкой на сервер.
  9. Не используйте InheritedWidget, отдав предпочтение более современным способам State Management'а (например: RxDart, BLoC) и Dependency Injection (например: Provider, Get It).
  10. Сформулируйте самостоятельно какое-либо важное на ваш взгляд функциональное требование и реализуйте его.

Нефункциональные требования (для всех разработчиков)

  1. Весь функционал написанный в ходе работы необходимо покрыть тестами
  2. Весь код должен соответствовать рекомендациям, описанным в руководствах
  3. Если в ходе работы будут выявлены ошибки, то их нужно исправить.
  4. Если в ходе работы будет найдено более красивое решение, чем уже реализованное, то его нужно применить.
  5. Последовательность реализации функциональных требований не важна.

Отчет о проделанной работе

По результатам работы нужно составить краткий отчет. В отчет должно быть включено следующее:

  • Что из предложенного задания удалось реализовать
  • В чем возникли затруднения
  • Если были сделаны доработки не указанные в ТЗ, то отметить какие.

Код с результатами работы необходимо выложить в любой публичный git-репозиторий и прислать ссылку на него.

Отчёт

Что удалось/не удалось выполнить

  1. Выполнено
  2. Выполнено
  3. Выполнено, 2 таба на главном экране, каждый управляется коллекцией со своими моделями
  4. Выполнено с использованием pull_to_refresh
  5. Выполнено с использованием flutter_local_notifications
  6. Выполнено с использованием flutter_secure_storage
  7. Не выполнено, не удалось воспроизвести с указанными рекомендациями, на эмуляцию проблемы локально не хватило времени
  8. Выполнено
  9. Учтено
  10. Добавить поддержку разных локалей, реализовано при помощи gen_lang

Затруднения

  1. Первичная настройка приложения. При указании localhost в адресах api не соединялось с базой, так же и приложение с api.

Доработки не указанные в тз

  1. Добаление gen_lang для использования разных локализация
  2. Стилизация
  3. Добавлен RouteAwareWidget для управления контекстами, что позволяет не привязываться к виджету. Так же есть возможность для расширения сбора дополнительной информации о экранном времени и информации о посещенных экранах

Недоделки и замечания

  1. Жирное замечание не написано ни одного теста что является минусом -
  2. Не доделана логика пропущенных сообщений в списке чатов
  3. Не доделана обработка ошибок и контроля подключенных сетей
  4. Не доделана логика прокрутки в чате. При появлении нового сообщения список не скролиться автоматом, при открытии клавиатуры может произойти аналогичная ситуация
  5. Не пересмотренна работа chat_component, из-за чего была проблема спама локальных сообщений при переходе на разные экраны

Всего потрачено на приложение не более 18 часов

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published