From 0612ea01912153a9aceaf6a30086718e71e489e6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Sun, 18 Feb 2024 23:10:48 +0100 Subject: [PATCH] DateChecker fixed --- mc-vod-sync/mc-vod-sync-app/pom.xml | 2 +- .../java/hu/user/mcvodsync/RepositoryIT.java | 2 +- .../db/repository/AssetRepository.java | 13 +- .../service/config/ScheduledTasks.java | 3 +- .../service/data/CompositeSummary.java | 11 +- .../service/data/PlaylistSummary.java | 24 ++++ .../user/mcvodsync/service/data/Summary.java | 6 +- .../service/in/AssetImportService.java | 111 ++++++++++++------ .../service/mail/EmailSendService.java | 17 ++- .../service/out/SyncExportService.java | 7 +- 10 files changed, 141 insertions(+), 55 deletions(-) create mode 100644 mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/PlaylistSummary.java diff --git a/mc-vod-sync/mc-vod-sync-app/pom.xml b/mc-vod-sync/mc-vod-sync-app/pom.xml index 9ac277ea..e9b72dbb 100644 --- a/mc-vod-sync/mc-vod-sync-app/pom.xml +++ b/mc-vod-sync/mc-vod-sync-app/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 mc-vod-sync-app - 0.0.4 + 0.0.5 hu.user mc-vod-sync diff --git a/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.java b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.java index 2d085c9c..dc44d74c 100644 --- a/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.java +++ b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/RepositoryIT.java @@ -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); diff --git a/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/repository/AssetRepository.java b/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/repository/AssetRepository.java index e96a736c..26fd7433 100644 --- a/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/repository/AssetRepository.java +++ b/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/repository/AssetRepository.java @@ -17,7 +17,7 @@ public interface AssetRepository extends JpaRepository { @Query("SELECT DISTINCT(a.playlist) FROM Asset a ORDER BY a.playlist") List 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 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 { Optional 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 queryExpired(Date currentDate); @Modifying - @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.listed = FALSE AND a.id IN (:ids)") - void updateListed(List ids); + @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.id IN (:ids)") + @Transactional + void updateSetListed(List ids); @Modifying @Query("UPDATE Asset a SET a.listed = FALSE") @@ -38,9 +39,9 @@ public interface AssetRepository extends JpaRepository { 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 ids); @Query("SELECT a.referenceId FROM Asset a WHERE a.id = :id") String findReferenceIdById(Long id); diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/config/ScheduledTasks.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/config/ScheduledTasks.java index 4d3394e8..ea1a1221 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/config/ScheduledTasks.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/config/ScheduledTasks.java @@ -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); diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/CompositeSummary.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/CompositeSummary.java index 55017fce..0923da99 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/CompositeSummary.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/CompositeSummary.java @@ -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 index 00000000..7e9aae33 --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/PlaylistSummary.java @@ -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 sunsets = new ArrayList<>(); + + //napkelte + @Builder.Default + private List sunrises = new ArrayList<>(); + +} diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/Summary.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/Summary.java index f9572330..771bdaa5 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/Summary.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/data/Summary.java @@ -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++; } } diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/AssetImportService.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/AssetImportService.java index 9ebab716..42e85e37 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/AssetImportService.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/AssetImportService.java @@ -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 expiredAssets = assetRepository.queryExpired(checkDate); if (!expiredAssets.isEmpty()) { - assetRepository.deleteExpired(checkDate); + List ids = expiredAssets.stream().map(Asset::getId).collect(Collectors.toList()); + assetRepository.updateSetUnlisted(ids); List 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 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 currentPlaylistNames, Map> newPlaylists) { + currentPlaylistNames.forEach(name -> { + List currentContent = currentPlaylists.get(name); + List 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 removedIds = CollectionUtils.subtract(currentContent, newContent); + List sunsets = assetRepository.findAllById(removedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList()); + summary.getPlaylist().getSunsets().addAll(sunsets); + + Collection addedIds = CollectionUtils.subtract(newContent, currentContent); + List 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 playlistNamesDifference, Map> newPlaylists) { + playlistNamesDifference.forEach(name -> { + try { + List 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 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 currentContent = currentPlaylists.get(name); - List newContent = newPlaylists.get(name); - if (isContentChanged(currentContent, newContent)) { + private void handleDeletedPlaylists(CompositeSummary summary, Collection 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 removedIds = currentPlaylists.get(name); + List 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(); } }); } diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/mail/EmailSendService.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/mail/EmailSendService.java index ca0472bd..16ea618a 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/mail/EmailSendService.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/mail/EmailSendService.java @@ -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()); } } diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java index 8e68ac94..cb208bd5 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/out/SyncExportService.java @@ -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); -- 2.54.0