class IssueManager {

    @Transactional(propagation = Propagation.REQUIRED)
    public IssueComment updateComment(Long issueId, Long commentId, IssueCommentVO commentVO) {
        IssueComment issueComment = loadComment(issueId, commentId);
        loadIssueAndCheckIfNotClosed(issueId);
        String text = commentVO.getText();
        ensureNotEmptyString(text, MessageConstants.ERROR_INVALID_COMMENT_TEXT);
        issueComment.setText(text);
        commentDao.updateComment(issueComment);

        // Find the attachments that were removed during update and delete them
        HashSet<Attachment> newAttachments = new HashSet<>(commentVO.getAttachments());
        List<Attachment> allAttachments = attachmentDao.loadAttachmentsByCommentId(commentId);
        List<Attachment> toDelete = allAttachments.stream().filter(a -> !newAttachments.contains(a))
            .collect(Collectors.toList());
        attachmentFileManager.deleteAttachments(toDelete);

        // New attachments might be added so we need to link them to this comment
        commentVO.getAttachments().forEach(a -> attachmentDao.updateAttachmentCommentId(a.getId(), commentId));

        return issueComment;
    }

}