From 2cac1770f9897d5993454b7af71e412fc92961aa Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Thu, 2 Jul 2026 18:53:23 +0100 Subject: [PATCH] feat(markers): auto-delete after 8 hours --- .env.example | 4 +++- docker-compose.dev.yml | 2 ++ docker-compose.yml | 2 ++ nginx/default.conf.template | 2 +- nginx/docker-entrypoint.sh | 2 +- .../vodsystem/repositories/MarkerRepository.java | 4 ++++ .../com/ddf/vodsystem/services/MarkerService.java | 14 ++++++++++++++ src/main/resources/application.properties | 1 + 8 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 6083238..a4e6dd5 100644 --- a/.env.example +++ b/.env.example @@ -15,4 +15,6 @@ POSTGRES_PASSWORD=mypassword POSTGRES_DB=vodSystem FRONTEND_URL= -BACKEND_URL= \ No newline at end of file +BACKEND_URL= + +STREAM_RING_LENGTH_SECOND=28800 \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 6cc3fbf..61149a9 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -22,6 +22,8 @@ services: container_name: vod_rtmp extra_hosts: - "host.docker.internal:host-gateway" + env_file: + - .env environment: - WEB_SERVER_URL=http://host.docker.internal:8080 ports: diff --git a/docker-compose.yml b/docker-compose.yml index 201b8dd..cc38d19 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,6 +45,8 @@ services: context: ./nginx dockerfile: Dockerfile container_name: vod_rtmp + env_file: + - .env environment: - WEB_SERVER_URL=http://backend:8080 ports: diff --git a/nginx/default.conf.template b/nginx/default.conf.template index 1cc95aa..05fa14b 100644 --- a/nginx/default.conf.template +++ b/nginx/default.conf.template @@ -20,7 +20,7 @@ rtmp { hls_path /stream; hls_fragment_naming system; hls_fragment 3; - hls_playlist_length 28800; + hls_playlist_length ${STREAM_RING_LENGTH_SECOND}; on_publish ${WEB_SERVER_URL}/api/v1/stream/start; on_publish_done ${WEB_SERVER_URL}/api/v1/stream/stop; diff --git a/nginx/docker-entrypoint.sh b/nginx/docker-entrypoint.sh index 3d1c9c0..0859fb6 100644 --- a/nginx/docker-entrypoint.sh +++ b/nginx/docker-entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/sh # must only run on certain env files, otherwise it replaces too much -envsubst '${WEB_SERVER_URL}' \ +envsubst '${WEB_SERVER_URL} ${STREAM_RING_LENGTH_SECOND}' \ < /etc/nginx/templates/default.conf.template \ > /etc/nginx/nginx.conf diff --git a/src/main/java/com/ddf/vodsystem/repositories/MarkerRepository.java b/src/main/java/com/ddf/vodsystem/repositories/MarkerRepository.java index 581d286..d5b7d82 100644 --- a/src/main/java/com/ddf/vodsystem/repositories/MarkerRepository.java +++ b/src/main/java/com/ddf/vodsystem/repositories/MarkerRepository.java @@ -6,10 +6,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.time.Instant; import java.util.List; @Repository public interface MarkerRepository extends JpaRepository { @Query("SELECT m FROM Marker m WHERE m.user = ?1") List findByUser(User user); + + @Query("SELECT m FROM Marker m WHERE m.timestamp <= ?1") + List findAllBefore(Instant time); } diff --git a/src/main/java/com/ddf/vodsystem/services/MarkerService.java b/src/main/java/com/ddf/vodsystem/services/MarkerService.java index c23c27a..b747f6a 100644 --- a/src/main/java/com/ddf/vodsystem/services/MarkerService.java +++ b/src/main/java/com/ddf/vodsystem/services/MarkerService.java @@ -7,6 +7,9 @@ import com.ddf.vodsystem.exceptions.MarkerNotFound; import com.ddf.vodsystem.exceptions.NotAuthenticated; import com.ddf.vodsystem.exceptions.NotStreaming; import com.ddf.vodsystem.repositories.MarkerRepository; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.Instant; @@ -20,6 +23,9 @@ public class MarkerService { private final StreamService streamService; private final MarkerRepository markerRepository; + @Value("${stream.max-length}") + private Long maxStreamLength; + public MarkerService(UserService userService, StreamService streamService, MarkerRepository markerRepository) { this.userService = userService; this.streamService = streamService; @@ -65,4 +71,12 @@ public class MarkerService { marker.setTimestamp(Instant.now()); return markerRepository.saveAndFlush(marker); } + + @Scheduled(fixedDelay = 360_000) + @Transactional + public void deleteOldMarkers() { + Instant cutoff = Instant.now().minusSeconds(maxStreamLength); + List stale = markerRepository.findAllBefore(cutoff); + markerRepository.deleteAllInBatch(stale); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9701c07..3fd439f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,6 +3,7 @@ spring.application.name=vodSystem # VODs spring.servlet.multipart.max-file-size=2GB spring.servlet.multipart.max-request-size=2GB +stream.max-length=${STREAM_RING_LENGTH_SECOND} # Database spring.datasource.url=${POSTGRES_URL}