1 package hu.user.mcvodsync.service.xls;
4 import hu.user.mcvodsync.db.Asset;
5 import hu.user.mcvodsync.db.AssetSync;
6 import hu.user.mcvodsync.db.PlaylistSync;
7 import hu.user.mcvodsync.db.SyncType;
8 import hu.user.mcvodsync.db.repository.AssetRepository;
9 import hu.user.mcvodsync.db.repository.AssetSyncRepository;
10 import hu.user.mcvodsync.db.repository.PlaylistSyncRepository;
11 import hu.user.mcvodsync.service.data.EntityDataService;
12 import lombok.extern.log4j.Log4j2;
13 import org.apache.commons.collections4.CollectionUtils;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Service;
17 import java.time.Instant;
18 import java.time.LocalDate;
20 import java.util.stream.Collectors;
24 public class AssetImportService {
26 private AssetRepository assetRepository;
29 private AssetSyncRepository assetSyncRepository;
32 private PlaylistSyncRepository playlistSyncRepository;
35 private EntityDataService<Asset> entityDataService;
37 private Map<String, List<String>> currentPlaylists;
39 private hu.user.mcvodsync.service.xls.ImportSummary summary;
41 public void prepare(hu.user.mcvodsync.service.xls.ImportSummary summary) {
42 this.summary = summary;
43 currentPlaylists = getPlayLists();
46 private Map<String, List<String>> getPlayLists() {
47 Map<String, List<String>> result = new HashMap<>();
48 List<String> playlistNames = assetRepository.queryDistinctPlaylists();
49 playlistNames.forEach(playlist -> {
50 List<String> playlistsAssets = assetRepository.queryPlaylistsAssets(playlist);
51 result.put(playlist, playlistsAssets);
56 public void processAsset(Asset asset) {
57 Optional<Asset> optionalEntity = assetRepository.findById(asset.getCatalogId());
59 AssetSync assetSync = AssetSync.builder()
60 .catalogId(asset.getCatalogId())
63 if (optionalEntity.isPresent()) {
64 boolean areDifferent = entityDataService.areDifferent(asset, optionalEntity.get());
66 assetSync.setSyncType(SyncType.UPDATE);
69 assetSync.setSyncType(SyncType.INSERT);
72 if (Objects.nonNull(assetSync.getSyncType())) {
73 assetRepository.save(asset);
74 assetSyncRepository.save(assetSync);
77 if (assetSync.getSyncType() == SyncType.UPDATE) {
80 if (assetSync.getSyncType() == SyncType.INSERT) {
81 summary.incInserted();
85 public void removeExpired(LocalDate currentDate) {
86 List<String> ids = assetRepository.queryExpired(java.sql.Date.valueOf(currentDate));
87 List<AssetSync> syncs = ids.stream().map(id -> AssetSync.builder()
89 .syncType(SyncType.DELETE)
90 .build()).collect(Collectors.toList());
91 assetSyncRepository.saveAll(syncs);
92 assetRepository.deleteExpired(java.sql.Date.valueOf(currentDate));
93 summary.setDeleted(summary.getDeleted() + ids.size());
96 public void finish() {
97 removeExpired(LocalDate.now());
101 public void processPlaylists() {
102 Map<String, List<String>> newPlaylists = getPlayLists();
103 Set<String> currentPlaylistNames = currentPlaylists.keySet();
104 Set<String> newPlaylistNames = newPlaylists.keySet();
106 Collection<String> playlistNamesDifference = CollectionUtils.subtract(currentPlaylistNames, newPlaylistNames);
107 if (!playlistNamesDifference.isEmpty()) {
108 playlistNamesDifference.forEach(playlist -> {
109 PlaylistSync sync = PlaylistSync.builder()
111 .syncType(SyncType.DELETE)
112 .created(Date.from(Instant.now()))
114 playlistSyncRepository.save(sync);
115 summary.incDeletedPlaylist();
119 playlistNamesDifference = CollectionUtils.subtract(newPlaylistNames, currentPlaylistNames);
120 if (!playlistNamesDifference.isEmpty()) {
121 playlistNamesDifference.forEach(playlist -> {
122 PlaylistSync sync = PlaylistSync.builder()
124 .syncType(SyncType.INSERT)
125 .created(Date.from(Instant.now()))
127 playlistSyncRepository.save(sync);
128 summary.incInsertedPlaylist();
132 currentPlaylistNames.forEach(playlist -> {
133 List<String> currentContent = currentPlaylists.get(playlist);
134 List<String> newContent = newPlaylists.get(playlist);
135 if (isContentChanged(currentContent, newContent)) {
136 PlaylistSync sync = PlaylistSync.builder()
138 .syncType(SyncType.UPDATE)
139 .created(Date.from(Instant.now()))
141 playlistSyncRepository.save(sync);
142 summary.incUpdatedPlaylist();
147 private boolean isContentChanged(List<String> currentContent, List<String> newContent) {
148 if (currentContent.size() != newContent.size()) {
151 for (int i = 0; i < currentContent.size(); i++) {
152 if (!currentContent.get(i).equals(newContent.get(i))) {