v0.0.4
authorVásáry Dániel <vasary@elgekko.net>
Sun, 14 Jan 2024 19:43:56 +0000 (20:43 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Sun, 14 Jan 2024 19:43:56 +0000 (20:43 +0100)
20 files changed:
mc-vod-sync/mc-vod-sync-app/pom.xml
mc-vod-sync/mc-vod-sync-app/src/main/resources/application-dev.yaml
mc-vod-sync/mc-vod-sync-app/src/main/resources/application.yaml
mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ExecutionLockIT.java
mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.java
mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ScheduledDateCheckerIT.java [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-db/migrations/scripts/004_modify_asset.sql [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/Asset.java
mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/repository/AssetRepository.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/ServiceProperties.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/config/ScheduledTasks.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerCompletedEvent.java [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerStartedEvent.java [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/AssetImportService.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/VodXlsProcessor.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledDateChecker.java [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledSunsetChacker.java [deleted file]
mc-vod-sync/mc-vod-sync-ui/src/main/java/hu/user/mcvodsync/ui/view/MainViewModel.java
mc-vod-sync/mc-vod-sync-ui/src/main/resources/web/main.zul

index b73d56eb9e44d4d7115e9093bb511cda5ace035b..9ac277ea760c2e53e3e985316f42e2b29627c1cb 100644 (file)
@@ -3,7 +3,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>mc-vod-sync-app</artifactId>
-    <version>0.0.3</version>
+    <version>0.0.4</version>
     <parent>
         <groupId>hu.user</groupId>
         <artifactId>mc-vod-sync</artifactId>
index f2b12d1b461977e18b90d83ccfe715e4daaff68c..faf30e13d128d174b27ef1953d1f5a7fa21e9810 100644 (file)
@@ -41,14 +41,15 @@ logging:
 mc-vod-sync:
   service:
     target-video-insert-enabled: false
+    target-video-update-enabled: false
     target-playlist-insert-enabled: false
     scheduler:
       import-enabled: false
       export-enabled: false
-      sunset-checker-enabled: false
-      import-cron: 0 0 4 1/1 * ? *
-      export-cron: 0 0 4 1/1 * ? *
-      sunset-checker-cron: 0 0 4 1/1 * ? *
+      schedule-checker-enabled: true
+      import-cron: 0 0 4 1/1 * ?
+      export-cron: 0 0 4 1/1 * ?
+      schedule-checker-cron: 0 38 14 1/1 * ?
     report:
       recipient: vasary@elgekko.net
       sender: noreply@mc-vod-sync
index 00b7dec1aaff4c376907f5d189756c5f54b7d1c4..48e92b02b28befdf456ddaea56c8e6465968fc3a 100644 (file)
@@ -34,14 +34,15 @@ logging:
 mc-vod-sync:
   service:
     target-video-insert-enabled: false
+    target-video-update-enabled: false
     target-playlist-insert-enabled: false
     scheduler:
       import-enabled: false
       export-enabled: false
-      sunset-checker-enabled: false
+      schedule-checker-enabled: false
       import-cron: 0 0 4 1/1 * ? *
       export-cron: 0 0 4 1/1 * ? *
-      sunset-checker-cron: 0 0 4 1/1 * ? *
+      schedule-checker-cron: 0 0 4 1/1 * ? *
     report:
       recipient: vasary@elgekko.net
       sender: noreply@mc-vod-sync
index 9e8f09745d1c62ff7e6dac944c81a22e994aa53e..07c86136c0753df574282b6265d6e7063daf88c0 100644 (file)
@@ -5,7 +5,7 @@
 
 package hu.user.mcvodsync;
 
-import hu.user.mcvodsync.service.schedule.ScheduledSunsetChacker;
+import hu.user.mcvodsync.service.schedule.ScheduledDateChecker;
 import lombok.extern.log4j.Log4j2;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -30,16 +30,16 @@ public class ExecutionLockIT {
     private TaskScheduler taskScheduler;
 
     @Autowired
-    private ScheduledSunsetChacker scheduledSunsetChacker;
+    private ScheduledDateChecker scheduledDateChecker;
 
     @Test
     public void testSemaphore() throws InterruptedException {
         log.info("Test start");
         Thread.sleep(1000);
 
-        taskScheduler.schedule(scheduledSunsetChacker, Instant.now());
+        taskScheduler.schedule(scheduledDateChecker, Instant.now());
         Thread.sleep(5000);
-        log.info("Test finish");
+        log.info("Test processPlaylists");
     }
 
 }
\ No newline at end of file
index 8a6940405e3480eba639f7245162f76dea38d46f..2d085c9ce77e3b0e76cb4d3e2842d69060bc8e9d 100644 (file)
@@ -24,7 +24,6 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.sql.Date;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -58,21 +57,21 @@ public class RepositoryIT {
         List<String> playlists = assetRepository.queryDistinctPlaylists();
         assertNotNull(playlists);
 
-        List<Long> assets = assetRepository.queryPlaylistsAssets(playlists.get(0));
+        List<Long> assets = assetRepository.queryPlaylistsAssetsByDate(playlists.get(0), java.sql.Date.valueOf(LocalDate.now()));
         assertNotNull(assets);
     }
 
     @Test
     public void queryExpired() {
         LocalDate currentDate = LocalDate.parse("2000-01-02", DateTimeFormatter.ISO_LOCAL_DATE);
-        List<Asset> ids = assetRepository.queryExpired(Date.valueOf(currentDate));
+        List<Asset> ids = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate));
         assertNotNull(ids);
         assertEquals(1, ids.size());
 
         CompositeSummary summary = CompositeSummary.builder().build();
-        assetImportService.removeExpired(currentDate, summary);
+        assetImportService.removeExpired(summary);
 
-        ids = assetRepository.queryExpired(Date.valueOf(currentDate));
+        ids = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate));
         assertNotNull(ids);
         assertEquals(0, ids.size());
 
diff --git a/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ScheduledDateCheckerIT.java b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ScheduledDateCheckerIT.java
new file mode 100644 (file)
index 0000000..db970f2
--- /dev/null
@@ -0,0 +1,84 @@
+package hu.user.mcvodsync;
+
+import hu.user.mcvodsync.db.Asset;
+import hu.user.mcvodsync.db.repository.AssetRepository;
+import hu.user.mcvodsync.service.schedule.ScheduledDateChecker;
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.time.LocalDate;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+@Log4j2
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ActiveProfiles("dev")
+@TestPropertySource("classpath:application-dev.yaml")
+public class ScheduledDateCheckerIT extends AssetImportExportBase {
+
+    @Autowired
+    private ScheduledDateChecker scheduledDateChecker;
+
+    @Autowired
+    private AssetRepository assetRepository;
+
+    @Test
+    public void doNotPublishTest() {
+        cleanupLocal();
+        importFile("src/test/resources/testdata.xlsx");
+        cleanupLocalSync();
+
+        assetRepository.clearListed();
+        Optional<Asset> asset = assetRepository.findByCatalogId("CCEM110068");
+        asset.ifPresent(a -> {
+            a.setSunrise(java.sql.Date.valueOf(LocalDate.now().plusDays(2)));
+            assetRepository.save(a);
+        });
+
+        scheduledDateChecker.run();
+        assertEquals("CCEM110180,CCEM110183", getPlaylistSyncIds("Playlist1"));
+        assertEquals("CCEM128963,CCEM128965,CCEM128967", getPlaylistSyncIds("Playlist2"));
+        assertEquals("CCEF008678,CCEM001148,CCEM072086", getPlaylistSyncIds("Playlist3"));
+    }
+
+    @Test
+    public void publishTest() {
+        cleanupLocal();
+        importFile("src/test/resources/testdata.xlsx");
+        cleanupLocalSync();
+
+        Optional<Asset> asset = assetRepository.findByCatalogId("CCEM110068");
+        asset.ifPresent(a -> {
+            a.setSunrise(java.sql.Date.valueOf(LocalDate.now().plusDays(1)));
+            a.setListed(false);
+            assetRepository.save(a);
+        });
+
+        scheduledDateChecker.run();
+        assertEquals("CCEM110180,CCEM110183,CCEM110068", getPlaylistSyncIds("Playlist1"));
+    }
+
+    @Test
+    public void unPublishTest() {
+        cleanupLocal();
+        importFile("src/test/resources/testdata.xlsx");
+        cleanupLocalSync();
+
+        Optional<Asset> asset = assetRepository.findByCatalogId("CCEM110068");
+        asset.ifPresent(a -> {
+            a.setSunset(java.sql.Date.valueOf(LocalDate.now()));
+            assetRepository.save(a);
+        });
+
+        scheduledDateChecker.run();
+        assertEquals("CCEM110180,CCEM110183", getPlaylistSyncIds("Playlist1"));
+    }
+}
diff --git a/mc-vod-sync/mc-vod-sync-db/migrations/scripts/004_modify_asset.sql b/mc-vod-sync/mc-vod-sync-db/migrations/scripts/004_modify_asset.sql
new file mode 100644 (file)
index 0000000..0c70a06
--- /dev/null
@@ -0,0 +1,18 @@
+-- // Modify Asset
+-- Migration SQL that makes the change goes here.
+ALTER TABLE asset
+    ADD COLUMN listed SMALLINT;
+
+CREATE INDEX idx_asset_playlist_listed ON asset(playlist, listed);
+CREATE INDEX idx_asset_playlist_sunrise ON asset(playlist, sunrise);
+CREATE INDEX idx_asset_sunset ON asset(sunset);
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+DROP INDEX idx_asset_playlist_listed;
+DROP INDEX idx_asset_playlist_sunrise;
+DROP INDEX idx_asset_sunset;
+
+ALTER TABLE asset
+    DROP COLUMN listed;
+CALL SYSPROC.ADMIN_CMD('REORG TABLE asset');
index e97ceddba9a9b91a73378ba7d6776e56b52d28a9..524cd932254cca75b44c8c97a944de16e79e7eba 100644 (file)
@@ -84,4 +84,6 @@ public class Asset implements Serializable {
     @Column(name = "prog_genre3", length = 128)
     private String progGenre3;
 
+    private boolean listed;
+
 }
index cec95118d603feaf6467ec73c7ee851c0e10246e..e96a736c47e1a7de534c90cfe593eb525765ac03 100644 (file)
@@ -4,6 +4,7 @@ import hu.user.mcvodsync.db.Asset;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.sql.Date;
 import java.util.List;
@@ -11,19 +12,34 @@ import java.util.Optional;
 
 public interface AssetRepository extends JpaRepository<Asset, Long> {
 
+    Optional<Asset> findByCatalogId(String catalogId);
+
     @Query("SELECT DISTINCT(a.playlist) FROM Asset a ORDER BY a.playlist")
     List<String> queryDistinctPlaylists();
 
-    @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist ORDER BY a.seasonNr, a.episodeNr")
-    List<Long> queryPlaylistsAssets(String playlist);
+    @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist and a.sunrise <= :currentDate ORDER BY a.seasonNr, a.episodeNr")
+    List<Long> queryPlaylistsAssetsByDate(String playlist, Date currentDate);
+
+    @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist AND a.listed = TRUE ORDER BY a.seasonNr, a.episodeNr")
+    List<Long> queryPlaylistsListedAssets(String playlist);
 
     Optional<Asset> findByCatalogIdAndPlaylist(String catalogId, String playlist);
 
-    @Query("SELECT a FROM Asset a WHERE a.sunset <= :currentDate ORDER BY a.catalogId")
+    @Query("SELECT a FROM Asset a WHERE a.sunset < :currentDate ORDER BY a.catalogId")
     List<Asset> queryExpired(Date currentDate);
 
     @Modifying
-    @Query("DELETE FROM Asset a WHERE a.sunset <= :currentDate")
+    @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.listed = FALSE AND a.id IN (:ids)")
+    void updateListed(List<Long> ids);
+
+    @Modifying
+    @Query("UPDATE Asset a SET a.listed = FALSE")
+    @Transactional
+    void clearListed();
+
+    @Modifying
+    @Query("DELETE FROM Asset a WHERE a.sunset < :currentDate")
+    @Transactional
     void deleteExpired(Date currentDate);
 
     @Query("SELECT a.referenceId FROM Asset a WHERE a.id = :id")
index 515b3e15f8cb1270b0062dadc17d37001ad3579c..7074b69edfc4fc5e212e60685b95b0271a93dbcb 100644 (file)
@@ -13,6 +13,8 @@ public class ServiceProperties {
 
     private boolean targetVideoInsertEnabled;
 
+    private boolean targetVideoUpdateEnabled;
+
     private boolean targetPlaylistInsertEnabled;
 
     private Scheduler scheduler;
@@ -30,9 +32,9 @@ public class ServiceProperties {
 
         private String exportCron;
 
-        private boolean sunsetCheckerEnabled;
+        private boolean scheduleCheckerEnabled;
 
-        private String sunsetCheckerCron;
+        private String scheduleCheckerCron;
     }
 
     @Getter
index 4a8ffdd9231e2311d6d55700cb61f499f692bad5..4d3394e8fc4eb9887010165616057612a22fd6a7 100644 (file)
@@ -4,14 +4,11 @@ import hu.user.mcvodsync.db.repository.AssetSyncRepository;
 import hu.user.mcvodsync.db.repository.PlaylistSyncRepository;
 import hu.user.mcvodsync.service.ServiceProperties;
 import hu.user.mcvodsync.service.data.CompositeSummary;
-import hu.user.mcvodsync.service.event.ExportCompletedEvent;
-import hu.user.mcvodsync.service.event.ExportStartedEvent;
-import hu.user.mcvodsync.service.event.ImportCompletedEvent;
-import hu.user.mcvodsync.service.event.ImportStartedEvent;
+import hu.user.mcvodsync.service.event.*;
 import hu.user.mcvodsync.service.mail.EmailSendService;
+import hu.user.mcvodsync.service.schedule.ScheduledDateChecker;
 import hu.user.mcvodsync.service.schedule.ScheduledExport;
 import hu.user.mcvodsync.service.schedule.ScheduledImport;
-import hu.user.mcvodsync.service.schedule.ScheduledSunsetChacker;
 import hu.user.mcvodsync.service.time.TimeUtils;
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -42,7 +39,7 @@ public class ScheduledTasks {
     private ScheduledImport scheduledImport;
 
     @Autowired
-    private ScheduledSunsetChacker scheduledSunsetChacker;
+    private ScheduledDateChecker scheduledDateChecker;
 
     @Autowired
     private AssetSyncRepository assetSyncRepository;
@@ -51,7 +48,7 @@ public class ScheduledTasks {
     private PlaylistSyncRepository playlistSyncRepository;
 
     @Autowired
-    EmailSendService emailSendService;
+    private EmailSendService emailSendService;
 
     @Getter
     private CompositeSummary importSummary;
@@ -77,8 +74,8 @@ public class ScheduledTasks {
         if (scheduler.isImportEnabled()) {
             taskScheduler.schedule(scheduledImport, new CronTrigger(scheduler.getExportCron()));
         }
-        if (scheduler.isSunsetCheckerEnabled()) {
-            taskScheduler.schedule(scheduledSunsetChacker, new CronTrigger(scheduler.getSunsetCheckerCron()));
+        if (scheduler.isScheduleCheckerEnabled()) {
+            taskScheduler.schedule(scheduledDateChecker, new CronTrigger(scheduler.getScheduleCheckerCron()));
         }
 
         checkSyncStatus();
@@ -93,6 +90,28 @@ public class ScheduledTasks {
         taskScheduler.schedule(scheduledExport, Instant.now());
     }
 
+    public void startCheckDates() {
+        taskScheduler.schedule(scheduledDateChecker, Instant.now());
+    }
+
+    @Async
+    @EventListener
+    public void handleEvent(DateCheckerStartedEvent evt) {
+        log.info("DateCheckerStartedEvent handle");
+        importSummary = null;
+        status = String.format("Date checker is in progress, started as %s", TimeUtils.toString(evt.getTimestamp()));
+    }
+
+    @Async
+    @EventListener
+    public void handleEvent(DateCheckerCompletedEvent evt) {
+        log.info("DateCheckerCompletedEvent handle");
+        importSummary = evt.getSummary();
+        status = String.format("Date checker completed at %s", TimeUtils.toString(evt.getTimestamp()));
+        checkSyncStatus();
+        emailSendService.sendSimpleMessage("BrightCove date checker report", importSummary);
+    }
+
     @Async
     @EventListener
     public void handleEvent(ImportStartedEvent evt) {
diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerCompletedEvent.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerCompletedEvent.java
new file mode 100644 (file)
index 0000000..e17d7da
--- /dev/null
@@ -0,0 +1,18 @@
+package hu.user.mcvodsync.service.event;
+
+import hu.user.mcvodsync.service.data.CompositeSummary;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.context.ApplicationEvent;
+
+@Getter
+@Setter
+public class DateCheckerCompletedEvent extends ApplicationEvent {
+
+    private final CompositeSummary summary;
+
+    public DateCheckerCompletedEvent(Object source, CompositeSummary summary) {
+        super(source);
+        this.summary = summary;
+    }
+}
diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerStartedEvent.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerStartedEvent.java
new file mode 100644 (file)
index 0000000..37f4ecf
--- /dev/null
@@ -0,0 +1,15 @@
+package hu.user.mcvodsync.service.event;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.context.ApplicationEvent;
+
+@Getter
+@Setter
+public class DateCheckerStartedEvent extends ApplicationEvent {
+
+    public DateCheckerStartedEvent(Object source) {
+        super(source);
+    }
+
+}
index 2fd8ca519cd5279714af29c8ddd9b732de2f1d31..9ebab7165df8e2a1df06960265256020657d0b5c 100644 (file)
@@ -14,6 +14,7 @@ import lombok.extern.log4j.Log4j2;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.Instant;
 import java.time.LocalDate;
@@ -37,17 +38,33 @@ public class AssetImportService {
 
     private Map<String, List<Long>> currentPlaylists;
 
+    private java.sql.Date checkDate;
 
-    public void prepare() {
-        currentPlaylists = getPlayLists();
+    public void prepare(LocalDate currentData) {
+        checkDate = java.sql.Date.valueOf(currentData);
     }
 
+
     public Map<String, List<Long>> getPlayLists() {
         Map<String, List<Long>> result = new HashMap<>();
         List<String> playlistNames = assetRepository.queryDistinctPlaylists();
         playlistNames.forEach(playlist -> {
-            List<Long> playlistsAssets = assetRepository.queryPlaylistsAssets(playlist);
-            result.put(playlist, playlistsAssets);
+            List<Long> playlistsAssets = assetRepository.queryPlaylistsListedAssets(playlist);
+            if (!playlistsAssets.isEmpty()) {
+                result.put(playlist, playlistsAssets);
+            }
+        });
+        return result;
+    }
+
+    private Map<String, List<Long>> getPlayListsByDate() {
+        Map<String, List<Long>> result = new HashMap<>();
+        List<String> playlistNames = assetRepository.queryDistinctPlaylists();
+        playlistNames.forEach(playlist -> {
+            List<Long> playlistsAssets = assetRepository.queryPlaylistsAssetsByDate(playlist, checkDate);
+            if (!playlistsAssets.isEmpty()) {
+                result.put(playlist, playlistsAssets);
+            }
         });
         return result;
     }
@@ -91,26 +108,31 @@ public class AssetImportService {
         }
     }
 
-    public void removeExpired(LocalDate currentDate, CompositeSummary summary) {
-        List<Asset> expiredAssets = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate));
-        assetRepository.deleteExpired(java.sql.Date.valueOf(currentDate));
-        List<AssetSync> syncs = expiredAssets.stream().map(asset -> AssetSync.builder()
-                .assetId(asset.getId())
-                .catalogId(asset.getCatalogId())
-                .syncType(SyncType.DELETE)
-                .build()).collect(Collectors.toList());
-        assetSyncRepository.saveAllAndFlush(syncs);
-        summary.getVideo().setDelete(summary.getVideo().getDelete() + expiredAssets.size());
+    public void removeExpired(CompositeSummary summary) {
+        List<Asset> expiredAssets = assetRepository.queryExpired(checkDate);
+        if (!expiredAssets.isEmpty()) {
+            assetRepository.deleteExpired(checkDate);
+            List<AssetSync> syncs = expiredAssets.stream().map(asset -> AssetSync.builder()
+                    .assetId(asset.getId())
+                    .catalogId(asset.getCatalogId())
+                    .syncType(SyncType.DELETE)
+                    .build()).collect(Collectors.toList());
+            assetSyncRepository.saveAllAndFlush(syncs);
+            summary.getVideo().setDelete(expiredAssets.size());
+        }
     }
 
-    public void finish(CompositeSummary summary) {
-        removeExpired(LocalDate.now(), summary);
-        processPlaylists(summary);
+    @Transactional
+    public void processPlaylists(CompositeSummary summary) {
+        currentPlaylists = getPlayLists();
+        removeExpired(summary);
+        checkPlaylists(summary);
     }
 
-    public void processPlaylists(CompositeSummary summary) {
-        Map<String, List<Long>> newPlaylists = getPlayLists();
+    public void checkPlaylists(CompositeSummary summary) {
         Set<String> currentPlaylistNames = currentPlaylists.keySet();
+
+        Map<String, List<Long>> newPlaylists = getPlayListsByDate();
         Set<String> newPlaylistNames = newPlaylists.keySet();
 
         Collection<String> playlistNamesDifference = CollectionUtils.subtract(currentPlaylistNames, newPlaylistNames);
@@ -121,7 +143,7 @@ public class AssetImportService {
                         .syncType(SyncType.DELETE)
                         .created(Date.from(Instant.now()))
                         .build();
-                playlistSyncRepository.save(sync);
+                playlistSyncRepository.saveAndFlush(sync);
                 summary.getPlaylist().incDelete();
             });
         }
@@ -135,8 +157,10 @@ public class AssetImportService {
                         .created(Date.from(Instant.now()))
                         .ids(newPlaylists.get(name))
                         .build();
-                playlistSyncRepository.save(sync);
+                playlistSyncRepository.saveAndFlush(sync);
+                assetRepository.updateListed(sync.getIds());
                 summary.getPlaylist().incInsert();
+
             });
         }
 
@@ -150,7 +174,8 @@ public class AssetImportService {
                         .ids(newPlaylists.get(name))
                         .created(Date.from(Instant.now()))
                         .build();
-                playlistSyncRepository.save(sync);
+                playlistSyncRepository.saveAndFlush(sync);
+                assetRepository.updateListed(sync.getIds());
                 summary.getPlaylist().incUpdate();
             }
         });
index b2e7fa99dc2bfebab65f23973734ea83582718c3..47309637274568bc846268f63e5fa3a0ef7ec0a0 100644 (file)
@@ -16,6 +16,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.Instant;
+import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -44,7 +45,7 @@ public class VodXlsProcessor {
             try (Stream<Row> rows = sheet.openStream()) {
                 rows.forEach(row -> {
                     if (row.getRowNum() == 1) {
-                        assetImportService.prepare();
+                        assetImportService.prepare(LocalDate.now());
                         headers = getHeaders(row);
                     } else {
                         log.info("Processing {}", row.getRowNum());
@@ -53,7 +54,7 @@ public class VodXlsProcessor {
                     }
                 });
             }
-            assetImportService.finish(summary);
+            assetImportService.processPlaylists(summary);
 
         } catch (IOException e) {
             log.error("Excel file reading error from {}. System message: {}", fileName, e.getMessage());
index 31390b379c65412fc35f1620da9c0a41e52c77a3..8e68ac94381c8d889533a879b87518b02596a61a 100644 (file)
@@ -11,6 +11,7 @@ import hu.user.mcvodsync.db.SyncType;
 import hu.user.mcvodsync.db.repository.AssetRepository;
 import hu.user.mcvodsync.db.repository.AssetSyncRepository;
 import hu.user.mcvodsync.db.repository.PlaylistSyncRepository;
+import hu.user.mcvodsync.service.ServiceProperties;
 import hu.user.mcvodsync.service.data.CompositeSummary;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
@@ -43,6 +44,9 @@ public class SyncExportService {
     @Autowired
     private VideoMapper videoMapper;
 
+    @Autowired
+    private ServiceProperties serviceProperties;
+
     private static final String MC_VOD_SYNC = "mc-vod-sync";
 
     @Transactional
@@ -66,11 +70,17 @@ public class SyncExportService {
                         assetRepository.save(asset);
                     }
                 }
-                if (StringUtils.isNotBlank(videoId)) {
-                    assetVideo.addTagsItem(MC_VOD_SYNC);
-                    bcClient.updateVideo(videoId, assetVideo);
-                    summary.getVideo().incUpdate();
+
+                if (serviceProperties.isTargetVideoUpdateEnabled()) {
+                    if (StringUtils.isNotBlank(videoId)) {
+                        assetVideo.addTagsItem(MC_VOD_SYNC);
+                        bcClient.updateVideo(videoId, assetVideo);
+                        summary.getVideo().incUpdate();
+                    }
+                } else {
+                    summary.getVideo().incSkip();
                 }
+
                 assetSync.setExportedSuccess(Date.from(Instant.now()));
             }
             summary.getVideo().incSuccess();
diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledDateChecker.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledDateChecker.java
new file mode 100644 (file)
index 0000000..2be0173
--- /dev/null
@@ -0,0 +1,43 @@
+package hu.user.mcvodsync.service.schedule;
+
+import hu.user.mcvodsync.service.data.CompositeSummary;
+import hu.user.mcvodsync.service.event.DateCheckerCompletedEvent;
+import hu.user.mcvodsync.service.event.DateCheckerStartedEvent;
+import hu.user.mcvodsync.service.in.AssetImportService;
+import lombok.SneakyThrows;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+
+import java.time.Instant;
+import java.time.LocalDate;
+
+@Log4j2
+@Component
+public class ScheduledDateChecker implements Runnable {
+    @Autowired
+    private ApplicationEventPublisher applicationEventPublisher;
+
+    @Autowired
+    private AssetImportService assetImportService;
+
+    @SneakyThrows
+    @Override
+    public void run() {
+        CompositeSummary summary = CompositeSummary.builder().started(Instant.now()).build();
+        try {
+            applicationEventPublisher.publishEvent(new DateCheckerStartedEvent(this));
+            log.info("ScheduledDateChecker started");
+            assetImportService.prepare(LocalDate.now().plusDays(1));
+            assetImportService.processPlaylists(summary);
+        } catch (Exception e) {
+            log.error(e);
+        } finally {
+            summary.setFinished(Instant.now());
+            applicationEventPublisher.publishEvent(new DateCheckerCompletedEvent(this, summary));
+            log.info("ScheduledDateChecker finished");
+        }
+
+    }
+}
diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledSunsetChacker.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledSunsetChacker.java
deleted file mode 100644 (file)
index 7b394df..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-package hu.user.mcvodsync.service.schedule;
-
-import lombok.SneakyThrows;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.ThreadLocalRandom;
-
-@Log4j2
-@Component
-//@ConditionalOnExpression("'${mc-vod-sync.scheduler.sunrise-checker}'=='true'")
-public class ScheduledSunsetChacker implements Runnable {
-
-    @SneakyThrows
-    @Override
-    public void run() {
-        try {
-            log.info("Start 3");
-            log.info("Execute 3");
-            int randomNum = ThreadLocalRandom.current().nextInt(100, 2000);
-            Thread.sleep(randomNum);
-            log.info("Finish 3");
-
-        } catch (Exception e) {
-            log.error(e);
-        }
-
-    }
-}
index 5cf385d5b7170f537c9f7ead632007a6278923ad..57e2cc7e8445deaa70cd63865435b13edbe9eba6 100644 (file)
@@ -94,5 +94,10 @@ public class MainViewModel extends FilterActiveViewModel<UploadFile> {
         scheduledTasks.startExport();
     }
 
+    @Command
+    public void onStartCheckDates() {
+        scheduledTasks.startCheckDates();
+    }
+
 
 }
index d458fd9aff82172e8d49c3538224b5c79ca7acb8..6be22bba7e950fa89937739467dfddf44090798c 100644 (file)
@@ -15,6 +15,9 @@
                         <separator orient="vertical"/>
                         <toolbarbutton label="Export" iconSclass="z-icon-cloud-upload"
                                        onClick="@command('onStartExport')" style="font-size: 1.2em"/>
+                        <space bar="true"/>
+                        <toolbarbutton label="Check dates" iconSclass="z-icon-calendar-times-o"
+                                       onClick="@command('onStartCheckDates')" style="font-size: 1.2em"/>
                     </toolbar>
                 </vlayout>
             </north>