From e4c8e3524228b9a35f37a1b9dfb18d98972226ed Mon Sep 17 00:00:00 2001 From: Bavithbabu Date: Sun, 12 Apr 2026 08:26:53 +0530 Subject: [PATCH] Done with Delete comment refacatoring --- .codex | 0 .env | 4 +- .../admin/entity/ArchiveComment.java | 5 + .../admin/entity/ArchivePost.java | 5 + .../repository/ArchiveCommentRepository.java | 11 +++ .../repository/ArchivePostRepository.java | 11 +++ .../content/delete/ArchiveContentMapper.java | 66 +++++++++++++ .../content/delete/ContentDeleteResult.java | 12 +++ .../content/delete/ContentDeleteService.java | 93 +++++++++++++++++++ .../post/controller/PostController.java | 2 +- .../post/service/PostServiceImp.java | 13 ++- 11 files changed, 212 insertions(+), 10 deletions(-) create mode 100644 .codex create mode 100644 src/main/java/com/cadac/stone_inscription/admin/repository/ArchiveCommentRepository.java create mode 100644 src/main/java/com/cadac/stone_inscription/admin/repository/ArchivePostRepository.java create mode 100644 src/main/java/com/cadac/stone_inscription/content/delete/ArchiveContentMapper.java create mode 100644 src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteResult.java create mode 100644 src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteService.java diff --git a/.codex b/.codex new file mode 100644 index 0000000..e69de29 diff --git a/.env b/.env index a10a5ae..3f2de9f 100644 --- a/.env +++ b/.env @@ -22,9 +22,9 @@ APPLE_CLIENT_SECRET=your-apple-client-secret-jwt-here CONTENT_MODERATION_WEBHOOK_URL=https://inscriptions.cdacb.in/n8n/webhook/content-moderation -# CONTENT_MODERATION_INSECURE_SSL=true +CONTENT_MODERATION_INSECURE_SSL=true CONTENT_MODERATION_SAFE_THRESHOLD=0.7 CONTENT_MODERATION_CONNECT_TIMEOUT_MS=5000 CONTENT_MODERATION_READ_TIMEOUT_MS=10000 -CONTENT_MODERATION_INSECURE_SSL=false +# CONTENT_MODERATION_INSECURE_SSL=false diff --git a/src/main/java/com/cadac/stone_inscription/admin/entity/ArchiveComment.java b/src/main/java/com/cadac/stone_inscription/admin/entity/ArchiveComment.java index 94ce833..5bc0357 100644 --- a/src/main/java/com/cadac/stone_inscription/admin/entity/ArchiveComment.java +++ b/src/main/java/com/cadac/stone_inscription/admin/entity/ArchiveComment.java @@ -34,6 +34,11 @@ public class ArchiveComment { @JsonSerialize(using = ToStringSerializer.class) private ObjectId id; + @Field("originalCommentId") + @JsonProperty("originalCommentId") + @JsonSerialize(using = ToStringSerializer.class) + private ObjectId originalCommentId; + @Field("postId") @JsonProperty("postId") @JsonSerialize(using = ToStringSerializer.class) diff --git a/src/main/java/com/cadac/stone_inscription/admin/entity/ArchivePost.java b/src/main/java/com/cadac/stone_inscription/admin/entity/ArchivePost.java index 9278439..896092d 100644 --- a/src/main/java/com/cadac/stone_inscription/admin/entity/ArchivePost.java +++ b/src/main/java/com/cadac/stone_inscription/admin/entity/ArchivePost.java @@ -35,6 +35,11 @@ public class ArchivePost { @JsonSerialize(using = ToStringSerializer.class) private ObjectId id; + @Field("originalPostId") + @JsonProperty("originalPostId") + @JsonSerialize(using = ToStringSerializer.class) + private ObjectId originalPostId; + @Field("user_id") @JsonProperty("user_id") @JsonSerialize(using = ToStringSerializer.class) diff --git a/src/main/java/com/cadac/stone_inscription/admin/repository/ArchiveCommentRepository.java b/src/main/java/com/cadac/stone_inscription/admin/repository/ArchiveCommentRepository.java new file mode 100644 index 0000000..c80a4e4 --- /dev/null +++ b/src/main/java/com/cadac/stone_inscription/admin/repository/ArchiveCommentRepository.java @@ -0,0 +1,11 @@ +package com.cadac.stone_inscription.admin.repository; + +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import com.cadac.stone_inscription.admin.entity.ArchiveComment; + +@Repository +public interface ArchiveCommentRepository extends MongoRepository { +} diff --git a/src/main/java/com/cadac/stone_inscription/admin/repository/ArchivePostRepository.java b/src/main/java/com/cadac/stone_inscription/admin/repository/ArchivePostRepository.java new file mode 100644 index 0000000..4f8e421 --- /dev/null +++ b/src/main/java/com/cadac/stone_inscription/admin/repository/ArchivePostRepository.java @@ -0,0 +1,11 @@ +package com.cadac.stone_inscription.admin.repository; + +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import com.cadac.stone_inscription.admin.entity.ArchivePost; + +@Repository +public interface ArchivePostRepository extends MongoRepository { +} diff --git a/src/main/java/com/cadac/stone_inscription/content/delete/ArchiveContentMapper.java b/src/main/java/com/cadac/stone_inscription/content/delete/ArchiveContentMapper.java new file mode 100644 index 0000000..38ccfc6 --- /dev/null +++ b/src/main/java/com/cadac/stone_inscription/content/delete/ArchiveContentMapper.java @@ -0,0 +1,66 @@ +package com.cadac.stone_inscription.content.delete; + +import org.springframework.stereotype.Component; + +import com.cadac.stone_inscription.admin.entity.ArchiveComment; +import com.cadac.stone_inscription.admin.entity.ArchivePost; +import com.cadac.stone_inscription.entity.InscriptionPost; +import com.cadac.stone_inscription.entity.PublicPostDescription; + +@Component +public class ArchiveContentMapper { + + public ArchivePost toArchivePost(InscriptionPost post) { + return ArchivePost.builder() + .originalPostId(post.getId()) + .userId(post.getUserId()) + .createdAt(post.getCreatedAt()) + .updatedAt(post.getUpdatedAt()) + .images(post.getImages() != null ? ArchivePost.Images.builder() + .thumbnailImage(post.getImages().getThumbnailImage()) + .image(post.getImages().getImage()) + .build() : null) + .description(post.getDescription() != null ? ArchivePost.Description.builder() + .title(post.getDescription().getTitle()) + .subject(post.getDescription().getSubject()) + .description(post.getDescription().getDescription()) + .scriptLanguage(post.getDescription().getScriptLanguage()) + .language(post.getDescription().getLanguage()) + .englishTranslation(post.getDescription().getEnglishTranslation()) + .moderation(post.getDescription().getModeration()) + .upvote(post.getDescription().getUpvote()) + .geolocation(post.getDescription().getGeolocation() != null ? ArchivePost.GeoLocation.builder() + .lat(post.getDescription().getGeolocation().getLat()) + .lon(post.getDescription().getGeolocation().getLon()) + .state(post.getDescription().getGeolocation().getState()) + .city(post.getDescription().getGeolocation().getCity()) + .country(post.getDescription().getGeolocation().getCountry()) + .build() : null) + .createdAt(post.getDescription().getCreatedAt()) + .updatedAt(post.getDescription().getUpdatedAt()) + .build() : null) + .topic(post.getTopic()) + .script(post.getScript()) + .type(post.getType()) + .status(post.getStatus()) + .report(post.getReport()) + .build(); + } + + public ArchiveComment toArchiveComment(PublicPostDescription comment) { + return ArchiveComment.builder() + .originalCommentId(comment.getId()) + .postId(comment.getPostId()) + .userId(comment.getUserId()) + .username(comment.getUsername()) + .userImageUrl(comment.getUserImageUrl()) + .description(comment.getDescription()) + .moderation(comment.getModeration()) + .upvote(comment.getUpvote()) + .createdAt(comment.getCreatedAt()) + .updatedAt(comment.getUpdatedAt()) + .status(comment.getStatus()) + .report(comment.getReport()) + .build(); + } +} diff --git a/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteResult.java b/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteResult.java new file mode 100644 index 0000000..0eacd32 --- /dev/null +++ b/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteResult.java @@ -0,0 +1,12 @@ +package com.cadac.stone_inscription.content.delete; + +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class ContentDeleteResult { + int archivedPosts; + int archivedComments; + int deletedImages; +} diff --git a/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteService.java b/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteService.java new file mode 100644 index 0000000..958fad0 --- /dev/null +++ b/src/main/java/com/cadac/stone_inscription/content/delete/ContentDeleteService.java @@ -0,0 +1,93 @@ +package com.cadac.stone_inscription.content.delete; + +import java.util.Collections; +import java.util.List; + +import org.bson.types.ObjectId; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import com.cadac.stone_inscription.admin.repository.ArchiveCommentRepository; +import com.cadac.stone_inscription.admin.repository.ArchivePostRepository; +import com.cadac.stone_inscription.entity.InscriptionPost; +import com.cadac.stone_inscription.entity.PublicPostDescription; +import com.cadac.stone_inscription.entity.User; +import com.cadac.stone_inscription.exception.StoneInscriptionException; +import com.cadac.stone_inscription.repository.ImagesDataRepo; +import com.cadac.stone_inscription.repository.InscriptionPostRepo; +import com.cadac.stone_inscription.repository.PublicPostDescriptionRepo; +import com.cadac.stone_inscription.repository.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ContentDeleteService { + + private final InscriptionPostRepo inscriptionPostRepo; + private final PublicPostDescriptionRepo publicPostDescriptionRepo; + private final ArchivePostRepository archivePostRepository; + private final ArchiveCommentRepository archiveCommentRepository; + private final ArchiveContentMapper archiveContentMapper; + private final ImagesDataRepo imagesDataRepo; + private final UserRepository userRepository; + + public ContentDeleteResult deletePost(ObjectId postId) { + InscriptionPost post = inscriptionPostRepo.findById(postId) + .orElseThrow(() -> new StoneInscriptionException("Unprocesable request", HttpStatus.BAD_REQUEST)); + + List comments = publicPostDescriptionRepo.findByPostId(postId); + List imageIds = getImageIds(post); + + archivePostRepository.save(archiveContentMapper.toArchivePost(post)); + comments.stream() + .map(archiveContentMapper::toArchiveComment) + .forEach(archiveCommentRepository::save); + + imageIds.forEach(imagesDataRepo::deleteById); + publicPostDescriptionRepo.deleteAll(comments); + inscriptionPostRepo.delete(post); + decrementUserImagesUploaded(post.getUserId(), imageIds.size()); + + return ContentDeleteResult.builder() + .archivedPosts(1) + .archivedComments(comments.size()) + .deletedImages(imageIds.size()) + .build(); + } + + public ContentDeleteResult deleteComment(ObjectId commentId) { + PublicPostDescription comment = publicPostDescriptionRepo.findById(commentId) + .orElseThrow(() -> new StoneInscriptionException("Unprocesable request", HttpStatus.BAD_REQUEST)); + + archiveCommentRepository.save(archiveContentMapper.toArchiveComment(comment)); + publicPostDescriptionRepo.delete(comment); + + return ContentDeleteResult.builder() + .archivedPosts(0) + .archivedComments(1) + .deletedImages(0) + .build(); + } + + private List getImageIds(InscriptionPost post) { + if (post.getImages() == null || post.getImages().getImage() == null) { + return Collections.emptyList(); + } + + return post.getImages().getImage(); + } + + private void decrementUserImagesUploaded(ObjectId userId, int imageCount) { + if (imageCount <= 0) { + return; + } + + User user = userRepository.findById(userId) + .orElseThrow(() -> new StoneInscriptionException("User not found", HttpStatus.NOT_FOUND)); + + int currentCount = user.getImagesUploaded() == null ? 0 : user.getImagesUploaded(); + user.setImagesUploaded(Math.max(0, currentCount - imageCount)); + userRepository.save(user); + } +} diff --git a/src/main/java/com/cadac/stone_inscription/post/controller/PostController.java b/src/main/java/com/cadac/stone_inscription/post/controller/PostController.java index f8fbabc..30a21b2 100644 --- a/src/main/java/com/cadac/stone_inscription/post/controller/PostController.java +++ b/src/main/java/com/cadac/stone_inscription/post/controller/PostController.java @@ -264,7 +264,7 @@ public ResponseEntity deleteImagesFromPost(HttpServletRequest request, // TODO: Remove these methods when testing is done to restore normal behavior. // ============================ - // // @PostMapping("/test/updatePost/{email}") + // @PostMapping("/test/updatePost/{email}") // public ResponseEntity updatePostForTest( // @PathVariable String email, // @RequestPart(value = "post", required = false) InscriptionPostDto InscriptionPostDto, 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 ee72fe3..3b5d341 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 @@ -22,6 +22,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import com.cadac.stone_inscription.content.delete.ContentDeleteService; import com.cadac.stone_inscription.entity.ImagesData; import com.cadac.stone_inscription.entity.InscriptionPost; import com.cadac.stone_inscription.entity.PublicPostDescription; @@ -65,6 +66,9 @@ public class PostServiceImp implements PostService { @Autowired private ContentModerationService contentModerationService; + @Autowired + private ContentDeleteService contentDeleteService; + @Value("${app.backend.url}") private String backendUrl; @@ -356,13 +360,8 @@ public ResponseEntity postDelete(String usernameFromToken, String postId) { if (!user.getId().toString().equals(postDelete.get().getUserId().toString())) { throw new StoneInscriptionException("Unprocesable request", HttpStatus.BAD_REQUEST); } - int deletedImageCount = getExistingImageIds(postDelete.get()).size(); - getExistingImageIds(postDelete.get()).forEach(imagesDataRepo::deleteById); - adjustUserImagesUploaded(user, -deletedImageCount); - userRepository.save(user); - publicPostDescriptionRepo.deleteAllByPostId(postId); - inscriptionPostRepo.deleteById(new ObjectId(postId)); + contentDeleteService.deletePost(postDelete.get().getId()); return UserResponse.responseHandler("post deleted", HttpStatus.OK, true); } @@ -380,7 +379,7 @@ public ResponseEntity descriptionDelete(String usernameFromToken, String desc throw new StoneInscriptionException("Unprocesable request Unauthorized", HttpStatus.UNAUTHORIZED); } - publicPostDescriptionRepo.deleteById(new ObjectId(descriptionId)); + contentDeleteService.deleteComment(postDiscription.get().getId()); return UserResponse.responseHandler("description deleted", HttpStatus.OK, true); }