From c8505c05b8ed4b3218445eeda3fdc8b4bae5b57b Mon Sep 17 00:00:00 2001 From: Bavithbabu Date: Tue, 24 Mar 2026 17:17:34 +0530 Subject: [PATCH] Fixed the image duplication --- .../post/service/PostServiceImp.java | 30 ++++++++++------ .../repository/ImagesDataRepo.java | 35 ++++++++++--------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/cadac/stone_inscription/post/service/PostServiceImp.java b/src/main/java/com/cadac/stone_inscription/post/service/PostServiceImp.java index 3cbd034..c145fbf 100644 --- a/src/main/java/com/cadac/stone_inscription/post/service/PostServiceImp.java +++ b/src/main/java/com/cadac/stone_inscription/post/service/PostServiceImp.java @@ -72,7 +72,8 @@ public class PostServiceImp implements PostService { public ResponseEntity addPostWithFile(InscriptionPostDto inscriptionPostDto, MultipartFile[] files, String usernameFromToken) { - List ls = validateAndExtractImages(files, Collections.emptySet(), true); + User user = userRepository.findByEmail(usernameFromToken); + List ls = validateAndExtractImages(files, user.getId(), Collections.emptySet(), true); // Below Line To use for Threshold similarty @@ -94,8 +95,6 @@ public ResponseEntity addPostWithFile(InscriptionPostDto inscriptionPostDto, // .filter(Objects::nonNull) // .findFirst(); - User user = userRepository.findByEmail(usernameFromToken); - InscriptionPost inscriptionPost = new InscriptionPost(); if (inscriptionPostDto != null) { @@ -398,7 +397,7 @@ public ResponseEntity updatePost(String usernameFromToken, InscriptionPostDto List existingImageIds = getExistingImageIds(post); List imagesToDelete = validateDeletedImageIds(existingImageIds, deletedImageIds, false); Set deletableImageIds = new HashSet<>(imagesToDelete); - List newImages = validateAndExtractImages(files, deletableImageIds, false); + List newImages = validateAndExtractImages(files, user.getId(), deletableImageIds, false); ensureMinimumImageCount(existingImageIds.size(), deletableImageIds.size(), newImages.size()); @@ -439,7 +438,7 @@ public ResponseEntity updatePost(String usernameFromToken, InscriptionPostDto public ResponseEntity addImagesToPost(String usernameFromToken, String postId, MultipartFile[] files) { InscriptionPost post = getOwnedPost(usernameFromToken, postId); User user = userRepository.findByEmail(usernameFromToken); - List newImages = validateAndExtractImages(files, Collections.emptySet(), true); + List newImages = validateAndExtractImages(files, user.getId(), Collections.emptySet(), true); List updatedImageIds = getExistingImageIds(post); updatedImageIds.addAll(saveImages(post.getId(), newImages)); @@ -606,8 +605,8 @@ private InscriptionPost.Description mergeDescription(InscriptionPost.Description .build(); } - private List validateAndExtractImages(MultipartFile[] files, Set replaceableImageIds, - boolean filesRequired) { + private List validateAndExtractImages(MultipartFile[] files, ObjectId userId, + Set replaceableImageIds, boolean filesRequired) { if (files == null || files.length == 0) { if (filesRequired) { throw new StoneInscriptionException("No File Uploaded", HttpStatus.BAD_REQUEST); @@ -626,14 +625,18 @@ private List validateAndExtractImages(MultipartFile[] files, S throw new StoneInscriptionException("Duplicate Image Uploaded", HttpStatus.BAD_REQUEST); } - boolean imageAlreadyExists = ls.stream().anyMatch(image -> { + List userPostIds = getUserPostIds(userId); + + boolean imageAlreadyExists = !userPostIds.isEmpty() && ls.stream().anyMatch(image -> { Optional existingImage = imagesDataRepo - .findFirstByMetadata_ImageHashValue(image.getPHash().getHashValue().toString()); + .findFirstByMetadata_ImageHashValueAndPostIdIn( + image.getPHash().getHashValue().toString(), + userPostIds); return existingImage.isPresent() && !replaceableImageIds.contains(existingImage.get().getId()); }); if (imageAlreadyExists) { - throw new StoneInscriptionException("Image Already Uploaded By some User", HttpStatus.CONFLICT); + throw new StoneInscriptionException("Image Already Uploaded By same User", HttpStatus.CONFLICT); } return ls; @@ -652,6 +655,13 @@ private List saveImages(ObjectId postId, List images) .build()).getId()).toList(); } + private List getUserPostIds(ObjectId userId) { + return inscriptionPostRepo.findByUserId(userId).stream() + .map(InscriptionPost::getId) + .filter(Objects::nonNull) + .toList(); + } + private InscriptionPost getOwnedPost(String usernameFromToken, String postId) { User user = userRepository.findByEmail(usernameFromToken); Optional inscriptionPost = inscriptionPostRepo.findById(new ObjectId(postId)); diff --git a/src/main/java/com/cadac/stone_inscription/repository/ImagesDataRepo.java b/src/main/java/com/cadac/stone_inscription/repository/ImagesDataRepo.java index 8aa9a1f..37fcb0d 100644 --- a/src/main/java/com/cadac/stone_inscription/repository/ImagesDataRepo.java +++ b/src/main/java/com/cadac/stone_inscription/repository/ImagesDataRepo.java @@ -1,17 +1,18 @@ -package com.cadac.stone_inscription.repository; - -import java.util.Optional; - -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -import com.cadac.stone_inscription.entity.ImagesData; - -import dev.brachtendorf.jimagehash.hash.Hash; - -@Repository -public interface ImagesDataRepo extends MongoRepository { - - Optional findFirstByMetadata_ImageHashValue(String imageHashValue); - -} +package com.cadac.stone_inscription.repository; + +import java.util.Collection; +import java.util.Optional; + +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import com.cadac.stone_inscription.entity.ImagesData; + +@Repository +public interface ImagesDataRepo extends MongoRepository { + + Optional findFirstByMetadata_ImageHashValueAndPostIdIn(String imageHashValue, + Collection postIds); + +}