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