diff --git a/Documents/CaptThibault_rapport_projet_semestre.docx b/Documents/CaptThibault_rapport_projet_semestre.docx index b64afa97f0eaa8b5c524f7dc4c742c5e8a6eb28f..ef91bb36c1bca2f6bf806f0d47f7fd92d019286b 100644 Binary files a/Documents/CaptThibault_rapport_projet_semestre.docx and b/Documents/CaptThibault_rapport_projet_semestre.docx differ diff --git a/todo-workspace/backend/pom.xml b/todo-workspace/backend/pom.xml index 1b2347478b45562a3420e4603ce85687ac0cea99..0d97912040a6e37b9011a189b1efbd3c1537aa35 100755 --- a/todo-workspace/backend/pom.xml +++ b/todo-workspace/backend/pom.xml @@ -1,147 +1,152 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.4.2</version> - <relativePath/> <!-- lookup parent from repository --> - </parent> - <groupId>com.hepia</groupId> - <artifactId>backend</artifactId> - <version>0.0.1-SNAPSHOT</version> - <name>todo</name> - <description>API Rest for todo's list</description> - <url/> - <licenses> - <license/> - </licenses> - <developers> - <developer/> - </developers> - <scm> - <connection/> - <developerConnection/> - <tag/> - <url/> - </scm> - <properties> - <java.version>17</java.version> - </properties> - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-docker-compose</artifactId> - <scope>runtime</scope> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.security</groupId> - <artifactId>spring-security-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>junit-jupiter</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-testcontainers</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>postgresql</artifactId> - <scope>test</scope> - </dependency> - </dependencies> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>3.4.2</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + <groupId>com.hepia</groupId> + <artifactId>backend</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>todo</name> + <description>API Rest for todo's list</description> + <url/> + <licenses> + <license/> + </licenses> + <developers> + <developer/> + </developers> + <scm> + <connection/> + <developerConnection/> + <tag/> + <url/> + </scm> + <properties> + <java.version>17</java.version> + </properties> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-docker-compose</artifactId> + <scope>runtime</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-testcontainers</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>postgresql</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> + <version>2.8.5</version> + </dependency> + </dependencies> - <build> - <finalName>todoapi</finalName> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <annotationProcessorPaths> - <path> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </path> - </annotationProcessorPaths> - </configuration> - </plugin> - <plugin> - <groupId>org.asciidoctor</groupId> - <artifactId>asciidoctor-maven-plugin</artifactId> - <version>2.2.1</version> - <executions> - <execution> - <id>generate-docs</id> - <phase>prepare-package</phase> - <goals> - <goal>process-asciidoc</goal> - </goals> - <configuration> - <backend>html</backend> - <doctype>book</doctype> - </configuration> - </execution> - </executions> - <dependencies> - <dependency> - <groupId>org.springframework.restdocs</groupId> - <artifactId>spring-restdocs-asciidoctor</artifactId> - <version>${spring-restdocs.version}</version> - </dependency> - </dependencies> - </plugin> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <configuration> - <excludes> - <exclude> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </exclude> - </excludes> - </configuration> - </plugin> - </plugins> - </build> + <build> + <finalName>todoapi</finalName> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <groupId>org.asciidoctor</groupId> + <artifactId>asciidoctor-maven-plugin</artifactId> + <version>2.2.1</version> + <executions> + <execution> + <id>generate-docs</id> + <phase>prepare-package</phase> + <goals> + <goal>process-asciidoc</goal> + </goals> + <configuration> + <backend>html</backend> + <doctype>book</doctype> + </configuration> + </execution> + </executions> + <dependencies> + <dependency> + <groupId>org.springframework.restdocs</groupId> + <artifactId>spring-restdocs-asciidoctor</artifactId> + <version>${spring-restdocs.version}</version> + </dependency> + </dependencies> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </build> </project> diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java b/todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java index 60bae092ef90fb7f72cc502736d8617c98b7d840..32d5728e337320dd692312e4161d6d10c606566e 100644 --- a/todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java @@ -24,7 +24,10 @@ public class SecurityConfig { .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(req -> req.requestMatchers( - "/todos/**" + "/todos/**", + "/swagger-ui/**", // Autoriser l'accès à Swagger UI + "/v3/api-docs/**", // Autoriser l'accès aux API docs + "/" ).permitAll() .anyRequest() .authenticated() diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java index c69bedfdf998f68907bc9d1a4d3ba308e4f87b0e..541491df84520bbb9e8a20d2bc74c166c4b8e9ef 100644 --- a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java @@ -3,6 +3,7 @@ package com.hepia.backend.controller; import com.hepia.backend.model.dto.CreateTodoRequest; import com.hepia.backend.model.entity.Todo; import com.hepia.backend.repository.TodoRepository; +import com.hepia.backend.service.TodoService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -15,38 +16,25 @@ import static org.springframework.http.HttpStatus.CREATED; @RequestMapping("/todos") @RequiredArgsConstructor public class TodoController { - private final TodoRepository todoRepository; + private final TodoService todoService; @GetMapping public ResponseEntity<List<Todo>> getAll() { - List<Todo> todos = todoRepository.findAll(); - return ResponseEntity.ok(todos); + return todoService.getAll(); } @PostMapping public ResponseEntity<Todo> create(@RequestBody CreateTodoRequest request) { - Todo todo = Todo.builder().name(request.getName()).completed(false).build(); - Todo saved = todoRepository.save(todo); - return ResponseEntity.status(CREATED).body(saved); + return todoService.create(request); } @DeleteMapping("/{id}") public ResponseEntity<Long> delete(@PathVariable Long id) { - if (!todoRepository.existsById(id)){ - return ResponseEntity.notFound().build(); - } - todoRepository.deleteById(id); - return ResponseEntity.ok(id); + return todoService.delete(id); } @PatchMapping("/{id}") public ResponseEntity<Todo> toggleCompleted(@PathVariable Long id) { - if (!todoRepository.existsById(id)){ - return ResponseEntity.notFound().build(); - } - Todo todo = todoRepository.findById(id).orElseThrow(); - todo.setCompleted(!todo.isCompleted()); - Todo updated = todoRepository.save(todo); - return ResponseEntity.ok(updated); + return todoService.toggleCompleted(id); } } diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/service/TodoService.java b/todo-workspace/backend/src/main/java/com/hepia/backend/service/TodoService.java new file mode 100644 index 0000000000000000000000000000000000000000..4c491bd7763bcab8a5e80888625607e358da486e --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/service/TodoService.java @@ -0,0 +1,51 @@ +package com.hepia.backend.service; + +import com.hepia.backend.model.dto.CreateTodoRequest; +import com.hepia.backend.model.entity.Todo; +import com.hepia.backend.repository.TodoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +import static org.springframework.http.HttpStatus.CREATED; + +@Service +@RequiredArgsConstructor +public class TodoService { + private final TodoRepository todoRepository; + + public ResponseEntity<List<Todo>> getAll() { + List<Todo> todos = todoRepository.findAll(); + return ResponseEntity.ok(todos); + } + + public ResponseEntity<Todo> create(CreateTodoRequest request) { + Todo todo = Todo.builder().name(request.getName()).completed(false).build(); + Todo saved = todoRepository.save(todo); + return ResponseEntity.status(CREATED).body(saved); + } + + public ResponseEntity<Long> delete(Long id) { + Optional<Todo> todo = todoRepository.findById(id); + if (todo.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + todoRepository.deleteById(todo.get().getId()); + return ResponseEntity.ok(id); + } + + public ResponseEntity<Todo> toggleCompleted(Long id) { + Optional<Todo> todo = todoRepository.findById(id); + if (todo.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + todo.get().setCompleted(!todo.get().isCompleted()); + Todo updated = todoRepository.save(todo.get()); + return ResponseEntity.ok(updated); + } +} diff --git a/todo-workspace/backend/src/main/resources/application.yml b/todo-workspace/backend/src/main/resources/application.yml index 982753f5f870023c682fe20f782fa9bab2b14d66..5202707678d2503bde4ea2b072772a0c2601fc98 100755 --- a/todo-workspace/backend/src/main/resources/application.yml +++ b/todo-workspace/backend/src/main/resources/application.yml @@ -17,4 +17,7 @@ spring: server: servlet: context-path: /api/v1 - port: 8080 \ No newline at end of file + port: 8080 +springdoc: + swagger-ui: + path: /