Skip to content

Instantly share code, notes, and snippets.

@DanielHe4rt
Last active October 6, 2024 22:09
Show Gist options
  • Save DanielHe4rt/4012e5bf9c612d9cee9efa654eb32f6d to your computer and use it in GitHub Desktop.
Save DanielHe4rt/4012e5bf9c612d9cee9efa654eb32f6d to your computer and use it in GitHub Desktop.
Teste Técnico: Crie seu Discord!

Teste Tecnico: Desenvolvimento de uma Aplicação de Chat em Tempo Real com PHP e Laravel (ou qualquer outra lang)

Introdução

Neste desafio, você será responsável por desenvolver uma aplicação de chat em tempo real utilizando PHP e o framework Laravel. A aplicação deve oferecer funcionalidades básicas similares às encontradas em plataformas de chat como o Discord. O foco principal é a criação de um backend robusto e escalável, utilizando as abstrações e boas práticas do Laravel.

Requisitos do Projeto

Funcionalidades Principais

  1. Autenticação de Usuários
    • Cadastro e login de usuários com autenticação em Laravel Sanctum.
    • Entidades: User
  2. Criação de Servidores
    • Usuários podem criar servidores de chat.
    • Entidades: Guild
  3. Canais de Texto
    • Cada servidor pode ter múltiplos canais de texto.
    • Mensagens podem ser enviadas e recebidas em tempo real.
    • Entidades: Channel
  4. Mensagens em Tempo Real
    • Implementação de mensagens em tempo real utilizando Laravel Echo e websockets.
    • Entidades: Message
  5. Perfis de Usuários
    • Cada usuário possui um perfil.
    • Exibição de informações básicas do perfil, como:
      • nome de usuário
      • quantidade de servidores que ele possui
      • quantidade de mensagens enviadas
      • data de criação

Rotas da aplicação

Método Rota Descrição
GET /login Página de Login/Senha
GET /register Página de Registro
POST /auth/register Cria um usuário
POST /auth/login Faz login de um usuário
GET /user Retorna o usuário autenticado
GET /guilds Retorna todos os servidores disponíveis
POST /guilds Cria um novo servidor
DELETE /guilds/{guildId} Deleta um servidor
GET /guilds/{guildId} Lista as salas de um servidor
POST /guilds/{guildId}/channels Cria um novo canal dentro de um servidor
GET /guilds/{guildId}/channels/{channelId} Entra em um canal e começa a escutar as mensagens
POST /guilds/{guildId}/channels/{channelId}/messages Envia uma mensagem para um canal específico
DELETE /guilds/{guildId}/channels/{channelId}/messages/{messageId} Deleta uma mensagem em um canal específico

Requisitos Técnicos

  1. Backend

    • PHP 8.3
    • Laravel 11
    • Banco de dados: SQLite
    • Pacotes: Laravel Sanctum (Bonus: Laravel Reverb)
  2. Frontend

    • Laravel Blade + TailwindCSS.
  3. Documentação e Testes

    • Documentação da API utilizando Swagger ou outro framework de documentação.
    • BONUS: Testes de Integração

Critérios de Avaliação

  1. Qualidade do Código
    • Estrutura e organização do código.
    • Uso de abstrações:
      • Service
      • Repositories
      • Jobs/Broadcast
  2. Funcionalidade
    • Implementação completa das funcionalidades descritas.
  3. Documentação
    • Clareza e completude da documentação.
    • Instruções claras para configuração e execução do projeto.
  4. Inovação
    • Funcionalidades adicionais ou melhorias que não foram especificadas, mas agregam valor ao projeto.

Entrega

Assim que iniciar o projeto, faça um commit com a base do projeto (framework) e crie uma nova branch pro seu desafio. Abra um Pull Request com o desafio e mande o link no e-mail abaixo.

  • Repositório Git: O código deve estar disponível em um repositório Git (GitHub, GitLab, etc.) e publico.
  • Instruções: Um arquivo README.md com instruções detalhadas sobre como configurar e executar o projeto.
  • Entrega: Envie o código para [email protected] com o assunto "Teste Tecnico: Discord por (seu nome)"
  • Prazo: indefinido! .

Boa sorte e bom desenvolvimento!! :D

Materiais de Apoio

@cherryramatisdev
Copy link

Na rota GET para ouvir as mensagens, ela abre uma conexão websocket para enviar mensagens continuas? ou é uma rota HTTP que retorna a ultima mensagem enviada?
Sou meio noob com esse tipo de aplicação, mas to interessada em fazer uma com elixir e outra com Ruby

nesse caso ai acho que seria um GET pra pegar pelo menos as últimas mensagens desde de um certo período (1 dia atrás por exemplo) e fazer o handshake pra transformar em websocket, dai pra frente é realtime

huuuuum não sei se entendi muito bem, mas pelo menos já tenho assunto pra ler, mto obrigada!

@Iazzetta
Copy link

Iazzetta commented Jun 6, 2024

vou divulgar, parabéns pela iniciativa, teste bem interessante!

@oalvesxp
Copy link

Excelente conteúdo, com certeza vou trabalhar nisso esses próximos meses! Obrigado :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment