A aplicação faz uso do Express, para o gerenciamento de end-points, do Socket.io, para as conexões em tempo real, e do MongoDB, para armazenar as informações.
A pasta backend contém o código que faz todo o gerenciamento dos dados, enquanto a pasta frontend possui um exemplo de implementação para uso da ferramenta, feito usando HTML, CSS, Javascript e o socket.io-client.
Essa seção descreve todos os end-points existentes na aplicação
- POST /users → Criar novo usuário.
- (String) name → Nome do usuário a ser cadastrado.
- GET /users → Carregar os usuários cadastrados
- GET /activities/{userId} → Carregar todas as atividades de um usuário específico.
- POST / → Carregar todas as mensagens entre dois usuários.
- (String) userId → O id do usuário que está realizando a requisição;
- (String) partnerId → O id do usuário parceiro.
- POST /groups → Criar um novo grupo.
- (String) name → Nome do grupo a ser cadastrado;
- (String) creator → Id do usuário criador do grupo;
- (Array) users → Lista de usuários que serão adicionados ao grupo;
- PUT /groups → Atualizar algum grupo já existente.
- (String) id → Id do grupo a ser atualizado;
- [opcional] (String) name → Nome do grupo a ser cadastrado;
- [opcional] (Array) users → Lista de usuários que serão adicionados ao grupo.
- GET /groups/{userId} → Carregar os grupos em que um usuário está inserido.
- GET /groups/{groupId}/info → Carregar dos dados do grupo
- GET /groups/{groupId}/messages → Carregar as mensagens de um grupo específico.
Essa seção descreve os eventos que devem ser utilizados quando se deseja atualizar dados em tempo real. Ao se "cadastrar" em um evento a aplicação passa a receber tudo relacionado a esse evento.
A conexão deve ser realizada através da biblioteca Cliente do Socket.io
- (String) id → Id do usuário que está tentando se conectar;
const baseUrl = "http://localhost:3030"; const socket = io(baseUrl, { query: { _id: userId }, });
Existem dois tipos de interação:
- emit → utilizada para transmitir uma mensagem em um evento;
- on → utilizada para receber o que for transmitido em algum evento.
- emit update activity → Atualizar a atividade que está sendo realizada por um usuário.
- (String) userId → Id do usuário;
- (String) activity → Nome da atividade;
socket.emit("update activity", userId, activity);
- emit receive activities → Abrir a conexão para receber as atividades de um usuário.
- (String) partnerId → Id do usuário do qual se deseja receber as atividades;
socket.emit("receive activities", parterId);
- on update activities → Receber as atividades de um usuário cadastrado.
emit receive activities
- Chamada do evento
socket.on("update activities", async ({ userId, activity }) => { console.log(userId, activity) })
- Resposta
{ "5efb390fff58a54ca1cf676e": { "socket": "emRjoWCa_hGRc-WaAAAF", "status": "online", "_id": "5efb390fff58a54ca1cf676e", "name": "Henrique Couto", "registrationDate": "2020-06-30T13:07:27.121Z" }, "5efb3914ff58a54ca1cf676f": { "socket": "7OQ8H6g6_6mGdg-aAAAG", "status": "online", "_id": "5efb3914ff58a54ca1cf676f", "name": "Neo Ferreira", "registrationDate": "2020-06-30T13:07:32.297Z" } }
- emit open chat → Abrir a conexão para receber mensagens de um usuário.
- (String) partnerId → Id do usuário;
socket.emit("open chat", partnerId);
- emit send message → Enviar mensagem para um usuário.
- (String) partnerId → Id do usuário que receberá a mensagem;
- (String) message → Mensagem a ser enviada;
socket.emit("send message", partnerId, message);
- on update messages → Receber as mensagens de uma conversa ativa com outro usuário.
- emit open chat
- Chamada do evento
socket.on("update messages", async ({ userId, message, type }) => { // O atributo type pode conter um desses valores: "sended", "received" // O atributo userId refere-se ao id do parceiro da conversa console.log(userId, message, type) })
- Resposta
{ "type": "sended", "userId": "5efb3914ff58a54ca1cf676f", "message": { "_id": "5efb3dddff58a54ca1cf6783", "emitter": "5efb390fff58a54ca1cf676e", "receptor": "5efb3914ff58a54ca1cf676f", "text": "has", "registrationDate": "2020-06-30T13:27:57.962Z" } }
- emit open group → Abrir a conexão para receber mensagens de um grupo.
- (String) groupId → Id do grupo;
socket.emit("open group", groupId);
- emit send group message → Enviar mensagem para um grupo.
- (String) groupId → Id do grupo;
- (String) message → Mensagem a ser enviada;
socket.emit("send group message", groupId, message);
- emit update groups → Informar que os usuários devem receber uma atualização dos grupos.
socket.emit("update groups");
- on update groups → Indicar que a lista de grupos deve ser atualizada.
- Chamada do evento
socket.on("update groups", async () => { // Deve ser executada alguma função que carrega os grupos em que o usuário está inserido })
- on update group messages → Receber as mensagens de uma conversa de grupo ativa.
- emit open group
- Chamada do evento
socket.on("update group messages", async ({ groupId, message, type, emitter }) => { // O atributo type pode conter um desses valores: "sended", "received" console.log(userId, message, type) })
- Resposta
{ "type": "sended", "groupId": "5efb3fcdff58a54ca1cf6784", "message": { "_id": "5efb429aff58a54ca1cf6786", "emitter": "5efb390fff58a54ca1cf676e", "group": "5efb3fcdff58a54ca1cf6784", "text": "opj", "registrationDate": "2020-06-30T13:48:10.109Z" } }
- emit update group users → Informar que os usuários devem receber uma atualização dos grupos.
- (String) groupId → Id do grupo;
socket.emit("update groups", groupId);
- on update group users → Indicar que a lista de usuários de uma conversa de grupo ativa deve ser atualizada.
- Chamada do evento
socket.on("update group users", async (groupId) => { // Deve ser executada alguma função que carrega os usuários do grupo console.log(groupId) })
- on update users → Receber a lista de usuários para saber quem está online e offline e a atividade que está sendo executada, se houver.
- Chamada do evento
socket.on("update users", async (users) => { console.log(users) })
- Resposta
{ "5efb390fff58a54ca1cf676e": { "socket": "emRjoWCa_hGRc-WaAAAF", "status": "online", "_id": "5efb390fff58a54ca1cf676e", "name": "Henrique Couto", "registrationDate": "2020-06-30T13:07:27.121Z" }, "5efb3914ff58a54ca1cf676f": { activity: "Criando Matéria" "socket": "7OQ8H6g6_6mGdg-aAAAG", "status": "online", "_id": "5efb3914ff58a54ca1cf676f", "name": "Neo Ferreira", "registrationDate": "2020-06-30T13:07:32.297Z" } }