Перед выполнением задания внимательно прочитайте:
- О всех этапах проверки задания
- Как отправить пулл
- Как пройти тесты
- Правила оформления javascript, HTML и CSS кода
🎉 Ура! В этой задаче можно пользоваться любыми внешними библиотеками! 🎉
Билли обидно, что у его друзей есть чатики без него. Поэтому он решил создать и всячески продвигать свой собственный мессенджер, в котором нет такого недостатка by design.
Киллер-фича данного мессенджера в том, что любой пользователь может читать все сообщения.
Мессенджер состоит из сервера и клиента. Сервер хранит сообщения, умеет отдавать их и добавлять новые. С клиента можно удобно смотреть и отправлять сообщения. При отправке сообщения можно указывать от кого и кому (а можно не указывать, тогда это анонимное сообщение для всех).
-
Сервер будет отвечать на запросы по адресу http://localhost:8080. Сообщения - это объекты такого вида:
{ "from": "Вася", "to": "Игорь", "text": "Привет!" }
Где все поля содержат непустые строки, а
from
иto
могут отсутствовать.У сервера должна быть следующая функциональность:
-
Получение сообщений
- Адрес:
/messages
- HTTP-метод:
GET
- Query-параметры:
from
,to
Метод возвращает список сообщений, отфильтрованных по
from
иto
:- Если указаны
from
иto
, то возвращаются сообщения с этимиfrom
иto
- Если указан только
from
, то возвращаются сообщения с этимfrom
и любымto
- Если указан только
to
, то возвращаются сообщения с этимto
и любымfrom
- Если не указаны ни
from
, ниto
, то возвращаются все сообщения
- Адрес:
-
Создание сообщений
- Адрес:
/messages
- HTTP-метод:
POST
- Query-параметры:
from
,to
- Содержимое тела запроса:
{ "text": "Какой-то текст" }
Этот метод должен сохранять сообщение на сервере и отвечать созданным сообщением. Параметр
from
/to
может быть не указан, в таком случае этого поля в сообщении не будет. - Адрес:
-
Все сообщения передаются в формате json, поэтому нужно выставлять соответствующий заголовок
Content-Type
-
На любые другие адреса сервер должен отвечать кодом 404
-
-
Сервер бесполезен, если им нельзя пользоваться, потому мы напишем консольный клиент для него.
Интерфейс клиента следующий:node client.js [command] [--param1] [--param2]
Сначала идет команда, которая определяет, хотим ли мы отправить сообщение (send
) или получить (list
).
Далее передаются параметры в таком виде:--from=Вася --to Игорь --text "Привет, Игорь"
. Обратите внимание, что имя и значение параметра могут разделяться пробелом или символом=
, а также параметры могут передаваться в произвольном порядке.-
Команда
list
запрашивает у сервера сообщения, передавая параметрыfrom
иto
. Полученнные сообщения выводятся на экран в следующем формате:- Если есть поле
from
(to
), то оно выводится после соответствующего заголовка, написанного красным (#f00) цветом - Поле
text
выводится после заголовка зеленого (#0f0) цвета - Сообщения должны разделяться дополнительным переводом строки
- После последнего сообщения переводов строк быть не должно
- Если есть поле
-
Команда
send
отправляет на сервер сообщение, передавая параметрыfrom
,to
иtext
. Добавленное сообщение выводится на экран в том же формате, как сообщения в командеlist
-
Обратите внимание, что во всех командах, если
from
илиto
– пустая строка, то параметр не нужно передавать в запросе к серверу
-
Для того, чтобы красить текст в консоли, используйте мелки библиотеку chalk
- Сначала необходимо запустить сервер командой
node server.js
- Затем открыть вторую консоль и запускать клиент командой
node client.js <command> <args>
Иногда хочется начать жизнь в интернете с чистого листа, так что давайте дадим возможность сделать это! Для этого вам нужно:
- Придумать уникальный строковый идентификатор для каждого сообщения, который должен храниться в поле
id
. - Добавить в сообщение поле
edited
типаBoolean
, которое показывает, не менялся ли текст сообщения. Если сообщение не менялось, поле должно отсутствовать. - Добавить серверу такую функциональность:
-
Удаление сообщений
- Адрес:
/messages/<id>
, - HTTP-метод:
DELETE
Метод удаляет сообщение с заданным
id
и возвращает{ "status": "ok" }
. - Адрес:
-
Изменение сообщений
- Адрес:
/messages/<id>
- HTTP-метод:
PATCH
- Содержимое тела запроса:
{ "text": "Какой-то текст" }
Метод изменяет текст сообщения с заданным
id
, выставляет флагedited: true
и возвращает объект измененного сообщения.id
при изменении должен сохраниться. - Адрес:
-
- Также необходимо доработать консольный интерфейс, добавив возможность подробного вывода и две новые команды:
delete
иedit
.-
Режим подробного вывода включается, если при вызове команды передать ключ
-v
. В этом режиме к каждому сообщению в начало добавляется строкаID: <id>
, гдеID
окрашено в желтый (#ff0) цвет -
Команда
delete
удаляет сообщение, принимая параметрid
. После успешного удаления, команда печатает в консоль "DELETED" -
Команда
edit
изменяет текст уже существующего сообщения, принимая параметрыid
иtext
. Измененное сообщение выводится на экран, к его тексту добавляется пометка(edited)
серого (#777) цвета: -
Команда
list
также должна добавлять при выводе измененных сообщений пометку(edited)
серого (#777) цвета после их текста
-