Запуск:
Склонируйте (или скачайте руками) репозиторий, перейдите в директорию проекта и запустите docker-compose up.
При первом запуске будет произведена инициализация хранилища, поэтому в логе будет "многобуков".
Конфигурационные параметры приложения и хранилища задаются чз переменные окружения в
docker-compose.yml+Dockerfile и storage/Dockerfile соответственно.
О реализации:
Хранилище данных: PostgreSQL.
Хранилище доступно на порту 5432.
Паттерн: MVC
Формат ответа: {"Error":<данные>,"Result":<данные>}
где Error - дополнительное описание ошибки (помимо информации, получаемой из HTTP-кода ошибки).
И Error и Result могут быть null, это означает отсутствие ошибки/результата соответственно, причем HTTP-код
ошибки может быть 200 - это значит что все в порядке, просто запрашиваемых данных нет.
На эндпоинте /chats/get сделал так, что отсортированы не только чаты в требуемом порядке, но и сообщения в каждом из них от
позднего к раннему. Думаю, так будет удобнее фронту.
Лог при false (переменная окружения "APP_LOGMODE" в docker-compose.yml) пишет в stdout только ошибки от хранилища,
при true пишет ошибки от хранилища + все запросы к нему в файл log.log рядом с экзешником.
Т.е. этот параметр влияет только на то, какие сообщения от хранилища будут выводиться и куда.
Все сообщения приложения, включая ошибки, всегда идут в stdout.
На /chats/add все дубли в "users" будут удалены молча.
Вопросы/Предложения
Нужно ли на эндпоинте /chats/get подгружать все поля у вложенных сущностей?
Например у юзера. Реализовал подгрузку только на 1 уровень вложенности.
На маршруте /chats/get если в чатах нет сообщений, то такие чаты будут в самом конце выборки.
Пойдет ли такое поведение или можно придумать что-нибудь получше?
Не совсем хорошо знаю где какой http код применяется в случае ошибки, но оставил пока такие.