-
Conseguir desenvolver um server socket usando o socket.io;
-
Emitir eventos personalizados usando o socket.io;
-
Usar o pacote
socket.io
do Node.js para criar aplicações que trafeguem mensagens através de sockets.
- Clone o repositório
$ git clone https://github.com/AndersonSilva94/project-webchat.git`.
- Entre na pasta do repositório que você acabou de clonar:
$ cd project-webchat
- Instale as dependências
$ npm install
-
Siga as instruções para configurar o arquivo .env no tópico 'Variáveis'
-
Rode a aplicação
$ npm run debug
Neste projeto você vai desenvolver um chat online e ao utilizar essa aplicação um usuário deverá ser capaz de:
- Usar um front-end para enviar mensagens a clientes conectados;
- Visualizar o histórico de mensagens da conversa;
- Visualizar os usuários online no momento;
- Alterar o nome de usuário no chat em tempo real;
O desenho abaixo demonstra como o projeto pode ser estruturado ao decorrer do desenvolvimento, use a sua criatividade para surpreender! 🧑🎨
Deverá ser desenvolvida uma aplicação Node.js
de chat, usando socket.io
para emitir eventos e atualizar estado no servidor e cliente.
Através do cliente será possível enviar e receber mensagens, trocar seu nome, ver usuários online.
O MVC será usado para renderizar as mensagens do histórico e usuários online, com ambos vindo direto do servidor.
Para garantir a qualidade do código, usaremos o ESLint para fazer a sua análise estática.
Este projeto já vem com as dependências relacionadas ao linter configuradas nos arquivos package.json
nos seguintes caminhos:
project-webchat/package.json
Para poder rodar os ESLint
em um projeto basta executar o comando npm install
dentro do projeto e depois npm run lint
. Se a análise do ESLint
encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.
Você também pode instalar o plugin do ESLint
no VSCode
, bastar ir em extensions e baixar o plugin ESLint
.
Haverá um arquivo no caminho: project-webchat/models/connection.js
que fará a conexão com o Banco de Dados. Neste arquivo, na linha 9, haverá o seguinte comando:
.connect(process.env.DB_URL, {
e na linha 13:
.then((conn) => conn.db(process.env.DB_NAME))
Você irá precisar configurar as variáveis globais do MongoDB. Você pode usar esse Conteúdo de variáveis de ambiente com NodeJS como referência.
** webchat
**
As variáveis de ambiente receberão os seguintes valores
DB_URL=mongodb://localhost:27017/webchat/ // conexão local com o seu MongoDB
DB_NAME=webchat // nome do database
Para executar os testes localmente, você pode rodar o comando npm test
.
Caso prefira testar um requisito por vez pode executar o teste da seguinte forma: npm test tests/req1
(nesse caso testa apenas o requisito 1)
-
Sua aplicação deve ser inicializada no arquivo
server.js
; -
Seu back-end deve permitir que vários clientes se conectem simultaneamente;
-
Seu back-end deve permitir que cada cliente mande mensagens para todas os outros clientes online de forma simultânea;
-
Toda mensagem que um cliente recebe deve conter as informações acerca de quem a enviou: nickname (apelido), data-hora do envio e o conteúdo da mensagem em si.
-
O evento da mensagem deve ter o nome
message
e deve enviar como parâmetro o objeto{ chatMessage, nickname }
. OchatMessage
deve ser a mensagem enviada enquanto onickname
deverá ser o apelido de quem a enviou; -
A data na mensagem deve seguir o padrão 'dd-mm-yyyy' e o horário deve seguir o padrão 'hh:mm:ss' sendo os segundos opcionais;
-
O formato da mensagem deve seguir esse padrão:
DD-MM-yyyy HH:mm:ss ${nickname} ${chatMessage}
- Exemplo prático:
09-10-2020 2:35:09 PM - Joel: Olá meu caros amigos!
-
O back-end deve enviar a mensagem ao front-end já formatada, ela deve ser uma
string
, como no exemplo acima; -
Tanto o evento enviado do cliente para o servidor, como do servidor para o cliente deve ser message.
- Será validado que todos os clientes que estão conectados ao chat recebem as mensagens enviadas;
- Será validado que toda mensagem que um cliente recebe contém as informações acerca de quem a enviou, data-hora do envio e o conteúdo da mensagem em si.
⚠️ DICA: Para facilitar armazenar e/ou recuperar o nickname do cliente, lembre-se de usar o sessionStorage.
-
O front-end e o back-end têm que usar a mesma porta -
localhost:3000
; -
O front-end deve gerar um um nickname aleatório de 16 caracteres quando um novo cliente se conecta, para identificar quem está enviando a mensagem.
- O elemento com o nome do cliente deve conter o
data-testid="online-user"
.
- O elemento com o nome do cliente deve conter o
-
O front-end deve ter uma caixa de texto através da qual seja possível enviar mensagens para o chat:
- A caixa de texto deve conter o
data-testid="message-box"
; - O botão de enviar mensagem deve conter o
data-testid="send-button"
.
- A caixa de texto deve conter o
-
As mensagens devem ser renderizadas na tela;
- Cada mensagem deve conter o
data-testid="message"
.
- Cada mensagem deve conter o
-
O front-end deve exibir todas as mensagens já enviadas no chat, ordenadas verticalmente da mais antiga para a mais nova (as mensagens mais recentes devem aparecer abaixo das mensagens mais antigas);
-
O front-end deve permitir a quem usa escolher um apelido (nickname) para si. Para que a pessoa usuária consiga escolher um apelido, o front-end deve ter um campo de texto e um botão. O campo de texto será onde a pessoa digitará o nickname que deseja. Após escolher o nickname, o cliente deverá clicar no botão para que o dado seja salvo:
- O campo onde o nickname será inserido deve conter o
data-testid="nickname-box"
; - O botão que será clicado para salvar o nickname deve conter
data-testid="nickname-button"
; - Ao salvar o nickname ele deve ser atualizado para todos os clientes conectados.
- O campo onde o nickname será inserido deve conter o
- Será validado que um _nickname_ aleatório é gerado quando o cliente se conecta;
- Será validado que o front-end tem uma caixa de texto para preencher e um botão para enviar mensagens;
- Será validado que as mensagens enviadas possuem o _data-test-id_ correto;
- Será validado que as mensagens são exibidas na ordem correta;
- Será validado que o front-end tem um campo de texto para preencher e um botão para alterar o apelido _(nickname)_;
- Será validado que é possível enviar mensagens após alterar o _nickname_.
⚠️ DICA: Uma boa forma de renderizar o histórico de mensagens via HTML é usando uma template engine (exemplo: EJS).
-
Você deve configurar o banco de dados
webchat
com uma coleção chamadamessages
, em que cada documento representa uma mensagem; -
O seu banco de dados deve salvar o nickname de quem enviou a mensagem, a mensagem em si e uma timestamp com precisão de segundos de quando ela foi salva no banco;
- Exemplo de um documento:
{ message: 'Lorem ipsum', nickname: 'xablau', timestamp: '2021-04-01 12:00:00' }
- Exemplo de um documento:
-
Envie o histórico de mensagens salvo no banco via
html
quando um novo cliente se conectar.
- Será validado que todo o histórico de mensagens irá aparecer quando o cliente se conectar;
- Será validado que ao enviar uma mensagem e recarregar a página, a mensagem persistirá;
- Será validado que ao alterar o _nickname_ e enviar uma mensagem, a mensagem persistirá;
- No front-end deve haver uma lista na tela de cada cliente que mostra quais clientes estão online em um dado momento. Um cliente é identificado pelo seu nickname.
- O elemento com o nome do cliente deve conter o
data-testid="online-user"
; - Quando um cliente se conecta, a lista de clientes deve ser atualizada para todos:
- Para o cliente que acabou de se conectar, seu nickname deve ser colocado no começo da lista;
- Para os demais clientes, o nickname do cliente que acabou de se conectar deve ser colocado no final da lista.
- A lista de clientes online deve ser renderizada no
html
ao carregar a página; - Quando um cliente atualiza seu nickname a lista de clientes deve ser atualizada para todos da mesma forma.
- O elemento com o nome do cliente deve conter o
- Será validado que quando um cliente se conecta, seu _nickname_ aparece no front-end de todos;
- Será validado que quando um cliente se desconecta, seu _nickname_ desaparece do front-end dos outros clientes;
- Será validado que quando um cliente atualiza seu _nickname_, o nickname é atualizado no front-end de todos os clientes;
- Será validado que os _nicknames_ são mostrados na ordem correta.
⌨️ com 💜 por Anderson Silva (Andy) 😊