From a78aecdfb6fd92959200a8d324da028250275e9d Mon Sep 17 00:00:00 2001 From: ThisBirchWood Date: Wed, 9 Jul 2025 21:57:23 +0200 Subject: [PATCH] ADD ClipController for clip retrieval --- .../vodsystem/controllers/AuthController.java | 15 +++----- .../vodsystem/controllers/ClipController.java | 37 +++++++++++++++++++ .../controllers/GlobalExceptionHandler.java | 8 ++++ .../java/com/ddf/vodsystem/entities/Clip.java | 5 ++- .../exceptions/NotAuthenticated.java | 7 ++++ .../repositories/ClipRepository.java | 6 +++ .../ddf/vodsystem/services/ClipService.java | 12 ++++++ 7 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/ddf/vodsystem/controllers/ClipController.java create mode 100644 src/main/java/com/ddf/vodsystem/exceptions/NotAuthenticated.java diff --git a/src/main/java/com/ddf/vodsystem/controllers/AuthController.java b/src/main/java/com/ddf/vodsystem/controllers/AuthController.java index de455e0..1197a6e 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/AuthController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/AuthController.java @@ -1,6 +1,7 @@ package com.ddf.vodsystem.controllers; import com.ddf.vodsystem.entities.APIResponse; +import com.ddf.vodsystem.exceptions.NotAuthenticated; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -14,21 +15,17 @@ import java.util.Map; @RestController @RequestMapping("/api/v1/auth/") public class AuthController { - @GetMapping("/user") public ResponseEntity>> user(@AuthenticationPrincipal OAuth2User principal) { if (principal == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN). - body(new APIResponse<>( - "error", - "User not authenticated", - null - )); + throw new NotAuthenticated("User is not authenticated"); } - if (principal.getAttribute("email") == null + if ( + principal.getAttribute("email") == null || principal.getAttribute("name") == null - || principal.getAttribute("picture") == null) { + || principal.getAttribute("picture") == null) + { return ResponseEntity.status(HttpStatus.BAD_REQUEST). body(new APIResponse<>( "error", diff --git a/src/main/java/com/ddf/vodsystem/controllers/ClipController.java b/src/main/java/com/ddf/vodsystem/controllers/ClipController.java new file mode 100644 index 0000000..1910bda --- /dev/null +++ b/src/main/java/com/ddf/vodsystem/controllers/ClipController.java @@ -0,0 +1,37 @@ +package com.ddf.vodsystem.controllers; + +import com.ddf.vodsystem.entities.APIResponse; +import com.ddf.vodsystem.entities.Clip; +import com.ddf.vodsystem.exceptions.NotAuthenticated; +import com.ddf.vodsystem.services.ClipService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("/api/v1/clips") +public class ClipController { + private final ClipService clipService; + + public ClipController(ClipService clipService) { + this.clipService = clipService; + } + + @GetMapping("/") + public ResponseEntity>> getClips(@AuthenticationPrincipal OAuth2User principal) { + if (principal == null) { + throw new NotAuthenticated("User is not authenticated"); + } + + List clips = clipService.getClipsByUser(); + return ResponseEntity.ok( + new APIResponse<>("success", "Clips retrieved successfully", clips) + ); + } +} diff --git a/src/main/java/com/ddf/vodsystem/controllers/GlobalExceptionHandler.java b/src/main/java/com/ddf/vodsystem/controllers/GlobalExceptionHandler.java index dfedadf..79fa6bd 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/GlobalExceptionHandler.java +++ b/src/main/java/com/ddf/vodsystem/controllers/GlobalExceptionHandler.java @@ -4,6 +4,7 @@ import com.ddf.vodsystem.entities.APIResponse; import com.ddf.vodsystem.exceptions.FFMPEGException; import com.ddf.vodsystem.exceptions.JobNotFinished; import com.ddf.vodsystem.exceptions.JobNotFound; +import com.ddf.vodsystem.exceptions.NotAuthenticated; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.HttpMediaTypeNotSupportedException; @@ -68,4 +69,11 @@ public class GlobalExceptionHandler { APIResponse response = new APIResponse<>(ERROR, "FFMPEG Error: Please upload a valid file", null); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); } + + @ExceptionHandler(NotAuthenticated.class) + public ResponseEntity> handleNotAuthenticated(NotAuthenticated ex) { + logger.error("NotAuthenticated: {}", ex.getMessage(), ex); + APIResponse response = new APIResponse<>(ERROR, "User is not authenticated", null); + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response); + } } \ No newline at end of file diff --git a/src/main/java/com/ddf/vodsystem/entities/Clip.java b/src/main/java/com/ddf/vodsystem/entities/Clip.java index bf655cb..0ae1c77 100644 --- a/src/main/java/com/ddf/vodsystem/entities/Clip.java +++ b/src/main/java/com/ddf/vodsystem/entities/Clip.java @@ -1,8 +1,9 @@ package com.ddf.vodsystem.entities; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Data; -import lombok.ToString; + import java.time.LocalDateTime; @@ -16,7 +17,7 @@ public class Clip { private Long id; @ManyToOne(fetch = FetchType.LAZY) - @ToString.Exclude + @JsonIgnore @JoinColumn(name = "user_id", nullable = false) private User user; diff --git a/src/main/java/com/ddf/vodsystem/exceptions/NotAuthenticated.java b/src/main/java/com/ddf/vodsystem/exceptions/NotAuthenticated.java new file mode 100644 index 0000000..2790650 --- /dev/null +++ b/src/main/java/com/ddf/vodsystem/exceptions/NotAuthenticated.java @@ -0,0 +1,7 @@ +package com.ddf.vodsystem.exceptions; + +public class NotAuthenticated extends RuntimeException { + public NotAuthenticated(String message) { + super(message); + } +} diff --git a/src/main/java/com/ddf/vodsystem/repositories/ClipRepository.java b/src/main/java/com/ddf/vodsystem/repositories/ClipRepository.java index 5c804ff..10e9885 100644 --- a/src/main/java/com/ddf/vodsystem/repositories/ClipRepository.java +++ b/src/main/java/com/ddf/vodsystem/repositories/ClipRepository.java @@ -1,9 +1,15 @@ package com.ddf.vodsystem.repositories; import com.ddf.vodsystem.entities.Clip; +import com.ddf.vodsystem.entities.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ClipRepository extends JpaRepository { + @Query("SELECT c FROM Clip c WHERE c.user = ?1") + List findByUser(User user); } diff --git a/src/main/java/com/ddf/vodsystem/services/ClipService.java b/src/main/java/com/ddf/vodsystem/services/ClipService.java index 78cba6f..4ac48dc 100644 --- a/src/main/java/com/ddf/vodsystem/services/ClipService.java +++ b/src/main/java/com/ddf/vodsystem/services/ClipService.java @@ -5,6 +5,7 @@ import com.ddf.vodsystem.entities.*; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; +import java.util.List; import com.ddf.vodsystem.repositories.ClipRepository; import com.ddf.vodsystem.security.CustomOAuth2User; @@ -60,6 +61,17 @@ public class ClipService { logger.info("FFMPEG finished successfully for job: {}", job.getUuid()); } + public List getClipsByUser() { + User user = getUser(); + + if (user == null) { + logger.warn("No authenticated user found"); + return List.of(); + } + + return clipRepository.findByUser(user); + } + private User getUser() { Authentication auth = SecurityContextHolder.getContext().getAuthentication();