Ao iniciar este projeto, você concorda com as diretrizes do Código de Ética e Conduta e do Manual da Pessoa Estudante da Trybe.
Você já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver os projetos, você deverá seguir as instruções a seguir. Fique atento a cada passo, e se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀
Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir desse repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.
- Termos de acordos
- Habilidades
- Entregáveis
- Instruções para entregar seu projeto
- Requisitos do projeto
- Avisos Finais
-
Conseguir desenvolver um server socket usando o socket.io;
-
Emitir eventos personalizados usando o socket.io;
-
Usar o pacote
socket.iodo Node.js para criar aplicações que trafeguem mensagens através de sockets.
Neste projeto você vai desenvolver uma 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;
- (Bonus) Enviar mensagens particulares para outro cliente;
Para entregar o seu projeto você deverá criar um Pull Request neste repositório.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub sempre que precisar!
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 projeto tem até a seguinte data: 04/01/2021 - 14:00h. Para ser entregue a avaliação final.
-
Você tem liberdade para adicionar novos comportamentos ao seu projeto, seja na forma de aperfeiçoamentos em requisitos propostos ou novas funcionalidades, desde que tais comportamentos adicionais não conflitem com os requisitos propostos.
- Em outras palavras, você pode fazer mais do que for pedido, mas nunca menos.
-
Contudo, tenha em mente que nada além do que for pedido nos requisitos será avaliado. Esta é uma oportunidade de você exercitar sua criatividade e experimentar com os conhecimentos adquiridos.
Leia todo este documento e se inteire de tudo que o projeto pede antes de começar o desenvolvimento. Montar uma estratégia para construir o projeto e atender os seus requisitos faz parte do trabalho.
-
Clone o repositório
git clone https://github.com/tryber/sd-04-project-webchat.git.- Entre na pasta do repositório que você acabou de clonar:
cd sd-04-project-webchat
-
Crie uma branch a partir da branch
master- Verifique que você está na branch
master- Exemplo:
git branch
- Exemplo:
- Se não estiver, mude para a branch
master- Exemplo:
git checkout master
- Exemplo:
- Agora, crie uma branch onde você vai guardar os
commitsdo seu projeto- Você deve criar uma branch no seguinte formato:
nome-de-usuario-nome-do-projeto - Exemplo:
git checkout -b joaozinho-webchat-project
- Você deve criar uma branch no seguinte formato:
- Verifique que você está na branch
-
Crie na raiz do projeto os arquivos que você precisará desenvolver:
- Verifique que você está na raiz do projeto
- Exemplo:
pwd-> o retorno vai ser algo tipo /Users/joaozinho/code/sd-04-project-webchat
- Exemplo:
- Crie os arquivos index.html, style.css e script.js
- Exemplo:
touch index.html style.css script.js
- Exemplo:
- Verifique que você está na raiz do projeto
-
Adicione as mudanças ao stage do Git e faça um
commit- Verifique que as mudanças ainda não estão no stage
- Exemplo:
git status(devem aparecer listados os novos arquivos em vermelho)
- Exemplo:
- Adicione o novo arquivo ao stage do Git
- Exemplo:
git add .(adicionando todas as mudanças - que estavam em vermelho - ao stage do Git)git status(devem aparecer listados os arquivos em verde)
- Exemplo:
- Faça o
commitinicial- Exemplo:
git commit -m 'iniciando o projeto. VAMOS COM TUDO :rocket:'(fazendo o primeiro commit)git status(deve aparecer uma mensagem tipo nothing to commit )
- Exemplo:
- Verifique que as mudanças ainda não estão no stage
-
Adicione a sua branch com o novo
commitao repositório remoto- Usando o exemplo anterior:
git push -u origin joaozinho-webchat-project
- Usando o exemplo anterior:
-
Crie um novo
Pull Request(PR)- Vá até a página de Pull Requests do repositório no GitHub
- Clique no botão verde "New pull request"
- Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
- Clique no botão verde "Create pull request"
- Adicione uma descrição para o Pull Request, um título claro que o identifique, e clique no botão verde "Create pull request"
- Não se preocupe em preencher mais nada por enquanto!
- Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
-
⚠ RECOMENDAMOS QUE VOCÊ FIQUE ATENTO ÀS ISSUES DO CODE CLIMATE, PARA RESOLVÊ-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO. ⚠
-
Faça
commitsdas alterações que você fizer no código regularmente; -
Lembre-se de sempre após um
(ou alguns)commitsatualizar o repositório remoto (o famosogit push); -
Os comandos que você utilizará com mais frequência são:
-
git status(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage); -
git add(para adicionar arquivos ao stage do Git); -
git commit(para criar um commit com os arquivos que estão no stage do Git); -
git push -u nome-da-branch(para enviar o commit para o repositório remoto na primeira vez que fizer opushde uma nova branch); -
git push(para enviar o commit para o repositório remoto após o passo anterior).
-
Para sinalizar que o seu projeto está pronto para o "Code Review" dos seus colegas, faça o seguinte:
-
Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque seus colegas:
-
No menu à direita, clique no link "Labels" e escolha a label code-review;
-
No menu à direita, clique no link "Assignees" e escolha o seu usuário;
-
No menu à direita, clique no link "Reviewers" e digite
students, selecione o timetryber/students-sd-04.
-
Caso tenha alguma dúvida, aqui tem um video explicativo.
Para garantir a qualidade do código,saremos 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:
sd-04-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ê pode também instalar o plugin do ESLint no VSCode, bastar ir em extensions e baixar o plugin ESLint.
Haverá um arquivo no caminho: sd-04-project-webchat/helpers/db.js. Neste arquivo, na linha 10, Haverá a seguinte comando:
.connect(process.env.DB_URL, {
e na linha 14:
.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.
(Neste arquivo e obrigatório deixar o nome do database como webchat)
Ela deve ter o seguinte formato:
const { MongoClient } = require('mongodb');
require('dotenv').config();
let schema = null;
async function connection() {
if (schema) return Promise.resolve(schema);
return MongoClient
.connect(process.env.DB_URL || 'mongodb://localhost:27017/webchat', {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then((conn) => conn.db(process.env.DB_NAME))
.then((dbSchema) => {
schema = dbSchema;
return schema;
})
.catch((err) => {
console.error(err);
process.exit(1);
});
}
module.exports = connection;Com elas que iremos conseguir conectar ao banco do avaliador automático
-
Sua aplicação deve ser inicializada no arquivo
server.js; -
Seu back-end deve permitir que várias usuários se conectem simultâneamente;
-
Seu back-end deve permitir que usuários mandem mensagens para todos os outros usuários de forma simultânea;
-
Toda mensagem que um cliente recebe deve conter as informações acerca de quem a enviou, data-hora do envio e o conteúdo da mensagem em si. A data-hora das mensagens deve ser determinada pelo momento em que são salvas no banco de dados (ver requisito 3);
-
O evento da mensagem deve ter o nome
messagee deve enviar como parâmetro o objeto{ chatMessage, nickname }. OchatMessagedeve ser o mensagem enviada e onicknameo nickname do usuário que 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 ${message.nickname} ${message.chatMessage}
- Exemplo prático:
09-10-2020 2:35:09 PM - Joel: Olá meu caros amigos!
- O servidor deve enviar a mensagem ao front-end já formatada, ela deve ser uma
string, como nos dois exemplos acima;
-
Será validado que vários clientes conseguem se conectar ao mesmo tempo;
-
Será validado que cada cliente conectado ao chat recebe todas as mensagens que já foram 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;
-
O front-end e o back-end tem que usar a mesma porta a
localhost:3000; -
As mensagens devem ser renderizadas na tela;
-
Cada mensagem deve ter o
data-testid="message". -
O frontend deve exibir todas as mensagens já enviadas no chat, ordenadas verticalmente da mais antiga para a mais nova;
-
O frontend deve ter uma caixa de texto através da qual quem usa consiga 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
-
O front-end deve permitir a quem usa escolher um apelido (nickname) para si. Para que o cliente consiga escolher um apelido deve ter um campo de texto e um botão no front-end. O campo de texto será onde o cliente 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-save". - ao entrar, o usuário deve receber um nickname aleatório.
- o campo onde o nickname será inserido deve conter o
-
Será validado que o frontend tem uma caixa pra enviar mensagens;
-
Será validado que o frontend possui um campo onde o usuário pode inserir o nickname e um botão para salvar;
-
Será validado que é possível enviar mensagem após alterar o nickname;
-
Você deve configurar um banco de dados MongoDB, onde cada linha contém uma mensagem enviada, e a coleção deve se chamar
messages; -
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.
-
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á;
- 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" - O cliente atual sempre dever seu o nome como primeiro da primeiro da lista
- Quando um cliente se conecta, ele deve entrar no final da lista de clientes online.
- O elemento com o nome do cliente deve conter o
-
Será validado que quando um usuário se conecta, seu nome aparece no frontend de todos
-
Será validado que quando um usuário se desconecta, seu nome desaparece do frontend dos outros usuários.
-
No frontend deve haver uma lista com todos os clientes e, ao lado de cada identificador, um botão. Um clique nesse botão deve direcionar as pessoas para um chat privado. Além disso, deve existir um botão para entrar no chat público.
- O usuário não deve conseguir enviar mensagens privadas para si mesmo.
- O botão para o chat privado deve ter o
data-testid="private" - O botão para o chat público deve ter o
data-testid="public"
-
No front-end deve ser possível navegar entre os chats privados ou o chat geral na mesma janela, clicando no botão com
data-testid="private"para ir ao privado edata-testid="public"para voltar para o público. -
Mensagens particulares só devem ser visíveis para as partes pertinentes. Clientes terceiros não devem poder acessar seu conteúdo.
-
o formato da mensagem deve seguir esse padrão:
DD-MM-yyyy HH:mm:ss (private) ${message.nickname} ${message.chatMessage}
- exemplo prático:
09-10-2020 2:35:09 (private) - Joel: Olá meu caros amigos!
-
Será validado que existe o botão para entrar em um chat privado e para voltar ao chat principal;
-
Será validado que é possível enviar uma mensagem privada para um usuário.
-
Será validado que é possível transitar entre o chat particular e o chat global.
- Tomar decisões de projeto em prol do bom desenvolvimento faz parte do projeto! Interprete os requisitos, tome suas decisões e, em caso de dúvidas, valide-as conosco no Slack!
Use o conteúdo sobre Code Review para te ajudar a revisar os Pull Requests.
#VQV 🚀
Ao finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos! Ao finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos! Link: FORMULÁRIO DE AVALIAÇÃO DE PROJETO Link: FORMULÁRIO DE AVALIAÇÃO DE PROJETO O avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok? O avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok?