🎉 Primeiro de tudo, agradecemos por despender tempo em contribuir com esse projeto! Espero que tenha uma experiência incível! 🎉
Siga os passos descritos na seção de Setup
, no README!
.
├── config/
├── guides/
├── lib/
├── mix.exs
├── mix.lock
├── priv/
├── rel/
└── test/
config
- neste diretório se encontra toda a configuração do projeto, o arquivoconfig/config.exs
é a porta de entrada da config e no final dele são importadas as configurações específicas de ambiente comodev
,test
ouprod
. Essa configuração é executada em tempo de compilação. Por fim, o arquivoconfig/runtime.exs
é executado; este arquivo é ideal para pegar valores dinâmicos, de variáveis de ambiente, por exemplo. Como o nome do arquivo diz, essa configuração é processada em tempo de execução.guides
- neste diretório se encontra os guias para diferentes formas de configuração do ambiente de desenvolvimento local, guias de padronização de código como formatado dos testes automatizados, dentre outras recomendações e padrões utilizados no projeto.lib
- diretório onde se encontra o código fonte da aplicação. Dentro dele existem dois subdiretórios,lib/pescarte
elib/pescarte_web
. O diretóriolib/pescarte
é responsável por denominar e guardar a implementação das regras de negócio e domínios de negócio da aplicação. Geralmente é onde se comunica com a base de dados. Jálib/pescarte_web
é responsável por expor o domínio de negócio para o externo, geralmente sendo uma aplicação web, e mais especificamente, uma APIGraphQL
.mix.exs
- arquivo de configuração do projeto como um todo! Entenda como se fosse umpackage.json
dentro do ecossistemaJavaScript
. Aqui definimos o nome da aplicação, listamos suas dependências, configuramos como a aplicação deve ser compilada e gerada sua versão final e também configuramos os dados para gerar documentação do projeto.mix.lock
- arquivo onde é guardado as versões atuais das dependências baixadas, gerando reprodutibilidade no ambiente. Entenda como umyarn.lock
oupackage-lock.json
do ecossistemaJavaScript
.rel
- diretório onde são definidos scripts que serão executados quando a aplicação for gerar sua versão finaltest
- diretório onde se encontram todos os testes automatizados, sejam eles unitários ou de integração. Geralmente sua estrutura interior replica a subestrutura encontrada emlib
lib/pescarte
├── application.ex
├── database.ex
├── domains/
├── helpers.ex
├── http_client.ex
├── http_client_behaviour.ex
├── release.ex
├── repo.ex
└── types/
application.ex
- este arquivo representa o ponto de inicío da nossa aplicação! É onde são definidas as aplicações que nosso projeto depende, como conexão com banco de dados, cliente HTTP distribuído, entre outros. Cada aplicação listada aqui é uma aplicação Elixir e e gerenciada por Supervisors, que fornece a tolerância a falhas pra nossa aplicação como um todo e suas dependências.database.ex
- é uma abstração sobre as funções do Ecto.Repo, centralizando todas as chamandas ao banco em 1 (um) único arquivo. Assim torna-se mais fácil de testar e isolar os efeitos colaterais da aplicação.domains
- diretório onde se encontra os domínios de negócio da aplicação! Será melhor explicado na próxima seçãohelpers.ex
- neste arquivo são definidas funções comuns e puras que transformam dados da aplicação e padronizão os retornoshttp_client_behaviour.ex
- comportamento que define as funções necessárias para implementar um cliente HTTP, para realizar requisições a outros serviços e APIs externas! Entenda como uma interface doTypeScript
ouJava
. Para ler mais sobre comportamentos, siga a documentação oficial da linguagem Elixirhttp_client.ex
- arquivo no qual o comportamentohttp_client_behaviour
é implementado, permite realizar requições HTTP externas a aplicação
lib/pescarte/domains
└── modulo_pesquisa
├── repository.ex
├── models
├── handlers
└── services
Neste diretório se encontra os domínios de negócio da aplicação. Em outras palavras, cada domínio representa um contexto fechado no qual necessita de uma solução na vida real. Cada domínio é dividido em "camadas", onde a camada mais interna só pode ser acessada pela a camada superior direta. A imagem a seguir exemplifica isso:
Cada domínio de negócio possui os seguintes componentes:
repository
- neste arquivo é implementado as funções específicas de cada entidade para o CRUD (create, read, update e delete). Cada domínio possui seu próprio repositório com funções específicas e construções de queries (consultas)models
- diretório que representa os modelos de negócio, as entidades do domínio! Por exemplo, no caso do domíniomodulo_pesquisa
, temos as entidadesPesquisador
eRelatorio
. Os modelos são os componentes mais importantes dentro de um domínio e não podem ser acessados diretamente por outros domínios nem mesmo por outros componentes do mesmo domíniohandlers
- esse é o ponto de entrada do domínio/contexto da aplicação! Aqui é exposta a API pública dos serviços internos desse domínio e é a única forma de se comunicar com outros domínios ou outros pontos da aplicação, como a camada web. Cadahandler
deve atender à um sub-domínio do contexto e a um comportamento único. Para melhor entendimento, veja ohandler
do sub-domíniomídias
, que expõe funções que resolvem as solicitações vindas da nossa APIGraphQL
services
- neste diretório se encontra os serviços que modificam os modelos/entidades do domínio. É a única camada que pode modificar os modelo de forma direta e é importante ressaltar que os serviços de domínio podem apenas implementar funções puras, sem efeitos colaterais. Um serviço de domínio pode modificar uma ou mais entidades
lib/pescarte_web
├── authentication.ex
├── authorization.ex
├── controllers
├── design_system
├── design_system.ex
├── endpoint.ex
├── graphql
├── layouts
├── live
├── plugs
├── templates
└── router.ex
authentication.ex
- este arquivo abriga funções relacionadas à autenticação de usuários na parte interna da plataforma, com exceção da APIGraphQL
. Serve tanto paraviews
comuns quantolive views
authorization.ex
- este arquivo abriga funções de autorização e permissionamento dentro da parte interna da plataforma, com exceção da APIGraphQL
. Permite ou não que usuários de tipos diferentes acessem determinadas páginas internascontrollers
- neste diretório se encontram arquivos que mapeam as rotas da plataforma para as determinadas "dead views". Caso aview
a ser desenvolvida não dependa tanto de interatividade e portanto não irá usarlive view
, deve-se usar oscontrollers
e templates comunsdesign_system.ex
- arquivo onde se encontra as definições e implementações dos componentes especificados no Design System da plataforma que pode ser encontrato no Figma do projeto. Caso o componente seja muito complexo ou seja umlive component
, crie um arquivo separado no diretóriodesign_system
e usedefdelegate/2
para redirecionar as chamadas, como foi feito com o componente denavbar
endpoint.ex
- este arquivo é o ponto de entrada da camada web da aplicação! Nele é configurado o reteador da aplciação, opções de sessão web, diferentes leitores de formatos comoJSON
ouHTML
, dentre outras opçõeslayouts
- diretório onde se encontram layouts da aplicação, que são templates que vão encapsular todas as páginas da plataformalive
- neste diretório são implementadas as telas que precisam de interatividade real-time ou possuem um estado inerentegraphql
- neste diretório é implementado os esquemas, entidades e mutações possíveis da APIGraphQL
da aplicação. O mesmo será explicado em mais detalhes na próxima seçãographql
- neste diretório é implementado os esquemas, entidades e mutações possíveis da APIGraphQL
da aplicação. O mesmo será explicado em mais detalhes na próxima seçãoplugs
- neste diretório se encontra arquivos que modificam a componentes da conexão durante o fluxo da requisição na aplicação. Entenda como um middleware! Porém osPlugs
dentro do frameworkPhoenix
podem ser adicionados em qualquer ponto do ciclo de vida de uma requição, como no início, meio (middleware) ou no fim, antes de ser enviada uma resposta ao cliente. Para mais informações, leia a documentação de Plugstemplates
- diretório onde os templates comuns são implementadosrouter.ex
- neste arquivo são definidas as rotas que podem ser acessadas na aplicação!
lib/pescarte_web/graphql
├── context.ex
├── middlewares
├── resolvers
├── schema.ex
└── types
context.ex
- arquivo onde se implementa informações que precisam estar disponível de forma "global" para as requisiçõesGraphQL
, por exemplo, uma pessoa usuária caso autenticada é disponibilizada neste arquivo e inserida no contexto de toda requisição, assim sendo possível implementar autorizaçãomiddlewares
- neste diretório se encontra middlewares específicos para as requisiçõesGraphQL
resolvers
- neste diretório são implementadas as resoluções para cada entidade do esquemaGraphQL
da aplicação. Entenda uma resolução como um Controller em APIs RESTschema.ex
- este arquivo implementa o esquema público que será exposto na APIGraphQL
. Nele é especificado quais entidades e quais consultas e mutações estão disponíveis para modificar as entidadestypes
- neste diretório é implementado os tipos de cada entidade e esquemas de como os argumentos de cada entidade devem ser recebidos. Leia mais na documentação sobre esquemas
Serão abertas issues de diferente escopos, como:
- implementar novos contextos e entidades
- refatorar contextos e excluir partes desnecessárias
- corrigir bugs de algum fluxo existente
- expor as queries e mutations necessárias para alimentar o frontend
Em adição as issues, existem dois projetos do GitHub com as tarefas atuais, distribuídas num quadro estilo Kaban.
Um projeto é específico para os componentes do Design System e o outro é um projeto para tarefas gerais da plataforma, incluindo correção de bugs e implementação de telas.
Após encontrar uma tarefa do seu interesse na seção de issues, adicione um comentário na issue da mesma, informando que irá trabalhar nela!
Crie uma branch no formato <user-github>/tarefa
, exemplo:
- Usuário no github:
zoedsoupe
- Tarefa:
Criar componente de botão
Nome da branch: zoedsoupe/cria-componente-botao
Com a tarefa implementada, abra uma PR diretamente para a branch main
. A mesma deve seguir o formato do template.
Assim que possível a @zoedsoupe irá revisar sua PR que poderá ser aprovada ou ter solicitação de refatoração.
Lembre-se que é que não é obrigatório testes unitários para uma PR ser aberta! Caso não saiba como implementar os mesmo, a @zoedsoupe irá te ajudar no processo!
Em construção...
Tenho um servidor no Discord
onde centralizei dezenas de links não apenas sobre Elixir mas sobre programação web para backend como um todo, tendo banco de dados, APIs, git w github, sistemas operacioanis e muito mais.
Entrem no servidor por esse link e sigam as trilhas dos canais "fullstack" e "backend".
- Guia de início oficial em Elixir (en)
- Documentação oficial GraphQL (en)
- Artigo sobre a arquitetura "Clan" ou "Explícita" - 3 partes (en)
- Canal do Adolfo Neto, sobre Elixir, Erlang e a BEAM (pt-br)
- Documentação oficial Elixir (en)
- Documentação oficial Phoenix (en)
- Elixir do zero, acesso a API, banco de dados e testes (pt-br)
- Elixir - banco de dados com Ecto (pt-br)
- Documentação oficial Ecto - biblioteca para banco de dados (en)
- Conheça as estruturas de dados em Elixir (pt-br)
- Comunidade de Elixir no telegram, para dúvidas e discussões (pt-br)
- Fluxo de controle em Elixir de forma limpa com casamento de padrões (en)
- Colinha do módulo Elixir Enum
- Elixir em foco - o podcast da comunidade brasileira de Elixir (pt-br)
- Escrevendo Elixir extensível (en)
- Trilha de Elixir no Exercism - site para aprender linguagens de programação (en)
- Phoenix, o melhor framework web (pt-br)
- Construindo uma API JSON com Phoenix (en)
- Tutorial Elixir e Phoenix (en)
- CRUD completo com Phoenix (pt-br)
- Elixir - uma linguagem brasileira para sistemas distribuídos
- ElixirSchool - lições sobre Elixir (pt-br)
- Desenvolvendo sistemas com Elixir (pt-br)
- Palestra Elixir of life (pt-br)
- The Soul of Elixir (en)
- Principios de progrmação funcional com Elixir (en)
- Mistérios do GenServer com Willian Frantz (pt-br)
- Forum oficial do Elixir - faça perguntas e tirem dúvidas (en)
- Como começar a aprender Elixir? (pt-br)
- TDD com Elixir (pt-br)
- Funções em Elixir como associações ou como "receitas" (pt-br)
- Use pipes em Elixir sempre que possível
- Elixir - básico (pt-br)
- Introdução a programação funcional com Elixir (pt-br)
- Introdução a programação com Elixir (pt-br)
- Curso de Banco de Dados (pt-br)
- SQL sem mistério (pt-br)