diff --git a/src/main/java/com/rudakova/media_archive/model/UpdateRecord.java b/src/main/java/com/rudakova/media_archive/model/UpdateRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..e6a4caf6a9f0049b485e04881d64aef4a156f47c --- /dev/null +++ b/src/main/java/com/rudakova/media_archive/model/UpdateRecord.java @@ -0,0 +1,70 @@ +package com.rudakova.media_archive.model; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.time.Instant; +import java.util.UUID; + +@Document +public class UpdateRecord { + + private UUID id = UUID.randomUUID(); + + private String fileId; + + private String type; + + private Instant creationDate; + + private Account account; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Instant getCreationDate() { + return creationDate; + } + + public void setCreationDate(Instant creationDate) { + this.creationDate = creationDate; + } + + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + + @Override + public String toString() { + return "UpdateRecord{" + + "id=" + id + + ", fileId='" + fileId + '\'' + + ", type='" + type + '\'' + + ", creationDate=" + creationDate + + '}'; + } +} diff --git a/src/main/java/com/rudakova/media_archive/repository/FileRepository.java b/src/main/java/com/rudakova/media_archive/repository/FileRepository.java index 2f082ce51a91facc446ae60a09b29eae46c46d35..99aa25e68bbfac24f2324b732252cdeb1e707273 100644 --- a/src/main/java/com/rudakova/media_archive/repository/FileRepository.java +++ b/src/main/java/com/rudakova/media_archive/repository/FileRepository.java @@ -1,5 +1,6 @@ package com.rudakova.media_archive.repository; +import com.rudakova.media_archive.model.Account; import com.rudakova.media_archive.model.File; import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.repository.MongoRepository; @@ -12,9 +13,6 @@ public interface FileRepository extends MongoRepository<File, String> { Optional<File> findByPreview(String preview); - @Query(value = "{ 'parents' : ?0 }", fields = "{ '_id': 1 }") - List<String> findIdByParents(String folderId); - @Query("{ 'account.emailAddress' : ?0, 'parents' : ?1 }") List<File> findByAccountAndParents(String emailAddress, String folderId, Pageable pageable); diff --git a/src/main/java/com/rudakova/media_archive/repository/UpdateRecordRepository.java b/src/main/java/com/rudakova/media_archive/repository/UpdateRecordRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..69dc2515b2ded3db1a22e116ca0b8697a6be65c5 --- /dev/null +++ b/src/main/java/com/rudakova/media_archive/repository/UpdateRecordRepository.java @@ -0,0 +1,14 @@ +package com.rudakova.media_archive.repository; + +import com.rudakova.media_archive.model.UpdateRecord; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; + +import java.util.List; +import java.util.UUID; + +public interface UpdateRecordRepository extends MongoRepository<UpdateRecord, UUID> { + + @Query("{ 'account.emailAddress' : ?0 }") + List<UpdateRecord> findByAccount(String emailAddress); +} diff --git a/src/main/java/com/rudakova/media_archive/service/RestService.java b/src/main/java/com/rudakova/media_archive/service/RestService.java index 5d100bc165a6d45cd6bb4be89f53e8be33e914da..bfc358fcc9bc6549809469b55b7863542f40e37f 100644 --- a/src/main/java/com/rudakova/media_archive/service/RestService.java +++ b/src/main/java/com/rudakova/media_archive/service/RestService.java @@ -8,8 +8,10 @@ import com.rudakova.media_archive.google.GoogleService; import com.rudakova.media_archive.model.Account; import com.rudakova.media_archive.model.File; import com.rudakova.media_archive.model.FolderList; +import com.rudakova.media_archive.model.UpdateRecord; import com.rudakova.media_archive.repository.AccountRepository; import com.rudakova.media_archive.repository.FileRepository; +import com.rudakova.media_archive.repository.UpdateRecordRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -44,6 +46,9 @@ public class RestService { @Autowired private AccountRepository accountRepository; + @Autowired + private UpdateRecordRepository updateRecordRepository; + /** * Получение папок для выбора рабочей папки. * @param nextPageToken токен следующей страницы. @@ -113,6 +118,29 @@ public class RestService { return new AccountDto(account); } + /** + * Получение данных о пользователе. + * @return пользовательские данные. + */ + @PostMapping("/update") + public void update() throws IOException { + Account account = authService.getLoggedInAccount(); + List<UpdateRecord> records = updateRecordRepository.findByAccount(account.getEmailAddress()); + for (UpdateRecord record : records) { + if (record.getType().equals("trash")) { + List<String> ids = googleService.getFiles(record.getFileId()); + for (String id : ids) { + fileRepository.deleteById(id); + } + LOG.info("Deleted : {}", ids.size()); + } else { + int count = googleService.checkUpdate(record.getFileId(), record.getCreationDate()); + LOG.info("Added : {}", count); + } + updateRecordRepository.delete(record); + } + } + /** * Перемещение выбранных файлов в папку для выгрузки. * @param files id выбранных файлов. diff --git a/src/main/java/com/rudakova/media_archive/web/NotificationController.java b/src/main/java/com/rudakova/media_archive/web/NotificationController.java index 070693537e1244bf89a5e82bee7f372e6223da3c..33376195844fce1b3ed787d67502bb8deea7aa94 100644 --- a/src/main/java/com/rudakova/media_archive/web/NotificationController.java +++ b/src/main/java/com/rudakova/media_archive/web/NotificationController.java @@ -1,7 +1,9 @@ package com.rudakova.media_archive.web; -import com.rudakova.media_archive.google.GoogleService; +import com.rudakova.media_archive.model.File; +import com.rudakova.media_archive.model.UpdateRecord; import com.rudakova.media_archive.repository.FileRepository; +import com.rudakova.media_archive.repository.UpdateRecordRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -15,10 +17,6 @@ import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @RestController @RequestMapping("/notification") @@ -26,34 +24,32 @@ public class NotificationController { private static final Logger LOG = LoggerFactory.getLogger(NotificationController.class); @Autowired - private GoogleService googleService; + private FileRepository fileRepository; @Autowired - private FileRepository fileRepository; + private UpdateRecordRepository updateRecordRepository; @PostMapping public ResponseEntity<String> notification(HttpServletRequest request) throws IOException { - Map<String, String> headers = Collections.list(request.getHeaderNames()) - .stream() - .collect(Collectors.toMap(h -> h, request::getHeader)); - LOG.info(String.valueOf(headers)); - String state = headers.get("x-goog-resource-state"); - String uri = request.getHeader("x-goog-resource-uri"); - String id = uri.substring(uri.lastIndexOf("/") + 1, uri.indexOf("?")); - LOG.info("Values: {}, {}", state, id); - if (state != null && state.equals("trash")) { - List<String> ids = googleService.getFiles(id); - LOG.info("Deleted from google: {}", ids); - for (String trashId : ids) { - fileRepository.deleteById(trashId); - } - } else if (state != null && (state.equals("update") || state.equals("untrash"))) { - String changed = headers.get("x-goog-changed"); - int count = 0; - if (changed == null || changed.equals("children")) { - count = googleService.checkUpdate(id, Instant.now().minus(10, ChronoUnit.MINUTES)); - } - LOG.info("Changes: {}", count); + String state = request.getHeader("x-goog-resource-state"); + String changed = request.getHeader("x-goog-changed"); + LOG.info("State value: {}", state); + + if (state != null && (state.equals("trash") || + (state.equals("update") && changed.equals("children")) || + state.equals("untrash"))) { + String uri = request.getHeader("x-goog-resource-uri"); + String id = uri.substring(uri.lastIndexOf("/") + 1, uri.indexOf("?")); + + UpdateRecord updateRecord = new UpdateRecord(); + updateRecord.setFileId(id); + File file = fileRepository.findById(id).orElse(null); + updateRecord.setAccount(file == null ? null : file.getAccount()); + updateRecord.setType(state.equals("update") ? changed : state); + updateRecord.setCreationDate(Instant.now().minus(10, ChronoUnit.MINUTES)); + updateRecordRepository.save(updateRecord); + + LOG.info("Update record: {}", updateRecord); } return new ResponseEntity<>(HttpStatus.OK); } diff --git a/target/MediaArchive-1.0-SNAPSHOT.jar b/target/MediaArchive-1.0-SNAPSHOT.jar index 18bf6f9caa60beac9466cc8bc02e5d45a1856a60..aa749258941eb41271395c6a7a19f353f615352c 100644 Binary files a/target/MediaArchive-1.0-SNAPSHOT.jar and b/target/MediaArchive-1.0-SNAPSHOT.jar differ