From: Vásáry Dániel Date: Sun, 14 Jan 2024 19:43:56 +0000 (+0100) Subject: v0.0.4 X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=26bc1fd04add01cdfdddb6cfa238e5ca0896b311;p=mediacube.git v0.0.4 --- diff --git a/mc-vod-sync/mc-vod-sync-app/pom.xml b/mc-vod-sync/mc-vod-sync-app/pom.xml index b73d56eb..9ac277ea 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.3 + 0.0.4 hu.user mc-vod-sync diff --git a/mc-vod-sync/mc-vod-sync-app/src/main/resources/application-dev.yaml b/mc-vod-sync/mc-vod-sync-app/src/main/resources/application-dev.yaml index f2b12d1b..faf30e13 100644 --- a/mc-vod-sync/mc-vod-sync-app/src/main/resources/application-dev.yaml +++ b/mc-vod-sync/mc-vod-sync-app/src/main/resources/application-dev.yaml @@ -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 diff --git a/mc-vod-sync/mc-vod-sync-app/src/main/resources/application.yaml b/mc-vod-sync/mc-vod-sync-app/src/main/resources/application.yaml index 00b7dec1..48e92b02 100644 --- a/mc-vod-sync/mc-vod-sync-app/src/main/resources/application.yaml +++ b/mc-vod-sync/mc-vod-sync-app/src/main/resources/application.yaml @@ -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 diff --git a/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ExecutionLockIT.java b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ExecutionLockIT.java index 9e8f0974..07c86136 100644 --- a/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ExecutionLockIT.java +++ b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ExecutionLockIT.java @@ -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 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 8a694040..2d085c9c 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 @@ -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 playlists = assetRepository.queryDistinctPlaylists(); assertNotNull(playlists); - List assets = assetRepository.queryPlaylistsAssets(playlists.get(0)); + List 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 ids = assetRepository.queryExpired(Date.valueOf(currentDate)); + List 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 index 00000000..db970f2d --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-app/src/test/java/hu/user/mcvodsync/ScheduledDateCheckerIT.java @@ -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 = 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 = 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 = 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 index 00000000..0c70a06a --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-db/migrations/scripts/004_modify_asset.sql @@ -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'); diff --git a/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/Asset.java b/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/Asset.java index e97ceddb..524cd932 100644 --- a/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/Asset.java +++ b/mc-vod-sync/mc-vod-sync-db/src/main/java/hu/user/mcvodsync/db/Asset.java @@ -84,4 +84,6 @@ public class Asset implements Serializable { @Column(name = "prog_genre3", length = 128) private String progGenre3; + private boolean listed; + } 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 cec95118..e96a736c 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 @@ -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 { + Optional findByCatalogId(String catalogId); + @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 ORDER BY a.seasonNr, a.episodeNr") - List 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 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 queryPlaylistsListedAssets(String playlist); 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 ORDER BY a.catalogId") List 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 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") diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/ServiceProperties.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/ServiceProperties.java index 515b3e15..7074b69e 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/ServiceProperties.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/ServiceProperties.java @@ -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 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 4a8ffdd9..4d3394e8 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 @@ -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 index 00000000..e17d7dab --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerCompletedEvent.java @@ -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 index 00000000..37f4ecf2 --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/event/DateCheckerStartedEvent.java @@ -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); + } + +} 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 2fd8ca51..9ebab716 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,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> currentPlaylists; + private java.sql.Date checkDate; - public void prepare() { - currentPlaylists = getPlayLists(); + public void prepare(LocalDate currentData) { + checkDate = java.sql.Date.valueOf(currentData); } + public Map> getPlayLists() { Map> result = new HashMap<>(); List playlistNames = assetRepository.queryDistinctPlaylists(); playlistNames.forEach(playlist -> { - List playlistsAssets = assetRepository.queryPlaylistsAssets(playlist); - result.put(playlist, playlistsAssets); + List playlistsAssets = assetRepository.queryPlaylistsListedAssets(playlist); + if (!playlistsAssets.isEmpty()) { + result.put(playlist, playlistsAssets); + } + }); + return result; + } + + private Map> getPlayListsByDate() { + Map> result = new HashMap<>(); + List playlistNames = assetRepository.queryDistinctPlaylists(); + playlistNames.forEach(playlist -> { + List 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 expiredAssets = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate)); - assetRepository.deleteExpired(java.sql.Date.valueOf(currentDate)); - List 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 expiredAssets = assetRepository.queryExpired(checkDate); + if (!expiredAssets.isEmpty()) { + assetRepository.deleteExpired(checkDate); + List 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> newPlaylists = getPlayLists(); + public void checkPlaylists(CompositeSummary summary) { Set currentPlaylistNames = currentPlaylists.keySet(); + + Map> newPlaylists = getPlayListsByDate(); Set newPlaylistNames = newPlaylists.keySet(); Collection 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(); } }); diff --git a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/VodXlsProcessor.java b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/VodXlsProcessor.java index b2e7fa99..47309637 100644 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/VodXlsProcessor.java +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/in/VodXlsProcessor.java @@ -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 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()); 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 31390b37..8e68ac94 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 @@ -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 index 00000000..2be01734 --- /dev/null +++ b/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledDateChecker.java @@ -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 index 7b394dfb..00000000 --- a/mc-vod-sync/mc-vod-sync-service/src/main/java/hu/user/mcvodsync/service/schedule/ScheduledSunsetChacker.java +++ /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); - } - - } -} diff --git a/mc-vod-sync/mc-vod-sync-ui/src/main/java/hu/user/mcvodsync/ui/view/MainViewModel.java b/mc-vod-sync/mc-vod-sync-ui/src/main/java/hu/user/mcvodsync/ui/view/MainViewModel.java index 5cf385d5..57e2cc7e 100644 --- a/mc-vod-sync/mc-vod-sync-ui/src/main/java/hu/user/mcvodsync/ui/view/MainViewModel.java +++ b/mc-vod-sync/mc-vod-sync-ui/src/main/java/hu/user/mcvodsync/ui/view/MainViewModel.java @@ -94,5 +94,10 @@ public class MainViewModel extends FilterActiveViewModel { scheduledTasks.startExport(); } + @Command + public void onStartCheckDates() { + scheduledTasks.startCheckDates(); + } + } diff --git a/mc-vod-sync/mc-vod-sync-ui/src/main/resources/web/main.zul b/mc-vod-sync/mc-vod-sync-ui/src/main/resources/web/main.zul index d458fd9a..6be22bba 100644 --- a/mc-vod-sync/mc-vod-sync-ui/src/main/resources/web/main.zul +++ b/mc-vod-sync/mc-vod-sync-ui/src/main/resources/web/main.zul @@ -15,6 +15,9 @@ + +