From cc7c4379acae2991e51b4726b753f9624fb651f8 Mon Sep 17 00:00:00 2001
From: Karsch Lukas <lk224@hdm-stuttgart.de>
Date: Thu, 14 Dec 2023 21:32:18 +0100
Subject: [PATCH] add Swagger / OpenAPI #30

---
 pom.xml                                       |  6 ++++
 requests.http                                 | 11 +++++++
 .../hdm/mi/growbros/config/OpenApiConfig.java | 31 +++++++++++++++++++
 .../security/SecurityConfiguration.java       | 10 ++++++
 4 files changed, 58 insertions(+)
 create mode 100644 src/main/java/hdm/mi/growbros/config/OpenApiConfig.java

diff --git a/pom.xml b/pom.xml
index ab6e21b..80b0851 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,6 +74,12 @@
             <version>3.16.1</version>
             <scope>test</scope>
         </dependency>
+        <!-- Aufrufbar unter http://localhost:8080/swagger-ui/index.html -->
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.2.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/requests.http b/requests.http
index d99dd79..e985f72 100644
--- a/requests.http
+++ b/requests.http
@@ -17,6 +17,17 @@ content-type: application/json
   "password": "myPassword123"
 }
 
+###
+POST http://localhost:8080/api/v1/auth/register
+content-type: application/json
+
+{
+  "email": "lb210@hdm-stuttgart.de",
+  "firstname": "Lara",
+  "lastname": "Blersch",
+  "password": "Lara123"
+}
+
 ### Authenticate
 POST http://localhost:8080/api/v1/auth/authenticate
 content-type: application/json
diff --git a/src/main/java/hdm/mi/growbros/config/OpenApiConfig.java b/src/main/java/hdm/mi/growbros/config/OpenApiConfig.java
new file mode 100644
index 0000000..162b32d
--- /dev/null
+++ b/src/main/java/hdm/mi/growbros/config/OpenApiConfig.java
@@ -0,0 +1,31 @@
+package hdm.mi.growbros.config;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class OpenApiConfig {
+    @Bean
+    public OpenAPI customizeOpenAPI() {
+        final String securitySchemeName = "bearerAuth";
+        return new OpenAPI()
+                .info(new Info()
+                        .description("GrowBros API documentation.")
+                        .title("GrowBros")
+                        .version("1.0"))
+                .addSecurityItem(new SecurityRequirement()
+                        .addList(securitySchemeName))
+                .components(new Components()
+                        .addSecuritySchemes(securitySchemeName, new SecurityScheme()
+                                .name(securitySchemeName)
+                                .type(SecurityScheme.Type.HTTP)
+                                .scheme("bearer")
+                                .bearerFormat("JWT")));
+    }
+}
diff --git a/src/main/java/hdm/mi/growbros/security/SecurityConfiguration.java b/src/main/java/hdm/mi/growbros/security/SecurityConfiguration.java
index 3adcd66..cf9f52b 100644
--- a/src/main/java/hdm/mi/growbros/security/SecurityConfiguration.java
+++ b/src/main/java/hdm/mi/growbros/security/SecurityConfiguration.java
@@ -13,7 +13,9 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
 import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
 import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
 
+import static hdm.mi.growbros.models.user.Role.ADMIN;
 import static org.springframework.boot.autoconfigure.security.servlet.PathRequest.toH2Console;
+import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole;
 
 /**
  * Configuration of the filter chain.
@@ -36,6 +38,8 @@ public class SecurityConfiguration {
                         authorize
                                 .requestMatchers(toH2Console()).permitAll()
                                 .requestMatchers(mvc.pattern("/api/v1/auth/**")).permitAll()
+                                .requestMatchers(mvc.pattern("/swagger-ui/**")).permitAll()
+                                .requestMatchers(mvc.pattern("/v3/api-docs/**")).permitAll()
                                 .anyRequest().authenticated()
                 )
                 .headers(headers -> headers.frameOptions(
@@ -56,4 +60,10 @@ public class SecurityConfiguration {
         //see https://stackoverflow.com/questions/76809698/spring-security-method-cannot-decide-pattern-is-mvc-or-not-spring-boot-applicati
         return new MvcRequestMatcher.Builder(introspector);
     }
+
+    /*@Bean
+    protected void configure(HttpSecurity http) throws Exception {
+        http.authorizeRequests().requestMatchers("/swagger-ui.html")
+                .access("hasRole('ROLE_ADMIN')");
+    }*/
 }
-- 
GitLab