From fe735faba89fe4229ac9cc6a1dafc1a96ccb2428 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Thu, 2 Jul 2026 19:37:27 +0100 Subject: [PATCH] feat(api): delete marker endpoint --- bruno/VoD-System/Markers/Delete Marker.bru | 16 +++++ frontend/src/pages/StreamControl.tsx | 58 +++++++++++++------ frontend/src/utils/endpoints.ts | 13 +++++ .../controllers/MarkerController.java | 9 +++ .../ddf/vodsystem/services/MarkerService.java | 5 ++ 5 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 bruno/VoD-System/Markers/Delete Marker.bru diff --git a/bruno/VoD-System/Markers/Delete Marker.bru b/bruno/VoD-System/Markers/Delete Marker.bru new file mode 100644 index 0000000..b2e3459 --- /dev/null +++ b/bruno/VoD-System/Markers/Delete Marker.bru @@ -0,0 +1,16 @@ +meta { + name: Delete Marker + type: http + seq: 4 +} + +delete { + url: {{base_url}}/markers/5 + body: none + auth: inherit +} + +settings { + encodeUrl: true + timeout: 0 +} diff --git a/frontend/src/pages/StreamControl.tsx b/frontend/src/pages/StreamControl.tsx index be95763..4745f1b 100644 --- a/frontend/src/pages/StreamControl.tsx +++ b/frontend/src/pages/StreamControl.tsx @@ -9,6 +9,7 @@ import { getStreamHistory, getMarkers, createMarker, + deleteMarker, saveSectionByMarkers, clipSection, getJob, @@ -120,7 +121,7 @@ const StreamControl = () => { const refreshMarkers = () => { getMarkers() - .then((data) => setMarkers(data.filter((m) => m.streamId === streamStatus?.id) + .then((data) => setMarkers(data .sort((a, b) => stringToDate(a.timestamp).getTime() - stringToDate(b.timestamp).getTime()))) .catch(() => {}); }; @@ -209,6 +210,17 @@ const StreamControl = () => { } }; + const handleDeleteMarker = async (id: number) => { + try { + await deleteMarker(id); + if (startMarkerId === String(id)) setStartMarkerId(""); + if (endMarkerId === String(id)) setEndMarkerId(""); + refreshMarkers(); + } catch (err) { + setMarkerError(err instanceof Error ? err.message : "Failed to delete marker"); + } + }; + const handleChipClick = (id: number) => { const idStr = String(id); setMarkerSaveError(null); @@ -289,28 +301,36 @@ const StreamControl = () => { {markerError &&

{markerError}

} {markers.length > 0 && ( -
+
{markers.map((m) => { const isStart = startMarkerId === String(m.id); const isEnd = endMarkerId === String(m.id); return ( - +
+ + +
); })}
diff --git a/frontend/src/utils/endpoints.ts b/frontend/src/utils/endpoints.ts index 55c41fc..3fac59b 100644 --- a/frontend/src/utils/endpoints.ts +++ b/frontend/src/utils/endpoints.ts @@ -263,6 +263,18 @@ const createMarker = async (message: string): Promise => { return result.data; }; +const deleteMarker = async (id: number): Promise => { + const response = await fetch(API_URL + `/api/v1/markers/${id}`, { + method: 'DELETE', + credentials: 'include', + }); + + if (!response.ok) throw new Error(`Failed to delete marker: ${response.status}`); + + const result: APIResponse = await response.json(); + if (result.status === 'error') throw new Error(`Failed to delete marker: ${result.message}`); +}; + const saveSection = async (startTime: string, endTime: string, title?: string, description?: string): Promise => { const response = await fetch(API_URL + '/api/v1/media/save', { method: 'POST', @@ -327,6 +339,7 @@ export { getStreamHistory, getMarkers, createMarker, + deleteMarker, saveSection, saveSectionByMarkers, clipSection, diff --git a/src/main/java/com/ddf/vodsystem/controllers/MarkerController.java b/src/main/java/com/ddf/vodsystem/controllers/MarkerController.java index b10d276..9ab63c1 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/MarkerController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/MarkerController.java @@ -51,6 +51,15 @@ public class MarkerController { ); } + @DeleteMapping("/{id}") + public ResponseEntity> deleteMarker(@PathVariable Long id) { + markerService.deleteMarker(id); + + return ResponseEntity.ok( + new APIResponse<>(SUCCESS, "Marker deleted successfully", "Marker " + id + " deleted.") + ); + } + private MarkerResponse convertToDTO(Marker marker) { return new MarkerResponse( marker.getId(), diff --git a/src/main/java/com/ddf/vodsystem/services/MarkerService.java b/src/main/java/com/ddf/vodsystem/services/MarkerService.java index b747f6a..77059fc 100644 --- a/src/main/java/com/ddf/vodsystem/services/MarkerService.java +++ b/src/main/java/com/ddf/vodsystem/services/MarkerService.java @@ -72,6 +72,11 @@ public class MarkerService { return markerRepository.saveAndFlush(marker); } + public void deleteMarker(Long id) { + Marker marker = getMarkerById(id); + markerRepository.delete(marker); + } + @Scheduled(fixedDelay = 360_000) @Transactional public void deleteOldMarkers() {