From dc5af8f8686d3050de54e4a90c0e572daf3a3432 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Mon, 22 Jun 2026 22:08:56 +0100 Subject: [PATCH] docs(bruno): overhaul bruno to match new API --- bruno/VoD-System/Auth/Get Google Token.bru | 30 ------------------- bruno/VoD-System/Auth/Get User.bru | 11 ------- bruno/VoD-System/Auth/Login.bru | 21 ------------- bruno/VoD-System/Clips/Get all clips.bru | 2 +- bruno/VoD-System/Clips/Update Clip.bru | 2 +- bruno/VoD-System/Clips/folder.bru | 1 + .../Download/Converted Download.bru | 11 ------- .../VoD-System/Download/Original Download.bru | 11 ------- bruno/VoD-System/Download/folder.bru | 3 -- bruno/VoD-System/Edit/Edit.bru | 17 ----------- bruno/VoD-System/Edit/Process.bru | 11 ------- bruno/VoD-System/Edit/Progress.bru | 11 ------- bruno/VoD-System/Edit/folder.bru | 3 -- .../Metadata/Converted Metadata.bru | 11 ------- .../VoD-System/Metadata/Original Metadata.bru | 11 ------- bruno/VoD-System/Metadata/folder.bru | 3 -- bruno/VoD-System/Streams/Save Clip.bru | 22 -------------- bruno/VoD-System/Streams/Save Section.bru | 23 -------------- bruno/VoD-System/Streams/folder.bru | 2 +- bruno/VoD-System/Upload.bru | 2 +- .../configuration/SecurityConfig.java | 8 ++--- .../vodsystem/controllers/JobController.java | 5 ++-- .../controllers/MediaController.java | 18 ++++++----- .../vodsystem/controllers/UserController.java | 2 +- .../com/ddf/vodsystem/dto/ClipOptions.java | 16 ++++++++++ .../com/ddf/vodsystem/security/JwtFilter.java | 10 +++++-- .../ddf/vodsystem/services/ClipService.java | 2 +- 27 files changed, 46 insertions(+), 223 deletions(-) delete mode 100644 bruno/VoD-System/Auth/Get Google Token.bru delete mode 100644 bruno/VoD-System/Auth/Get User.bru delete mode 100644 bruno/VoD-System/Auth/Login.bru delete mode 100644 bruno/VoD-System/Download/Converted Download.bru delete mode 100644 bruno/VoD-System/Download/Original Download.bru delete mode 100644 bruno/VoD-System/Download/folder.bru delete mode 100644 bruno/VoD-System/Edit/Edit.bru delete mode 100644 bruno/VoD-System/Edit/Process.bru delete mode 100644 bruno/VoD-System/Edit/Progress.bru delete mode 100644 bruno/VoD-System/Edit/folder.bru delete mode 100644 bruno/VoD-System/Metadata/Converted Metadata.bru delete mode 100644 bruno/VoD-System/Metadata/Original Metadata.bru delete mode 100644 bruno/VoD-System/Metadata/folder.bru delete mode 100644 bruno/VoD-System/Streams/Save Clip.bru delete mode 100644 bruno/VoD-System/Streams/Save Section.bru diff --git a/bruno/VoD-System/Auth/Get Google Token.bru b/bruno/VoD-System/Auth/Get Google Token.bru deleted file mode 100644 index d810c7e..0000000 --- a/bruno/VoD-System/Auth/Get Google Token.bru +++ /dev/null @@ -1,30 +0,0 @@ -meta { - name: Get Google Token - type: http - seq: 3 -} - -get { - url: - body: none - auth: oauth2 -} - -auth:oauth2 { - grant_type: authorization_code - callback_url: http://localhost:8080 - authorization_url: https://accounts.google.com/o/oauth2/v2/auth - access_token_url: https://oauth2.googleapis.com/token - refresh_token_url: - client_id: {{google_client_id}} - client_secret: {{google_secret}} - scope: profile email openid - state: - pkce: true - credentials_placement: body - credentials_id: credentials - token_placement: header - token_header_prefix: Bearer - auto_fetch_token: true - auto_refresh_token: false -} diff --git a/bruno/VoD-System/Auth/Get User.bru b/bruno/VoD-System/Auth/Get User.bru deleted file mode 100644 index 28036c9..0000000 --- a/bruno/VoD-System/Auth/Get User.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Get User - type: http - seq: 1 -} - -get { - url: {{base_url}}/auth/user - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Auth/Login.bru b/bruno/VoD-System/Auth/Login.bru deleted file mode 100644 index a317e24..0000000 --- a/bruno/VoD-System/Auth/Login.bru +++ /dev/null @@ -1,21 +0,0 @@ -meta { - name: Login - type: http - seq: 2 -} - -post { - url: {{base_url}}/auth/login - body: json - auth: none -} - -body:json { - { - "token": "{{$oauth2.credentials.id_token}}" - } -} - -script:post-response { - bru.setEnvVar("token", res.getBody().data.token); -} diff --git a/bruno/VoD-System/Clips/Get all clips.bru b/bruno/VoD-System/Clips/Get all clips.bru index d78388d..4d33b6b 100644 --- a/bruno/VoD-System/Clips/Get all clips.bru +++ b/bruno/VoD-System/Clips/Get all clips.bru @@ -1,7 +1,7 @@ meta { name: Get all clips type: http - seq: 1 + seq: 2 } get { diff --git a/bruno/VoD-System/Clips/Update Clip.bru b/bruno/VoD-System/Clips/Update Clip.bru index a7ee47c..7aa91b8 100644 --- a/bruno/VoD-System/Clips/Update Clip.bru +++ b/bruno/VoD-System/Clips/Update Clip.bru @@ -1,7 +1,7 @@ meta { name: Update Clip type: http - seq: 2 + seq: 3 } patch { diff --git a/bruno/VoD-System/Clips/folder.bru b/bruno/VoD-System/Clips/folder.bru index b1359ee..cb80f7c 100644 --- a/bruno/VoD-System/Clips/folder.bru +++ b/bruno/VoD-System/Clips/folder.bru @@ -1,5 +1,6 @@ meta { name: Clips + seq: 3 } auth { diff --git a/bruno/VoD-System/Download/Converted Download.bru b/bruno/VoD-System/Download/Converted Download.bru deleted file mode 100644 index d68bf22..0000000 --- a/bruno/VoD-System/Download/Converted Download.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Converted Download - type: http - seq: 2 -} - -get { - url: {{base_url}}/download/output/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Download/Original Download.bru b/bruno/VoD-System/Download/Original Download.bru deleted file mode 100644 index 91d8e26..0000000 --- a/bruno/VoD-System/Download/Original Download.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Original Download - type: http - seq: 1 -} - -get { - url: {{base_url}}/download/input/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Download/folder.bru b/bruno/VoD-System/Download/folder.bru deleted file mode 100644 index be111cc..0000000 --- a/bruno/VoD-System/Download/folder.bru +++ /dev/null @@ -1,3 +0,0 @@ -meta { - name: Download -} diff --git a/bruno/VoD-System/Edit/Edit.bru b/bruno/VoD-System/Edit/Edit.bru deleted file mode 100644 index 63a5e17..0000000 --- a/bruno/VoD-System/Edit/Edit.bru +++ /dev/null @@ -1,17 +0,0 @@ -meta { - name: Edit - type: http - seq: 1 -} - -post { - url: {{base_url}}/edit/{{uuid}} - body: formUrlEncoded - auth: inherit -} - -body:form-urlencoded { - startPoint: 10 - duration: 40 - title: best possible title -} diff --git a/bruno/VoD-System/Edit/Process.bru b/bruno/VoD-System/Edit/Process.bru deleted file mode 100644 index a44770d..0000000 --- a/bruno/VoD-System/Edit/Process.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Process - type: http - seq: 2 -} - -get { - url: {{base_url}}/process/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Edit/Progress.bru b/bruno/VoD-System/Edit/Progress.bru deleted file mode 100644 index c54718f..0000000 --- a/bruno/VoD-System/Edit/Progress.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Progress - type: http - seq: 3 -} - -get { - url: {{base_url}}/progress/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Edit/folder.bru b/bruno/VoD-System/Edit/folder.bru deleted file mode 100644 index 8dd7263..0000000 --- a/bruno/VoD-System/Edit/folder.bru +++ /dev/null @@ -1,3 +0,0 @@ -meta { - name: Edit -} diff --git a/bruno/VoD-System/Metadata/Converted Metadata.bru b/bruno/VoD-System/Metadata/Converted Metadata.bru deleted file mode 100644 index 0bda004..0000000 --- a/bruno/VoD-System/Metadata/Converted Metadata.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Converted Metadata - type: http - seq: 2 -} - -get { - url: {{base_url}}/metadata/converted/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Metadata/Original Metadata.bru b/bruno/VoD-System/Metadata/Original Metadata.bru deleted file mode 100644 index 1a56e14..0000000 --- a/bruno/VoD-System/Metadata/Original Metadata.bru +++ /dev/null @@ -1,11 +0,0 @@ -meta { - name: Original Metadata - type: http - seq: 1 -} - -get { - url: {{base_url}}/metadata/original/{{uuid}} - body: none - auth: inherit -} diff --git a/bruno/VoD-System/Metadata/folder.bru b/bruno/VoD-System/Metadata/folder.bru deleted file mode 100644 index b670ec8..0000000 --- a/bruno/VoD-System/Metadata/folder.bru +++ /dev/null @@ -1,3 +0,0 @@ -meta { - name: Metadata -} diff --git a/bruno/VoD-System/Streams/Save Clip.bru b/bruno/VoD-System/Streams/Save Clip.bru deleted file mode 100644 index e3d2338..0000000 --- a/bruno/VoD-System/Streams/Save Clip.bru +++ /dev/null @@ -1,22 +0,0 @@ -meta { - name: Save Clip - type: http - seq: 3 -} - -post { - url: {{base_url}}/stream/clip - body: json - auth: inherit -} - -body:json { - { - "duration": 60 - } -} - -settings { - encodeUrl: true - timeout: 0 -} diff --git a/bruno/VoD-System/Streams/Save Section.bru b/bruno/VoD-System/Streams/Save Section.bru deleted file mode 100644 index 4d77571..0000000 --- a/bruno/VoD-System/Streams/Save Section.bru +++ /dev/null @@ -1,23 +0,0 @@ -meta { - name: Save Section - type: http - seq: 2 -} - -post { - url: {{base_url}}/stream/save - body: json - auth: inherit -} - -body:json { - { - "startTime": "2026-06-20T15:00:00Z", - "endTime": "2026-06-20T15:01:00Z" - } -} - -settings { - encodeUrl: true - timeout: 0 -} diff --git a/bruno/VoD-System/Streams/folder.bru b/bruno/VoD-System/Streams/folder.bru index 2aa144d..51c98c0 100644 --- a/bruno/VoD-System/Streams/folder.bru +++ b/bruno/VoD-System/Streams/folder.bru @@ -1,6 +1,6 @@ meta { name: Streams - seq: 7 + seq: 6 } auth { diff --git a/bruno/VoD-System/Upload.bru b/bruno/VoD-System/Upload.bru index 7a6c424..ca92bbd 100644 --- a/bruno/VoD-System/Upload.bru +++ b/bruno/VoD-System/Upload.bru @@ -1,7 +1,7 @@ meta { name: Upload type: http - seq: 1 + seq: 2 } post { diff --git a/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java b/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java index 81bf0e6..6c79878 100644 --- a/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java +++ b/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java @@ -30,11 +30,9 @@ public class SecurityConfig { .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.OPTIONS, "/api/v1/**").permitAll() - .requestMatchers("/api/v1/download/clip/**","/api/v1/clips/", "/api/v1/clips/**").authenticated() - .requestMatchers("/api/v1/auth/login", "/api/v1/auth/user").permitAll() - .requestMatchers("/api/v1/upload", "/api/v1/download/**").permitAll() - .requestMatchers("/api/v1/edit/**", "/api/v1/process/**", "/api/v1/progress/**", "/api/v1/convert/**").permitAll() - .requestMatchers("/api/v1/metadata/**").permitAll() + .requestMatchers("/api/v1/media/**").authenticated() + .requestMatchers("/api/v1/jobs/**").authenticated() + .requestMatchers("/api/v1/users/me", "/api/v1/users/logout").authenticated() .requestMatchers("/api/v1/stream/start", "/api/v1/stream/stop", "/api/v1/stream/heartbeat").permitAll() .anyRequest().authenticated() ) diff --git a/src/main/java/com/ddf/vodsystem/controllers/JobController.java b/src/main/java/com/ddf/vodsystem/controllers/JobController.java index cbff6fc..8bf6352 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/JobController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/JobController.java @@ -3,6 +3,7 @@ package com.ddf.vodsystem.controllers; import com.ddf.vodsystem.controllers.dto.JobResponse; import com.ddf.vodsystem.dto.APIResponse; import com.ddf.vodsystem.dto.Job; +import com.ddf.vodsystem.exceptions.ClipNotFound; import com.ddf.vodsystem.exceptions.NotReadyException; import com.ddf.vodsystem.services.JobRegistryService; import org.springframework.core.io.FileSystemResource; @@ -17,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("api/v1/job") +@RequestMapping("api/v1/jobs") public class JobController { private final JobRegistryService jobRegistryService; private static final String SUCCESS = "success"; @@ -57,7 +58,7 @@ public class JobController { Resource resource = new FileSystemResource(job.getDownload()); if (!resource.exists()) { - return ResponseEntity.notFound().build(); + throw new ClipNotFound("Job download file " + job.getDownload() + " does not exist."); } return ResponseEntity.ok() diff --git a/src/main/java/com/ddf/vodsystem/controllers/MediaController.java b/src/main/java/com/ddf/vodsystem/controllers/MediaController.java index 2351214..7643e7b 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/MediaController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/MediaController.java @@ -1,16 +1,19 @@ package com.ddf.vodsystem.controllers; +import com.ddf.vodsystem.controllers.dto.ClipSectionRequest; +import com.ddf.vodsystem.controllers.dto.SaveSectionRequest; import com.ddf.vodsystem.controllers.dto.UUIDResponse; import com.ddf.vodsystem.dto.Job; import com.ddf.vodsystem.dto.ClipOptions; import com.ddf.vodsystem.dto.APIResponse; import com.ddf.vodsystem.services.MediaService; +import jakarta.validation.Valid; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.time.Instant; @RestController @RequestMapping("/api/v1/media") @@ -22,10 +25,10 @@ public class MediaController { this.mediaService = mediaService; } - @PostMapping("/compress") + @PostMapping(value = "/compress", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity> compress( @RequestParam("file")MultipartFile file, - @RequestParam("options") ClipOptions options + @Valid @ModelAttribute ClipOptions options ) throws IOException, InterruptedException { Job job = mediaService.compress(file, options); return ResponseEntity.ok(new APIResponse<>( @@ -38,9 +41,8 @@ public class MediaController { @PostMapping("/save") public ResponseEntity> save( - @RequestParam("start") Instant startTime, - @RequestParam("end") Instant endTime) throws IOException { - Job job = mediaService.saveSection(startTime, endTime); + @RequestBody SaveSectionRequest saveSectionRequest) throws IOException { + Job job = mediaService.saveSection(saveSectionRequest.startTime(), saveSectionRequest.endTime()); return ResponseEntity.ok(new APIResponse<>( SUCCESS, "Section saving successfully started", @@ -50,8 +52,8 @@ public class MediaController { @PostMapping("/clip") public ResponseEntity> clip( - @RequestParam("duration") float duration) throws IOException { - Job job = mediaService.clip(duration); + @RequestBody ClipSectionRequest clipSectionRequest) throws IOException { + Job job = mediaService.clip(clipSectionRequest.duration()); return ResponseEntity.ok(new APIResponse<>( SUCCESS, "Clipping successfully started", diff --git a/src/main/java/com/ddf/vodsystem/controllers/UserController.java b/src/main/java/com/ddf/vodsystem/controllers/UserController.java index 75febcd..dead6ab 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/UserController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/UserController.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Optional; @RestController -@RequestMapping("/api/v1/user/") +@RequestMapping("/api/v1/users") public class UserController { private final UserService userService; diff --git a/src/main/java/com/ddf/vodsystem/dto/ClipOptions.java b/src/main/java/com/ddf/vodsystem/dto/ClipOptions.java index 735a3ea..7041658 100644 --- a/src/main/java/com/ddf/vodsystem/dto/ClipOptions.java +++ b/src/main/java/com/ddf/vodsystem/dto/ClipOptions.java @@ -1,15 +1,31 @@ package com.ddf.vodsystem.dto; +import jakarta.validation.constraints.*; import lombok.Data; @Data public class ClipOptions { + @NotBlank private String title; + private String description; + + @NotNull + @Positive private Float startPoint; + + @NotNull @Positive private Float duration; + + @DecimalMin("1.0") @DecimalMax("120.0") private Float fps; + + @Positive private Integer width; + + @Positive private Integer height; + + @Positive private Float fileSize; } diff --git a/src/main/java/com/ddf/vodsystem/security/JwtFilter.java b/src/main/java/com/ddf/vodsystem/security/JwtFilter.java index 1af18e2..e72ad72 100644 --- a/src/main/java/com/ddf/vodsystem/security/JwtFilter.java +++ b/src/main/java/com/ddf/vodsystem/security/JwtFilter.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -60,9 +61,12 @@ public class JwtFilter extends OncePerRequestFilter { } Optional authentication = getAuthentication(jwt); - authentication.ifPresent(value -> - SecurityContextHolder.getContext().setAuthentication(value) - ); + authentication.ifPresent(auth -> { + SecurityContext context = SecurityContextHolder.createEmptyContext(); + context.setAuthentication(auth); + SecurityContextHolder.setContext(context); + }); + filterChain.doFilter(request, response); } diff --git a/src/main/java/com/ddf/vodsystem/services/ClipService.java b/src/main/java/com/ddf/vodsystem/services/ClipService.java index 4729183..88fa8ee 100644 --- a/src/main/java/com/ddf/vodsystem/services/ClipService.java +++ b/src/main/java/com/ddf/vodsystem/services/ClipService.java @@ -229,7 +229,7 @@ public class ClipService { try { newClipFile = directoryService.getUserClipsFile(user.getId(), fileName); thumbnailFile = directoryService.getUserThumbnailsFile(user.getId(), fileName + ".png"); - directoryService.cutFile(clipFile, newClipFile); + directoryService.copyFile(clipFile, newClipFile); } catch (IOException e) { throw new StorageException("Failed to move clip from temporary directory to output directory", e); }