<?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>Forem: Tadeu Barbosa</title>
    <description>The latest articles on Forem by Tadeu Barbosa (@tadeubdev).</description>
    <link>https://forem.com/tadeubdev</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%2F387944%2Fe753bfa8-7173-4045-9a05-5443b1886c9a.jpg</url>
      <title>Forem: Tadeu Barbosa</title>
      <link>https://forem.com/tadeubdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tadeubdev"/>
    <language>en</language>
    <item>
      <title>Simplificando Testes no NestJS com Injeção de Valores</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Thu, 28 Aug 2025 22:13:11 +0000</pubDate>
      <link>https://forem.com/tadeubdev/simplificando-testes-no-nestjs-com-injecao-de-valores-3io4</link>
      <guid>https://forem.com/tadeubdev/simplificando-testes-no-nestjs-com-injecao-de-valores-3io4</guid>
      <description>&lt;p&gt;Quando trabalhamos com &lt;strong&gt;NestJS&lt;/strong&gt;, é muito comum ver serviços injetando o ConfigService diretamente. Isso funciona bem, mas pode tornar os &lt;strong&gt;testes mais complexos&lt;/strong&gt; e acoplar o código a detalhes de configuração.&lt;/p&gt;

&lt;p&gt;Vamos comigo enquanto escuto uma &lt;a href="https://www.youtube.com/watch?v=URBXJeUZKzU" rel="noopener noreferrer"&gt;playlist de techno no youtube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, vou mostrar uma abordagem simples para &lt;strong&gt;desacoplar suas classes&lt;/strong&gt; e facilitar os testes, injetando valores primitivos prontos via módulo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwvbj4n6v1b5sqmc8ffpm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwvbj4n6v1b5sqmc8ffpm.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema: acoplamento ao ConfigService
&lt;/h2&gt;

&lt;p&gt;Um serviço de criação de contato que valida a data mínima poderia ser escrito assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateContactService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;minDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CONTACT_MIN_DATE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;birthDate&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;minDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Data inválida&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthDate&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;Funciona, mas agora qualquer teste precisa &lt;strong&gt;mockar o ConfigService&lt;/strong&gt;.Isso gera fricção desnecessária.&lt;/p&gt;

&lt;h2&gt;
  
  
  A solução: injetar valores prontos via módulo
&lt;/h2&gt;

&lt;p&gt;Podemos mover a responsabilidade para o &lt;strong&gt;módulo&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateContactService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;minDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;birthDate&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Data inválida&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthDate&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;E no módulo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providers&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="na"&gt;provide&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CreateContactService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;useFactory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreateContactService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CONTACT_MIN_DATE&lt;/span&gt;&lt;span class="dl"&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="na"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ConfigService&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="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CreateContactService&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContactModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Por que é melhor?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Classes mais puras&lt;/strong&gt; – não sabem de onde o valor veio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testes mais simples&lt;/strong&gt; – basta instanciar new CreateContactService(new Date('2000-01-01'))&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuração centralizada&lt;/strong&gt; – módulos realmente controlam dependências&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alinhado a SOLID&lt;/strong&gt; – especialmente &lt;em&gt;Dependency Inversion Principle&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Essa pequena mudança de perspectiva (deixar o &lt;strong&gt;módulo&lt;/strong&gt; resolver configs e injetar valores prontos) pode simplificar bastante seus testes e deixar seu código mais limpo.&lt;/p&gt;

&lt;p&gt;Injeção de dependência não é só sobre classes complexas: até &lt;strong&gt;valores primitivos&lt;/strong&gt; podem (e devem) ser tratados como dependências.&lt;/p&gt;

&lt;p&gt;E você, já aplica esse padrão em seus projetos NestJS?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Ser dev não é (ou não deveria ser) apenas escrever código</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Sun, 10 Aug 2025 17:15:03 +0000</pubDate>
      <link>https://forem.com/tadeubdev/ser-dev-nao-e-ou-nao-deveria-ser-apenas-escrever-codigo-mlp</link>
      <guid>https://forem.com/tadeubdev/ser-dev-nao-e-ou-nao-deveria-ser-apenas-escrever-codigo-mlp</guid>
      <description>&lt;p&gt;Ano passado, criei um webapp para resolver uma dor pessoal: &lt;strong&gt;gerar um fundo borrado para fotos&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Simples, direto e sem precisar instalar nada.&lt;/p&gt;

&lt;p&gt;Enquanto escrevo, estou ouvindo uma &lt;a href="https://www.youtube.com/watch?v=8zF1s_XNdKE" rel="noopener noreferrer"&gt;playlist no youtube de música techno&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do zero à produção
&lt;/h2&gt;

&lt;p&gt;Comecei no &lt;strong&gt;JavaScript puro&lt;/strong&gt;, manipulando canvas e efeitos CSS.&lt;br&gt;&lt;br&gt;
Depois, estruturei tudo com &lt;strong&gt;Vue + Vite&lt;/strong&gt;, investi bastante em &lt;strong&gt;SEO&lt;/strong&gt;, aprendi sobre &lt;strong&gt;Google Analytics&lt;/strong&gt;, foquei no &lt;strong&gt;mobile-first&lt;/strong&gt; e implementei tradução com &lt;strong&gt;i18n&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Criei desde o &lt;strong&gt;nome, logo, imagens… tudo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os resultados
&lt;/h2&gt;

&lt;p&gt;Mesmo sendo um projeto paralelo e sem fins lucrativos, alcancei:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1.1k+ usuários ativos/mês&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CTR orgânico no Google acima de 80%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Público crescente no &lt;strong&gt;Brasil, México e outros países de língua espanhola&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que realmente importou
&lt;/h2&gt;

&lt;p&gt;Mais do que números, o valor real foi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Construir um produto &lt;strong&gt;do zero até ter usuários reais&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analisar dados&lt;/strong&gt; e tomar decisões com base neles
&lt;/li&gt;
&lt;li&gt;Equilibrar &lt;strong&gt;UX, performance e viabilidade técnica&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ter &lt;strong&gt;visão de produto&lt;/strong&gt; além do código
&lt;/li&gt;
&lt;li&gt;Priorizar &lt;strong&gt;impacto real&lt;/strong&gt; em vez de “tecnologia da moda”
&lt;/li&gt;
&lt;li&gt;Comunicar de forma clara entre partes técnicas e não técnicas&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Minha visão
&lt;/h2&gt;

&lt;p&gt;Na minha opinião, o dev que &lt;strong&gt;só escreve código&lt;/strong&gt; pode facilmente ser substituído.&lt;br&gt;&lt;br&gt;
Ser dev é &lt;strong&gt;viver estudando&lt;/strong&gt;, conhecer profundamente as tecnologias que usa, explorar novas ferramentas e, acima de tudo, &lt;strong&gt;entender o usuário final&lt;/strong&gt; — porque no fim, é para ele que estamos escrevendo código.&lt;/p&gt;




&lt;p&gt;Você já teve algum projeto pessoal que mudou sua forma de trabalhar como dev?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Como sites te reconhecem mesmo sem login: uma introdução ao Fingerprinting</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Sat, 26 Jul 2025 21:47:13 +0000</pubDate>
      <link>https://forem.com/tadeubdev/como-sites-te-reconhecem-mesmo-sem-login-uma-introducao-ao-fingerprinting-eh8</link>
      <guid>https://forem.com/tadeubdev/como-sites-te-reconhecem-mesmo-sem-login-uma-introducao-ao-fingerprinting-eh8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Fingerprinting&lt;/strong&gt; é uma técnica utilizada por muitos sites para identificar ou categorizar usuários.&lt;/p&gt;

&lt;p&gt;Enquanto escrevo esse post, estou escutando uma &lt;a href="https://www.youtube.com/watch?v=HSRJMjRApCQ" rel="noopener noreferrer"&gt;playlist no youtube de techno&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Uns anos atrás eu entrei num hiperfoco nesse assunto e acabei pesquisando bastante sobre ele.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minha dúvida era simples:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como um site sabe que sou eu que estou acessando, mesmo sem login?&lt;br&gt;
Como ele consegue mostrar anúncios em diversos sites diferentes, conectando tudo?&lt;/p&gt;

&lt;p&gt;Naquela época, o &lt;em&gt;Facebook&lt;/em&gt; e o &lt;em&gt;Google&lt;/em&gt; ainda não tinham dominado a web com seus plugins de "curtir" e botões de login. Mesmo assim, um site sabia que era eu ali acessando.&lt;/p&gt;

&lt;p&gt;A técnica em si não é boa nem má. Ela pode ser usada para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prevenção de fraudes,&lt;/li&gt;
&lt;li&gt;melhorar a experiência do usuário,&lt;/li&gt;
&lt;li&gt;autenticação passiva,&lt;/li&gt;
&lt;li&gt;entender o tráfego,&lt;/li&gt;
&lt;li&gt;entre outros usos legítimos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas também é usada para o lado oposto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identificação forçada sem consentimento (mesmo com VPN, aba anônima etc),&lt;/li&gt;
&lt;li&gt;criação de perfis comportamentais para venda de dados,&lt;/li&gt;
&lt;li&gt;personalização abusiva (como exibir preços diferentes com base no seu perfil).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo, deixei uma imagem que ilustra de forma simples como isso funciona na prática:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F28eu8jsywotwocihgmm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F28eu8jsywotwocihgmm4.png" alt=" " width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já parou pra pensar sobre esse assunto?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>Integrando Mercado Pago Checkout Pro com Contas de Teste: problemas reais e como resolvi</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Sun, 29 Jun 2025 02:38:36 +0000</pubDate>
      <link>https://forem.com/tadeubdev/integrando-mercado-pago-checkout-pro-com-contas-de-teste-problemas-reais-e-como-resolvi-343c</link>
      <guid>https://forem.com/tadeubdev/integrando-mercado-pago-checkout-pro-com-contas-de-teste-problemas-reais-e-como-resolvi-343c</guid>
      <description>&lt;p&gt;Recentemente estava tentando integrar o &lt;strong&gt;Mercado Pago (Checkout Pro)&lt;/strong&gt;. Por já ter integrado a eles a uns bons anos atrás em outros projetos, mas acabei tendo dificuldade com a documentação.&lt;/p&gt;

&lt;p&gt;Neste post, compartilho os principais problemas que enfrentei com o modo &lt;strong&gt;sandbox&lt;/strong&gt; do Mercado Pago e como consegui resolver cada um deles.&lt;/p&gt;




&lt;p&gt;A ideia era criar um link de pagamento para o usuário. Exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pacote 1: R$ 100,00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao pagar, o sistema adiciona o pacote na conta do usuário.&lt;/p&gt;




&lt;p&gt;A questão é que:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Não encontrava o &lt;strong&gt;Access Token&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para ver as credenciais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criei uma conta no mercado livre&lt;/li&gt;
&lt;li&gt;Criei uma &lt;strong&gt;aplicação&lt;/strong&gt; no &lt;a href="https://www.mercadopago.com.br/developers/panel" rel="noopener noreferrer"&gt;painel de desenvolvedor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Criei uma conta de vendedor e outra de comprador&lt;/li&gt;
&lt;li&gt;Copiei o &lt;strong&gt;Access Token&lt;/strong&gt; da conta de vendedor (ex: &lt;code&gt;TEST-...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Gerei o link de pagamento, mas &lt;strong&gt;não conseguia pagar&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fazia tudo certinho, mas ao acessar o link com uma conta de teste compradora, era redirecionado para uma tela pedindo &lt;strong&gt;confirmação de email&lt;/strong&gt;, que obviamente não existe no sandbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Descobri que o comprador também precisa ter uma aplicação (!)
&lt;/h3&gt;

&lt;p&gt;Esse foi o ponto de virada: mesmo sendo uma &lt;strong&gt;conta de teste COMPRADORA&lt;/strong&gt;, ela precisa ter uma aplicação cadastrada no painel de desenvolvedores. Sem isso, os pagamentos não funcionam corretamente no checkout.&lt;/p&gt;

&lt;p&gt;Encontrei essa informação... (&lt;a href="https://www.reddit.com/r/devsarg/comments/1fttnbt/no_me_funciona_el_sand_box_de_mercado_pago_cuando/?tl=pt-br" rel="noopener noreferrer"&gt;&lt;strong&gt;no Reddit&lt;/strong&gt;&lt;/a&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Solução passo a passo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Crie duas contas de teste no painel sandbox
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.mercadopago.com.br/developers/panel/sandbox" rel="noopener noreferrer"&gt;https://www.mercadopago.com.br/developers/panel/sandbox&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma como &lt;strong&gt;vendedor&lt;/strong&gt; (para gerar o link e receber o pagamento)&lt;/li&gt;
&lt;li&gt;Outra como &lt;strong&gt;comprador&lt;/strong&gt; (para simular o pagamento)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Crie uma aplicação nas DUAS contas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Na conta &lt;strong&gt;vendedor&lt;/strong&gt;, para obter o Access Token&lt;/li&gt;
&lt;li&gt;Na conta &lt;strong&gt;comprador&lt;/strong&gt;, para que ela consiga usar o checkout pro&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Gere a preference normalmente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;preference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;items&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pacote 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;unit_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;currency_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BRL&lt;/span&gt;&lt;span class="dl"&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="na"&gt;back_urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://seusite.com/sucesso&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://seusite.com/falha&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://seusite.com/pendente&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;auto_return&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;approved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;notification_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://seusite.com/webhook/mercado-pago&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;external_reference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Faça o pagamento com a conta de comprador
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use o botão "Saldo em conta" se quiser evitar qualquer bloqueio com cartão&lt;/li&gt;
&lt;li&gt;Se quiser usar cartão de teste, &lt;strong&gt;confirme a conta de email da conta test_user&lt;/strong&gt; manualmente&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Se esse post te ajudou, deixe um comentário ou compartilhe com quem estiver precisando.&lt;/p&gt;

</description>
      <category>development</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>📸 Blurtofit: Como criei uma ferramenta gratuita para transformar fotos verticais com fundo desfocado</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Sun, 15 Jun 2025 21:30:43 +0000</pubDate>
      <link>https://forem.com/tadeubdev/blurtofit-como-criei-uma-ferramenta-gratuita-para-transformar-fotos-verticais-com-fundo-desfocado-3pmk</link>
      <guid>https://forem.com/tadeubdev/blurtofit-como-criei-uma-ferramenta-gratuita-para-transformar-fotos-verticais-com-fundo-desfocado-3pmk</guid>
      <description>&lt;p&gt;Saiba como criei uma ferramenta simples, gratuita e multilíngue que resolve um problema comum: adaptar fotos verticais com fundo borrado para redes sociais.&lt;/p&gt;

&lt;p&gt;A ideia do Blurtofit nasceu de uma dor pessoal: como postar fotos verticais no Instagram ou TikTok sem cortar, distorcer ou colocar bordas estranhas?&lt;/p&gt;

&lt;p&gt;Criei uma solução leve, gratuita e sem login: &lt;a href="https://blurtofit.app" rel="noopener noreferrer"&gt;&lt;strong&gt;Blurtofit.app&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 O que é o Blurtofit?
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://blurtofit.app" rel="noopener noreferrer"&gt;Blurtofit&lt;/a&gt; é uma ferramenta online para transformar &lt;strong&gt;imagens verticais em quadradas&lt;/strong&gt;, adicionando um &lt;strong&gt;fundo desfocado automaticamente&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sem anúncios&lt;/li&gt;
&lt;li&gt;Sem cadastro&lt;/li&gt;
&lt;li&gt;Sem rastreamento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para fotógrafos, designers ou criadores de conteúdo que querem &lt;strong&gt;ganhar tempo&lt;/strong&gt; e manter o foco no que importa.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Tecnologias utilizadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vue 3 + Vite&lt;/strong&gt; como base do frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue I18n&lt;/strong&gt; para suporte multilíngue (&lt;code&gt;/pt&lt;/code&gt;, &lt;code&gt;/en&lt;/code&gt;, &lt;code&gt;/es&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; para um layout limpo e responsivo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite SSG (parcialmente)&lt;/strong&gt; para otimização de carregamento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web API (Canvas)&lt;/strong&gt; para aplicar o efeito de desfoque&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Desempenho e SEO
&lt;/h2&gt;

&lt;p&gt;Estou constantemente otimizando o site com foco em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Core Web Vitals: LCP, FCP, CLS&lt;/li&gt;
&lt;li&gt;✅ acessibilidade com contraste, navegação por teclado e sem dependência de JS&lt;/li&gt;
&lt;li&gt;✅ metatags dinâmicas por idioma com &lt;code&gt;useHead&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ sitemap.xml + robots.txt configurados corretamente&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; com fallback para indexação&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 Multilíngue desde o início
&lt;/h2&gt;

&lt;p&gt;Muitos acessos vieram de países latinos, então o app tem suporte completo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇧🇷 Português (pt-BR)&lt;/li&gt;
&lt;li&gt;🇺🇸 Inglês (en)&lt;/li&gt;
&lt;li&gt;🇪🇸 Espanhol (es)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As rotas são visíveis via &lt;code&gt;/pt&lt;/code&gt;, &lt;code&gt;/en&lt;/code&gt;, &lt;code&gt;/es&lt;/code&gt;, e as traduções estão organizadas por domínio.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Resultados
&lt;/h2&gt;

&lt;p&gt;Mesmo com um vídeo mal editado no TikTok (😅), o app começou a receber visitas, curtidas e feedback real de pessoas que compartilham da mesma dor que eu. O projeto está hospedado com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare + Heroku&lt;/li&gt;
&lt;li&gt;Deploy via Vite&lt;/li&gt;
&lt;li&gt;Sem cookies, analytics ou qualquer coleta de dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Próximos passos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adicionar novos efeitos com IA (remoção de fundo, ajustes automáticos)&lt;/li&gt;
&lt;li&gt;Melhorar ainda mais o tempo de carregamento e PWA&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Quer testar?
&lt;/h2&gt;

&lt;p&gt;👉 Acesse agora: &lt;a href="https://blurtofit.app" rel="noopener noreferrer"&gt;https://blurtofit.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🎁 É gratuito, leve, e pronto pra usar.&lt;/p&gt;

&lt;p&gt;Se quiser ver o código, ideias ou trocar sobre performance, acessibilidade e Vue, é só comentar aqui ou me chamar. Bora criar ferramentas úteis e abertas! ✌️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vue</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>O que aprendi pensando em como funciona a criptografia de ponta a ponta nos chats</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Sat, 03 May 2025 20:53:13 +0000</pubDate>
      <link>https://forem.com/tadeubdev/o-que-aprendi-pensando-em-como-funciona-a-criptografia-de-ponta-a-ponta-nos-chats-1lkk</link>
      <guid>https://forem.com/tadeubdev/o-que-aprendi-pensando-em-como-funciona-a-criptografia-de-ponta-a-ponta-nos-chats-1lkk</guid>
      <description>&lt;p&gt;Estava assistindo umas coisas um dia desses e em um certo momento um pessoal precisou criar um chat com criptografia de ponta a ponta (e2ee). Já trabalhei com criptografia simples, além de usar sempre as chaves públicas e privadas no linux, github, ssh etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff9njyoyy2o0s4c5xdk3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff9njyoyy2o0s4c5xdk3l.png" alt="Gerei essa estrutura com base no que foi falado" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resolvi pensar em como seria arquiteturar um sistema bem simples com esse tipo de funcionalidade. Não sei se já percebeu, mas o whatsapp tem essa funcionalidade. De uns anos pra cá os chats vêm com uma mensagem: "As mensagens nesse chat são criptografadas de ponta a ponta. Somente as pessoas nesse chat poderão visualizar o conteúdo."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é criptografia de ponta a ponta?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A criptografia de ponta a ponta, num contexto de chat, é quando cada usuário registrado no sistema recebe duas chaves, uma pública e uma privada. Essas chaves, falando entre muitas aspas, são sequências geradas por algoritmos de criptografia. Essas chaves ficam salvas somente na máquina desse usuário, não vão para o servidor (por segurança e para manter a confiabilidade do sistema de criptografia). Imagine que dois usuários estão prestes a se comunicar, internamente as chaves públicas são compartilhadas entre eles. E a partir dai ao enviar uma nova mensagem, essa mensagem é criptografada ("trancada") usando a chave pública do usuário 2. A mensagem é enviada por todo o sistema, salvo em banco etc, e assim que chega na máquina do segundo usuário, a mensagem é descriptografada ("destrancada") usando a chave privada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9k7yqgehiqmju07oop9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9k7yqgehiqmju07oop9q.png" alt="Caminho da mensagem no sistema" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como eu acho que poderia ser a arquitetura desse sistema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tenho estudado e tentado entender como funcionam as arquiteturas dos sistemas e como gerar arquiteturas cada vez melhores nos projetos que atuo. Pensando nisso pensei na seguinte coisa para esse projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9d1hbzv7t72g9o2i9dtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9d1hbzv7t72g9o2i9dtm.png" alt="Imagem com a arquitetura proposta abaixo" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na minha visão faria um sistema utilizando nestjs, vue, redis, socket e mongodb.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O mecanismo de criptografia seria uma lib interna que proveria as funções relacionadas a criptografia: gerar chaves, criptografar mensagem, descriptografar mensagem, tudo com testes etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O frontend onde haveria login, cadastro, visualização dos chats, disparos etc. Trataria de salvar as chaves localmente, e integrações com backend via api + socket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O Backend lidaria com o banco de dados, cache, disparar mensagens para as filas, banco etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O infra lidaria com a geração dos builds do frontend, backend etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;E você, já pensou em como estruturaria um sistema assim? Estou estudando mais sobre arquitetura de software e adoraria trocar ideias.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>microservices</category>
    </item>
    <item>
      <title>🚀 How to Use JavaScript Custom Events 🔥 (and Why You Need Them)</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Wed, 02 Oct 2024 15:52:06 +0000</pubDate>
      <link>https://forem.com/tadeubdev/how-to-use-javascript-custom-events-and-why-you-need-them-okg</link>
      <guid>https://forem.com/tadeubdev/how-to-use-javascript-custom-events-and-why-you-need-them-okg</guid>
      <description>&lt;p&gt;Here's the adapted version of your post for dev.to:&lt;/p&gt;

&lt;p&gt;🚀 How to Use JavaScript Custom Events 🔥 (and Why You Need Them)&lt;/p&gt;

&lt;p&gt;Custom events in JavaScript offer a fantastic way to:&lt;/p&gt;

&lt;p&gt;✅ Achieve modularity and reusability&lt;br&gt;
✅ Improve code organization&lt;br&gt;
✅ Facilitate communication between components&lt;br&gt;
✅ Simplify data transfer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;br&gt;
Imagine you’re working on a vanilla JS store website with separate components like a product list, shopping cart, and notification system. Using custom events can help these components communicate efficiently when a product is added to the cart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;br&gt;
Here’s how you can set up and use a custom event in your JavaScript application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Event listener for handling product added to cart&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;product-added-to-cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;New product added to cart:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Notification: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; has been added to your cart.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Dispatching the custom event&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CustomEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;product-added-to-cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;product&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Green Jacket&lt;/span&gt;&lt;span class="dl"&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Custom Events?&lt;/strong&gt;&lt;br&gt;
Custom events simplify communication between separate parts of your application. For example, when a product is added to the cart, you might want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update the shopping cart&lt;/li&gt;
&lt;li&gt;Notify the user&lt;/li&gt;
&lt;li&gt;Update the product stock&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custom events allow you to handle all these tasks without tight coupling between components, making your code more modular and maintainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Do You Think?&lt;/strong&gt;&lt;br&gt;
Have you used custom events in your JavaScript projects? Share your experience in the comments below! 👇&lt;/p&gt;




&lt;p&gt;Photograph by &lt;a href="https://unsplash.com/pt-br/@afgprogrammer?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Mohammad Rahmani&lt;/a&gt; on &lt;a href="https://unsplash.com/pt-br/fotografias/monitor-de-computador-de-tela-plana-preta-oXlXu2qukGE?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Balancing Creativity and AI: How to Keep Producing Content</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Tue, 03 Sep 2024 13:01:34 +0000</pubDate>
      <link>https://forem.com/tadeubdev/balancing-creativity-and-ai-how-to-keep-producing-content-52i6</link>
      <guid>https://forem.com/tadeubdev/balancing-creativity-and-ai-how-to-keep-producing-content-52i6</guid>
      <description>&lt;p&gt;Hello everyone! It's been a while since I wrote my last post here. But, in my defense, I got a bunch of responsibilities that made me not write anything.&lt;/p&gt;

&lt;p&gt;I'm listening right now to &lt;a href="https://www.youtube.com/watch?v=UrX52BAls34" rel="noopener noreferrer"&gt;ShalomTeck, PuffT - Feeling (Rádio Apolo)&lt;/a&gt; and thinking about this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First of all&lt;/strong&gt;&lt;br&gt;
To me, producing content on the internet is something great if you want to improve your skills, even forces your brain to learn some subjects deeply.&lt;/p&gt;

&lt;p&gt;As you know, I'm a software developer, and a subject that I love to learn and talk about is Technology. So, I'd write some posts about programming and related content. All of this before AI came and changed our lives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0dukiye1lhgy3slu1nym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0dukiye1lhgy3slu1nym.png" alt="MEME: AI everywhere" width="500" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI in our daily routine&lt;/strong&gt;&lt;br&gt;
Yesterday someone asked me: How much do you use AI. So I've answered: In the morning, in the afternoon, and at night haha. Seriously, It's a part of my life now. And how can I use it to help me producing content?&lt;/p&gt;

&lt;p&gt;Everyone knows that it's possible to generate an entire post. An example using &lt;a href="https://www.perplexity.ai/" rel="noopener noreferrer"&gt;perplexity.ai&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Maximizing AI in Content Creation&lt;/strong&gt;&lt;br&gt;
AI is a powerful tool for enhancing content creation. It helps writers generate ideas, draft articles, and refine their writing. Start by identifying your audience and content type, such as blogs or social media posts. Tools like GPT-3 can assist with brainstorming and outlining while optimizing for SEO to expand your reach. By combining human creativity with AI efficiency, you can produce engaging and impactful content.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As I said, I use those tools in my entire day, but for me you can be more productive or even growing up more using those tools to help you than using it to produce the entire content.&lt;/p&gt;

&lt;p&gt;For example, English is my second language (as you can imagine reading this post), I could use AI to generate I post in English. But instead, using it to help me correct some mistakes or creating an image or even giving me ideas, is better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's all&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As I said, for me, it's better keeping the majority of the content with my ideias and my brain and using the tools just as a copilot than using it for generating entire content. Even commiting some mistakes or something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And about you?&lt;/strong&gt;&lt;br&gt;
What do you think about it? Let me know!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>contentwriting</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Unlocking the Power of AI: My Journey Begins</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Fri, 29 Mar 2024 14:57:30 +0000</pubDate>
      <link>https://forem.com/tadeubdev/unlocking-the-power-of-ai-my-journey-begins-g6a</link>
      <guid>https://forem.com/tadeubdev/unlocking-the-power-of-ai-my-journey-begins-g6a</guid>
      <description>&lt;p&gt;Hi guys! It's being a long time since my last post. But, recently a friend of mine, &lt;a href="https://medium.com/@thiagoa_martins" rel="noopener noreferrer"&gt;Thiago&lt;/a&gt; (follow and read his posts too ;D ), that recently began writing, brought me some inspiration to start writing again.&lt;/p&gt;

&lt;p&gt;While I write this, I'm listening to: &lt;a href="https://www.youtube.com/watch?v=Bi11Iid2hmo" rel="noopener noreferrer"&gt;YearMix 2020 - Progressive House by Miss Monique&lt;/a&gt; on Youtube.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A bit of history&lt;/strong&gt;&lt;br&gt;
Since ChatGPT was introduced in 2022, there's nothing else that the people are talking about. I know that OpenAI brought a lot of technology that no one was expecting at that moment.&lt;/p&gt;

&lt;p&gt;Maybe all of the 'big techs' like Google, Microsoft, X, and others were scared because they didn't have a ready product to compete. Even if they owned a lot of data to make one, or they owned enough technology, OpenAI came out ahead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fpyuww9sy3gr2cjjue22x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fpyuww9sy3gr2cjjue22x.gif" alt="Jim Carrey typing fast" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's talk about coding&lt;/strong&gt;&lt;br&gt;
Since Chat GPT was released, I began using it. Sometime later, when &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;Github Copilot&lt;/a&gt; was released, I became one of the paying users. AI is part of my developer tools.&lt;/p&gt;

&lt;p&gt;A couple of times ago, with a client of mine, I created an integration with the &lt;a href="https://openai.com/blog/openai-api" rel="noopener noreferrer"&gt;Open AI Api&lt;/a&gt;. They already owned a chat between employees and consumers, even a chat with a local bot that following some rules, has the capacity to talk with consumers.&lt;/p&gt;

&lt;p&gt;So, I connected AI to this chat bot and thing works like a charm. With my capability to work with AI, I solved some problems and brought some reliability to the chat bot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbvnvvp8inolv11llx00u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbvnvvp8inolv11llx00u.gif" alt="humanoid robot dancing" width="320" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My first "all in AI job"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After all of that context... Some days ago, a company contacted me, they was needing a service to read some uploaded files related with the company, extract some information and finally convert into a content that people can easily understand.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI INPUT&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first thing about AI, is that AI is not "All Powerful Omniscient Machine". You need to prepare the input data. It means that you have to comprehend the data provided from the company and the AI needed input data.&lt;br&gt;
Another important aspect to worry about is the financial issues. You can't create an AI integration without worrying about how much money that integration will cost to the company. Remember that they will pay to each character (or for a certain amount of characters), then the input is very, very important to work in.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI OUTPUT&lt;/em&gt;&lt;br&gt;
The second thing is that, as the input, comprehend the AI output and the company expectations. We can't resolve every human problem with AI, then we need to comprehend what AI can solve and equate the expectation of the company. Then, expectations equalized, we can work on the AI output and create the final product.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;FINAL PRODUCT&lt;/em&gt;&lt;br&gt;
AI can solve a lot of different problems in our world. Therefore, the final product can be totally different for each AI integration. You have to take some tech decisions with the company: "It's really necessary send data to AI each time it was requested? Can we cache the answers to use later?". And things like that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all, Devs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, working with AI involves finding a careful balance between understanding its capabilities and aligning with client expectations.&lt;br&gt;
You need to make the client informed about the data input needing, about the cost (speccially) and the possibilities of AI. &lt;br&gt;
I hope I continue working with AI and writing about it to brought some persperctive to all of AI enthusiasts.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>techjourney</category>
    </item>
    <item>
      <title>[php-curtas] Resolvendo Cors Origins no Lumen</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Fri, 25 Feb 2022 13:53:01 +0000</pubDate>
      <link>https://forem.com/tadeubdev/php-curtas-resolvendo-cors-origins-no-lumen-23ih</link>
      <guid>https://forem.com/tadeubdev/php-curtas-resolvendo-cors-origins-no-lumen-23ih</guid>
      <description>&lt;p&gt;Estou a uma dia tentando resolver um problema no Lumen e, agora que finalmente consegui resolver, resolvi trazer pra vocês!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quem nunca teve problemas com CORS que atire a primeira pedra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois de revirar toda a internet atrás de uma solução, tentar [e falhar miseravelmente] setar os &lt;em&gt;headers&lt;/em&gt; na aplicação e tudo mais que você possa imaginar... Encontrei &lt;a href="https://stackoverflow.com/a/66558429/5278356" rel="noopener noreferrer"&gt;essa resposta no Stak Overflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como resolver:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criei um arquivo chamado &lt;code&gt;CorsMiddleware&lt;/code&gt; dentro do diretório &lt;code&gt;app/Http/Middlewares&lt;/code&gt;, com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Middleware&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CorsMiddleware&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;\Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'OPTIONS'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'HEAD, GET, POST, PUT, PATCH, DELETE'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Request-Headers'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&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;Esse middleware irá retornar 200 caso o método requisitado seja &lt;code&gt;OPTIONS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida basta registar o seu middleware no arquivo &lt;code&gt;bootstrap/app.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt; &lt;span class="nv"&gt;$app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
     &lt;span class="nc"&gt;App\Http\Middleware\CorsMiddleware&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;
 &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Pronto! Agora sua aplicação poderá ser acessada por outras origins.&lt;br&gt;
Espero ter ajudado, até a próxima!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>lumen</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>[mysql curtas] Função case no MySQL</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Mon, 14 Feb 2022 12:00:45 +0000</pubDate>
      <link>https://forem.com/tadeubdev/mysql-curtas-funcao-case-no-mysql-371a</link>
      <guid>https://forem.com/tadeubdev/mysql-curtas-funcao-case-no-mysql-371a</guid>
      <description>&lt;p&gt;Banco de dados não é o meu forte, porém estava estudando sobre o assunto e me deparei com algo novo para mim e queria compartilhar com vocês!&lt;/p&gt;

&lt;p&gt;Como no exemplo da imagem em desataque, pode ser que você precise de uma condicional para verificar, por exemplo, se o salário de um funcionário é abaixo de R$5000, se está entre R$5000 e R$10000 ou acima. Você pode, diretamente pela chamada ao banco de dados, retornar isso para a linguagem que você está utilizando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cargo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;CASE&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;salario&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;"aumento"&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;salario&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;"verificar"&lt;/span&gt;
  &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="nv"&gt;"não aumentar"&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;classificacao&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;empregados&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código trará as colunas: nome, cargo_id, salario e classificação (sendo: "aumento" ou "verificar" ou ainda "não aumentar").&lt;/p&gt;




&lt;p&gt;Bem legal, né?! Aprendi isso aqui e vim trazer para vocês!&lt;br&gt;
Até a próxima!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mysql</category>
      <category>braziliandevs</category>
      <category>sql</category>
    </item>
    <item>
      <title>[php-curtas]: Testando FormRequest no Laravel</title>
      <dc:creator>Tadeu Barbosa</dc:creator>
      <pubDate>Fri, 21 Jan 2022 16:24:52 +0000</pubDate>
      <link>https://forem.com/tadeubdev/php-curtas-testando-formrequest-no-laravel-4ilm</link>
      <guid>https://forem.com/tadeubdev/php-curtas-testando-formrequest-no-laravel-4ilm</guid>
      <description>&lt;p&gt;Há uma maneira de testar que o seu Controller irá receber exatamente o que você precisa, e isso você poderá fazer tanto antes de criar um Request (com TDD), ou após a criação para garantir que nada irá mudar!&lt;/p&gt;

&lt;p&gt;Para testar você vai criar o seu teste normalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Tests\TestCase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateContactRequestTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TestCase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testEnsureAValidIdWilBePassed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&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;Após isso adicione o seguinte método &lt;code&gt;setUp&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nv"&gt;$request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreateContactRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'validator'&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;Adicione também esses dois métodos para validação do Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFieldValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&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="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getFieldValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;passes&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;Por fim, teste os fields que serão passados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testEnsureAValidIdWilBePassed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'any_id'&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;Juntando tudo, teremos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Tests\TestCase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateContactRequestTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TestCase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreateContactRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'validator'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testEnsureAValidIdWilBePassed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'any_id'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFieldValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$field&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="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;validateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getFieldValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;passes&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;Prontinho! :D &lt;br&gt;
Espero ter ajudado! Deixe seu like ;)&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>testing</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
