Programuję w taki sposób, aby unikać korzystania z serwisów w innych serwisach https://github.com/JonkiPro/REST-Web-Services/tree/master/core/src/main/java/com/core/jpa/service. Próbuję korzystać tylko z repozytoriów w serwisach. Obecnie piszę kontroler, który korzysta z dwóch serwisów. Jeden do zapisywania plików w chmurze, a drugi do zapisywania encji do bazy z identyfikatorem pliku w chmurze.
@PutMapping(value = "/contributions/{id}/photos")
@ResponseStatus(HttpStatus.NO_CONTENT)
public
void updatePhotoContribution(
@PathVariable("id") final Long id,
@RequestParam(required = false) Set<Long> elementIdsToAdd,
@RequestPart(required = false) List<MultipartFile> elementsToAdd,
@RequestPart(required = false) List<MultipartFile> newElementsToAdd,
@RequestParam(required = false) Set<Long> idsToUpdate,
@RequestPart(required = false) List<MultipartFile> elementsToUpdate,
@RequestParam(required = false) Set<Long> idsToDelete,
@RequestParam final Set<String> sources,
@RequestParam(required = false) final String comment
) {
Set<String> ids = new HashSet<>();
for(files) {
String id = this.storageService.save(...); // Save the file in the cloud with file identifiers stored in the cloud
ids.add(id);
}
Contribution contribution = //create contribution
try {
this.movieContributionPersistenceService.updateReviewContribution(contribution, id, this.authorizationService.getUserId());
} catch(ResourceNotFoundException e) {
// remove the file from the cloud
throw new ResourceNotFoundException(e.getMessage());
} catch(ResourceConflictException e) {
// remove the file from the cloud
throw new ResourceConflictException(e.getMessage());
}
}
Problem polega na tym, że cała magia z walidacją kontrybucji odbywa się w metodzie updateReviewContribution serwisu
movieContributionPersistenceService, czyli dopiero po zapisaniu plików do chmury. Dlatego w przypadku wyrzucenia jakiegoś wyjątku muszę cofnąć się tu do kontrolera i usunąć pliki, które zostały zapisane. Gdybym używał storageService w movieContributionPersistenceService można by było zrobić to lepiej, bez tego śmiesznego łapania wyjątków. Wtedy mógłbym pliki zapisywać do chmury dopiero po walidacji w klasie movieContributionPersistenceService . Co o tym myslicie?
To drugi kontroler, który wcześniej stworzyłem na tej samej zasadzie: https://pastebin.com/Ry1gcYdL (skończony)