Skip to content

PicPay/picpay-desafio-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 

Repository files navigation

Desafio Back-end PicPay

Primeiramente, obrigado pelo seu interesse em trabalhar na melhor plataforma de pagamentos do mundo! Abaixo você encontrará todos as informações necessárias para iniciar o seu teste.

Avisos antes de começar

  • Leia com atenção este documento todo e tente seguir ao máximo as instruções;
  • Crie um repositório no seu GitHub sem citar nada relacionado ao PicPay;
  • Faça seus commits no seu repositório;
  • Envie o link do seu repositório para o email do recrutador responsável;
  • Você poderá consultar o Google, Stackoverflow ou algum projeto particular na sua máquina;
  • Dê uma olhada nos Materiais úteis;
  • Dê uma olhada em como será a entrevista;
  • Fique à vontade para perguntar qualquer dúvida aos recrutadores;
  • Fique tranquilo, respire, assim como você, também já passamos por essa etapa. Boa sorte! :)

Corpo do Email com o link do repositório do desafio

Seu Nome

Nome do recrutador

Link do repositório

Link do Linkedin

Sobre o ambiente da aplicação:

  • Escolha qualquer framework que se sinta confortável em trabalhar. Esse teste não faz nenhuma preferência, portanto decida por aquele com o qual estará mais seguro em apresentar e conversar com a gente na entrevista ;)

  • Você pode, inclusive, não optar por framework nenhum. Neste caso, recomendamos a implementação do serviço via script para diminuir a sobrecarga de criar um servidor web;

  • Ainda assim, se optar por um framework tente evitar usar muito métodos mágicos ou atalhos já prontos. Sabemos que essas facilidades aumentam a produtividade no dia-a-dia mas aqui queremos ver o seu código e a sua forma de resolver problemas;

Valorizamos uma boa estrutura de containeres criada por você.

Para o dia da entrevista técnica

Na data marcada pelo recrutador tenha sua aplicação rodando na sua máquina local para execução dos testes e para nos mostrar os pontos desenvolvidos e possíveis questionamentos. Faremos um code review junto contigo como se você já fosse do nosso time ❤️, você poderá explicar o que você pensou, como arquitetou e como pode evoluir o projeto.

Objetivo: PicPay Simplificado

O PicPay Simplificado é uma plataforma de pagamentos simplificada. Nela é possível depositar e realizar transferências de dinheiro entre usuários. Temos 2 tipos de usuários, os comuns e lojistas, ambos têm carteira com dinheiro e realizam transferências entre eles.

Requisitos

A seguir estão algumas regras de negócio que são importantes para o funcionamento do PicPay Simplificado:

  • Para ambos tipos de usuário, precisamos do Nome Completo, CPF, e-mail e Senha. CPF/CNPJ e e-mails devem ser únicos no sistema. Sendo assim, seu sistema deve permitir apenas um cadastro com o mesmo CPF ou endereço de e-mail;

  • Usuários podem enviar dinheiro (efetuar transferência) para lojistas e entre usuários;

  • Lojistas só recebem transferências, não enviam dinheiro para ninguém;

  • Validar se o usuário tem saldo antes da transferência;

  • Antes de finalizar a transferência, deve-se consultar um serviço autorizador externo, use este mock https://util.devi.tools/api/v2/authorize para simular o serviço utilizando o verbo GET;

  • A operação de transferência deve ser uma transação (ou seja, revertida em qualquer caso de inconsistência) e o dinheiro deve voltar para a carteira do usuário que envia;

  • No recebimento de pagamento, o usuário ou lojista precisa receber notificação (envio de email, sms) enviada por um serviço de terceiro e eventualmente este serviço pode estar indisponível/instável. Use este mock https://util.devi.tools/api/v1/notify)) para simular o envio da notificação utilizando o verbo POST;

  • Este serviço deve ser RESTFul.

Tente ser o mais aderente possível ao que foi pedido, mas não se preocupe se não conseguir atender a todos os requisitos. Durante a entrevista vamos conversar sobre o que você conseguiu fazer e o que não conseguiu.

Endpoint de transferência

Você pode implementar o que achar conveniente, porém vamos nos atentar somente ao fluxo de transferência entre dois usuários. A implementação deve seguir o contrato abaixo.

POST /transfer
Content-Type: application/json

{
  "value": 100.0,
  "payer": 4,
  "payee": 15
}

Caso ache interessante, faça uma proposta de endpoint e apresente para os entrevistadores ❤️

Avaliação

Apresente sua solução utilizando o framework que você desejar, justificando a escolha. Atente-se a cumprir a maioria dos requisitos, pois você pode cumprir-los parcialmente e durante a avaliação vamos bater um papo a respeito do que faltou.

O que será avaliado e valorizamos ❤️

Habilidades básicas de criação de projetos backend:

  • Conhecimentos sobre REST
  • Uso do Git
  • Capacidade analítica
  • Apresentação de código limpo e organizado

Conhecimentos intermediários de construção de projetos manuteníveis:

  • Aderência a recomendações de implementação como as PSRs
  • Aplicação e conhecimentos de SOLID
  • Identificação e aplicação de Design Patterns
  • Noções de funcionamento e uso de Cache
  • Conhecimentos sobre conceitos de containers (Docker, Podman etc)
  • Documentação e descrição de funcionalidades e manuseio do projeto
  • Implementação e conhecimentos sobre testes de unidade e integração
  • Identificar e propor melhorias
  • Boas noções de bancos de dados relacionais

Aptidões para criar e manter aplicações de alta qualidade:

  • Aplicação de conhecimentos de observabilidade
  • Utlização de CI para rodar testes e análises estáticas
  • Conhecimentos sobre bancos de dados não-relacionais
  • Aplicação de arquiteturas (CQRS, Event-sourcing, Microsserviços, Monolito modular)
  • Uso e implementação de mensageria
  • Noções de escalabilidade
  • Boas habilidades na aplicação do conhecimento do negócio no software
  • Implementação margeada por ferramentas de qualidade (análise estática, PHPMD, PHPStan, PHP-CS-Fixer etc)
  • Noções de PHP assíncrono

Boas práticas

Caso use PHP tente seguir as PSRs, caso use outro framework ou linguagem, tente seguir as boas práticas da comunidade.

Uma sugestão para revisar a qualidade do seu código é usar ferramentas como o PHPMD antes de submeter o seu teste. O comando a seguir pode ser usado para rodar o PHPMD no seu projeto localmente, por exemplo:

docker run -it --rm -v $(pwd):/project -w /project jakzal/phpqa phpmd app text cleancode,codesize,controversial,design,naming,unusedcode

O que NÃO será avaliado ⚠️

O que será um Diferencial

  • Uso de Docker
  • Uma cobertura de testes consistente
  • Uso de Design Patterns
  • Documentação
  • Proposta de melhoria na arquitetura
  • Ser consistente e saber argumentar suas escolhas
  • Apresentar soluções que domina
  • Modelagem de Dados
  • Manutenibilidade do Código
  • Tratamento de erros
  • Cuidado com itens de segurança
  • Arquitetura (estruturar o pensamento antes de escrever)
  • Carinho em desacoplar componentes (outras camadas, service, repository)

Materiais úteis