<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thyago Christian Ramos Martins</title>
    <description>The latest articles on DEV Community by Thyago Christian Ramos Martins (@thyago_martins).</description>
    <link>https://dev.to/thyago_martins</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%2F1153933%2Fd00491ec-90c1-4b2d-90cb-79261abcbf37.jpeg</url>
      <title>DEV Community: Thyago Christian Ramos Martins</title>
      <link>https://dev.to/thyago_martins</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thyago_martins"/>
    <language>en</language>
    <item>
      <title>Como fazer API-REST com Spring</title>
      <dc:creator>Thyago Christian Ramos Martins</dc:creator>
      <pubDate>Tue, 05 Dec 2023 15:39:23 +0000</pubDate>
      <link>https://dev.to/thyago_martins/como-fazer-api-rest-com-spring-3998</link>
      <guid>https://dev.to/thyago_martins/como-fazer-api-rest-com-spring-3998</guid>
      <description>&lt;p&gt;Para podermos fazer esse passo a passo irei usar como base um projeto de TO DO LIST &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esta é uma receitinha de bolo para construções de API&lt;/li&gt;
&lt;li&gt; é importante dizer que mesmo sendo uma receita de bolo, isso são apenas informações basicas,&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Controller
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;th&gt;Second Header&lt;/th&gt;
&lt;th&gt;Third Header&lt;/th&gt;
&lt;th&gt;Fourth  Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@RestController&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@RequestMapping&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@AllArgsConstructor&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@Slf4j&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;th&gt;Second Header&lt;/th&gt;
&lt;th&gt;Third Header&lt;/th&gt;
&lt;th&gt;Fourth  Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @PostMapping&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @ApiOperation&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@ResponseStatus&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @ApiResponses&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;th&gt;Second Header&lt;/th&gt;
&lt;th&gt;Third Header&lt;/th&gt;
&lt;th&gt;Fourth  Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @GetMapping&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt;@PathVariable&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @PutMapping&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="%20"&gt; @DeleteMapping&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
@RestController// this is a controller class
@RequestMapping("/api/v1")// base url
@AllArgsConstructor// lombok annotation for constructor
@Slf4j// lombok annotation for logger
public class TaskController {

    TaskService taskService;

   //primeiro ENDPOINT
   @ApiOperation(value = "Create a task")
           @ApiResponses(value = {
                   @ApiResponse(code = 201, message = "Task created"),
                   @ApiResponse(code = 400, message = "Invalid request"),
                   @ApiResponse(code = 500, message = "Internal server error")
           })

    @PostMapping("/tasks")
    @ResponseStatus(HttpStatus.CREATED)
    public Task createTask(@RequestBody Task task)// @RequestBody annotation is used to bind the request body with a method parameter.
    { log.info("Task created[{}]",task);
        return taskService.createTask(task);
    }
    //SEGUNDO ENDPOINT
    @ApiOperation(value = "Get all tasks")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Task found"),
    })

            @GetMapping("/tasks")
    @ResponseStatus(HttpStatus.OK)
    public List&amp;lt;Task&amp;gt; getAllTasks() {
        return taskService.listAllTasks();
    }

    //TERCEIRO ENDPOINT
    @ApiOperation(value = "Get a task by id")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Task found"),
    })

            @GetMapping("/tasks/{id}")// {id} is a path variable
    @ResponseStatus(HttpStatus.OK)// this annotation is used to set the http status code
    public ResponseEntity&amp;lt;Task&amp;gt; getTaskById(@PathVariable (value = "id") Long id)// @PathVariable annotation is used to bind the path variable with a method parameter.
     { log.info("Task found[{}]",id);
        return taskService.findTaskById(id);
    }

    //QUARTO ENDPOINT
    @ApiOperation(value = "Update a task by id")
        @ApiResponses(value = {
                @ApiResponse(code = 200, message = "Task updated"),
        })


            @PutMapping  ("/tasks/{id}")
    @ResponseStatus(HttpStatus.OK)
    public ResponseEntity&amp;lt;Task&amp;gt; UpdateById(@PathVariable (value = "id")Long id, @RequestBody Task task)
    {log.info("Task updated[{}]",id);
        return taskService.updateTaskId(task,id);
    }

    //QUINTO ENDPOINT
    @ApiOperation(value = "Delete a task by id")
        @ApiResponses(value = {
                @ApiResponse(code = 204, message = "Task deleted") })


            @DeleteMapping("/tasks/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public ResponseEntity&amp;lt;Object&amp;gt; DeleteById(@PathVariable (value = "id") Long id)
    {log.info("Task deleted[{}]",id);
        return taskService.deleteById(id);
    }


}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Model
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Camada de dados &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsavel por onde fica a entidade ( tabela do banco de dados)&lt;/li&gt;
&lt;li&gt;Nome da classe pode ser ou  não criado com o nome do pacote( recomendo que crie com o nome caso ainda esteja aprendendo estrutura de dados e de api)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;@Entity (&lt;a href="https://www.devmedia.com.br/jpa-como-usar-a-anotacao-entity/38410#:~:text=A%20anota%C3%A7%C3%A3o%20%40Entity%20%C3%A9%20utilizada,desse%20tipo%20poder%C3%A3o%20ser%20persistidos."&gt;Clique aqui para relembrar o que é&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;@Table (&lt;a href="https://www.geeksforgeeks.org/spring-data-jpa-table-annotation/"&gt;Clique aqui para relembrar o que é&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;@Getter e &lt;a class="mentioned-user" href="https://dev.to/setter"&gt;@setter&lt;/a&gt; (&lt;a href="https://projectlombok.org/features/GetterSetter"&gt;Clique aqui para relembrar o que é&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;@ToString (&lt;a href="https://www.baeldung.com/lombok-tostring"&gt;Clique aqui para relembrar o que é&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Catalago&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;th&gt;Second Header&lt;/th&gt;
&lt;th&gt;Third Header&lt;/th&gt;
&lt;th&gt;Fourth  Header&lt;/th&gt;
&lt;th&gt;Fifth Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.devmedia.com.br/jpa-como-usar-a-anotacao-id/38508"&gt;@Id&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.devmedia.com.br/jpa-como-usar-a-anotacao-generatedvalue/38592"&gt;@GeneratedValue&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.geeksforgeeks.org/spring-data-jpa-column-annotation/"&gt;@Column&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.baeldung.com/hibernate-creationtimestamp-updatetimestamp"&gt;@CreationTimestamp&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.baeldung.com/hibernate-creationtimestamp-updatetimestamp"&gt;@UpdateTimestamp&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Task { public class Task { ... }: estamos definindo a classe Task, que provavelmente
contém informações sobre uma tarefa no sistema.) 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private  Long id;

    @Column(nullable = false)
    private String title;

    @CreationTimestamp
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @UpdateTimestamp
    @Column(name = "updated_at")
    private  LocalDateTime updatedAt;

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Repository
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Interface &lt;/li&gt;
&lt;li&gt;taskRepository&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.gasparbarancelli.com/post/anotacao-repository-em-projetos-spring-entenda-sua-importancia-e-beneficios#:~:text=A%20anota%C3%A7%C3%A3o%20%40Repository%20%C3%A9%20utilizada,%C3%A9%20um%20reposit%C3%B3rio%20de%20dados"&gt;@Repository&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Repository
public interface TaskRepository extends JpaRepository&amp;lt;Task(Model), Long(tipo da chave primaria)&amp;gt; {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Service
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Header&lt;/th&gt;
&lt;th&gt;Second Header&lt;/th&gt;
&lt;th&gt;Third Header&lt;/th&gt;
&lt;th&gt;Fourth  Header&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.geeksforgeeks.org/spring-service-annotation-with-example/"&gt;@Service&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://projectlombok.org/features/constructor"&gt;@AllArgsConstructor&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://projectlombok.org/api/lombok/RequiredArgsConstructor"&gt;@RequiredArgsConstructor&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.baeldung.com/spring-autowire"&gt; @Autowired&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Service
@AllArgsConstructor
public class TaskService {


    private TaskRepository taskRepository;

    public Task(model) createTask(Task(model) task) {
        return taskRepository.save(task);
    }

    public List&amp;lt;Task&amp;gt; listAllTasks() {
        return taskRepository.findAll();
    }

    public ResponseEntity&amp;lt;Task&amp;gt; findTaskById(Long id) {
        return taskRepository.findById(id).map(task -&amp;gt; ResponseEntity.ok().body(task)).orElse(ResponseEntity.notFound().build());
    }

    public ResponseEntity&amp;lt;Task&amp;gt; updateTaskId(Task task, Long id) {
        return taskRepository.findById(id)
                .map(taskToUpdate -&amp;gt; {
                    taskToUpdate.setTitle(task.getTitle());
                    taskToUpdate.setDescription(task.getDescription());
                    taskToUpdate.setDeadLine(task.getDeadLine());
                    Task updated = taskRepository.save(taskToUpdate);
                    return ResponseEntity.ok().body(updated);
                }).orElse(ResponseEntity.notFound().build());
    }

    public ResponseEntity&amp;lt;Object&amp;gt; deleteById (Long id ) {
        return taskRepository.findById(id)
                .map(taskToDelete -&amp;gt; {
                    taskRepository.deleteById(id);
                    return ResponseEntity.noContent().build();
                }).orElse(ResponseEntity.notFound().build());
    }
    }


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: Em diferentes design pattern o Swagger fica na pasta DOCS ou CONFIGURATION, aqui deixarei como DOCS por estar fazendo o projeto &lt;/p&gt;

</description>
      <category>api</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
