DateChecker fixed
authorVásáry Dániel <vasary@elgekko.net>
Sun, 18 Feb 2024 22:10:48 +0000 (23:10 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Sun, 18 Feb 2024 22:10:48 +0000 (23:10 +0100)
mc-vod-sync/mc-vod-sync-app/pom.xml
mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.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/config/ScheduledTasks.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/CompositeSummary.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/PlaylistSummary.java [new file with mode: 0644]
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/Summary.java
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/mail/EmailSendService.java
mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java

index 9ac277ea760c2e53e3e985316f42e2b29627c1cb..e9b72dbbadf20716981f5a3ddb73f5089dd02e8c 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.4</version>
+    <version>0.0.5</version>
     <parent>
         <groupId>hu.user</groupId>
         <artifactId>mc-vod-sync</artifactId>
index 2d085c9ce77e3b0e76cb4d3e2842d69060bc8e9d..dc44d74c1122f977dd8e4f0caca2916cdaca073b 100644 (file)
@@ -69,7 +69,7 @@ public class RepositoryIT {
         assertEquals(1, ids.size());
 
         CompositeSummary summary = CompositeSummary.builder().build();
-        assetImportService.removeExpired(summary);
+        assetImportService.unlistExpired(summary);
 
         ids = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate));
         assertNotNull(ids);
index e96a736c47e1a7de534c90cfe593eb525765ac03..26fd74338dd2060959969dbc02d27ea009f505e7 100644 (file)
@@ -17,7 +17,7 @@ public interface AssetRepository extends JpaRepository<Asset, Long> {
     @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 and a.sunrise <= :currentDate ORDER BY a.seasonNr, a.episodeNr")
+    @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist AND a.sunrise <= :currentDate AND a.sunset >= :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")
@@ -25,12 +25,13 @@ public interface AssetRepository extends JpaRepository<Asset, Long> {
 
     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 AND a.listed = TRUE ORDER BY a.catalogId")
     List<Asset> queryExpired(Date currentDate);
 
     @Modifying
-    @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.listed = FALSE AND a.id IN (:ids)")
-    void updateListed(List<Long> ids);
+    @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.id IN (:ids)")
+    @Transactional
+    void updateSetListed(List<Long> ids);
 
     @Modifying
     @Query("UPDATE Asset a SET a.listed = FALSE")
@@ -38,9 +39,9 @@ public interface AssetRepository extends JpaRepository<Asset, Long> {
     void clearListed();
 
     @Modifying
-    @Query("DELETE FROM Asset a WHERE a.sunset < :currentDate")
+    @Query("UPDATE Asset a SET a.listed = FALSE WHERE a.id IN (:ids)")
     @Transactional
-    void deleteExpired(Date currentDate);
+    void updateSetUnlisted(List<Long> ids);
 
     @Query("SELECT a.referenceId FROM Asset a WHERE a.id = :id")
     String findReferenceIdById(Long id);
index 4d3394e8fc4eb9887010165616057612a22fd6a7..ea1a12212fe7add6424fa6164b6928489dccbbbe 100644 (file)
@@ -105,8 +105,9 @@ public class ScheduledTasks {
     @Async
     @EventListener
     public void handleEvent(DateCheckerCompletedEvent evt) {
-        log.info("DateCheckerCompletedEvent handle");
         importSummary = evt.getSummary();
+        log.info("DateCheckerCompletedEvent handle");
+        log.info("Summary {}", importSummary);
         status = String.format("Date checker completed at %s", TimeUtils.toString(evt.getTimestamp()));
         checkSyncStatus();
         emailSendService.sendSimpleMessage("BrightCove date checker report", importSummary);
index 55017fce3728fe5462f7332420cbb411d54e0603..0923da999141f6f1ef6fff9ec9c4411a4c92fe73 100644 (file)
@@ -19,7 +19,7 @@ public class CompositeSummary {
     private Summary video = Summary.builder().build();
 
     @Builder.Default
-    private Summary playlist = Summary.builder().build();
+    private PlaylistSummary playlist = PlaylistSummary.builder().build();
 
     private Instant started;
 
@@ -36,10 +36,17 @@ public class CompositeSummary {
                 System.lineSeparator() +
                 String.format("Playlist success count: %d, error count: %d, skip count: %d", playlist.getSuccess(), playlist.getError(), playlist.getSkip()) +
                 System.lineSeparator() +
-                String.format("Playlist insert count: %d, update count: %d, delete count: %d", playlist.getInsert(), playlist.getUpdate(), playlist.getDelete());
+                String.format("Playlist insert count: %d, update count: %d, delete count: %d", playlist.getInsert(), playlist.getUpdate(), playlist.getDelete()) +
+                System.lineSeparator() +
+                String.format("Sunrise: %s", String.join(",", playlist.getSunrises())) +
+                System.lineSeparator() +
+                String.format("Sunset: %s", String.join(",", playlist.getSunsets()));
     }
 
     public String getDuration() {
+        if (Objects.isNull(started) || Objects.isNull(finished)) {
+            return StringUtils.EMPTY;
+        }
         Duration executionDuration = Duration.between(started, finished);
         return DurationFormatUtils.formatDuration(executionDuration.toMillis(), "H:mm:ss", true);
     }
diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/PlaylistSummary.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/PlaylistSummary.java
new file mode 100644 (file)
index 0000000..7e9aae3
--- /dev/null
@@ -0,0 +1,24 @@
+package hu.user.mcvodsync.service.data;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.SuperBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+@SuperBuilder
+public class PlaylistSummary extends Summary {
+
+    //napnyugta
+    @Builder.Default
+    private List<String> sunsets = new ArrayList<>();
+
+    //napkelte
+    @Builder.Default
+    private List<String> sunrises = new ArrayList<>();
+
+}
index f957233096cdbe96bb6d0e9b7605f931e6cadb27..771bdaa52996b7ad7fe03ebffc5e10dd9abaa99a 100644 (file)
@@ -1,12 +1,12 @@
 package hu.user.mcvodsync.service.data;
 
-import lombok.Builder;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.SuperBuilder;
 
 @Getter
 @Setter
-@Builder
+@SuperBuilder
 public class Summary {
     private long all;
 
@@ -47,7 +47,7 @@ public class Summary {
     }
 
     public void incDelete() {
-        update++;
+        delete++;
     }
 
 }
index 9ebab7165df8e2a1df06960265256020657d0b5c..42e85e37e727fc19b929f4e74f27d8490ee786b0 100644 (file)
@@ -14,7 +14,6 @@ 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;
@@ -90,13 +89,13 @@ public class AssetImportService {
         if (new Date().after(asset.getSunset())) {
             summary.getVideo().incSkip();
             if (assetSync.getSyncType() == SyncType.UPDATE) {
-                assetRepository.saveAndFlush(asset);
+                assetRepository.save(asset);
             }
         } else {
             if (Objects.nonNull(assetSync.getSyncType())) {
-                assetRepository.saveAndFlush(asset);
+                assetRepository.save(asset);
                 assetSync.setAssetId(asset.getId());
-                assetSyncRepository.saveAndFlush(assetSync);
+                assetSyncRepository.save(assetSync);
             }
 
             if (assetSync.getSyncType() == SyncType.UPDATE) {
@@ -108,24 +107,24 @@ public class AssetImportService {
         }
     }
 
-    public void removeExpired(CompositeSummary summary) {
+    public void unlistExpired(CompositeSummary summary) {
         List<Asset> expiredAssets = assetRepository.queryExpired(checkDate);
         if (!expiredAssets.isEmpty()) {
-            assetRepository.deleteExpired(checkDate);
+            List<Long> ids = expiredAssets.stream().map(Asset::getId).collect(Collectors.toList());
+            assetRepository.updateSetUnlisted(ids);
             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);
+            assetSyncRepository.saveAll(syncs);
             summary.getVideo().setDelete(expiredAssets.size());
         }
     }
 
-    @Transactional
     public void processPlaylists(CompositeSummary summary) {
         currentPlaylists = getPlayLists();
-        removeExpired(summary);
+        unlistExpired(summary);
         checkPlaylists(summary);
     }
 
@@ -137,46 +136,92 @@ public class AssetImportService {
 
         Collection<String> playlistNamesDifference = CollectionUtils.subtract(currentPlaylistNames, newPlaylistNames);
         if (!playlistNamesDifference.isEmpty()) {
-            playlistNamesDifference.forEach(name -> {
-                PlaylistSync sync = PlaylistSync.builder()
-                        .name(name)
-                        .syncType(SyncType.DELETE)
-                        .created(Date.from(Instant.now()))
-                        .build();
-                playlistSyncRepository.saveAndFlush(sync);
-                summary.getPlaylist().incDelete();
-            });
+            handleDeletedPlaylists(summary, playlistNamesDifference);
         }
 
         playlistNamesDifference = CollectionUtils.subtract(newPlaylistNames, currentPlaylistNames);
         if (!playlistNamesDifference.isEmpty()) {
-            playlistNamesDifference.forEach(name -> {
+            handleAddedPlaylist(summary, playlistNamesDifference, newPlaylists);
+        }
+
+        handleUpdatesPlaylist(summary, currentPlaylistNames, newPlaylists);
+    }
+
+    private void handleUpdatesPlaylist(CompositeSummary summary, Set<String> currentPlaylistNames, Map<String, List<Long>> newPlaylists) {
+        currentPlaylistNames.forEach(name -> {
+            List<Long> currentContent = currentPlaylists.get(name);
+            List<Long> newContent = newPlaylists.get(name);
+
+            if (Objects.nonNull(currentContent) && isContentChanged(currentContent, newContent)) {
+                try {
+                    PlaylistSync sync = PlaylistSync.builder()
+                            .name(name)
+                            .syncType(SyncType.UPDATE)
+                            .ids(newContent)
+                            .created(Date.from(Instant.now()))
+                            .build();
+                    playlistSyncRepository.save(sync);
+                    assetRepository.updateSetListed(sync.getIds());
+                    summary.getPlaylist().incUpdate();
+
+                    Collection<Long> removedIds = CollectionUtils.subtract(currentContent, newContent);
+                    List<String> sunsets = assetRepository.findAllById(removedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+                    summary.getPlaylist().getSunsets().addAll(sunsets);
+
+                    Collection<Long> addedIds = CollectionUtils.subtract(newContent, currentContent);
+                    List<String> sunrises = assetRepository.findAllById(addedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+                    summary.getPlaylist().getSunrises().addAll(sunrises);
+                    summary.getPlaylist().incSuccess();
+                } catch (Exception e) {
+                    summary.getPlaylist().incError();
+                }
+            }
+        });
+    }
+
+    private void handleAddedPlaylist(CompositeSummary summary, Collection<String> playlistNamesDifference, Map<String, List<Long>> newPlaylists) {
+        playlistNamesDifference.forEach(name -> {
+            try {
+                List<Long> ids = newPlaylists.get(name);
                 PlaylistSync sync = PlaylistSync.builder()
                         .name(name)
                         .syncType(SyncType.INSERT)
                         .created(Date.from(Instant.now()))
-                        .ids(newPlaylists.get(name))
+                        .ids(ids)
                         .build();
-                playlistSyncRepository.saveAndFlush(sync);
-                assetRepository.updateListed(sync.getIds());
+                playlistSyncRepository.save(sync);
+                assetRepository.updateSetListed(sync.getIds());
+                summary.getPlaylist().incAll();
                 summary.getPlaylist().incInsert();
 
-            });
-        }
+                List<String> sunrises = assetRepository.findAllById(ids).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+                summary.getPlaylist().getSunrises().addAll(sunrises);
+                summary.getPlaylist().incSuccess();
+            } catch (Exception e) {
+                summary.getPlaylist().incError();
+            }
+        });
+    }
 
-        currentPlaylistNames.forEach(name -> {
-            List<Long> currentContent = currentPlaylists.get(name);
-            List<Long> newContent = newPlaylists.get(name);
-            if (isContentChanged(currentContent, newContent)) {
+    private void handleDeletedPlaylists(CompositeSummary summary, Collection<String> playlistNamesDifference) {
+        playlistNamesDifference.forEach(name -> {
+
+            try {
                 PlaylistSync sync = PlaylistSync.builder()
                         .name(name)
-                        .syncType(SyncType.UPDATE)
-                        .ids(newPlaylists.get(name))
+                        .syncType(SyncType.DELETE)
                         .created(Date.from(Instant.now()))
                         .build();
-                playlistSyncRepository.saveAndFlush(sync);
-                assetRepository.updateListed(sync.getIds());
-                summary.getPlaylist().incUpdate();
+                playlistSyncRepository.save(sync);
+                summary.getPlaylist().incDelete();
+
+                List<Long> removedIds = currentPlaylists.get(name);
+                List<String> sunsets = assetRepository.findAllById(removedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+                summary.getPlaylist().getSunsets().addAll(sunsets);
+                summary.getPlaylist().incAll();
+                summary.getPlaylist().incSuccess();
+            } catch (Exception e) {
+                summary.getPlaylist().incError();
             }
         });
     }
index ca0472bdafd67a0843a120ba780de49ef16b0742..16ea618a25903e046ad7ba04b1923e93656897a7 100644 (file)
@@ -30,12 +30,17 @@ public class EmailSendService {
             log.info("No recipient specified, report not sent.");
             return;
         }
-        SimpleMailMessage message = new SimpleMailMessage();
-        message.setFrom(serviceProperties.getReport().getSender());
-        message.setTo(serviceProperties.getReport().getRecipient());
-        message.setSubject(subject);
-        message.setText(summary.toString());
-        emailSender.send(message);
+
+        try {
+            SimpleMailMessage message = new SimpleMailMessage();
+            message.setFrom(serviceProperties.getReport().getSender());
+            message.setTo(serviceProperties.getReport().getRecipient());
+            message.setSubject(subject);
+            message.setText(summary.toString());
+            emailSender.send(message);
+        } catch (Exception e) {
+            log.error("Report email not sent, system message is: {}", e.getMessage());
+        }
         log.info("'{}' report sent to {}", subject, serviceProperties.getReport().getRecipient());
     }
 }
index 8e68ac94381c8d889533a879b87518b02596a61a..cb208bd54da872eb34f3806700285e95828db74c 100644 (file)
@@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.EntityNotFoundException;
 import java.time.Instant;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -148,12 +149,14 @@ public class SyncExportService {
     @Transactional
     public void processPlaylistSync(PlaylistSync playlistSync, CompositeSummary summary) {
         try {
+            Playlist playlist = bcClient.getPlaylistsById(playlistSync.getName());
             if (SyncType.DELETE.equals(playlistSync.getSyncType())) {
+                playlist.setVideoIds(Collections.emptyList());
+                bcClient.updatePlaylist(playlist);
                 playlistSync.setExportedSuccess(Date.from(Instant.now()));
                 summary.getPlaylist().incDelete();
             } else {
-                Playlist playlist = bcClient.getPlaylistsById(playlistSync.getName());
-                //TODO check if all Asset has rferenceId
+                //TODO check if all Asset has referenceId
                 if (Objects.nonNull(playlist)) {
                     playlist.setVideoIds(toApiIds(playlistSync.getIds()));
                     bcClient.updatePlaylist(playlist);