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() {