<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcus Brasizza</title>
    <description>The latest articles on DEV Community by Marcus Brasizza (@brasizza).</description>
    <link>https://dev.to/brasizza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1032100%2Fb81651b7-a3bf-4038-8890-cb87400e2987.jpeg</url>
      <title>DEV Community: Marcus Brasizza</title>
      <link>https://dev.to/brasizza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brasizza"/>
    <language>en</language>
    <item>
      <title>MUDAMOS!</title>
      <dc:creator>Marcus Brasizza</dc:creator>
      <pubDate>Wed, 05 Mar 2025 14:05:46 +0000</pubDate>
      <link>https://dev.to/brasizza/mudamos-cch</link>
      <guid>https://dev.to/brasizza/mudamos-cch</guid>
      <description>&lt;p&gt;por conta de baixa entrega do medium (dependendo do tanto de coisas que você acessa precisa pagar) , mudamos para um link próprio&lt;br&gt;
&lt;a href="https://jacodouhoje.dev" rel="noopener noreferrer"&gt;Ja codou hoje?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Enviando logs de exception pelo event bus (Discord e Slack)</title>
      <dc:creator>Marcus Brasizza</dc:creator>
      <pubDate>Sat, 09 Sep 2023 04:14:38 +0000</pubDate>
      <link>https://dev.to/brasizza/enviando-logs-de-exception-pelo-event-bus-discord-e-slack-23h4</link>
      <guid>https://dev.to/brasizza/enviando-logs-de-exception-pelo-event-bus-discord-e-slack-23h4</guid>
      <description>&lt;p&gt;Fala galera!&lt;br&gt;
Depois de algum tempo sumido resolvi fazer esse post, pois passei por um desafio interessante que eu queria compartilhar.&lt;/p&gt;

&lt;p&gt;Irei demonstrar como você pode emitir mensagem detalhada de log para o seu canal do Discord e até mesmo para uma thread do slack ou &lt;strong&gt;ambos!&lt;/strong&gt; , somente passando uma exception específica para o seu sistema sem precisar se preocupar com nada!&lt;/p&gt;



&lt;p&gt;Pois bem!&lt;br&gt;
Qual será o nosso desafio:&lt;br&gt;
Vamos fazer um aplicativo que rode até mesmo no Flutter Web com alguns botões, onde irá realizar uma consulta em uma  &lt;strong&gt;API&lt;/strong&gt; com sucesso, um outro botão com algum problema de parse no nosso json e um outro com uma falha na url para simular uma falha da sua &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que iremos utilizar
&lt;/h2&gt;

&lt;p&gt;Vamos utilizar somente os packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pub.dev/packages/event_bus" rel="noopener noreferrer"&gt;event_bus&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;dio&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pub.dev/packages/device_info_plus" rel="noopener noreferrer"&gt;device_info_plus&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pub.dev/packages/get_it" rel="noopener noreferrer"&gt;get_it&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pub.dev/packages/image_network" rel="noopener noreferrer"&gt;image_network&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;O carinha diferente da vez é o event_bus, que eu não vejo muita gente usando. Então vou tentar dar uma breve descrição do que ele faz:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;event_bus&lt;/strong&gt; é uma biblioteca que facilita a comunicação entre diferentes partes de um aplicativo, permitindo que componentes ou classes enviem e recebam eventos (mensagens) de forma assíncrona. Ele é bem útil quando você precisa que componentes separados do seu aplicativo comuniquem-se de forma eficiente, especialmente quando eles não têm uma relação direta, no nosso caso uma &lt;strong&gt;exception&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Além disso, vamos usar o &lt;strong&gt;device_info_plus&lt;/strong&gt; para poder mandar junto com o erro os dados do equipamento para análise de um possível problema e o &lt;strong&gt;get_it&lt;/strong&gt; somente para injetar as dependências mais facilmente no nosso projeto. Vamos usar também o &lt;strong&gt;image_network&lt;/strong&gt;, para mostrar as imagens na web, por conta do CORS!&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando nosso canal do Discord para receber a mensagem
&lt;/h2&gt;

&lt;p&gt;Vamos criar nosso servidor no Discord, que por si só é realmente intuitivo, e após isso vamos criar um canal &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudyx43mxn7tg45s2es25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudyx43mxn7tg45s2es25.png" alt="Imagem da tela do discord"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;depois de criado, vamos nas configurações do canal e vamos criar um bot&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5nd96pn7yh8xlv8x9e3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5nd96pn7yh8xlv8x9e3.png" alt="Imagem de onde se cria o bot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vamos copiar essa url para usar mais tarde!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando o projeto esqueleto
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;flutter create --org="com.example.eventbus" --platforms=web,android -e --project-name=event_bus_exception  eventBusException&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;feito isso vamos já adicionar os nossos packages de uso&lt;br&gt;
&lt;code&gt;flutter pub add dio event_bus get_it device_info_plus image_network&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando o caminho perfeito
&lt;/h2&gt;

&lt;p&gt;Vamos iniciar o projeto criando os botões e as chamadas para as apis , deixando estourar os possíveis erros na tela para fazermos a correção posteriormente&lt;/p&gt;

&lt;p&gt;Vamos iniciar 'de cima para baixo', iniciando a criação das chamadas das apis que vão ser consumidas pela aplicação&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Teremos aqui somente 2 métodos, um com os dados corretos, e outro com um erro de parse no json para a transformação de objeto, para recebermos um erro e tratar&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Sua implementação é extremamente intuitiva, já que o nosso intuito é somente mostrar como executar a exception&lt;/p&gt;

&lt;p&gt;Temos também nosso &lt;strong&gt;AlbumModel&lt;/strong&gt; que está sem nenhum problema&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;e temos o &lt;strong&gt;AlbumModelError&lt;/strong&gt;, onde eu coloquei propositamente o i do albumId minúsculo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Feito isso, podemos construir nossa &lt;strong&gt;MainController&lt;/strong&gt; com os métodos que serão chamados na página e vamos injetar nela o nosso repository &lt;strong&gt;ApiCallImpl&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
Iremos criar a exception que queremos que o event_bus dispare para o discord, então criaremos uma exception chamada &lt;strong&gt;CriticalException&lt;/strong&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
Por enquanto essa exception não faz absolutamente nada, mas logo isso vai mudar!

&lt;p&gt;Iremos utilizar o &lt;strong&gt;get_it&lt;/strong&gt; para injetar o nosso repository e a nossa controller e depois injetar a repository dentro da nossa controller para podermos fazer a chamada diretamente pela controller&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Se você rodar o projeto do jeito que está agora, vai ver que ao clicar nos dois últimos botões só irá aparecer um erro no console de erro, mas SE a aplicação estiver em produção, dificilmente você irá conseguir pegar esse erro em um tempo hábil de correção. E é aí que o event_bus chega para ajudar a gente.&lt;/p&gt;

&lt;p&gt;Como descrito acima, ele pode nos ajudar desacoplado do nosso sistema principal e ficar escutando certos eventos e executar alguma ação com esse evento, e o nosso caso vai ser disparar o erro para o Discord!&lt;/p&gt;

&lt;p&gt;Vamos criar uma classe chamada &lt;strong&gt;BroadcastController&lt;/strong&gt; que será encarregada de escutar o disparo do evento do &lt;strong&gt;CriticalException&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nela iremos injetar tudo que é importante para seu funcionamento, como o eventBus , a nossa classe que irá pegar os dados do device, e pra onde vamos enviar o nosso broadCast, que pode ser um ou vários!&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando a nossa classe de informação do dispositivo
&lt;/h2&gt;

&lt;p&gt;Vamos criar uma classe  somente para pegar o modelo do equipamento que está acessando a aplicação, e no caso da web o user-agent:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Criando nosso primeiro channel
&lt;/h2&gt;

&lt;p&gt;Vamos chamar de channel o remetente que vamos enviar nossa exception, e vamos inicialmente criar uma classe abstrata com um método chamado execute que será encarregado de enviar os dados para o channel escolhido e também um método de configure, para alguma configuração prévia no channel, como por exemplo no caso do slack, configurar para qual canal a mensagem será enviada.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Channel: &lt;strong&gt;DiscordBroadcastImpl&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nosso broadcast para o Discord, iremos injetar nele o Dio , para que possamos fazer o post na url que nós pegamos lá no começo do artigo. Nele não precisaremos fazer nenhuma configuração extra, pois o webhook já se encarrega de enviar para o lugar certo&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora vamos alterar o nosso main.dart para colocar o resto das injeções das dependencias no projeto&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Se você rodou o projeto até aqui vai quer que .. não aconteceu absolutamente NADA, não foi pro discord e você já deve estar achando que eu estou enganando vc!&lt;/p&gt;

&lt;p&gt;Faltou fazermos o principal, precisamos disparar o evento propriamente dito dentro da nossa exception&lt;/p&gt;

&lt;p&gt;então vamos colocar o comando do nosso broadcast para fazer o acionamento do nosso listen lá no &lt;strong&gt;BroadCastController&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;e quando clicamos lá no botão de erro do parse do json para o objeto .. BANG!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6z9k9dk9o5ee2n2og2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6z9k9dk9o5ee2n2og2s.png" alt="Erro emitido"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e quanto clicamos no botão de falha do servidor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf689nx6fjc63ao3hovd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf689nx6fjc63ao3hovd.png" alt="Erro emitido"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o envio pro slack!
&lt;/h2&gt;

&lt;p&gt;Como fomos pessoas precavidas e criamos uma classe abstrata para o nosso broadcast a &lt;strong&gt;BroadcastBase&lt;/strong&gt;, a assim será extremamente rápida a criação de mais uma classe, mas dessa vez enviando para o slack!&lt;/p&gt;

&lt;p&gt;Precisamos criar o canal do slack, e para isso precisamos criar e ir na área de webhooks e ativar a integração por lá&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4yapzkksdzycb7k9432.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4yapzkksdzycb7k9432.png" alt="Criando o canal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsr1zv49fe2wz77t9zhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsr1zv49fe2wz77t9zhk.png" alt="Selecionando o webhook"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a configuração o sistema irá te dar uma url para acessar o serviço de webhook do slack.&lt;/p&gt;

&lt;p&gt;Vamos criar a nossa &lt;strong&gt;SlackBroadCastImpl&lt;/strong&gt; implementando a &lt;strong&gt;BroadcastBase&lt;/strong&gt; que nos obriga a implementar a &lt;strong&gt;execute&lt;/strong&gt; e a &lt;strong&gt;configure&lt;/strong&gt;&lt;br&gt;
No caso do slack precisamos de uma configuração inicial, como por exemplo indicar o canal que vai ser emitida a mensagem e assim como a do Discord, também injetaremos o Dio para poder fazer a requisição na url indicada&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Como alterar a emissão entre o slack e o Discord?
&lt;/h2&gt;

&lt;p&gt;Precisaremos fazer algumas modificações nas nossas injeções do main.dart. O principal é que como vamos injetar duas &lt;strong&gt;BroadcastBase&lt;/strong&gt; precisaremos nomear nossas instâncias para que o &lt;strong&gt;get_it&lt;/strong&gt; consiga recuperá-las.&lt;br&gt;
Após isso no nosso &lt;strong&gt;BroadcastController&lt;/strong&gt; que já espera uma lista, ou a gente inclui o slack junto ou escolhe entre eles, no nosso caso vou colocar os dois juntos para a mensagem chegar nos dois ao mesmo tempo, ficando assim:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Assim que a exception &lt;strong&gt;CriticalException&lt;/strong&gt; for acionada no sistema, será enviado tanto para o Discord quanto para o slack&lt;/p&gt;

&lt;h2&gt;
  
  
  Possibilidades (Ideias)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A exception pode chamar uma api sua que vai pro seu whatsapp&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A exception pode emitir para o crashlytics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A exception pode emitir para o sentry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A exception pode gravar em um banco interno do seu aplicativo&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;e assim por diante. &lt;/p&gt;

&lt;p&gt;Espero que tenham gostado e segue o git abaixo!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/brasizza" rel="noopener noreferrer"&gt;
        brasizza
      &lt;/a&gt; / &lt;a href="https://github.com/brasizza/flutter-eventbus-exception" rel="noopener noreferrer"&gt;
        flutter-eventbus-exception
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Artigo sobre eventBus - Flutter&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;O que é o EventBus?&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;O EventBus é uma biblioteca que facilita a comunicação assíncrona entre diferentes partes de um aplicativo Flutter. Ele permite que componentes ou classes troquem mensagens (eventos) de forma eficiente, sem a necessidade de depender de herança ou referências diretas. Isso torna o código mais flexível e desacoplado, facilitando a manutenção e o desenvolvimento de aplicativos escaláveis.&lt;/p&gt;
&lt;p&gt;Com isso, surgiu a ideia de usar o EventBus para emitir logs para servidores externos por meio de uma exception específica!&lt;/p&gt;
&lt;p&gt;Caso você tenha vindo diretamente do GIT, segue abaixo  o link do artivo&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/brasizza/enviando-logs-de-exception-pelo-event-bus-discord-e-slack-23h4" rel="nofollow"&gt;https://dev.to/brasizza/enviando-logs-de-exception-pelo-event-bus-discord-e-slack-23h4&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/brasizza/flutter-eventbus-exception" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Criação de uma API em Shelf</title>
      <dc:creator>Marcus Brasizza</dc:creator>
      <pubDate>Sun, 26 Feb 2023 06:15:49 +0000</pubDate>
      <link>https://dev.to/brasizza/criacao-de-uma-api-em-shelf-3c29</link>
      <guid>https://dev.to/brasizza/criacao-de-uma-api-em-shelf-3c29</guid>
      <description>&lt;p&gt;Fala pessoal!&lt;/p&gt;

&lt;p&gt;Vamos ao primeiro artigo da série que se tudo der certo sai 100%&lt;/p&gt;

&lt;h2&gt;
  
  
  Já aviso que o artigo é grande mas é necessário para que seja colocado exatamente o passo a passo de como fazer!
&lt;/h2&gt;

&lt;p&gt;O json para testar no postman se encontra aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/brasizza/shelf-server-v1/blob/master/postman/artigo_shelf.postman_collection.json"&gt;POSTMAN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos iniciar explicando como será nossa api:&lt;br&gt;
Iremos conectar em um banco mysql onde terá nosso banco de dados chamado de &lt;strong&gt;delivery&lt;/strong&gt; e nele terá uma tabela chamada &lt;strong&gt;orders&lt;/strong&gt;, e nela estarão todos nossos pedidos por provider (ifood/rappi) e os status (&lt;strong&gt;Iniciado&lt;/strong&gt;, &lt;strong&gt;Em andamento&lt;/strong&gt;, &lt;strong&gt;Finalizado&lt;/strong&gt;, &lt;strong&gt;Em Rota&lt;/strong&gt; e &lt;strong&gt;Completo&lt;/strong&gt;) onde&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Iniciado&lt;/strong&gt;: O servidor recebeu o pedido naquele momento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Em andamento&lt;/strong&gt;: Alguém iniciou a produção desse pedido&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finalizado&lt;/strong&gt;: A produção do pedido foi finalizado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Em rota&lt;/strong&gt;: O pedido saiu do restaurante e está indo para o cliente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finalizado&lt;/strong&gt;: Pedido foi entregue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teremos as rotas de pegar Todos os pedidos, pegar um pedido por ID, Inserir, Alterar e excluir o pedido por ID&lt;/p&gt;

&lt;p&gt;Nossa tabela do mysql&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

&lt;/h2&gt;
&lt;h2&gt;
  
  
  INICIANDO O SHELF
&lt;/h2&gt;

&lt;p&gt;O Dart nos traz uma facilidade absurda na criação dos nossos projetos, que são os templates. Com eles você pode já criar seu projeto de um jeito fácil e já é incluído algumas coisas automaticamente nele.&lt;/p&gt;

&lt;p&gt;Vamos criar nosso projeto com o template do shelf mesmo assim&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dart create -t server-shel api&lt;/code&gt;&lt;br&gt;
Com isso ele já vai jogar nas depenências o shelf e o shelf_router  e um arquivo teste rest no seu &lt;strong&gt;bin/server.dart&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;podemos executar ele clicando ou no &lt;code&gt;debug&lt;/code&gt; ou no &lt;code&gt;run&lt;/code&gt; do server.dart e abrir o link &lt;strong&gt;&lt;a href="http://0.0.0.0:8080/"&gt;http://0.0.0.0:8080/&lt;/a&gt;&lt;/strong&gt;, você vai ver que ele vai aparecer um 'Hello World!' , sinal de que está tudo funcionando&lt;/p&gt;
&lt;h2&gt;
  
  
  DEPENDENCIAS
&lt;/h2&gt;

&lt;p&gt;Tentarei usar o mínimo de dependências possíveis no server, então iremos usar o &lt;a href="https://pub.dev/packages/get_it"&gt;&lt;strong&gt;get_it&lt;/strong&gt;&lt;/a&gt; para gerenciar nossas dependências, um package de mysql que eu optei nesse projeto usar o &lt;a href="https://pub.dev/packages/mysql_client"&gt;&lt;strong&gt;mysql_client&lt;/strong&gt;&lt;/a&gt;, pois está atualizado há pouco tempo e diz no package o suporte pro mysql8 e mariadb 10 e sabemos que o mysql1 está meio chatinho de usar então dei uma chance pra ele! e pra finalizar o &lt;a href="https://pub.dev/packages/dotenv/example"&gt;&lt;strong&gt;dotenv&lt;/strong&gt;&lt;/a&gt;, que iremos utilizar para pegar alguns dados para iniciar nosso servidor shelf, como porta e dados do mysql, mesmo sabendo que não é o local mais seguro do mundo, como estará no server-side não vejo muito problema inicialmente. &lt;br&gt;
Para adicionar rapidamente no seu projeto todos esses packages faremos de uma vez só&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dart pub add get_it mysql_client dotenv&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ARQUIVOS UTEIS
&lt;/h2&gt;

&lt;p&gt;Iremos criar um concentrador de logs que chamaremos de &lt;br&gt;
 &lt;strong&gt;developer&lt;/strong&gt; e iremos colocar em &lt;strong&gt;lib/src/core/developer&lt;/strong&gt;&lt;br&gt;
iremos criar o &lt;strong&gt;developer.dart&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Estou também fazendo uns testes de abstração de banco de dados, portanto é &lt;strong&gt;meramente experimental&lt;/strong&gt;, onde teoricamente eu poderia usar qualquer banco de dados (que podemos testar depois, por exemplo o hive), existem alguns métodos nele que eu ainda não implementei, pois como foi construído para o &lt;strong&gt;hive&lt;/strong&gt;, consegui adaptar muito bem para o &lt;strong&gt;mysql&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar uma pasta em &lt;strong&gt;lib/src/core/database&lt;/strong&gt; e colocaremos nosso database.dart e o nosso mysql_database.dart&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  ESTRUTURA DO PROJETO
&lt;/h2&gt;

&lt;p&gt;Iremos utilizar uma estrutura de &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller

&lt;ul&gt;
&lt;li&gt;Service &lt;/li&gt;
&lt;li&gt;Repository&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse projeto escolhi utilizar o service layer para que possamos ter mais liberdade para o repository, por exemplo quando atualizamos um pedido ou inserimos, a responsabilidade do repository é só inserir ou alterar, deixamos o service responsável por retornar o objeto novo ou alterado, assim dividimos as responsabilidades e deixamos o nosso repository somente para fazer a conexão entre o nosso banco e nada mais!&lt;/p&gt;

&lt;p&gt;Para ficar mais fácil , fora da pasta bin, iremos criar uma pasta &lt;strong&gt;lib&lt;/strong&gt;, e dentro dela a &lt;strong&gt;src&lt;/strong&gt; onde iremos colocar nosso código isolado dos demais&lt;/p&gt;

&lt;h2&gt;
  
  
  MODEL ORDER e ORDER STATUS
&lt;/h2&gt;

&lt;p&gt;Primeiramente precisamos criar nosso model, e olhando a nossa tabela temos os campos que serão representados da nossa tabela.Podemos notar que os campos estão em snake_case e por padrão o flutter 'sugere' que as propriedades sejam em camelCase, então teremos que fazer algumas traduções de campos além de para ficar mais fácil iremos criar um enum para o nosso campo de &lt;strong&gt;status&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;O enum do status que iremos criar na pasta &lt;strong&gt;lib/src/enum/order_status.dart&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;O nosso model do Order, criei com a extensão do &lt;a href="https://marketplace.visualstudio.com/items?itemName=hzgood.dart-data-class-generator"&gt;Dart class generator &lt;/a&gt; , ele ajuda demais a construir rapidamente um model&lt;/p&gt;

&lt;p&gt;Model que iremos criar na pasta &lt;strong&gt;lib/src/data/model/order.dart&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pontos importantes da nossa model que foram customizados, como por exemplo o &lt;strong&gt;orderId&lt;/strong&gt; que no nosso banco é &lt;strong&gt;order_id&lt;/strong&gt; , e os outros, que tiveram que ser traduzidos no &lt;em&gt;fromMap&lt;/em&gt; exatamente como está na tabela&lt;/p&gt;

&lt;p&gt;Outro ponto importante foi a criação do &lt;strong&gt;toDatabase&lt;/strong&gt; e do &lt;strong&gt;updateMap&lt;/strong&gt;, que no decorrer vou explicar o motivo da criação&lt;/p&gt;

&lt;h2&gt;
  
  
  Módulo order
&lt;/h2&gt;

&lt;p&gt;Para separar nosso projeto , iremos criar uma pasta order em&lt;br&gt;
&lt;strong&gt;lib/src/modules/order&lt;/strong&gt;  e criaremos 2 arquivos&lt;br&gt;
o &lt;strong&gt;order_controller.dart&lt;/strong&gt; e &lt;strong&gt;order_route.dart&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;order_controller&lt;/strong&gt; será nosso controlador de todas as ações que o nosso endpoint precisará fazer, e o &lt;strong&gt;order_route&lt;/strong&gt; será onde iremos especificar a nossas rotas e o que efetivamente faremos nelas&lt;/p&gt;

&lt;p&gt;Na nossa controller teremos o:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;getAll , pra pegar todos os pedidos&lt;/li&gt;
&lt;li&gt;getById, para pegar um pedido específico&lt;/li&gt;
&lt;li&gt;save, para inserir o pedido no banco de dados&lt;/li&gt;
&lt;li&gt;update, para atualizar um pedido específico&lt;/li&gt;
&lt;li&gt;delete, para deletar um pedido específico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ta, mas como faremos isso?&lt;br&gt;
Como eu havia mencionado, iremos utilizar 2 camadas acima da controller: a service e a repository.&lt;/p&gt;

&lt;p&gt;Iremos inicialmente criar a abstração da service e depois implementar. Vamos chamar de order_service e vamos colocar ela dentro da pasta &lt;strong&gt;lib/src/service/order_service.dart&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
onde:

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;getAll&lt;/strong&gt; pode ou não retornar uma lista de Order,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;getById&lt;/strong&gt;, pode ou não retornar um Order passando um id,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;delete&lt;/strong&gt;,  deleta da sua base de dados com base em um id e te retorna o Order deletado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;save&lt;/strong&gt;, salva os dados enviados para o endpoint , retornando o Order salvo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;update&lt;/strong&gt; , atualiza um Order com base em um id, atualizando os campos que foram preenchidos para atualização&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Se olharmos no service, iremos ver que temos algumas particularidades para deixar nosso código mais limpo, como por exemplo as checagens para deletar ou atualizar um registro, além de por exemplo ele retornar um objeto Order para sua service seja com ele atualizado no caso do update ou o que foi inserido naquele momento, e no caso do delete em particular, ele te manda o registro que foi excluído!&lt;/p&gt;

&lt;p&gt;Além disso iremos utilizar o método &lt;strong&gt;updateMap&lt;/strong&gt; que, como pegamos o objeto antes de fazer o update, nós atualizamos o mesmo objeto com os dados vindos requisição, assim nós garantimos que só irão ser alterados os campos que forem enviados pela requisião de &lt;strong&gt;UPDATE&lt;/strong&gt;, além de atualizar o campo de data de atualização e ai sim enviamos para o banco de dados para atualização&lt;/p&gt;

&lt;p&gt;Também iremos criar um &lt;strong&gt;repository&lt;/strong&gt; chamado &lt;strong&gt;order_repository&lt;/strong&gt; na pasta&lt;br&gt;
&lt;strong&gt;lib/src/data/repository/order_repository.dart&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;A grande diferença entre o &lt;strong&gt;repository&lt;/strong&gt; e o service estão nos métodos de inserir, deletar e atualizar, onde o &lt;strong&gt;repository&lt;/strong&gt; só precisa entregar pro service, se deu certo ou não, e só no caso do inserir que ele precisa retornar o id inserido para que o service possa tomar as providencias necessárias.&lt;/p&gt;

&lt;p&gt;A implementação do repository para explicação&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No repository fazemos a conexão com o banco de dados que por fim faz todas as ações necessárias, além de no salvar, nós utilizamos o método &lt;strong&gt;toDatabase&lt;/strong&gt; que criamos que basicamente é para normalizar os nomes dos campos com os nomes das tabelas do banco de dados, assim facilita nosso trabalho de ter que normalizar (ou seja, colocar os mesmos nomes da tabela)&lt;/p&gt;

&lt;p&gt;Com tudo isso criado, podemos finalmente criar nossa controller.&lt;/p&gt;

&lt;p&gt;A controller também terá os seguintes métodos iniciais&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;getAll &lt;/li&gt;
&lt;li&gt;getById&lt;/li&gt;
&lt;li&gt;save&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A diferença dela para as camadas acima é que ela vai ser nossa ligação entre o shelf e o service que por sua vez se comunica com o repository&lt;/p&gt;

&lt;p&gt;Como você deve ter notado, normalmente fazemos a inversão dependência e injetamos por exemplo o repository na service e o database no repository e por sua vez injetamos o service na controller, assim podemos fazer um código o mínimo de agregação fixa e se caso for preciso mudar a instância, mudamos somente na injeção na classe.&lt;/p&gt;

&lt;p&gt;Uma coisa importante no nosso controller é que como estamos trabalhando com o shelf, o retorno de todos os métodos devem ser um Response, para que o shelf possa responder corretamente com 200, ou 400 ou 500 para o nosso cliente na ponta onde está acessando o endpoint específico que iremos criar logo em seguida.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;O controller que tem o service injetado será nossa ponta para ligar diretamente no shelf, podemos ver que na maioria dos casos, faz uma logica simples e chama o service que faz toda a lógica juntamente com o controller retornando somente o objeto ou um nulo indicando erro, sempre respeitando o máximo possível das respostas http: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2xx para OK &lt;/li&gt;
&lt;li&gt;4xx para dados com problemas (mas processou)&lt;/li&gt;
&lt;li&gt;5xx erro crítico no nosso servidor ou banco de dados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu particularmente gosto de nomear minhas instâncias em constantes para ficar mais fácil a recuperação, então como sabemos que teremos que injetar o mysql, o nosso service do order e o repository, já vamos criar a nossa classe que ficará com os nomes das constantes.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
Eu coloco nomes grandes, porque como esta na propriedade não tem problema nenhum porque vai pegar de &lt;strong&gt;Consts.mysqlInstance&lt;/strong&gt; por exemplo

&lt;p&gt;Até agora não colocamos um dedo no código do shelf propriamente dito e provavelmente se criou um template do shelf igual descrito acima o seu server.dart vai estar parecido com algo assim&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;isso quer dizer que , se for executado esse shelf do jeito que está e entrar no seu ip:8080 ele vai mostrar na tela um &lt;strong&gt;Hello world&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A primeira coisa que vamos fazer ai é criar um arquivo .env na raiz do seu projeto para que possamos colocar os dados do seu banco de dados &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Vamos usar o dotenv para carregar esse arquivo e também vamos usar o GetIt para guardar essa instância para um futuro uso. Além disso vamos no &lt;strong&gt;server.dart&lt;/strong&gt; mesmo fazer a conexão como o mysql e também guardar essa instância.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;GetIt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;I&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registerSingleton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;MysqlDatabase&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;MysqlDatabase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'host'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'port'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'port'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'userName'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'userName'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'password'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'databaseName'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'databaseName'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'secure'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'secure'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;GetIt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;I&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registerSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;instanceName:&lt;/span&gt; &lt;span class="n"&gt;Consts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mysqlInstance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;....&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com isso teremos nossa conexão com o mysql sempre disponível no getIt.&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando as rotas no shelf
&lt;/h2&gt;

&lt;p&gt;Criamos um &lt;strong&gt;order_route.dart&lt;/strong&gt; que ainda está vazio e vamos criar nossas rotas nesse arquivo para deixar bem separado.&lt;/p&gt;

&lt;p&gt;Como já criamos nosso controller, o nosso service E a nossa repository iremos iniciar a instância deles somente neste ponto , para que a responsabilidade da criação das instâncias seja somente onde ela é chamada de fato!&lt;br&gt;
Iremos criar um método estático chamado routes onde iremos criar nossas chamadas de rotas como descritas abaixo&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;podemos ver que foram criados 5 rotas bases &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;/orders&lt;/strong&gt; que é o nosso getAll&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;/order/&lt;em&gt;id&lt;/em&gt;&lt;/strong&gt; que é a nossa rota de pegar um order por id&lt;/li&gt;
&lt;li&gt;o &lt;strong&gt;/order&lt;/strong&gt; que vai salvar o nosso objeto de order&lt;/li&gt;
&lt;li&gt;o &lt;strong&gt;/order/&lt;em&gt;id&lt;/em&gt;&lt;/strong&gt; que vai atualizar a nossa order com base em um id&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;/order/&lt;em&gt;id&lt;/em&gt;&lt;/strong&gt; que vai deletar o nosso registro com base na ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso mandando os verbos certos, &lt;strong&gt;get&lt;/strong&gt; onde é requisição de informação, &lt;strong&gt;post&lt;/strong&gt; e &lt;strong&gt;put&lt;/strong&gt; e &lt;strong&gt;delete&lt;/strong&gt; quando é envio de informação para o servidor&lt;/p&gt;

&lt;p&gt;Feito isso iremos agora colocar essa rota no nosso server.dart&lt;br&gt;
Colocaremos a porta do shelf padrão como vindo do .env, e se não encontrar ele assume a porta &lt;strong&gt;8080&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Iremos fazer de um jeito inicialmente que só será possível incluir as rotas do order, mas caso nós formos progredindo podemos alterar para contemplar mais rotas&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;e com isso terminamos nossa primeira parte do servidor shelf. Sei que é muita informação e muito texto, mas se você se perdeu em algum lugar, você inicialmente pode tentar me chamar no &lt;a href="https://discord.gg/Brasizza#7615"&gt;discord&lt;/a&gt; pois me ajuda demais a entender onde está o problema e ajudar a corrigir!&lt;/p&gt;

&lt;p&gt;Ou olhar no repositório &lt;a href="https://github.com/brasizza/shelf-server-v1"&gt;GIT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado e iremos fazer nosso primeiro app utilizando esse backend no próximo artigo!&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>shelf</category>
      <category>api</category>
    </item>
    <item>
      <title>Criando uma api em shelf com socket + app com provider e bloc</title>
      <dc:creator>Marcus Brasizza</dc:creator>
      <pubDate>Thu, 23 Feb 2023 04:48:02 +0000</pubDate>
      <link>https://dev.to/brasizza/criando-uma-api-em-shelf-com-socket-app-com-provider-e-bloc-2g64</link>
      <guid>https://dev.to/brasizza/criando-uma-api-em-shelf-com-socket-app-com-provider-e-bloc-2g64</guid>
      <description>&lt;p&gt;Fala pessoal!&lt;br&gt;
Resolvi trocar o medium pelo dev.to, simplesmente pelo fato dele ser free e não impedir a galera de ver somente alguns posts por mês!&lt;/p&gt;




&lt;p&gt;Vamos para o post em Sí!&lt;br&gt;
Farei uma série de alguns artigos que irão consistir em:&lt;/p&gt;

&lt;p&gt;Faremos uma api simulando um sistema de delivery (rappi/ifood)&lt;br&gt;
onde o endpoint vai salvar o pedido, recuperar um pedido por id, todos  e deletar o pedido por id e finalmente alterar o pedido (teoricamente o status)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Criação de uma API simples Restfull (GET/POST/DELETE/PUT) , vou usar o PUT para editar também pra ficar mais fácil e testaremos tudo via POSTMAN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Criação de um aplicativo simples para consumir essa api (Tentarei fazer um drag/drop) todo estilizado com provider e cubit (Se Deus quiser!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modificação dessa API para integrar um servidor socket embutido emitindo cada um dos métodos pertinentes (POST/DELETE)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modificação do nosso APP para escutar o socket e fazer as alterações em tempo real.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Então fiquem ligados aqui que logo mais teremos a saga completa separada de como criar tudo passo a passo!&lt;/p&gt;

&lt;p&gt;E colocarei os links em ordem aqui também abaixo a medida que for desenvolvendo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/brasizza/criacao-de-uma-api-em-shelf-3c29"&gt;Parte 1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
