<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>STS - Service e Security by </title>
      <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7</link>
      <description>Estrutura </description>
      <language>en-us</language>
      <pubDate>2022-03-14 19:46:03 UTC</pubDate>
      <lastBuildDate>2022-03-15 14:58:15 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url></url>
      </image>
      <item>
         <title>BasicSecurityConfig </title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094577373</link>
         <description><![CDATA[<div><strong><em>Classe BasicSecurityConfig<br></em></strong><br>Esta classe é responsável por habilitar a segurança básica da aplicação e o login na aplicação.<br><br>Para habilitar a segurança HTTP no Spring, precisamos extender (herdar) a&nbsp; Classe WebSecurityConfigurerAdapter para fornecer uma configuração padrão no método configure (HttpSecurity http)<br><br>A configuração padrão garante que qualquer requisição enviada para a API seja autenticada com login baseado em formulário ou autenticação via Browser.<br><br>Para personalizar a autenticação utilizaremos a sobrecarga dos métodos da Classe WebSecurityConfigurerAdapter<br>____________________________________<br><br><strong><em>@EnableWebSecurity</em></strong>: <br>A annotation <strong><em>@</em></strong><em>EnableWebSecurity</em><strong>: </strong>habilita a configuração de segurança padrão do Spring Security na nossa api.<br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@EnableWebSecurity<br>&nbsp; &nbsp; &nbsp;public class BasicSecurityConfig extends <br>&nbsp; &nbsp; &nbsp;WebSecurityConfigurerAdapter { <br></em>____________________________________<br><em><br></em><strong><em>@Autowired</em></strong><em><br></em>A annotation <em>@Autowired</em> insere uma Injeção de Dependência. <br><br>Como iremos utilizar os usuários salvos no nosso Banco de dados, na tabela tb_usuarios, para efetuar o login na api precisamos injetar um objeto da Interface UserDetailsService que será implementada na Classe UserDetailsServiceImpl que fará o acesso ao nosso Banco de dado para recuperar os dados do usuário.<br><br> EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Autowired<br>&nbsp; &nbsp; &nbsp; private UserDetailsService userDetailsService;</em><br>&nbsp; ____________________________________<br><br><strong><em>@Override</em></strong> <br>Sobrescreve (<em>@Override</em>) o primeiro método Configure, que tem a função de criar uma nova instância da Classe AuthenticationManagerBuilder e define que o login será efetuado através dos usuários criados no Banco de dados.<br>Para recuperar os dados do usuário no Banco de Dados utilizaremos a Interface UserDetailsService.<br>Outra alternativa de login seria acriação de um usuário em memória, que veremos nas próximas sessões.<br> <br>O método é do tipo protected por definição da classe.<br><br>Lembrete:<br>1) public: permite acesso a qualquer código externo a classe.<br>2) protected: permite acesso às classes filhas, mas proíbe a qualquer outro acesso externo.<br>3) private: proíbe qualquer acesso externo à própria classe, inclusive das classes filhas.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Override<br>&nbsp; &nbsp; &nbsp; protected void configure(AuthenticationManagerBuilder <br>&nbsp; &nbsp; &nbsp; auth) throws Exception {</em><br>&nbsp; ____________________________________<br><br><strong><em>auth</em></strong><br>O objeto <strong><em>auth </em></strong>registra e cria uma nova instância do objeto userDetailsService da interface UserDetailsService implementada na Classe UserDetailsServiceImpl para recuperar os dados dos usuários gravados no Banco de dados.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp; <em>auth.userDetailsService(userDetailsService);<br><br>&nbsp; &nbsp; &nbsp; auth.inMemoryAuthentication()<br>&nbsp; &nbsp; &nbsp; .withUser("root")<br>&nbsp; &nbsp; &nbsp; .password(passwordEncoder().encode("root"))<br>&nbsp; &nbsp; &nbsp; .authorities("ROLE_USER");</em><br>&nbsp; ____________________________________<br><br><strong><em>@Bean </em></strong><br>A annotation <em>@Bean</em> transforma a instância retornada pelo método como um objeto gerenciado pelo Spring, desta forma, ele pode ser injetado em qualquer classe, a qualquer momento que você precisar sem a necessidade de usar a <br>annotation <em>@Autowired</em><br>&nbsp; <br>O método abaixo é responsável por criptografar a senha do usuário utilizando o método hash Bcrypt.<br><br>EX.: <br>&nbsp; &nbsp; &nbsp; <em>@Bean<br>&nbsp; &nbsp; &nbsp; &nbsp;public PasswordEncoder passwordEncoder() {<br>&nbsp; &nbsp; &nbsp; &nbsp;return new BCryptPasswordEncoder();<br>&nbsp;}</em><br>&nbsp; ____________________________________<br><br> <strong><em>@Override </em></strong><br>Sobrescreve (<em>@Override</em>) o segundo método Configure que é responsável por criar uma instância da Classe HttpSecurity, que permite configurar a segurança baseada na web para solicitações http específicas (endpoints)<br><br>EX.:<br>&nbsp; &nbsp; &nbsp; <em>@Override<br>&nbsp; &nbsp; &nbsp; protected void configure(HttpSecurity http) throws<br>&nbsp; &nbsp; &nbsp; Exception {</em><br> ____________________________________<br><br>antMatchers().permitAll -&gt; Endpoint liberado de autenticação<br> <br>HttpMethod.OPTIONS -&gt; O parâmetro HttpMethod.OPTIONS permite que o cliente (frontend), possa descobrir quais são as opções de requisição permitidas para um determinado recurso em um servidor. Nesta implementação, está sendo liberada todas as opções das requisições através do método permitAll().<br> <br>anyRequest().authenticated() -&gt; Todos os demais endpoints <br>serão autenticados<br><br>httpBasic -&gt; Tipo de autenticação http (Basic Security)<br><br>Http Sessions: As sessões HTTP são um recurso que permite que os servidores da Web mantenham a identidade do usuário e armazenem dados específicos do usuário durante várias interações (request/response) entre um aplicativo cliente e um aplicativo da Web.<br> <br>sessionManagement() -&gt; Cria um gerenciador de Sessões<br><br>sessionCreationPolicy(SessionCreationPolicy.STATELESS) -&gt; Define como o Spring Secuiryt irá criar (ou não) as sessões<br><br>STATELESS -&gt; Nunca será criada uma sessão, ou seja, basta enviar o token através do cabeçalho da requisição que a mesma será processada.<br><br>cors -&gt; O compartilhamento de recursos de origem cruzada (CORS) surgiu porquê os navegadores não permitem solicitações feitas por um domínio (endereço) diferente daquele de onde o site foi carregado. Desta forma o Frontend da aplicação, por exemplo, obrigatoriamente teria que estar no mesmo domínio que o Backend. Habilitando o CORS, o Spring desabilita esta regra e permite conexões de outros domínios.<br><br>CSRF: O cross-site request forgery (falsificação de solicitação entre sites), é um tipo de ataque no qual comandos não autorizados são transmitidos a partir de um usuário em quem a aplicação web confia. <br><br>csrf().disabled() -&gt; Esta opção de proteção é habilitada por padrão no Spring Security, entretanto precisamos desabilitar, caso contrário, todos os endpoints que respondem ao verbo POST não serão executados.<br><br>EX.:<em> <br> http.authorizeRequests()<br>&nbsp; &nbsp;.antMatchers("/usuarios/logar").permitAll()<br>&nbsp; &nbsp;.antMatchers("/usuarios/cadastrar").permitAll()<br>&nbsp; &nbsp;.antMatchers(HttpMethod.OPTIONS).permitAll()<br>&nbsp; &nbsp;.anyRequest().authenticated()<br>&nbsp; &nbsp;.and().httpBasic()<br>&nbsp; &nbsp;.and().sessionManagement()<br>&nbsp; &nbsp;.sessionCreationPolicy(SessionCreationPolicy.STATELESS)<br>&nbsp; &nbsp;.and().cors()<br>&nbsp; &nbsp;.and().csrf().disable();<br>&nbsp; &nbsp;</em>}<br>}&nbsp;</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-14 19:49:47 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094577373</guid>
      </item>
      <item>
         <title>UserDetailsImpl</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094642155</link>
         <description><![CDATA[<div><strong><em>Classe UserDetailsImpl </em></strong><br><br>Implementa a interface UserDetails, que descreve o usuário para o Spring Security,ou seja, detalha as caracteríticas do usuário.<br><br>Por se tratar de uma implementação de uma interface, a classe deve ter em seu nome o sufixo Impl para indicar que se trata de uma implementação.<br><br>As características descritas na interface UserDetails são:<br><br>1) Credenciais do usuário (Username e Password)<br>2) As Autorizações do usuário (o que ele pode e não pode fazer), através da Collection authorities do tipo GrantedAuthority<br>3) As Restrições (isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired() e isEnabled()) da conta do usuário.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>public class UserDetailsImpl implements UserDetails {<br>&nbsp; &nbsp; &nbsp;private static final long serialVersionUID = 1L;<br><br>&nbsp; &nbsp; &nbsp;private String userName;<br>&nbsp; &nbsp; &nbsp;private String password;<br>&nbsp; &nbsp; &nbsp;private List&lt;GrantedAuthority&gt; authorities;<br></em><br>____________________________________<br><br>Método construtor com parâmetros <br><br>Observe que este método Construtor recebe um objeto Usuario e recupera os dados necessários através dos respectivos métodos Get.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>public UserDetailsImpl(Usuario usuario) {<br>&nbsp; &nbsp; &nbsp;this.userName = usuario.getUsuario();<br>&nbsp; &nbsp; &nbsp;this.password = usuario.getSenha();<br>&nbsp; &nbsp; &nbsp;}</em><br>____________________________________<br><br>Método construtor sem parâmetros <br><br>public UserDetailsImpl() { }<br><br> ____________________________________<br><br><strong><em>&nbsp;@Override</em></strong> <br><br>Sobrescreve (@Override) o método que retorna as Autorizações da conta do usuário. Nesta implementação, não há nenhuma autorização negada.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Override<br>&nbsp; &nbsp; &nbsp;public Collection&lt;? extends GrantedAuthority&gt; <br>&nbsp; &nbsp; &nbsp;getAuthorities() {<br>&nbsp; &nbsp; &nbsp;return authorities;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp;public String getPassword() {<br>&nbsp; &nbsp; &nbsp;return password;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp;public String getUsername() {<br><br>&nbsp; &nbsp; &nbsp;return userName;<br>&nbsp; &nbsp; &nbsp;}</em><br> ____________________________________<br><br><strong><em>&nbsp;@Override<br></em></strong><br>Sobrescreve (@Override) o método que Indica se a conta do usuário expirou.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Override<br>&nbsp; &nbsp; &nbsp;public boolean isAccountNonExpired() {<br>&nbsp; &nbsp; &nbsp;return true;<br>&nbsp; &nbsp; &nbsp;}</em><br> ____________________________________<br><br><strong><em>&nbsp;@Override</em></strong><br> Sobrescreve (@Override) o método que Indica se o usuário <br> está bloqueado ou desbloqueado.<br><br> EX.: <br>&nbsp; &nbsp; &nbsp;<em>@Override<br>&nbsp; &nbsp; &nbsp;public boolean isAccountNonLocked() {<br>&nbsp; &nbsp; &nbsp;return true;<br>&nbsp; &nbsp; &nbsp; }</em><br><br> ____________________________________<br><br><strong><em>&nbsp;@Override<br></em></strong><br>Sobrescreve (@Override) o método que indica se as credenciais do usuário (senha) expiraram. <br><br>EX.: <br><em>@Override<br>public boolean isCredentialsNonExpired() {<br>return true;<br>&nbsp;}</em><br><br> ____________________________________<br><br><strong><em>&nbsp;@Override</em></strong><br><br>Sobrescreve (@Override) o método que Indica se o usuário <br> está habilitado ou desabilitado. Se mudar para false nenhum usuário conseguirá logar.<br><br>EX.:<em><br>&nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp;public boolean isEnabled() {<br>&nbsp; &nbsp; &nbsp;return true;<br>&nbsp; &nbsp; &nbsp;}<br>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-14 20:46:40 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094642155</guid>
      </item>
      <item>
         <title>UserDetailsServiceImpl</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094652731</link>
         <description><![CDATA[<div><strong><em>Classe UserDetailsServiceImpl </em></strong><br><br>Implementa a interface UserDetailsService, que é responsável por recuperar os dados do usuário no Banco de Dados pelo usuário e converter em um objeto da Classe <br>UserDetailsImpl.<br><br>Por se tratar de uma implementação de uma interface, a classe deve ter em seu nome o sufixo Impl para indicar que se trata de uma implementação.<br>____________________________________<br><br><strong><em>&nbsp;@Service </em></strong><br><br>A annotation @Service indica que esta é uma Classe de Serviço, ou seja, implementa regras de negócio da aplicação<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Service<br>&nbsp; &nbsp; &nbsp;public class UserDetailsServiceImpl implements<br>&nbsp; &nbsp; &nbsp;UserDetailsService {<br><br>&nbsp; &nbsp; &nbsp;@Autowired<br>&nbsp; &nbsp; &nbsp; private UsuarioRepository userRepository;</em><br>____________________________________ <br><br><strong><em>&nbsp;@Override <br></em></strong><br>Sobrescreve (@Override) o método loadUserByUsername.<br><br>A implementação de autenticação chama o método loadUserByUsername(String username), para obter os dados de um usuário com um determinado nome de usuário. <br>O nome do usuário deve ser único. O usuário retornado por este método é um objeto da classe UserDetailsImpl. <br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Override<br>&nbsp; &nbsp; &nbsp;public UserDetails loadUserByUsername(String&nbsp; <br>&nbsp; &nbsp; &nbsp;userName) throws UsernameNotFoundException {</em><br><br>Para buscar o usuário no Banco de dados, utilizaremos o método findByUsuario, que foi assinado na interface UsuarioRepository<br><br>&nbsp; &nbsp; &nbsp;<em>Optional&lt;Usuario&gt; usuario =<br>&nbsp; &nbsp; &nbsp;userRepository.findByUsuario(userName);</em><br><br>Se o usuário não existir, o método lança uma Exception do tipo UsernameNotFoundException.<br><br>EX.:<br><em>&nbsp; &nbsp; &nbsp; usuario.orElseThrow(() -&gt; new <br>&nbsp; &nbsp;  &nbsp;UsernameNotFoundException(userName + " not <br>      found."));<br></em><br>Retorna um objeto do tipo UserDetailsImpl criado com os dados recuperados do Banco de dados.<br><br>O operador :: faz parte de uma expressão que referencia um método, complementando uma função lambda. Neste exemplo, o operador faz referência ao construtor da Classe UserDetailsImpl. <br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>return usuario.map(UserDetailsImpl::new).get();<br>&nbsp; &nbsp; &nbsp; }<br>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-14 20:56:07 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094652731</guid>
      </item>
      <item>
         <title>Spring Boot Starter Security </title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094654691</link>
         <description><![CDATA[<div>No arquivo pom.xml, btão direito e add status: incluir dependencia da Spring Security e avançar &gt; adicionar &gt; finish, aguardar baixar as dependências. Somente com isso ele ja tranca a app toda. Quando você da PLAY no spring ele já gera um password no console e quando vou acessar a URL no localhost:8080/hello, ele redirecionar automaticamente para usuario e senha.<br><br><br>&lt;dependency&gt;<br>&nbsp;&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br>&nbsp;&lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt;<br>&lt;/dependency&gt;&nbsp;</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-14 20:58:06 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094654691</guid>
      </item>
      <item>
         <title> Commons-codec </title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094655183</link>
         <description><![CDATA[<div><strong><em>Codificação do Token</em></strong><br><br>No mvnrepository.com você encontra esta dependência. <a href="https://mvnrepository.com/artifact/commons-codec/commons-codec/1.15">https://mvnrepository.com/artifact/commons-codec/commons-codec/1.15<br></a><br></div><div>O commons code nada mais é do que o Usuario, seguido de dois pontos + a senha. Codifica em 64 bits. Essa sequencia de palavra é seguida de Basic e espaço entre a palavra Basic e o token. Ex: <em>Basic ZW1haWxAZ9hGosluY<br></em><br></div><div><strong>IMPORTANTE: o código do pom.xml precisa estar com a identação alinhadissima, senao nao baixa as dependencias.&nbsp;<br></strong><br></div><div>Os <strong>filtros </strong>(15 filtros) são responsáveis por trancar a aplicação, e a partir da implemenntação você seleciona quais de fato serão utilizados na app do blog pessoal.&nbsp;<br><br></div><div>&lt;dependency&gt;<br>&nbsp;&lt;groupId&gt;commons-codec&lt;/groupId&gt;<br>&nbsp;&lt;artifactId&gt;commons-codec&lt;/artifactId&gt;<br>&lt;/dependency&gt;&nbsp;</div>]]></description>
         <enclosure url="https://mvnrepository.com/artifact/commons-codec/commons-codec/1.15" />
         <pubDate>2022-03-14 20:58:31 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094655183</guid>
      </item>
      <item>
         <title>Link Add Dependências</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094666730</link>
         <description><![CDATA[<div>https://mvnrepository.com/</div>]]></description>
         <enclosure url="https://mvnrepository.com/" />
         <pubDate>2022-03-14 21:10:07 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094666730</guid>
      </item>
      <item>
         <title>UsuarioService</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094718746</link>
         <description><![CDATA[<div>A Classe UsuarioService implementa as regras de negócio do Recurso Usuario.<br><br>Regras de negócio são as particularidades das funcionalidades a serem implementadas no objeto, tais como:<br><br>1) O Usuário não pode estar duplicado no Banco de dados<br>2) A senha do Usuario deve ser criptografada<br><br>Observe que toda a implementação dos metodos Cadastrar, Atualizar e Logar estão implmentadas na classe de serviço, enquanto a Classe Controller se limitará a checar a resposta da requisição.<br>____________________________________ <br><br><strong><em>&nbsp;@Service </em></strong><br><br>&nbsp;A Anotação @Service indica que esta é uma Classe de Serviço, ou seja, implementa todas regras de negócio do Recurso Usuário.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@Service<br>&nbsp; &nbsp; &nbsp;public class UsuarioService {</em><br><br>&nbsp; &nbsp; &nbsp;<em>@Autowired<br>&nbsp; &nbsp; &nbsp;private UsuarioRepository usuarioRepository;<br></em><br>&nbsp;____________________________________ <br>&nbsp;<br><strong><em>Cadastrar Usuário</em></strong><br><br>Checa se o usuário já existe no Banco de Dados através do método findByUsuario, porquê não pode existir 2 usuários com o mesmo email. <br>Se não existir retorna um Optional vazio.<br><br>isPresent() -&gt; Se um valor estiver presente retorna true, caso contrário retorna false.<br><br>empty -&gt; Retorna uma instância de Optional vazia.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>public Optional&lt;Usuario&gt; cadastrarUsuario(Usuario <br>&nbsp; &nbsp; &nbsp;usuario) {<br></em><br>&nbsp; &nbsp; &nbsp; &nbsp; <em>if (usuarioRepository.findByUsuario(usuario.<br>&nbsp; &nbsp; &nbsp; &nbsp;getUsuario()).isPresent())<br>&nbsp; &nbsp; &nbsp; &nbsp;return Optional.empty();<br></em><br>____________________________________ <br><br><strong><em>Cadastrar Usuário maior de 18 anos</em></strong></div><blockquote><strong><em><br>&nbsp; &nbsp; &nbsp;</em></strong>if&nbsp; (usuarioRepository.findByUsuario(usuario.getUsuario()).isPresent())<br>&nbsp; &nbsp; &nbsp;return Optional.empty();<br><br>&nbsp; &nbsp; &nbsp;if (calcularIdade(usuario.getDataNascimento()) &lt; 18)<br>&nbsp; &nbsp; &nbsp;throw new ResponseStatusException(<br>&nbsp; &nbsp; &nbsp;HttpStatus.BAD_REQUEST, "Usuário é menor de 18 anos", null);<br><br>&nbsp;usuario.setSenha(criptografarSenha(usuario.getSenha()));<br>&nbsp; &nbsp; &nbsp;return &nbsp; Optional.ofNullable(usuarioRepository.save(usuario));<br>&nbsp; &nbsp; &nbsp;}&nbsp;</blockquote><div>____________________________________ <br><strong><em>Criptografar Senha. </em></strong><br><br>Se o Usuário não existir no Banco de Dados, a senha será criptografada através do Método criptografarSenha.<br><br>EX:<br>&nbsp; &nbsp; <em>usuario.setSenha(criptografarSenha(usuario.getSenha()));<br></em><br>Assim como na Expressão Lambda, o resultado do método save será retornado dentro de um Optional, com o Usuario persistido no Banco de Dados.<br><br>of​ -&gt; Retorna um Optional com o valor fornecido, mas o valor não pode ser nulo.&nbsp; Se não tiver certeza de que o valor não é nulo use ofNullable.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>return Optional.of(usuarioRepository.save(usuario));</em><br><em>&nbsp; &nbsp; &nbsp;}<br></em>____________________________________&nbsp; <br><br><strong><em>Atualizar Usuário</em></strong><br><br>Checa se o usuário já existe no Banco de Dados através do método findById, porquê não é possíve atualizar 1 usuário inexistente. <br>Se não existir retorna um Optional vazio.<br> <br>isPresent() -&gt; Se um valor estiver presente retorna true, caso contrário retorna false.<br><br>EX.: <br>&nbsp; <em>public Optional&lt;Usuario&gt; atualizarUsuario(Usuario usuario) {<br><br>&nbsp; &nbsp; if(usuarioRepository.findById(usuario.getId()).isPresent()) <br>&nbsp; &nbsp; {</em><br><br>Cria um Objeto Optional com o resultado do método findById<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>Optional&lt;Usuario&gt; buscaUsuario =&nbsp; &nbsp; &nbsp; usuarioRepository.findByUsuario(usuario.getUsuario());<br></em><br><br>Se o Usuário existir no Banco de dados e o Id do Usuário encontrado no Banco for diferente do usuário do Id do Usuário enviado na requisição, a Atualização dos dados do Usuário não pode ser realizada.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>if ( (buscaUsuario.isPresent()) &amp;&amp; (&nbsp; buscaUsuario.get().getId() != usuario.getId()))<br>throw new ResponseStatusException(<br>&nbsp; &nbsp; &nbsp;HttpStatus.BAD_REQUEST, "Usuário já existe!", null);<br></em><br>Se o Usuário existir no Banco de Dados e o Id for o mesmo, a senha será criptografada através do Método criptografarSenha.<br><br>EX.:<br>&nbsp; &nbsp; <em>usuario.setSenha(criptografarSenha(usuario.getSenha()));</em><br><br>Assim como na Expressão Lambda, o resultado do método save será retornado dentro de um Optional, com o Usuario persistido no Banco de Dados ou um Optional vazio, caso aconteça algum erro.<br><br>ofNullable​ -&gt; Se um valor estiver presente, retorna um Optional com o valor,&nbsp; caso contrário, retorna um Optional vazio.<br><br>EX.:<br><em>&nbsp; &nbsp; &nbsp;return Optional.<br>&nbsp; &nbsp; &nbsp;ofNullable(usuarioRepository.save(usuario))<br>&nbsp; &nbsp; &nbsp;}</em><br> <br>empty -&gt; Retorna uma instância de Optional vazia, caso o usuário não seja encontrado.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>return Optional.empty();</em><br><br> }&nbsp;<br> ____________________________________ &nbsp;<br><br></div><blockquote><strong><em>Atualizar Usuário (maior de 18 anos)<br><br>&nbsp; &nbsp; &nbsp;</em></strong>public Optional&lt;Usuario&gt; atualizarUsuario(Usuario usuario) {<br> if(usuarioRepository.findById(usuario.getId()).isPresent()) {<br><br>     Optional&lt;Usuario&gt; buscaUsuario = usuarioRepository.findByUsuario(usuario.getUsuario());<br><br>     if ( (buscaUsuario.isPresent()) &amp;&amp; ( buscaUsuario.get().getId() != usuario.getId()))<br>     throw new ResponseStatusException(<br>     HttpStatus.BAD_REQUEST, "Usuário já existe!", null);<br><br>     if (calcularIdade(usuario.getDataNascimento()) &lt; 18)<br>     throw new ResponseStatusException(<br>     HttpStatus.BAD_REQUEST, "Usuário é menor de 18  anos", null);<br><br>&nbsp;usuario.setSenha(criptografarSenha(usuario.getSenha()));<br>     return Optional.ofNullable(usuarioRepository.save(usuario));<br>     &nbsp;}<br>    return Optional.empty();<br>}&nbsp;</blockquote><div>____________________________________ <br><br><strong><em>Autenticar Usuario </em></strong><br><br>A principal função do método autenticarUsuario, que é executado no endpoint logar, é gerar o token do usuário codificado em Base64. O login prorpiamente dito é executado pela BasicSecurityConfig em conjunto com as classes UserDetailsService e Userdetails<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>public Optional&lt;UsuarioLogin&gt;&nbsp; autenticarUsuario(Optional&lt;UsuarioLogin&gt; usuarioLogin) {</em><br><br>Cria um objeto Optional do tipo Usuario para receber o resultado do método findByUsuario().<br><br>Observe que o método autenticarUsuario recebe como parâmetro um objeto da Classe UsuarioLogin, ao invés de Usuario. <br><br>get() -&gt; Se um valor estiver presente no objeto ele retorna o valor, caso contrário lança uma Exception NoSuchElementException. Então para usar get é preciso ter certeza de que o Optional não está vazio.<br>O get() funciona como uma chave que abre o Objeto Optional e permite acessar os Métodos do Objeto encpsulado.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp; <em>Optional&lt;Usuario&gt; usuario = usuarioRepository.findByUsuario(usuarioLogin.get().getUsuario());<br></em><br>Checa se o usuario existe<br><br>EX.: <br>&nbsp; &nbsp; &nbsp;<em>if (usuario.isPresent()) {</em><br><br>Checa se a senha enviada, depois de criptografada, é igual a senha gravada no Banco de Dados, através do Método compararSenhas.<br><br>O Método Retorna verdadeiro se as senhas forem iguais, e falso caso contrário.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>if (compararSenhas(usuarioLogin.get().getSenha(),&nbsp; usuario.get().getSenha())) {</em><br><br>Se as senhas forem iguais, atualiza o objeto usuarioLogin com os dados recuperados do Banco de Dados e insere o Token Gerado através do Método gerarBasicToken.<br>Desta forma, será possível exibir o nome e a foto do usuário no Frontend.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>usuarioLogin.get().setId(usuario.get().getId());<br>&nbsp; &nbsp; &nbsp;usuarioLogin.get().setNome(usuario.get().getNome());<br>&nbsp; &nbsp; &nbsp;usuarioLogin.get().setFoto(usuario.get().getFoto());<br>usuarioLogin.get().setToken(gerarBasicToken(usuarioLogin.get().getUsuario(), usuarioLogin.get().getSenha()));<br>&nbsp; &nbsp; &nbsp; usuarioLogin.get().setSenha(usuario.get().getSenha());<br><br></em>Retorna o objeto usarioLogin atualizado para a classe UsuarioController.<br>A Classe controladora checará se deu tudo certo nesta operação e retornará o status.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>return usuarioLogin;</em><br><br>&nbsp; &nbsp;<em>&nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; } </em><br><br>empty -&gt; Retorna uma instância de Optional vazia, caso o usuário não seja encontrado.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>return Optional.empty();<br><br>}<br><br></em>____________________________________&nbsp;<br><br></div><blockquote><strong>Método</strong> <strong><em>Calcular Idade (maior de 18 anos)<br><br></em></strong>EX.:<strong><em><br>&nbsp; &nbsp; &nbsp; </em></strong><em>private int calcularIdade(LocalDate dataNascimento) {<br><br>&nbsp; &nbsp; &nbsp;return Period.between(dataNascimento, &nbsp; LocalDate.now()).getYears();<br>&nbsp; &nbsp; &nbsp;}&nbsp;</em></blockquote><div>____________________________________ <br><br><strong>Método Criptografar Senhas.</strong><br><br>Instancia um objeto da Classe BCryptPasswordEncoder para criptografar a senha do usuário.<br><br>O método encode retorna a senha criptografada no formato BCrypt. Para mais detalhes, consulte a documentação do BCryptPasswordEncoder.<br> <br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>private String criptografarSenha(String senha) {</em><br><br>&nbsp; &nbsp; &nbsp; &nbsp; <em>BCryptPasswordEncoder encoder = new &nbsp; BCryptPasswordEncoder();</em><br>&nbsp; &nbsp; &nbsp; <em>return encoder.encode(senha);<br>&nbsp;}<br><br></em>____________________________________ <br><br><strong>Método Comparar Senhas.</strong><br><br>Checa se a senha enviada, depois de criptografada, é igual a senha gravada no Banco de Dados.<br><br>Instancia um objeto da Classe BCryptPasswordEncoder para comparar a senha do usuário com a senha gravad no Banco de dados.<br><br>matches -&gt; Verifca se a senha codificada obtida do banco de dados corresponde à senha enviada depois que ela também for codificada. Retorna verdadeiro se as <br>senhas coincidem e falso se não coincidem. <br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>private boolean compararSenhas(String senhaDigitada, String senhaBanco) {</em><br>&nbsp; &nbsp; &nbsp;<em>BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();</em><br>&nbsp; &nbsp; &nbsp;return encoder.matches(senhaDigitada, senhaBanco);<em><br> }</em><br><br>____________________________________ <br><br><strong>Método Gerar Basic Token</strong><br><br>A primeira linha, monta uma String (token) seguindo o padrão Basic, através&nbsp; da concatenação de caracteres que será codificada (Não criptografada) no formato Base64, através da Dependência Apache Commons Codec. <br><br>Essa String tem o formato padrão: &lt;username&gt;:&lt;password&gt; que não pode ser alterado<br><br>Na segunda linha, faremos a codificação em Base 64 da String. <br> <br>Observe que o vetor tokenBase64 é do tipo Byte para receber o resultado da codificação, porquê durante o processo é necessário trabalhar diretamente com os bits (0 e 1) da String<br><br>Base64.encodeBase64 -&gt; aplica o algoritmo de codificação do Código Decimal para Base64, que foi gerado no próximo método. Para mais detalhes, veja Codificação 64 bits na <br>Documentação.<br><br>Charset.forName("US-ASCII") -&gt; Retorna o codigo ASCII (formato Decimal) de cada caractere da String. Para mais detalhes, veja a Tabela ASCII na Documentação.<br><br>Na terceira linha, acrescenta a palavra Basic acompanhada de um espaço em branco (Obrigatório), além de converter o vetor de Bytes novamente em String e concatenar tudo em uma única String.<br> <br>O espaço depois da palavra Basic é obrigatório. Caso não seja inserrido, o Token não será reconhecido.<br><br>EX.:<br><em>private String gerarBasicToken(String usuario, String senha) {</em><br>&nbsp; &nbsp; S<em>tring token = usuario + ":" + senha;<br>&nbsp; &nbsp; &nbsp;byte[] tokenBase64 = Base64.encodeBase64(token.getBytes(Charset.forName("US-ASCII")));<br>&nbsp; &nbsp; &nbsp;return "Basic " + new String(tokenBase64);<br>&nbsp; &nbsp; &nbsp; &nbsp;}<br>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-14 22:11:13 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2094718746</guid>
      </item>
      <item>
         <title>Usuario</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095951115</link>
         <description><![CDATA[<div>&nbsp; &nbsp; &nbsp;<em>@Entity<br>&nbsp; &nbsp; &nbsp;@Table(name = "tb_usuarios")<br>&nbsp; &nbsp; &nbsp;public class Usuario {<br><br>&nbsp; &nbsp; &nbsp;@Id<br>&nbsp; &nbsp; &nbsp;@GeneratedValue(strategy = GenerationType.IDENTITY)<br>&nbsp; &nbsp; &nbsp;private Long id;<br><br>&nbsp; &nbsp; &nbsp;@NotNull(message = "O atributo Nome é Obrigatório!")<br>&nbsp; &nbsp; &nbsp;private String nome;<br><br>&nbsp; &nbsp; &nbsp;@NotNull(message = "O atributo Usuário é Obrigatório!")<br>&nbsp; &nbsp; &nbsp;@Email(message = "O atributo Usuário deve ser um email válido!")<br>&nbsp; &nbsp; &nbsp;private String usuario;</em><br><br>A anotação @Size está definida apenas com o valor min<br>porque ao criptografar a senha a mesma terá uma tamanho<br>muito maior (em numero de caracteres) do que a senha<br>não ciptografada.<br><br>Exemplo: admin123 -&gt; 8 caracteres<br>admin123 criptografado -&gt; 60 caracteres<br> <br>A anotação @NotBlank indica que o atributo não deve ser<br>nulo e/ou conter espaços em branco.<br><em><br>&nbsp; &nbsp; @NotBlank(message = "O atributo Senha é Obrigatório!")<br>&nbsp; &nbsp; @Size(min = 8, message = "A Senha deve ter no mínimo 8 &nbsp; caracteres")<br>&nbsp; &nbsp; &nbsp;private String senha;<br><br>&nbsp; &nbsp; &nbsp;private String foto;<br><br></em>A anotação @Column indica o nome que o atributo terá no Banco de dados<br>A anotação @JsonFormat formata a data para o mesmo padrão do MySQL<br><br>&nbsp; &nbsp; &nbsp;<em>@Column(name = "data_nascimento")<br>&nbsp; &nbsp; &nbsp;@JsonFormat(pattern = "yyyy-MM-dd")<br>&nbsp; &nbsp; &nbsp;@NotNull(message = "O atributo Data de Nascimento é Obrigatório!")<br>&nbsp; &nbsp; &nbsp;private LocalDate dataNascimento; <br></em><br>CascadeType.REMOVE -&gt; Ele propaga a operação de remoção de um objeto Pai para um objeto Filho. <br>Apenas quando remover a Entidade Usuario, também será removida todas as entidades <br>Postagens associadas. Nas demais operações não haverá a propagação.<br><br>CascadeType.ALL -&gt; Ele propaga todas a operações (Inserir, Listar, Atualizar e Apagar) de um objeto Pai para um objeto Filho. <br><br>&nbsp; &nbsp; &nbsp;<em>@OneToMany(mappedBy = "usuario", cascade =&nbsp; &nbsp; &nbsp;CascadeType.REMOVE)<br>&nbsp; &nbsp; &nbsp;@JsonIgnoreProperties("usuario")<br>&nbsp; &nbsp; &nbsp;private List&lt;Postagem&gt; postagem;<br><br>&nbsp; &nbsp; &nbsp;public Long getId() {<br>&nbsp; &nbsp; &nbsp;return id;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp; public void setId(Long id) {<br>&nbsp; &nbsp; &nbsp;this.id = id;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public String getNome() {<br>&nbsp; &nbsp; &nbsp;return nome;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setNome(String nome) {<br>&nbsp; &nbsp; &nbsp;this.nome = nome;<br>&nbsp; &nbsp; &nbsp;}&nbsp;<br><br>&nbsp; &nbsp; &nbsp;public String getUsuario() {<br>&nbsp; &nbsp; &nbsp;return usuario;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setUsuario(String usuario) {<br>&nbsp; &nbsp; &nbsp;this.usuario = usuario;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public String getSenha() {<br>&nbsp; &nbsp; &nbsp;return senha;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setSenha(String senha) {<br>&nbsp; &nbsp; &nbsp;this.senha = senha;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public String getFoto() {<br>&nbsp; &nbsp; &nbsp;return foto;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; public void setFoto(String foto) {<br>&nbsp; &nbsp; this.foto = foto;<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; public LocalDate getDataNascimento() {<br>&nbsp; &nbsp; return dataNascimento;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setDataNascimento(LocalDate&nbsp;<br>&nbsp; &nbsp; &nbsp;dataNascimento) {<br>&nbsp; &nbsp; &nbsp;this.dataNascimento = dataNascimento;<br>&nbsp; &nbsp; &nbsp;}&nbsp;<br><br>&nbsp; &nbsp; &nbsp;public List&lt;Postagem&gt; getPostagem() {<br>&nbsp; &nbsp; &nbsp;return postagem;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setPostagem(List&lt;Postagem&gt; postagem) {<br>&nbsp; &nbsp; &nbsp;this.postagem = postagem;<br>&nbsp; &nbsp; &nbsp;}<br>} &nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 13:25:15 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095951115</guid>
      </item>
      <item>
         <title>UsuarioLogin</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095960247</link>
         <description><![CDATA[<div>A Classe UsuarioLogin não terá nenhuma annotation porque ela não irá gerar uma tabela no Banco de Dados.<br><br>A principal função desta classe é servir de apoio ao processo de login na api.<br>&nbsp;<br>&nbsp; &nbsp; &nbsp;<em>public class UsuarioLogin {<br><br>&nbsp; &nbsp; &nbsp;private Long id;<br><br>&nbsp; &nbsp; &nbsp;private String nome;<br><br>&nbsp; &nbsp; &nbsp;private String usuario;<br><br>&nbsp; &nbsp; &nbsp;private String senha;<br><br>&nbsp; &nbsp; &nbsp;private String foto;<br><br>&nbsp; &nbsp; &nbsp;private LocalDate dataNascimento;&nbsp;<br><br>&nbsp; &nbsp; &nbsp;private String token;<br><br>&nbsp; &nbsp; &nbsp;public Long getId() {<br>&nbsp; &nbsp; &nbsp;return id;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public void setId(Long id) {<br>&nbsp; &nbsp; &nbsp;this.id = id;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public String getNome() {<br>&nbsp; &nbsp; &nbsp;return nome;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setNome(String nome) {<br>&nbsp; &nbsp; &nbsp;this.nome = nome;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public String getUsuario() {<br>&nbsp; &nbsp; &nbsp;return usuario;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public String getToken() {<br>&nbsp; &nbsp; &nbsp;return token;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public void setToken(String token) {<br>&nbsp; &nbsp; &nbsp;this.token = token;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setUsuario(String usuario) {<br>&nbsp; &nbsp; &nbsp;this.usuario = usuario;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public String getSenha() {<br>&nbsp; &nbsp; &nbsp;return senha;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setSenha(String senha) {<br>&nbsp; &nbsp; &nbsp;this.senha = senha;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public String getFoto() {<br>&nbsp; &nbsp; &nbsp;return foto;<br>&nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp;public void setFoto(String foto) {<br>&nbsp; &nbsp; &nbsp;this.foto = foto;<br>&nbsp; &nbsp; &nbsp;}&nbsp;<br><br>&nbsp; &nbsp; &nbsp;public LocalDate getDataNascimento() {<br>&nbsp; &nbsp; &nbsp;return dataNascimento;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;public void setDataNascimento(LocalDate dataNascimento) {<br>&nbsp; &nbsp; &nbsp;this.dataNascimento = dataNascimento;<br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp;  public String getToken() {<br>&nbsp; &nbsp; &nbsp;return token;<br>    &nbsp;}<br><br>     public void setToken(String token) {<br>     this.token = token;<br>     }&nbsp;<br>&nbsp; }&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 13:29:16 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095960247</guid>
      </item>
      <item>
         <title>UsuarioRepository</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095966042</link>
         <description><![CDATA[<div>&nbsp; &nbsp; &nbsp;<em>@Repository<br>&nbsp; &nbsp; &nbsp;public interface UsuarioRepository extends JpaRepository&lt;Usuario, Long&gt; {</em><br><br>Método que busca um usuário pelo seu usuario (email).<br><br>select * from tb_usuarios where usuario = "usuario procurado"<br><br>&nbsp; &nbsp; &nbsp;<em>public Optional&lt;Usuario&gt; findByUsuario(String usuario);<br>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 13:31:43 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095966042</guid>
      </item>
      <item>
         <title>ControllerUsuario</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095975615</link>
         <description><![CDATA[<div>&nbsp; &nbsp; &nbsp;<em>@RestController<br>&nbsp; &nbsp; &nbsp;@RequestMapping("/usuarios")<br>&nbsp; &nbsp; &nbsp;@CrossOrigin(origins = "*", allowedHeaders = "*")<br>public class UsuarioController {<br></em><br>Faz uma injeção de dependência da classe de Serviço UsuarioService para ter acesso aos métodos do CRUD com regras de negócio<br><br>EX.:<br>&nbsp; &nbsp;<em>&nbsp; @Autowired<br>&nbsp; &nbsp; &nbsp;private UsuarioService usuarioService;</em><br><br>&nbsp; &nbsp; &nbsp;<em>@Autowired<br>&nbsp; &nbsp; &nbsp;private UsuarioRepository usuarioRepository;<br><br></em>____________________________________ <br><br><strong><em>Buscando todos os Usuario </em></strong><strong><br></strong><em><br>&nbsp; &nbsp; &nbsp;@GetMapping("/all")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity &lt;List&lt;Usuario&gt;&gt; getAll(){<br><br>&nbsp; &nbsp; &nbsp;return ResponseEntity.ok(usuarioRepository.findAll());<br>&nbsp;}<br><br></em>____________________________________ <br><br><strong><em>Buscando Usuario por ID</em></strong><strong><br></strong><em><br>&nbsp; &nbsp; @GetMapping("/{id}")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity&lt;Usuario&gt; getById(@PathVariable Long id) {<br>&nbsp; &nbsp;   return usuarioRepository.findById(id)<br>&nbsp; &nbsp; &nbsp;.map(resposta -&gt; ResponseEntity.ok(resposta))<br>&nbsp; &nbsp; &nbsp;.orElse(ResponseEntity.notFound().build());<br>&nbsp; &nbsp; }<br></em><br>&nbsp;____________________________________ <br><br><strong><em>Fazendo o Login</em></strong><br><br>Executa o método autenticarUsuario da classe de serviço para efetuar o login na api. O método da classe Controladora checa se deu certo e exibe as mensagens (Response Status) pertinentes. <br><br>Caso o login tenha sido bem sucedido, os dados do usuário e o token&nbsp; são exibidos.<br><br>&nbsp; &nbsp; &nbsp;<em>@PostMapping("/logar")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity&lt;UsuarioLogin&gt; login(@RequestBody Optional&lt;UsuarioLogin&gt; usuarioLogin) {<br>&nbsp; &nbsp; &nbsp;return usuarioService.autenticarUsuario(usuarioLogin)<br>&nbsp; &nbsp; &nbsp;.map(resposta -&gt; ResponseEntity.ok(resposta))<br>.orElse(ResponseEntity.status(HttpStatus.UNAUTHORIZED).build());<br>&nbsp;}</em><br><br>____________________________________ <br><br><strong><em>Cadastrando Usuário</em></strong><br><br>Executa o método cadastrarUsuario da classe de serviço para criar um novo usuário na api. O método da classe Controladora checa se&nbsp; deu certo e exibe as mensagens (Response Status) pertinentes. <br> <br>Caso cadastro tenha sido bem sucedido, os dados do usuário são exibidos.<br><br>EX.:<br>&nbsp; &nbsp; &nbsp;<em>@PostMapping("/cadastrar")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity&lt;Usuario&gt; postUsuario(@Valid&nbsp; &nbsp; &nbsp; @RequestBody Usuario usuario) {<br><br>&nbsp; &nbsp; return usuarioService.cadastrarUsuario(usuario)<br>&nbsp; &nbsp; .map(resposta -&gt;&nbsp; &nbsp; ResponseEntity.status(HttpStatus.CREATED).body(resposta))<br>&nbsp;.orElse(ResponseEntity.status(HttpStatus.BAD_REQUEST).build());<br>&nbsp;}</em><br><br> ____________________________________ <br><br><strong><em>Atualizando Usuário<br></em></strong><br>Executa o método atualizarUsuario da classe de serviço para atualizar os dados de um usuário na api. O método da classe Controladora checa se deu certo e exibe as mensagens (Response Status) pertinentes. <br><br>Caso a atualização tenha sido bem sucedida, os dados do usuário atualizados são exibidos.<br><br>EX.:<br>&nbsp; &nbsp; <em>&nbsp;@PutMapping("/atualizar")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity&lt;Usuario&gt; putUsuario(@Valid&nbsp; &nbsp; &nbsp; &nbsp; @RequestBody Usuario usuario) {<br>&nbsp; &nbsp; &nbsp;return usuarioService.atualizarUsuario(usuario)<br>&nbsp; &nbsp; &nbsp; .map(resposta -&gt;<br>&nbsp; &nbsp; &nbsp;ResponseEntity.status(HttpStatus.OK).body(resposta))<br>&nbsp;.orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build());<br>&nbsp; &nbsp; &nbsp;}<br><br></em>&nbsp;____________________________________<br><br><strong><em>Deletando Usuario<br></em></strong><em><br>&nbsp; &nbsp; &nbsp;@DeleteMapping("/{id}")<br>&nbsp; &nbsp; &nbsp;public ResponseEntity&lt;?&gt; deleteUsuario(@PathVariable Long id) {<br>&nbsp; &nbsp; &nbsp;return usuarioRepository.findById(id)<br>&nbsp; &nbsp; &nbsp; .map(resposta-&gt;{<br>&nbsp; &nbsp; &nbsp; usuarioRepository.deleteById(id);<br>&nbsp; &nbsp; &nbsp;return ResponseEntity.status(HttpStatus.NO_CONTENT).build();<br>&nbsp;})<br>&nbsp; &nbsp; &nbsp;.orElse(ResponseEntity.notFound().build());<br>}&nbsp;<br>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 13:36:07 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2095975615</guid>
      </item>
      <item>
         <title>PostagemService (Curtir)</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2096006959</link>
         <description><![CDATA[<div>&nbsp; &nbsp; &nbsp;<em>@Service<br>&nbsp; &nbsp; &nbsp;public class PostagemService {<br><br>&nbsp; &nbsp; &nbsp;@Autowired<br>&nbsp; &nbsp; &nbsp;private PostagemRepository postagemRepository;<br><br></em>Método Curtir -&gt; Soma 1 ao atributo curtir<em><br><br>&nbsp; &nbsp; &nbsp;public Optional&lt;Postagem&gt; curtir(Long id) {<br><br>&nbsp; &nbsp; &nbsp; if(postagemRepository.existsById(id)) {<br><br>&nbsp; &nbsp; &nbsp;Postagem postagem = postagemRepository.findById(id).get();<br><br>&nbsp; &nbsp; &nbsp; postagem.setCurtir(postagem.getCurtir() + 1);<br><br>&nbsp; &nbsp; &nbsp;return Optional.of(postagemRepository.save(postagem));<br><br>&nbsp; &nbsp; &nbsp;}<br><br>&nbsp; &nbsp; &nbsp;return Optional.empty();<br><br>&nbsp; &nbsp; &nbsp;}<br> }&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 13:49:49 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2096006959</guid>
      </item>
      <item>
         <title>PostagemController (Curtir)</title>
         <author>giuliarafa</author>
         <link>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2096068482</link>
         <description><![CDATA[<div>&nbsp; &nbsp; &nbsp;<em>@PutMapping("/curtir/{id}")<br>     public ResponseEntity&lt;Produto&gt; curtirProdutoId      (@PathVariable Long id){<br><br>     return produtoService.curtir(id)<br>&nbsp;    .map(resposta-&gt; ResponseEntity.ok(resposta))<br>&nbsp;    .orElse(ResponseEntity.badRequest().build());<br><br>    &nbsp;}</em><br><em>}&nbsp;</em></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-15 14:16:05 UTC</pubDate>
         <guid>https://padlet.com/giuliarafa/uo6hx7shsw4avul7/wish/2096068482</guid>
      </item>
   </channel>
</rss>
