└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Тестовое задание на позицию стажера-бекендера 2 | 3 | Цель задания – разработать чат-сервер, предоставляющий HTTP API для работы с чатами и сообщениями пользователя. 4 | 5 | Детали реализации: 6 | 7 | * Писать код можно на любом языке программирования 8 | * В качестве хранилища данных можно использовать любую технологию 9 | * При перезапуске сервера добавленные данные должны сохраняться 10 | * Сервер должен быть доступен на порту 9000 11 | * Визуализация данных в виде пользовательского интерфейса (веб-приложение, мобильное приложение) не требуется – достаточно только обозначенного ниже API, доступного из командной строки. Однако простор фантазии не ограничиваем, покуда соблюдаются основные требования 12 | * Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой `docker-compose up` 13 | * Финальную версию нужно выложить на github.com (просьба не делать форк этого репозитория, дабы не плодить плагиат) 14 | 15 | ## Основные сущности 16 | 17 | Ниже перечислены основные сущности, которыми должен оперировать сервер. 18 | 19 | ### User 20 | 21 | Пользователь приложения. Имеет следующие свойства: 22 | 23 | * **id** - уникальный идентификатор пользователя (может быть как числом, так и строковым – как удобнее) 24 | * **username** - уникальное имя пользователя 25 | * **created_at** - время создания пользователя 26 | 27 | ### Chat 28 | 29 | Отдельный чат. Имеет следующие свойства: 30 | 31 | * **id** - уникальный идентификатор чата 32 | * **name** - уникальное имя чата 33 | * **users** - список пользователей в чате, отношение многие-ко-многим 34 | * **created_at** - время создания 35 | 36 | ### Message 37 | 38 | Сообщение в чате. Имеет следующие свойства: 39 | 40 | * **id** - уникальный идентификатор сообщения 41 | * **chat** - ссылка на идентификатор чата, в который было отправлено сообщение 42 | * **author** - ссылка на идентификатор отправителя сообщения, отношение многие-к-одному 43 | * **text** - текст отправленного сообщения 44 | * **created_at** - время создания 45 | 46 | ## Основные API методы 47 | 48 | Методы обрабатывают HTTP POST запросы c телом, содержащим все необходимые параметры в JSON. 49 | 50 | ### Добавить нового пользователя 51 | 52 | Запрос: 53 | 54 | ```bash 55 | curl --header "Content-Type: application/json" \ 56 | --request POST \ 57 | --data '{"username": "user_1"}' \ 58 | http://localhost:9000/users/add 59 | ``` 60 | 61 | Ответ: `id` созданного пользователя или HTTP-код ошибки + описание ошибки. 62 | 63 | ### Создать новый чат между пользователями 64 | 65 | Запрос: 66 | 67 | ```bash 68 | curl --header "Content-Type: application/json" \ 69 | --request POST \ 70 | --data '{"name": "chat_1", "users": ["", ""]}' \ 71 | http://localhost:9000/chats/add 72 | ``` 73 | 74 | Ответ: `id` созданного чата или HTTP-код ошибки или HTTP-код ошибки + описание ошибки. 75 | 76 | Количество пользователей в чате не ограничено. 77 | 78 | ### Отправить сообщение в чат от лица пользователя 79 | 80 | Запрос: 81 | 82 | ```bash 83 | curl --header "Content-Type: application/json" \ 84 | --request POST \ 85 | --data '{"chat": "", "author": "", "text": "hi"}' \ 86 | http://localhost:9000/messages/add 87 | ``` 88 | 89 | Ответ: `id` созданного сообщения или HTTP-код ошибки + описание ошибки. 90 | 91 | ### Получить список чатов конкретного пользователя 92 | 93 | Запрос: 94 | 95 | ```bash 96 | curl --header "Content-Type: application/json" \ 97 | --request POST \ 98 | --data '{"user": ""}' \ 99 | http://localhost:9000/chats/get 100 | ``` 101 | 102 | Ответ: cписок всех чатов со всеми полями, отсортированный по времени создания последнего сообщения в чате (от позднего к раннему). Или HTTP-код ошибки + описание ошибки. 103 | 104 | ### Получить список сообщений в конкретном чате 105 | 106 | Запрос: 107 | 108 | ```bash 109 | curl --header "Content-Type: application/json" \ 110 | --request POST \ 111 | --data '{"chat": ""}' \ 112 | http://localhost:9000/messages/get 113 | ``` 114 | 115 | Ответ: список всех сообщений чата со всеми полями, отсортированный по времени создания сообщения (от раннего к позднему). Или HTTP-код ошибки + описание ошибки. 116 | --------------------------------------------------------------------------------