diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 945447b00..f81db8726 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -2,6 +2,14 @@ 更新日志文档,版本顺序从新到旧,最新版本在最前(上)面。 +# 0.15.10 + +## 问题修复 + +- 修复条目收藏的异常问题 674 +- 修复条目移除后未移除对应收藏的问题 674 +- 条目更新封面字段时异常移除相关条目封面字段 #675 + # 0.15.9 - 支持Prometheus的指标聚合API #676 diff --git a/gradle.properties b/gradle.properties index 4498ef81b..4a8116427 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.15.9 +version=0.15.10 diff --git a/server/src/main/java/run/ikaros/server/core/attachment/listener/AttachmentSubjectCoverChangeListener.java b/server/src/main/java/run/ikaros/server/core/attachment/listener/AttachmentSubjectCoverChangeListener.java index 80c3dd95b..69c040e97 100644 --- a/server/src/main/java/run/ikaros/server/core/attachment/listener/AttachmentSubjectCoverChangeListener.java +++ b/server/src/main/java/run/ikaros/server/core/attachment/listener/AttachmentSubjectCoverChangeListener.java @@ -81,7 +81,13 @@ public Mono onSubjectCoverUpdate(SubjectUpdateEvent event) { return attachmentRepository.findByUrl(oldCover) .map(AttachmentEntity::getId) - .flatMapMany(attachmentReferenceRepository::deleteAllByAttachmentId) + .flatMap(oldCoverAttId -> attachmentReferenceRepository + .deleteByTypeAndAttachmentIdAndReferenceId( + AttachmentReferenceType.SUBJECT, + oldEntity.getId(), + oldCoverAttId + ).doOnSuccess(unused -> + log.debug("Delete attachment Reference by type and att id and sub id."))) // update new attachment that move to cover dir .then(attachmentRepository.findByTypeAndParentIdAndName(AttachmentType.Directory, AttachmentConst.ROOT_DIRECTORY_ID, AttachmentConst.COVER_DIR_NAME)) @@ -91,12 +97,20 @@ public Mono onSubjectCoverUpdate(SubjectUpdateEvent event) { .map(entity -> entity.setParentId(coverDirAttId))) .flatMap(attachmentRepository::save) .map(AttachmentEntity::getId) - .map(attId -> AttachmentReferenceEntity.builder() - .type(AttachmentReferenceType.SUBJECT) - .attachmentId(attId) - .referenceId(newEntity.getId()) - .build()) - .flatMap(attachmentReferenceRepository::save) + .flatMap(attId -> attachmentReferenceRepository + .findByTypeAndAttachmentIdAndReferenceId(AttachmentReferenceType.SUBJECT, + attId, newEntity.getId()) + .switchIfEmpty(attachmentReferenceRepository.save( + AttachmentReferenceEntity.builder() + .type(AttachmentReferenceType.SUBJECT) + .attachmentId(attId) + .referenceId(newEntity.getId()) + .build() + ).doOnSuccess(entity -> + log.debug("Create attachment Reference by type and att id and sub id: [{}].", + entity))) + ) + .then(); } } diff --git a/server/src/main/java/run/ikaros/server/core/collection/CollectionSubjectRemoveEventListener.java b/server/src/main/java/run/ikaros/server/core/collection/CollectionSubjectRemoveEventListener.java new file mode 100644 index 000000000..a8ad5661e --- /dev/null +++ b/server/src/main/java/run/ikaros/server/core/collection/CollectionSubjectRemoveEventListener.java @@ -0,0 +1,35 @@ +package run.ikaros.server.core.collection; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; +import run.ikaros.server.core.subject.event.SubjectRemoveEvent; +import run.ikaros.server.store.entity.SubjectEntity; +import run.ikaros.server.store.repository.SubjectCollectionRepository; + +@Slf4j +@Component +public class CollectionSubjectRemoveEventListener { + private final SubjectCollectionRepository subjectCollectionRepository; + + public CollectionSubjectRemoveEventListener( + SubjectCollectionRepository subjectCollectionRepository) { + this.subjectCollectionRepository = subjectCollectionRepository; + } + + /** + * Listen subject remove event. + */ + @EventListener(SubjectRemoveEvent.class) + public Mono onSubjectAdd(SubjectRemoveEvent event) { + SubjectEntity entity = event.getEntity(); + if (entity == null) { + return Mono.empty(); + } + return subjectCollectionRepository.removeAllBySubjectId(entity.getId()) + .doOnSuccess(unused -> log.debug("Subject collections removed by subject id: {}", + entity.getId())) + .then(); + } +} diff --git a/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionImpl.java b/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionImpl.java index 2cb520f36..8ba10ebe2 100644 --- a/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionImpl.java +++ b/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionImpl.java @@ -181,8 +181,6 @@ public Mono findCollection(Long userId, Long subjectId) { Assert.isTrue(subjectId >= 0, "'subjectId' must >= 0"); return checkUserIdExists(userId) .then(subjectRepository.findById(subjectId)) - .switchIfEmpty(Mono.error( - new SubjectNotFoundException("Subject not found for id: " + subjectId))) .flatMap(subjectEntity -> copyProperties(subjectEntity, new SubjectCollection())) .flatMap(subjectCollection -> subjectCollectionRepository.findByUserIdAndSubjectId(userId, subjectId) diff --git a/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionService.java b/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionService.java index 9c7b435a1..768b63c20 100644 --- a/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionService.java +++ b/server/src/main/java/run/ikaros/server/core/collection/SubjectCollectionService.java @@ -22,6 +22,13 @@ Mono collect(Long userId, Long subjectId, @Transactional Mono unCollect(Long userId, Long subjectId); + /** + * Find subject collection with userId and subjectId. + * + * @param userId user id + * @param subjectId subject id + * @return subject collection or null + */ Mono findCollection(Long userId, Long subjectId); Mono> findCollections(Long userId, Integer page, diff --git a/server/src/main/java/run/ikaros/server/store/repository/SubjectCollectionRepository.java b/server/src/main/java/run/ikaros/server/store/repository/SubjectCollectionRepository.java index 5dddf3177..bdfb2cdff 100644 --- a/server/src/main/java/run/ikaros/server/store/repository/SubjectCollectionRepository.java +++ b/server/src/main/java/run/ikaros/server/store/repository/SubjectCollectionRepository.java @@ -16,4 +16,6 @@ public interface SubjectCollectionRepository Mono countAllByUserId(Long userId); Mono countByType(CollectionType type); + + Mono removeAllBySubjectId(Long subjectId); }