Skip to content

Commit 36fb4be

Browse files
committed
remove thumbnailator
1 parent 0110865 commit 36fb4be

4 files changed

Lines changed: 177 additions & 163 deletions

File tree

artcoded/pom.xml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
35
<parent>
46
<artifactId>artcoded-parent</artifactId>
57
<groupId>tech.artcoded</groupId>
@@ -123,10 +125,6 @@
123125
<groupId>net.lingala.zip4j</groupId>
124126
<artifactId>zip4j</artifactId>
125127
</dependency>
126-
<dependency>
127-
<groupId>net.coobird</groupId>
128-
<artifactId>thumbnailator</artifactId>
129-
</dependency>
130128
<dependency>
131129
<groupId>org.zeroturnaround</groupId>
132130
<artifactId>zt-exec</artifactId>

artcoded/src/main/java/tech/artcoded/websitev2/changelogs/CHANGE_LOG_03_GenerateThumbnailIfNotPresentChangeLog.java

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,66 @@
44
import io.mongock.api.annotations.Execution;
55
import io.mongock.api.annotations.RollbackExecution;
66
import lombok.extern.slf4j.Slf4j;
7-
import org.springframework.web.multipart.MultipartFile;
7+
8+
import org.openapitools.client.api.UploadRoutesApi;
89
import tech.artcoded.websitev2.pages.memzagram.MemZaGramRepository;
9-
import tech.artcoded.websitev2.rest.util.MockMultipartFile;
10+
import tech.artcoded.websitev2.upload.FileUpload;
1011
import tech.artcoded.websitev2.upload.IFileUploadService;
1112

12-
import java.io.ByteArrayInputStream;
13-
import java.io.ByteArrayOutputStream;
14-
15-
import static java.util.Optional.ofNullable;
16-
import static net.coobird.thumbnailator.Thumbnailator.createThumbnail;
17-
import static tech.artcoded.websitev2.utils.func.CheckedSupplier.toSupplier;
18-
1913
@Slf4j
2014
@ChangeUnit(id = "generate-thumbnail-if-not-present", order = "3", author = "Nordine Bittich")
2115
public class CHANGE_LOG_03_GenerateThumbnailIfNotPresentChangeLog {
2216

23-
@Execution
24-
public void run(MemZaGramRepository repository, IFileUploadService fileUploadService) throws Exception {
25-
repository.findByThumbnailUploadIdIsNull()
26-
.forEach(memz -> ofNullable(memz.getImageUploadId()).flatMap(fileUploadService::findOneById)
27-
.map(fileUploadService::toMockMultipartFile).ifPresent(image -> {
28-
log.info("perform migration for memz {}", memz.getId());
29-
byte[] thumbnailBytes = toSupplier(() -> {
30-
ByteArrayOutputStream bos = new ByteArrayOutputStream();
31-
createThumbnail(new ByteArrayInputStream(image.getBytes()), bos, 300, 300);
32-
return bos.toByteArray();
33-
}).get();
34-
String fileName = "thumb_".concat(ofNullable(image.getOriginalFilename()).orElse(""));
35-
MultipartFile thumb = MockMultipartFile.builder().bytes(thumbnailBytes).name(fileName)
36-
.contentType(image.getContentType()).originalFilename(fileName).build();
37-
String thumbUploadId = fileUploadService.upload(thumb, memz.getId(), memz.isVisible());
38-
repository.save(memz.toBuilder().thumbnailUploadId(thumbUploadId).build());
39-
log.info("migration for memz {} done", memz.getId());
40-
}));
41-
}
17+
@Execution
18+
public void run(MemZaGramRepository repository, IFileUploadService fileUploadService, UploadRoutesApi routesApi)
19+
throws Exception {
20+
var memzList = repository.findByThumbnailUploadIdIsNull();
21+
22+
for (var memz : memzList) {
23+
String imageUploadId = memz.getImageUploadId();
24+
25+
if (imageUploadId == null) {
26+
continue;
27+
}
28+
29+
var fileUploadOpt = fileUploadService.findOneById(imageUploadId);
4230

43-
@RollbackExecution
44-
public void rollbackExecution(MemZaGramRepository repository) {
31+
if (!fileUploadOpt.isPresent()) {
32+
continue;
33+
}
34+
35+
FileUpload fileUpload = fileUploadOpt.get();
36+
String thumbnailId = fileUpload.getThumbnailId();
37+
38+
if (thumbnailId == null || thumbnailId.isBlank()) {
39+
try {
40+
log.info("ping...");
41+
var res = routesApi.pingWithHttpInfo();
42+
if (res.getStatusCode() == 200) {
43+
log.info("pong!");
44+
break;
45+
} else {
46+
log.info("no pong :(");
47+
Thread.sleep(1000);
48+
}
49+
} catch (Exception e) {
50+
log.error("could not reach file service", e);
51+
}
52+
}
53+
var res = routesApi.makeThumbWithHttpInfo(fileUpload.getId());
54+
var data = res.getData();
55+
56+
var updatedMemz = memz.toBuilder()
57+
.thumbnailUploadId(data.getThumbnailId())
58+
.build();
59+
60+
repository.save(updatedMemz);
61+
log.info("migration for memz {} done", memz.getId());
4562
}
63+
64+
}
65+
66+
@RollbackExecution
67+
public void rollbackExecution(MemZaGramRepository repository) {
68+
}
4669
}
Lines changed: 117 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package tech.artcoded.websitev2.pages.memzagram;
22

3+
import lombok.SneakyThrows;
34
import lombok.extern.slf4j.Slf4j;
45
import org.apache.commons.lang3.StringUtils;
56
import org.springframework.cache.annotation.CachePut;
@@ -9,150 +10,140 @@
910
import org.springframework.stereotype.Service;
1011
import org.springframework.web.multipart.MultipartFile;
1112
import tech.artcoded.websitev2.notification.NotificationService;
12-
import tech.artcoded.websitev2.rest.util.MockMultipartFile;
13+
import tech.artcoded.websitev2.upload.FileUpload;
1314
import tech.artcoded.websitev2.upload.IFileUploadService;
1415
import tech.artcoded.websitev2.upload.ILinkable;
1516
import tech.artcoded.websitev2.utils.helper.IdGenerators;
1617

17-
import java.io.ByteArrayInputStream;
18-
import java.io.ByteArrayOutputStream;
1918
import java.util.Collection;
2019
import java.util.Date;
2120
import java.util.Map;
2221
import java.util.Optional;
22+
import java.util.concurrent.TimeUnit;
2323
import java.util.function.Function;
2424
import java.util.function.Predicate;
2525
import java.util.stream.Collectors;
2626

2727
import static java.lang.Boolean.TRUE;
2828
import static java.util.Optional.ofNullable;
29-
import static net.coobird.thumbnailator.Thumbnailator.createThumbnail;
30-
import static tech.artcoded.websitev2.utils.func.CheckedSupplier.toSupplier;
3129

3230
@Service
3331
@Slf4j
3432
public class MemZaGramService implements ILinkable {
3533

36-
private final MemZaGramRepository repository;
37-
private final IFileUploadService fileUploadService;
38-
private final NotificationService notificationService;
39-
private static final String MEMZ_ADDED = "MEMZ_ADDED";
40-
private static final String MEMZ_DELETED = "MEMZ_DELETED";
41-
42-
public MemZaGramService(MemZaGramRepository repository, IFileUploadService fileUploadService,
43-
NotificationService notificationService) {
44-
this.repository = repository;
45-
this.fileUploadService = fileUploadService;
46-
this.notificationService = notificationService;
47-
}
48-
49-
@Async
50-
public void save(String id, String title, String description, Boolean visible, Date dateOfVisibility,
51-
MultipartFile imageUpload) {
52-
MemZaGram memz = ofNullable(id).filter(StringUtils::isNotEmpty).flatMap(this.repository::findById)
53-
.orElseGet(() -> MemZaGram.builder().id(IdGenerators.get()).build());
54-
55-
log.info("persisting new image or update visibility...");
56-
57-
String imageUploadId = this.uploadAndDeleteIfExist(imageUpload, memz.getId(), memz.getImageUploadId(), visible);
58-
59-
log.info("generating thumbnail...");
60-
61-
String thumbnailUploadId = ofNullable(imageUpload).map(upl -> {
62-
byte[] thumbnailBytes = toSupplier(() -> {
63-
ByteArrayOutputStream bos = new ByteArrayOutputStream();
64-
createThumbnail(new ByteArrayInputStream(upl.getBytes()), bos, 300, 300);
65-
return bos.toByteArray();
66-
}).get();
67-
String fileName = "thumb_".concat(ofNullable(upl.getOriginalFilename()).orElse(""));
68-
return MockMultipartFile.builder().bytes(thumbnailBytes).name(fileName)
69-
.contentType(imageUpload.getContentType()).originalFilename(fileName).build();
70-
}).map(thumbMultipartFile -> this.uploadAndDeleteIfExist(thumbMultipartFile, memz.getId(),
71-
memz.getThumbnailUploadId(), visible))
72-
.orElseGet(() -> fileUploadService
73-
.updateVisibility(memz.getThumbnailUploadId(), id, TRUE.equals(visible)).orElse(null));
74-
75-
log.info("saving memz to mongo...");
76-
77-
MemZaGram save = repository.save(memz.toBuilder().title(title).description(description).updatedDate(new Date())
78-
.visible(visible).dateOfVisibility(dateOfVisibility).imageUploadId(imageUploadId)
79-
.thumbnailUploadId(thumbnailUploadId).build());
80-
notificationService.sendEvent("memz %s added or updated".formatted(save.getTitle()), MEMZ_ADDED, save.getId());
81-
}
82-
83-
public Page<MemZaGram> findByVisibleIsTrueOrderByCreatedDateDesc(Pageable pageable) {
84-
return repository.findByVisibleIsTrueOrderByCreatedDateDesc(pageable);
85-
}
86-
87-
public Page<MemZaGram> findAll(Pageable pageable) {
88-
return repository.findAll(pageable);
89-
}
90-
91-
private String uploadAndDeleteIfExist(MultipartFile file, String id, String uploadId, Boolean visibility) {
92-
String newUploadId;
93-
Optional<String> optionalImageUploadId = ofNullable(file).filter(Predicate.not(MultipartFile::isEmpty))
94-
.map(upload -> this.fileUploadService.upload(upload, id, TRUE.equals(visibility)));
95-
96-
if (optionalImageUploadId.isEmpty()) {
97-
newUploadId = ofNullable(uploadId)
98-
.flatMap(uplId -> fileUploadService.updateVisibility(uplId, id, TRUE.equals(visibility)))
99-
.orElseThrow(() -> new RuntimeException("You cannot save without an image!"));
100-
} else {
101-
newUploadId = optionalImageUploadId.get();
102-
ofNullable(uploadId).ifPresent(fileUploadService::delete);
103-
}
104-
return newUploadId;
105-
}
106-
107-
@Async
108-
public void delete(String id) {
109-
repository.findById(id).ifPresent(memz -> {
110-
fileUploadService.deleteByCorrelationId(id);
111-
repository.delete(memz);
112-
notificationService.sendEvent("memz %s deleted".formatted(memz.getTitle()), MEMZ_DELETED, memz.getId());
113-
});
114-
}
115-
116-
public void incrementViewsCount(String id) {
117-
repository.findById(id)
118-
.map(memZaGram -> memZaGram.toBuilder().viewsCount(memZaGram.getViewsCount() + 1).build())
119-
.ifPresent(repository::save);
120-
}
121-
122-
@Override
123-
@CachePut(cacheNames = "memz_correlation_links", key = "#correlationId")
124-
public String getCorrelationLabel(String correlationId) {
125-
return this.repository.findById(correlationId).map(toLabel()).orElse(null);
126-
}
127-
128-
private Function<? super MemZaGram, ? extends String> toLabel() {
129-
return mem -> "Memz '%s' ".formatted(mem.getTitle());
130-
}
131-
132-
@Override
133-
@CachePut(cacheNames = "memz_all_correlation_links", key = "'allLinks'")
134-
public Map<String, String> getCorrelationLabels(Collection<String> correlationIds) {
135-
return this.repository.findAllById(correlationIds).stream()
136-
.map(f -> Map.entry(f.getId(), this.toLabel().apply(f)))
137-
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
138-
}
139-
140-
@Override
141-
public void updateOldId(String correlationId, String oldId, String newId) {
142-
this.repository.findById(correlationId).ifPresent(p -> {
143-
var changed = false;
144-
if (oldId.equals(p.getImageUploadId())) {
145-
p.setImageUploadId(newId);
146-
changed = true;
147-
}
148-
if (oldId.equals(p.getThumbnailUploadId())) {
149-
p.setThumbnailUploadId(newId);
150-
changed = true;
151-
}
152-
if (changed) {
153-
this.repository.save(p.toBuilder().updatedDate(new Date()).build());
154-
}
155-
});
156-
34+
private final MemZaGramRepository repository;
35+
private final IFileUploadService fileUploadService;
36+
private final NotificationService notificationService;
37+
private static final String MEMZ_ADDED = "MEMZ_ADDED";
38+
private static final String MEMZ_DELETED = "MEMZ_DELETED";
39+
40+
public MemZaGramService(MemZaGramRepository repository, IFileUploadService fileUploadService,
41+
NotificationService notificationService) {
42+
this.repository = repository;
43+
this.fileUploadService = fileUploadService;
44+
this.notificationService = notificationService;
45+
}
46+
47+
@Async
48+
@SneakyThrows
49+
public void save(String id, String title, String description, Boolean visible, Date dateOfVisibility,
50+
MultipartFile imageUpload) {
51+
MemZaGram memz = ofNullable(id).filter(StringUtils::isNotEmpty).flatMap(this.repository::findById)
52+
.orElseGet(() -> MemZaGram.builder().id(IdGenerators.get()).build());
53+
54+
log.info("persisting new image or update visibility...");
55+
56+
String imageUploadId = this.uploadAndDeleteIfExist(imageUpload, memz.getId(), memz.getImageUploadId(), visible);
57+
58+
log.info("getting thumbnail in a few secs...");
59+
60+
TimeUnit.SECONDS.sleep(60);
61+
62+
String thumbnailUploadId = ofNullable(imageUploadId).flatMap(this.fileUploadService::findOneById)
63+
.map(FileUpload::getThumbnailId).orElse(null);
64+
65+
log.info("getting {} thumbnail id", thumbnailUploadId);
66+
log.info("saving memz to mongo...");
67+
68+
MemZaGram save = repository.save(memz.toBuilder().title(title).description(description).updatedDate(new Date())
69+
.visible(visible).dateOfVisibility(dateOfVisibility).imageUploadId(imageUploadId)
70+
.thumbnailUploadId(thumbnailUploadId).build());
71+
notificationService.sendEvent("memz %s added or updated".formatted(save.getTitle()), MEMZ_ADDED, save.getId());
72+
}
73+
74+
public Page<MemZaGram> findByVisibleIsTrueOrderByCreatedDateDesc(Pageable pageable) {
75+
return repository.findByVisibleIsTrueOrderByCreatedDateDesc(pageable);
76+
}
77+
78+
public Page<MemZaGram> findAll(Pageable pageable) {
79+
return repository.findAll(pageable);
80+
}
81+
82+
private String uploadAndDeleteIfExist(MultipartFile file, String id, String uploadId, Boolean visibility) {
83+
String newUploadId;
84+
Optional<String> optionalImageUploadId = ofNullable(file).filter(Predicate.not(MultipartFile::isEmpty))
85+
.map(upload -> this.fileUploadService.upload(upload, id, TRUE.equals(visibility)));
86+
87+
if (optionalImageUploadId.isEmpty()) {
88+
newUploadId = ofNullable(uploadId)
89+
.flatMap(uplId -> fileUploadService.updateVisibility(uplId, id, TRUE.equals(visibility)))
90+
.orElseThrow(() -> new RuntimeException("You cannot save without an image!"));
91+
} else {
92+
newUploadId = optionalImageUploadId.get();
93+
ofNullable(uploadId).ifPresent(fileUploadService::delete);
15794
}
95+
return newUploadId;
96+
}
97+
98+
@Async
99+
public void delete(String id) {
100+
repository.findById(id).ifPresent(memz -> {
101+
fileUploadService.deleteByCorrelationId(id);
102+
repository.delete(memz);
103+
notificationService.sendEvent("memz %s deleted".formatted(memz.getTitle()), MEMZ_DELETED, memz.getId());
104+
});
105+
}
106+
107+
public void incrementViewsCount(String id) {
108+
repository.findById(id)
109+
.map(memZaGram -> memZaGram.toBuilder().viewsCount(memZaGram.getViewsCount() + 1).build())
110+
.ifPresent(repository::save);
111+
}
112+
113+
@Override
114+
@CachePut(cacheNames = "memz_correlation_links", key = "#correlationId")
115+
public String getCorrelationLabel(String correlationId) {
116+
return this.repository.findById(correlationId).map(toLabel()).orElse(null);
117+
}
118+
119+
private Function<? super MemZaGram, ? extends String> toLabel() {
120+
return mem -> "Memz '%s' ".formatted(mem.getTitle());
121+
}
122+
123+
@Override
124+
@CachePut(cacheNames = "memz_all_correlation_links", key = "'allLinks'")
125+
public Map<String, String> getCorrelationLabels(Collection<String> correlationIds) {
126+
return this.repository.findAllById(correlationIds).stream()
127+
.map(f -> Map.entry(f.getId(), this.toLabel().apply(f)))
128+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
129+
}
130+
131+
@Override
132+
public void updateOldId(String correlationId, String oldId, String newId) {
133+
this.repository.findById(correlationId).ifPresent(p -> {
134+
var changed = false;
135+
if (oldId.equals(p.getImageUploadId())) {
136+
p.setImageUploadId(newId);
137+
changed = true;
138+
}
139+
if (oldId.equals(p.getThumbnailUploadId())) {
140+
p.setThumbnailUploadId(newId);
141+
changed = true;
142+
}
143+
if (changed) {
144+
this.repository.save(p.toBuilder().updatedDate(new Date()).build());
145+
}
146+
});
147+
148+
}
158149
}

0 commit comments

Comments
 (0)