Skip to content

Commit 18e7ea4

Browse files
committed
legacy file upload for backups
1 parent 1fe9b0f commit 18e7ea4

2 files changed

Lines changed: 177 additions & 158 deletions

File tree

artcoded/src/main/java/tech/artcoded/websitev2/upload/BackupFilesAction.java

Lines changed: 103 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -25,120 +25,120 @@
2525
@Component
2626
@Slf4j
2727
public class BackupFilesAction implements Action {
28-
public static final String ACTION_KEY = "BACKUP_FILES_ACTION";
29-
private final IFileUploadService fileUploadService;
30-
private final BuildProperties buildProperties;
31-
32-
@Value("${application.upload.pathToBackup}")
33-
private String pathToBackupFiles;
34-
35-
public BackupFilesAction(IFileUploadService fileUploadService, BuildProperties buildProperties) {
36-
this.fileUploadService = fileUploadService;
37-
this.buildProperties = buildProperties;
38-
}
39-
40-
public static ActionMetadata getDefaultMetadata() {
41-
return ActionMetadata.builder().key(ACTION_KEY).title("Backup Files")
42-
.description("An action to backup all the files within the server").allowedParameters(List.of())
43-
.defaultCronValue("0 0 3 * * *").build();
44-
}
28+
public static final String ACTION_KEY = "BACKUP_FILES_ACTION";
29+
private final LegacyFileUploadService fileUploadService;
30+
private final BuildProperties buildProperties;
31+
32+
@Value("${application.upload.pathToBackup}")
33+
private String pathToBackupFiles;
34+
35+
public BackupFilesAction(LegacyFileUploadService fileUploadService, BuildProperties buildProperties) {
36+
this.fileUploadService = fileUploadService;
37+
this.buildProperties = buildProperties;
38+
}
39+
40+
public static ActionMetadata getDefaultMetadata() {
41+
return ActionMetadata.builder().key(ACTION_KEY).title("Backup Files")
42+
.description("An action to backup all the files within the server").allowedParameters(List.of())
43+
.defaultCronValue("0 0 3 * * *").build();
44+
}
45+
46+
@Override
47+
public ActionResult run(List<ActionParameter> parameters) {
48+
49+
Date date = new Date();
50+
var resultBuilder = this.actionResultBuilder(parameters).startedDate(date);
51+
52+
List<String> messages = new ArrayList<>();
53+
try {
54+
String archiveName = buildProperties.getVersion().concat("-")
55+
.concat(ofPattern("yyyy-MM-dd-HH-mm-ss").format(LocalDateTime.now()));
56+
57+
File tempDirectory = FileUtils.getTempDirectory();
58+
File folder = new File(tempDirectory, RandomStringUtils.secure().nextAlphanumeric(6));
59+
List<FileUpload> uploads = fileUploadService.findAll();
60+
log.debug("create temp folder: {}", folder.mkdirs());
61+
62+
messages.add("current upload count: %s".formatted(uploads.size()));
63+
for (FileUpload upload : uploads) {
64+
var fileToSave = new File(folder, "%s_%s".formatted(upload.getId(), upload.getOriginalFilename()));
65+
try (InputStream is = fileUploadService.uploadToInputStream(upload)) {
66+
FileUtils.copyToFile(is, fileToSave);
67+
messages.add("file %s has been copied".formatted(upload.getOriginalFilename()));
68+
}
69+
}
70+
File zipFile = new File(tempDirectory, archiveName.concat(".zip"));
4571

46-
@Override
47-
public ActionResult run(List<ActionParameter> parameters) {
48-
49-
Date date = new Date();
50-
var resultBuilder = this.actionResultBuilder(parameters).startedDate(date);
51-
52-
List<String> messages = new ArrayList<>();
53-
try {
54-
String archiveName = buildProperties.getVersion().concat("-")
55-
.concat(ofPattern("yyyy-MM-dd-HH-mm-ss").format(LocalDateTime.now()));
56-
57-
File tempDirectory = FileUtils.getTempDirectory();
58-
File folder = new File(tempDirectory, RandomStringUtils.secure().nextAlphanumeric(6));
59-
List<FileUpload> uploads = fileUploadService.findAll();
60-
log.debug("create temp folder: {}", folder.mkdirs());
61-
62-
messages.add("current upload count: %s".formatted(uploads.size()));
63-
for (FileUpload upload : uploads) {
64-
var fileToSave = new File(folder, "%s_%s".formatted(upload.getId(), upload.getOriginalFilename()));
65-
try (InputStream is = fileUploadService.uploadToInputStream(upload)) {
66-
FileUtils.copyToFile(is, fileToSave);
67-
messages.add("file %s has been copied".formatted(upload.getOriginalFilename()));
68-
}
69-
}
70-
File zipFile = new File(tempDirectory, archiveName.concat(".zip"));
72+
ZipParameters zipParameters = new ZipParameters();
73+
zipParameters.setIncludeRootFolder(false);
7174

72-
ZipParameters zipParameters = new ZipParameters();
73-
zipParameters.setIncludeRootFolder(false);
75+
try (var zip = new ZipFile(zipFile)) {
76+
zip.addFolder(folder, zipParameters);
77+
}
7478

75-
try (var zip = new ZipFile(zipFile)) {
76-
zip.addFolder(folder, zipParameters);
77-
}
79+
File backupFolder = getBackupFolder();
7880

79-
File backupFolder = getBackupFolder();
80-
81-
zipLoop: for (File existingZipFile : FileUtils.listFiles(backupFolder, new String[] { "zip" }, false)) {
82-
File tempDir = new File(tempDirectory, IdGenerators.get());
83-
log.debug("mkdir tempdir {}", tempDir.mkdirs());
84-
85-
try (var existingZip = new ZipFile(existingZipFile)) {
86-
existingZip.extractAll(tempDir.getAbsolutePath());
87-
}
88-
boolean contentEquals = true;
89-
// todo this doesn't handle directory I think
90-
for (File fileToSave : FileUtils.listFiles(folder, null, false)) {
91-
var tempFile = new File(tempDir, fileToSave.getName());
92-
if (!tempFile.exists()) {
93-
FileUtils.deleteDirectory(tempDir);
94-
continue zipLoop;
95-
}
96-
try (var tempIs = new FileInputStream(tempFile);
97-
var is = new FileInputStream(fileToSave)) {
98-
if (!IOUtils.contentEquals(tempIs, is)) {
99-
contentEquals = false;
100-
break;
101-
}
102-
}
103-
}
104-
FileUtils.deleteDirectory(tempDir);
105-
106-
if (contentEquals) {
107-
return resultBuilder.finishedDate(new Date()).messages(List.of("zip are identical. done..."))
108-
.build();
109-
}
81+
zipLoop: for (File existingZipFile : FileUtils.listFiles(backupFolder, new String[] { "zip" }, false)) {
82+
File tempDir = new File(tempDirectory, IdGenerators.get());
83+
log.debug("mkdir tempdir {}", tempDir.mkdirs());
11084

85+
try (var existingZip = new ZipFile(existingZipFile)) {
86+
existingZip.extractAll(tempDir.getAbsolutePath());
87+
}
88+
boolean contentEquals = true;
89+
// todo this doesn't handle directory I think
90+
for (File fileToSave : FileUtils.listFiles(folder, null, false)) {
91+
var tempFile = new File(tempDir, fileToSave.getName());
92+
if (!tempFile.exists()) {
93+
FileUtils.deleteDirectory(tempDir);
94+
continue zipLoop;
95+
}
96+
try (var tempIs = new FileInputStream(tempFile);
97+
var is = new FileInputStream(fileToSave)) {
98+
if (!IOUtils.contentEquals(tempIs, is)) {
99+
contentEquals = false;
100+
break;
111101
}
102+
}
103+
}
104+
FileUtils.deleteDirectory(tempDir);
112105

113-
FileUtils.moveFileToDirectory(zipFile, backupFolder, true);
114-
FileUtils.cleanDirectory(tempDirectory);
106+
if (contentEquals) {
107+
return resultBuilder.finishedDate(new Date()).messages(List.of("zip are identical. done..."))
108+
.build();
109+
}
115110

116-
messages.add("done.");
117-
return resultBuilder.finishedDate(new Date()).messages(messages).build();
111+
}
118112

119-
} catch (Exception e) {
120-
log.error("error while executing action", e);
121-
messages.add("error, see logs: %s".formatted(e.getMessage()));
122-
return resultBuilder.messages(messages).finishedDate(new Date()).status(StatusType.FAILURE).build();
123-
}
124-
}
113+
FileUtils.moveFileToDirectory(zipFile, backupFolder, true);
114+
FileUtils.cleanDirectory(tempDirectory);
125115

126-
@Override
127-
public ActionMetadata getMetadata() {
128-
return getDefaultMetadata();
129-
}
116+
messages.add("done.");
117+
return resultBuilder.finishedDate(new Date()).messages(messages).build();
130118

131-
@Override
132-
public String getKey() {
133-
return ACTION_KEY;
119+
} catch (Exception e) {
120+
log.error("error while executing action", e);
121+
messages.add("error, see logs: %s".formatted(e.getMessage()));
122+
return resultBuilder.messages(messages).finishedDate(new Date()).status(StatusType.FAILURE).build();
134123
}
135-
136-
private File getBackupFolder() {
137-
File backupFolder = new File(pathToBackupFiles);
138-
if (!backupFolder.exists()) {
139-
boolean result = backupFolder.mkdirs();
140-
log.debug("creating backup folder: {}", result);
141-
}
142-
return backupFolder;
124+
}
125+
126+
@Override
127+
public ActionMetadata getMetadata() {
128+
return getDefaultMetadata();
129+
}
130+
131+
@Override
132+
public String getKey() {
133+
return ACTION_KEY;
134+
}
135+
136+
private File getBackupFolder() {
137+
File backupFolder = new File(pathToBackupFiles);
138+
if (!backupFolder.exists()) {
139+
boolean result = backupFolder.mkdirs();
140+
log.debug("creating backup folder: {}", result);
143141
}
142+
return backupFolder;
143+
}
144144
}

artcoded/src/main/java/tech/artcoded/websitev2/upload/LegacyFileUploadService.java

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,73 +15,92 @@
1515
import org.springframework.data.mongodb.core.MongoTemplate;
1616
import org.springframework.stereotype.Service;
1717

18+
/**
19+
* Fixme: still needed for backups.
20+
* backup logic should maybe move to the new file service v2 instead
21+
*
22+
*/
1823
@Service
1924
@Slf4j
2025
public class LegacyFileUploadService implements IFileUploadService {
21-
@Getter
22-
private final FileUploadRepository repository;
23-
private final FileUploadRdfService fileUploadRdfService;
24-
@Getter
25-
private final MongoTemplate mongoTemplate;
26-
27-
@Value("${application.upload.pathToUpload}")
28-
private String pathToUploads;
29-
30-
public LegacyFileUploadService(FileUploadRepository fileUploadRepository, FileUploadRdfService fileUploadRdfService,
31-
MongoTemplate mongoTemplate) {
32-
this.repository = fileUploadRepository;
33-
this.fileUploadRdfService = fileUploadRdfService;
34-
this.mongoTemplate = mongoTemplate;
35-
}
26+
@Getter
27+
private final FileUploadRepository repository;
28+
private final FileUploadRdfService fileUploadRdfService;
29+
@Getter
30+
private final MongoTemplate mongoTemplate;
3631

37-
public File getFile(FileUpload fileUpload) {
38-
return new File(getUploadFolder(), getFileNameOnDisk(fileUpload));
39-
}
32+
@Value("${application.upload.pathToUpload}")
33+
private String pathToUploads;
4034

41-
private String getFileNameOnDisk(FileUpload fileUpload) {
42-
return "%s.%s".formatted(fileUpload.getId(), fileUpload.getExtension());
43-
}
35+
public LegacyFileUploadService(FileUploadRepository fileUploadRepository, FileUploadRdfService fileUploadRdfService,
36+
MongoTemplate mongoTemplate) {
37+
this.repository = fileUploadRepository;
38+
this.fileUploadRdfService = fileUploadRdfService;
39+
this.mongoTemplate = mongoTemplate;
40+
}
4441

45-
@SneakyThrows
46-
public String upload(FileUpload upload, InputStream is, boolean publish) {
47-
File toStore = this.getFile(upload);
48-
copyToFile(is, toStore);
49-
repository.save(upload.toBuilder().size(toStore.length()).build());
50-
if (upload.isPublicResource() && publish) {
51-
fileUploadRdfService.publish(() -> this.findOneByIdPublic(upload.getId()));
52-
}
53-
return upload.getId();
54-
}
42+
@Override
43+
@Deprecated
44+
public File getFile(FileUpload fileUpload) {
45+
return new File(getUploadFolder(), getFileNameOnDisk(fileUpload));
46+
}
5547

56-
public void delete(FileUpload upload) {
57-
log.info("delete upload {}", upload.getOriginalFilename());
58-
fileUploadRdfService.delete(upload.getId());
59-
repository.deleteById(upload.getId());
60-
toSupplier(() -> FileUtils.delete(this.getFile(upload))).get();
61-
}
48+
private String getFileNameOnDisk(FileUpload fileUpload) {
49+
return "%s.%s".formatted(fileUpload.getId(), fileUpload.getExtension());
50+
}
51+
52+
@Override
53+
@Deprecated
54+
public InputStream uploadToInputStream(FileUpload upload) {
55+
return IFileUploadService.super.uploadToInputStream(upload);
56+
}
6257

63-
public File getUploadFolder() {
64-
File uploadFolder = new File(pathToUploads);
65-
if (!uploadFolder.exists()) {
66-
boolean result = uploadFolder.mkdirs();
67-
log.debug("creating upload folder: {}", result);
68-
}
69-
return uploadFolder;
58+
@SneakyThrows
59+
@Deprecated
60+
public String upload(FileUpload upload, InputStream is, boolean publish) {
61+
File toStore = this.getFile(upload);
62+
copyToFile(is, toStore);
63+
repository.save(upload.toBuilder().size(toStore.length()).build());
64+
if (upload.isPublicResource() && publish) {
65+
fileUploadRdfService.publish(() -> this.findOneByIdPublic(upload.getId()));
7066
}
67+
return upload.getId();
68+
}
7169

72-
@Override
73-
public File getFileById(String fileUploadId) {
74-
return this.findOneById(fileUploadId).map(this::getFile)
75-
.orElseThrow(() -> new RuntimeException("unknown file with id %s".formatted(fileUploadId)));
70+
@Override
71+
@Deprecated
72+
public void delete(FileUpload upload) {
73+
log.info("delete upload {}", upload.getOriginalFilename());
74+
fileUploadRdfService.delete(upload.getId());
75+
repository.deleteById(upload.getId());
76+
toSupplier(() -> FileUtils.delete(this.getFile(upload))).get();
77+
}
78+
79+
@Deprecated
80+
public File getUploadFolder() {
81+
File uploadFolder = new File(pathToUploads);
82+
if (!uploadFolder.exists()) {
83+
boolean result = uploadFolder.mkdirs();
84+
log.debug("creating upload folder: {}", result);
7685
}
86+
return uploadFolder;
87+
}
88+
89+
@Override
90+
@Deprecated
91+
public File getFileById(String fileUploadId) {
92+
return this.findOneById(fileUploadId).map(this::getFile)
93+
.orElseThrow(() -> new RuntimeException("unknown file with id %s".formatted(fileUploadId)));
94+
}
7795

78-
@Override
79-
public File getTempFolder() {
80-
var temp = FileUtils.getTempDirectory();
81-
if (!temp.exists()) {
82-
log.warn("temp folder doesn't exist :-( trying to create {}", temp.mkdirs());
83-
}
84-
return temp;
96+
@Override
97+
@Deprecated
98+
public File getTempFolder() {
99+
var temp = FileUtils.getTempDirectory();
100+
if (!temp.exists()) {
101+
log.warn("temp folder doesn't exist :-( trying to create {}", temp.mkdirs());
85102
}
103+
return temp;
104+
}
86105

87106
}

0 commit comments

Comments
 (0)