Skip to content

Commit 331f424

Browse files
authored
feat: 条目封面字段更新后如果是http开头则自动下载到本地Subject cover (#714)
* fix: 修复console编译问题 * feat: 条目封面字段更新后如果是http开头则自动下载到本地
1 parent 3378cd7 commit 331f424

File tree

4 files changed

+67
-8
lines changed

4 files changed

+67
-8
lines changed

CHANGELOG.MD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# 0.18.1
66

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

910
# 0.18.0
1011

console/src/modules/content/subject/SubjectDetails.vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -649,10 +649,7 @@ const loadEpisodeGroupLabels = () => {
649649
650650
const subjectSyncs = ref<SubjectSync[]>([]);
651651
const fetchSubjectSyncs = async () => {
652-
const { data } =
653-
await apiClient.subjectSync.getSubjectSyncsBySubjectId({
654-
id: subject.value.id as number,
655-
});
652+
const { data } = await apiClient.subjectSync.getSubjectSyncsBySubjectId({id: subject.value.id as number})
656653
subjectSyncs.value = data;
657654
};
658655

server/src/main/java/run/ikaros/server/core/attachment/listener/AttachmentSubjectCoverChangeListener.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,50 @@
44
import lombok.extern.slf4j.Slf4j;
55
import org.apache.commons.lang3.StringUtils;
66
import org.springframework.context.event.EventListener;
7+
import org.springframework.core.io.buffer.DataBufferFactory;
8+
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
79
import org.springframework.stereotype.Component;
10+
import org.springframework.web.client.RestTemplate;
811
import reactor.core.publisher.Mono;
912
import run.ikaros.api.core.attachment.AttachmentConst;
13+
import run.ikaros.api.core.attachment.AttachmentUploadCondition;
14+
import run.ikaros.api.infra.utils.FileUtils;
1015
import run.ikaros.api.store.enums.AttachmentReferenceType;
1116
import run.ikaros.api.store.enums.AttachmentType;
1217
import run.ikaros.server.core.attachment.service.AttachmentService;
18+
import run.ikaros.server.core.subject.SubjectOperator;
1319
import run.ikaros.server.core.subject.event.SubjectRemoveEvent;
1420
import run.ikaros.server.core.subject.event.SubjectUpdateEvent;
1521
import run.ikaros.server.store.entity.AttachmentEntity;
1622
import run.ikaros.server.store.entity.AttachmentReferenceEntity;
1723
import run.ikaros.server.store.entity.SubjectEntity;
1824
import run.ikaros.server.store.repository.AttachmentReferenceRepository;
1925
import run.ikaros.server.store.repository.AttachmentRepository;
26+
import run.ikaros.server.store.repository.SubjectRepository;
2027

2128
@Slf4j
2229
@Component
2330
public class AttachmentSubjectCoverChangeListener {
2431
private final AttachmentRepository attachmentRepository;
2532
private final AttachmentService attachmentService;
2633
private final AttachmentReferenceRepository attachmentReferenceRepository;
34+
private final RestTemplate restTemplate = new RestTemplate();
35+
private final SubjectOperator subjectOperator;
36+
private final SubjectRepository subjectRepository;
2737

2838
/**
2939
* Construct.
3040
*/
3141
public AttachmentSubjectCoverChangeListener(
3242
AttachmentRepository attachmentRepository,
3343
AttachmentService attachmentService,
34-
AttachmentReferenceRepository attachmentReferenceRepository) {
44+
AttachmentReferenceRepository attachmentReferenceRepository,
45+
SubjectOperator subjectOperator, SubjectRepository subjectRepository) {
3546
this.attachmentRepository = attachmentRepository;
3647
this.attachmentService = attachmentService;
3748
this.attachmentReferenceRepository = attachmentReferenceRepository;
49+
this.subjectOperator = subjectOperator;
50+
this.subjectRepository = subjectRepository;
3851
}
3952

4053

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

7689
String oldCover = oldEntity.getCover();
7790
String newCover = newEntity.getCover();
78-
if (oldCover.equals(newCover)) {
91+
if (oldCover.equals(newCover) && !oldCover.startsWith("http")) {
7992
return Mono.empty();
8093
}
8194

@@ -111,6 +124,43 @@ public Mono<Void> onSubjectCoverUpdate(SubjectUpdateEvent event) {
111124
entity)))
112125
)
113126

127+
// 当是网络url的时候,附件是找不到的,此时为空走这里的逻辑
128+
// 条目三方同步会发布更新事件
129+
130+
.then(Mono.just(newCover))
131+
.filter(StringUtils::isNotBlank)
132+
.filter(url -> url.startsWith("http"))
133+
.flatMap(url -> {
134+
String coverFileName = StringUtils.isNotBlank(newEntity.getNameCn())
135+
? newEntity.getNameCn() : newEntity.getName();
136+
coverFileName =
137+
System.currentTimeMillis() + "-" + coverFileName
138+
+ "." + FileUtils.parseFilePostfix(FileUtils.parseFileName(url));
139+
byte[] bytes = restTemplate.getForObject(url, byte[].class);
140+
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
141+
return attachmentService.upload(AttachmentUploadCondition.builder()
142+
.parentId(AttachmentConst.COVER_DIRECTORY_ID)
143+
.name(coverFileName)
144+
.dataBufferFlux(Mono.just(dataBufferFactory.wrap(bytes)).flux())
145+
.build());
146+
})
147+
.flatMap(attachment ->
148+
subjectRepository.findById(newEntity.getId())
149+
.map(entity -> entity.setCover(attachment.getUrl()))
150+
.flatMap(subjectRepository::save)
151+
.flatMap(entity ->
152+
attachmentReferenceRepository.findByTypeAndAttachmentIdAndReferenceId(
153+
AttachmentReferenceType.SUBJECT, attachment.getId(), entity.getId())
154+
.switchIfEmpty(Mono.just(AttachmentReferenceEntity.builder()
155+
.type(AttachmentReferenceType.SUBJECT)
156+
.attachmentId(attachment.getId())
157+
.referenceId(entity.getId())
158+
.build()))
159+
.flatMap(attachmentReferenceRepository::save)
160+
)
161+
162+
)
163+
114164
.then();
115165
}
116166
}

server/src/main/java/run/ikaros/server/core/subject/service/impl/SubjectSyncServiceImpl.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.springframework.beans.BeansException;
1414
import org.springframework.context.ApplicationContext;
1515
import org.springframework.context.ApplicationContextAware;
16+
import org.springframework.context.ApplicationEventPublisher;
1617
import org.springframework.stereotype.Service;
1718
import org.springframework.util.Assert;
1819
import reactor.core.publisher.Flux;
@@ -24,6 +25,7 @@
2425
import run.ikaros.api.infra.exception.subject.NoAvailableSubjectPlatformSynchronizerException;
2526
import run.ikaros.api.store.enums.SubjectSyncPlatform;
2627
import run.ikaros.api.store.enums.TagType;
28+
import run.ikaros.server.core.subject.event.SubjectUpdateEvent;
2729
import run.ikaros.server.core.subject.service.SubjectService;
2830
import run.ikaros.server.core.subject.service.SubjectSyncService;
2931
import run.ikaros.server.plugin.ExtensionComponentsFinder;
@@ -60,6 +62,7 @@ public class SubjectSyncServiceImpl implements SubjectSyncService,
6062
private final SubjectPersonRepository subjectPersonRepository;
6163
private ApplicationContext applicationContext;
6264
private final SubjectSyncRepository subjectSyncRepository;
65+
private final ApplicationEventPublisher applicationEventPublisher;
6366

6467
/**
6568
* Construct.
@@ -72,7 +75,8 @@ public SubjectSyncServiceImpl(ExtensionComponentsFinder extensionComponentsFinde
7275
CharacterRepository characterRepository,
7376
SubjectCharacterRepository subjectCharacterRepository,
7477
PersonRepository personRepository,
75-
SubjectPersonRepository subjectPersonRepository) {
78+
SubjectPersonRepository subjectPersonRepository,
79+
ApplicationEventPublisher applicationEventPublisher) {
7680
this.extensionComponentsFinder = extensionComponentsFinder;
7781
this.subjectService = subjectService;
7882
this.subjectSyncRepository = subjectSyncRepository;
@@ -83,6 +87,7 @@ public SubjectSyncServiceImpl(ExtensionComponentsFinder extensionComponentsFinde
8387
this.subjectCharacterRepository = subjectCharacterRepository;
8488
this.personRepository = personRepository;
8589
this.subjectPersonRepository = subjectPersonRepository;
90+
this.applicationEventPublisher = applicationEventPublisher;
8691
}
8792

8893
class SyncTargetExistsException extends RuntimeException {
@@ -140,7 +145,13 @@ public Mono<Void> sync(@Nullable Long subjectId, SubjectSyncPlatform platform,
140145
.flatMap(entity -> copyProperties(subject, entity, "id"));
141146
}
142147
})
143-
.flatMap(subjectRepository::save)
148+
.flatMap(entity -> subjectRepository.save(entity)
149+
.map(newEntity -> {
150+
SubjectUpdateEvent event =
151+
new SubjectUpdateEvent(this, entity, newEntity);
152+
applicationEventPublisher.publishEvent(event);
153+
return newEntity;
154+
}))
144155
.map(entity -> {
145156
subjectIdA.set(entity.getId());
146157
return entity;

0 commit comments

Comments
 (0)