From d8a9ceed2cb2e574bbbc3a53bca62e15aac1ffa5 Mon Sep 17 00:00:00 2001 From: thib <thibault.capt@hes-so.ch> Date: Thu, 20 Feb 2025 17:35:31 +0100 Subject: [PATCH] (feat): backend simple controller --- todo-workspace/backend/compose.yaml | 17 ++++++++- todo-workspace/backend/pom.xml | 15 ++++++++ .../com/hepia/backend/TodoApplication.java | 3 +- .../com/hepia/backend/config/BeanConfig.java | 32 ++++++++++++++++ .../hepia/backend/config/SecurityConfig.java | 37 +++++++++++++++++++ .../backend/controller/TodoController.java | 17 +++++++++ .../backend/domain/entity/TodoEntity.java | 20 ++++++++++ .../com/hepia/backend/domain/model/Todo.java | 17 +++++++++ .../src/main/resources/application.properties | 1 - .../src/main/resources/application.yml | 20 ++++++++++ 10 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 todo-workspace/backend/src/main/java/com/hepia/backend/config/BeanConfig.java create mode 100644 todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java create mode 100644 todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java create mode 100644 todo-workspace/backend/src/main/java/com/hepia/backend/domain/entity/TodoEntity.java create mode 100644 todo-workspace/backend/src/main/java/com/hepia/backend/domain/model/Todo.java delete mode 100755 todo-workspace/backend/src/main/resources/application.properties create mode 100755 todo-workspace/backend/src/main/resources/application.yml diff --git a/todo-workspace/backend/compose.yaml b/todo-workspace/backend/compose.yaml index 3b26131..d5ba86c 100755 --- a/todo-workspace/backend/compose.yaml +++ b/todo-workspace/backend/compose.yaml @@ -1,9 +1,24 @@ services: postgres: image: 'postgres:latest' + container_name: 'todo-db' + restart: 'unless-stopped' + env_file: + - '.env' environment: - 'POSTGRES_DB=${POSTGRES_DB}' - 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}' - 'POSTGRES_USER=${POSTGRES_USER}' ports: - - '5432' + - '5432:5432' + volumes: + - pgdata:/var/lib/postgresql/data + networks: + - todo-network + +networks: + todo-network: + driver: bridge +volumes: + pgdata: + driver: local diff --git a/todo-workspace/backend/pom.xml b/todo-workspace/backend/pom.xml index b44a92e..3d09d2e 100755 --- a/todo-workspace/backend/pom.xml +++ b/todo-workspace/backend/pom.xml @@ -78,6 +78,21 @@ <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> <build> diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/TodoApplication.java b/todo-workspace/backend/src/main/java/com/hepia/backend/TodoApplication.java index be190c0..ef48489 100755 --- a/todo-workspace/backend/src/main/java/com/hepia/backend/TodoApplication.java +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/TodoApplication.java @@ -5,9 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TodoApplication { - + // https://medium.com/@faroukymedia/de-la-th%C3%A9orie-%C3%A0-la-pratique-spring-boot-architecture-hexagonale-et-ddd-pour-des-applications-f1110d83bced public static void main(String[] args) { SpringApplication.run(TodoApplication.class, args); } - } diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/config/BeanConfig.java b/todo-workspace/backend/src/main/java/com/hepia/backend/config/BeanConfig.java new file mode 100644 index 0000000..fe0281a --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/config/BeanConfig.java @@ -0,0 +1,32 @@ +package com.hepia.backend.config; + +import org.springframework.web.filter.CorsFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.Arrays; +import java.util.Collections; + +import static org.springframework.http.HttpHeaders.*; + +@Configuration +public class BeanConfig { + @Bean + public CorsFilter corsFilter() { + final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + final CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.setAllowedOrigins(Collections.singletonList("http://localhost:4200")); + config.setAllowedHeaders(Arrays.asList( + ORIGIN, + CONTENT_TYPE, + ACCEPT, + AUTHORIZATION + )); + config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} 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 new file mode 100644 index 0000000..60bae09 --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/config/SecurityConfig.java @@ -0,0 +1,37 @@ +package com.hepia.backend.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; + +import static org.springframework.security.config.Customizer.withDefaults; +import static org.springframework.security.config.http.SessionCreationPolicy.STATELESS; + +@Configuration +@EnableWebSecurity +@EnableMethodSecurity(securedEnabled = true) +public class SecurityConfig { + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .cors(withDefaults()) + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(req -> + req.requestMatchers( + "/todos/**" + ).permitAll() + .anyRequest() + .authenticated() + ) + .sessionManagement(s -> + s.sessionCreationPolicy(STATELESS) + ); + return http.build(); + } +} 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 new file mode 100644 index 0000000..88d8bea --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java @@ -0,0 +1,17 @@ +package com.hepia.backend.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/todos") +@RequiredArgsConstructor +public class TodoController { + + @GetMapping + public String getTodos() { + return "Hello World!"; + } +} diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/domain/entity/TodoEntity.java b/todo-workspace/backend/src/main/java/com/hepia/backend/domain/entity/TodoEntity.java new file mode 100644 index 0000000..c56c0c5 --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/domain/entity/TodoEntity.java @@ -0,0 +1,20 @@ +package com.hepia.backend.domain.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "todos") +public class TodoEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + private boolean completed; + private String createdAt; +} diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/domain/model/Todo.java b/todo-workspace/backend/src/main/java/com/hepia/backend/domain/model/Todo.java new file mode 100644 index 0000000..473b54c --- /dev/null +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/domain/model/Todo.java @@ -0,0 +1,17 @@ +package com.hepia.backend.domain.model; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Todo { + private Long id; + private String name; + private boolean completed; + private LocalDateTime createdAt; +} diff --git a/todo-workspace/backend/src/main/resources/application.properties b/todo-workspace/backend/src/main/resources/application.properties deleted file mode 100755 index 3e6d0dc..0000000 --- a/todo-workspace/backend/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=todo diff --git a/todo-workspace/backend/src/main/resources/application.yml b/todo-workspace/backend/src/main/resources/application.yml new file mode 100755 index 0000000..d024d92 --- /dev/null +++ b/todo-workspace/backend/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: ${SPRING_DATASOURCE_URL} + username: ${SPRING_DATASOURCE_USER} + password: ${SPRING_DATASOURCE_PASSWORD} + driver-class-name: org.postgresql.Driver + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + format_sql: true + dialect: org.hibernate.dialect.PostgreSQLDialect + show-sql: true + database: postgresql + database-platform: org.hibernate.dialect.PostgreSQLDialect +server: + servlet: + context-path: /api/v1 + port: 8080 -- GitLab