Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 条目封面字段更新后如果是http开头则自动下载到本地Subject cover #714

Merged
merged 2 commits into from
Oct 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.MD
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# 0.18.1

- 修复Console快速拉取条目后无法定位到对应条目的问题
- 条目封面字段更新后如果是http开头则自动下载到本地

# 0.18.0

Expand Down
5 changes: 1 addition & 4 deletions console/src/modules/content/subject/SubjectDetails.vue
Original file line number Diff line number Diff line change
Expand Up @@ -649,10 +649,7 @@ const loadEpisodeGroupLabels = () => {

const subjectSyncs = ref<SubjectSync[]>([]);
const fetchSubjectSyncs = async () => {
const { data } =
await apiClient.subjectSync.getSubjectSyncsBySubjectId({
id: subject.value.id as number,
});
const { data } = await apiClient.subjectSync.getSubjectSyncsBySubjectId({id: subject.value.id as number})
subjectSyncs.value = data;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,50 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import reactor.core.publisher.Mono;
import run.ikaros.api.core.attachment.AttachmentConst;
import run.ikaros.api.core.attachment.AttachmentUploadCondition;
import run.ikaros.api.infra.utils.FileUtils;
import run.ikaros.api.store.enums.AttachmentReferenceType;
import run.ikaros.api.store.enums.AttachmentType;
import run.ikaros.server.core.attachment.service.AttachmentService;
import run.ikaros.server.core.subject.SubjectOperator;
import run.ikaros.server.core.subject.event.SubjectRemoveEvent;
import run.ikaros.server.core.subject.event.SubjectUpdateEvent;
import run.ikaros.server.store.entity.AttachmentEntity;
import run.ikaros.server.store.entity.AttachmentReferenceEntity;
import run.ikaros.server.store.entity.SubjectEntity;
import run.ikaros.server.store.repository.AttachmentReferenceRepository;
import run.ikaros.server.store.repository.AttachmentRepository;
import run.ikaros.server.store.repository.SubjectRepository;

@Slf4j
@Component
public class AttachmentSubjectCoverChangeListener {
private final AttachmentRepository attachmentRepository;
private final AttachmentService attachmentService;
private final AttachmentReferenceRepository attachmentReferenceRepository;
private final RestTemplate restTemplate = new RestTemplate();
private final SubjectOperator subjectOperator;
private final SubjectRepository subjectRepository;

/**
* Construct.
*/
public AttachmentSubjectCoverChangeListener(
AttachmentRepository attachmentRepository,
AttachmentService attachmentService,
AttachmentReferenceRepository attachmentReferenceRepository) {
AttachmentReferenceRepository attachmentReferenceRepository,
SubjectOperator subjectOperator, SubjectRepository subjectRepository) {
this.attachmentRepository = attachmentRepository;
this.attachmentService = attachmentService;
this.attachmentReferenceRepository = attachmentReferenceRepository;
this.subjectOperator = subjectOperator;
this.subjectRepository = subjectRepository;
}


Expand Down Expand Up @@ -75,7 +88,7 @@ public Mono<Void> onSubjectCoverUpdate(SubjectUpdateEvent event) {

String oldCover = oldEntity.getCover();
String newCover = newEntity.getCover();
if (oldCover.equals(newCover)) {
if (oldCover.equals(newCover) && !oldCover.startsWith("http")) {
return Mono.empty();
}

Expand Down Expand Up @@ -111,6 +124,43 @@ public Mono<Void> onSubjectCoverUpdate(SubjectUpdateEvent event) {
entity)))
)

// 当是网络url的时候,附件是找不到的,此时为空走这里的逻辑
// 条目三方同步会发布更新事件

.then(Mono.just(newCover))
.filter(StringUtils::isNotBlank)
.filter(url -> url.startsWith("http"))
.flatMap(url -> {
String coverFileName = StringUtils.isNotBlank(newEntity.getNameCn())
? newEntity.getNameCn() : newEntity.getName();
coverFileName =
System.currentTimeMillis() + "-" + coverFileName
+ "." + FileUtils.parseFilePostfix(FileUtils.parseFileName(url));
byte[] bytes = restTemplate.getForObject(url, byte[].class);
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
return attachmentService.upload(AttachmentUploadCondition.builder()
.parentId(AttachmentConst.COVER_DIRECTORY_ID)
.name(coverFileName)
.dataBufferFlux(Mono.just(dataBufferFactory.wrap(bytes)).flux())
.build());
})
.flatMap(attachment ->
subjectRepository.findById(newEntity.getId())
.map(entity -> entity.setCover(attachment.getUrl()))
.flatMap(subjectRepository::save)
.flatMap(entity ->
attachmentReferenceRepository.findByTypeAndAttachmentIdAndReferenceId(
AttachmentReferenceType.SUBJECT, attachment.getId(), entity.getId())
.switchIfEmpty(Mono.just(AttachmentReferenceEntity.builder()
.type(AttachmentReferenceType.SUBJECT)
.attachmentId(attachment.getId())
.referenceId(entity.getId())
.build()))
.flatMap(attachmentReferenceRepository::save)
)

)

.then();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import reactor.core.publisher.Flux;
Expand All @@ -24,6 +25,7 @@
import run.ikaros.api.infra.exception.subject.NoAvailableSubjectPlatformSynchronizerException;
import run.ikaros.api.store.enums.SubjectSyncPlatform;
import run.ikaros.api.store.enums.TagType;
import run.ikaros.server.core.subject.event.SubjectUpdateEvent;
import run.ikaros.server.core.subject.service.SubjectService;
import run.ikaros.server.core.subject.service.SubjectSyncService;
import run.ikaros.server.plugin.ExtensionComponentsFinder;
Expand Down Expand Up @@ -60,6 +62,7 @@ public class SubjectSyncServiceImpl implements SubjectSyncService,
private final SubjectPersonRepository subjectPersonRepository;
private ApplicationContext applicationContext;
private final SubjectSyncRepository subjectSyncRepository;
private final ApplicationEventPublisher applicationEventPublisher;

/**
* Construct.
Expand All @@ -72,7 +75,8 @@ public SubjectSyncServiceImpl(ExtensionComponentsFinder extensionComponentsFinde
CharacterRepository characterRepository,
SubjectCharacterRepository subjectCharacterRepository,
PersonRepository personRepository,
SubjectPersonRepository subjectPersonRepository) {
SubjectPersonRepository subjectPersonRepository,
ApplicationEventPublisher applicationEventPublisher) {
this.extensionComponentsFinder = extensionComponentsFinder;
this.subjectService = subjectService;
this.subjectSyncRepository = subjectSyncRepository;
Expand All @@ -83,6 +87,7 @@ public SubjectSyncServiceImpl(ExtensionComponentsFinder extensionComponentsFinde
this.subjectCharacterRepository = subjectCharacterRepository;
this.personRepository = personRepository;
this.subjectPersonRepository = subjectPersonRepository;
this.applicationEventPublisher = applicationEventPublisher;
}

class SyncTargetExistsException extends RuntimeException {
Expand Down Expand Up @@ -140,7 +145,13 @@ public Mono<Void> sync(@Nullable Long subjectId, SubjectSyncPlatform platform,
.flatMap(entity -> copyProperties(subject, entity, "id"));
}
})
.flatMap(subjectRepository::save)
.flatMap(entity -> subjectRepository.save(entity)
.map(newEntity -> {
SubjectUpdateEvent event =
new SubjectUpdateEvent(this, entity, newEntity);
applicationEventPublisher.publishEvent(event);
return newEntity;
}))
.map(entity -> {
subjectIdA.set(entity.getId());
return entity;
Expand Down
Loading