Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Commit 3f687ee

Browse files
authored
Merge pull request #69 from ploiu/storage-ui
main - show storage used on title bar
2 parents 582483d + 30cb6fb commit 3f687ee

File tree

9 files changed

+142
-113
lines changed

9 files changed

+142
-113
lines changed

.idea/workspace.xml

Lines changed: 81 additions & 103 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/ploiu/client/ApiClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.reactivex.rxjava3.core.Single;
55
import ploiu.model.ApiInfo;
66
import ploiu.model.CreatePasswordRequest;
7+
import ploiu.model.StorageInfo;
78
import retrofit2.http.Body;
89
import retrofit2.http.GET;
910
import retrofit2.http.POST;
@@ -15,4 +16,7 @@ public interface ApiClient {
1516

1617
@POST("/password")
1718
Completable setPassword(@Body CreatePasswordRequest req);
19+
20+
@GET("/api/disk")
21+
Single<StorageInfo> getStorageInfo();
1822
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package ploiu.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
5+
@JsonIgnoreProperties(ignoreUnknown = true)
6+
public record StorageInfo(long totalSpace, long freeSpace) {
7+
}

src/main/java/ploiu/search/SearchParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ enum Modes {
158158
/**
159159
* the default mode, set whenever we encounter a space and are either in "FILE_NAME", "ATTRIBUTE_VALUE", or "TAG_NAME"
160160
*/
161-
UNSET;
161+
UNSET
162162
}
163163

164164
record TokenAndMode(Token token, Modes mode) {

src/main/java/ploiu/search/TokenTypes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,5 @@ public enum TokenTypes {
3333
/**
3434
* catch-all
3535
*/
36-
UNKNOWN;
36+
UNKNOWN
3737
}

src/main/java/ploiu/service/ApiService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import ploiu.config.ServerConfig;
1212
import ploiu.model.ApiInfo;
1313
import ploiu.model.CreatePasswordRequest;
14+
import ploiu.util.UIUtils;
1415

1516
@Slf4j
1617
@RequiredArgsConstructor(onConstructor_ = @Inject)
@@ -48,4 +49,17 @@ public Single<Boolean> isCompatibleWithServer() {
4849
})
4950
.doOnError(e -> log.error("Failed to check server version", e));
5051
}
52+
53+
/**
54+
* retrieves the used storage on the backend server and parses it as a human-readable format
55+
*
56+
* @return human readable format for how much storage has been used (e.g. "30gb / 1tb used")
57+
*/
58+
public Single<String> getStorageUsed() {
59+
return client
60+
.getStorageInfo()
61+
.observeOn(Schedulers.io())
62+
.subscribeOn(Schedulers.io())
63+
.map(info -> String.format("%s / %s used", UIUtils.convertSizeToBytes(info.totalSpace() - info.freeSpace()), UIUtils.convertSizeToBytes(info.totalSpace())));
64+
}
5165
}

src/main/java/ploiu/ui/App.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void start(Stage stage) {
3030
if (value) {
3131
var root = new MainFrame();
3232
Scene scene = new Scene(root);
33-
stage.setTitle("File Server UI");
33+
stage.setTitle("Ploiu File Server");
3434
stage.setScene(scene);
3535
stage.show();
3636
} else {

src/main/java/ploiu/ui/MainFrame.java

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import javafx.scene.layout.AnchorPane;
1414
import javafx.scene.layout.FlowPane;
1515
import javafx.scene.layout.TilePane;
16+
import javafx.stage.Stage;
1617
import lombok.extern.slf4j.Slf4j;
1718
import org.pdfsam.rxjavafx.schedulers.JavaFxScheduler;
1819
import ploiu.event.AsyncEventReceiver;
@@ -24,6 +25,7 @@
2425
import ploiu.exception.BadFileRequestException;
2526
import ploiu.exception.BadFileResponseException;
2627
import ploiu.model.*;
28+
import ploiu.service.ApiService;
2729
import ploiu.service.DragNDropService;
2830
import ploiu.service.FileService;
2931
import ploiu.service.FolderService;
@@ -41,6 +43,7 @@
4143
public class MainFrame extends AnchorPane {
4244
private final FolderService folderService = App.INJECTOR.getInstance(FolderService.class);
4345
private final FileService fileService = App.INJECTOR.getInstance(FileService.class);
46+
private final ApiService apiService = App.INJECTOR.getInstance(ApiService.class);
4447
private final DragNDropService dragNDropService = App.INJECTOR.getInstance(DragNDropService.class);
4548
@FXML
4649
private ScrollPane scrollPane;
@@ -94,7 +97,9 @@ public class MainFrame extends AnchorPane {
9497
private final AsyncEventReceiver<FolderApi> asyncFolderUpdateEvent = event -> {
9598
if (event instanceof FolderUpdateEvent fe) {
9699
var folder = fe.get();
97-
return folderService.updateFolder(new FolderRequest(Optional.of(folder.id()), folder.parentId(), folder.name(), folder.tags())).doOnSuccess(ignored -> asyncLoadFolder(currentFolder)).map(ignored -> true);
100+
return folderService.updateFolder(new FolderRequest(Optional.of(folder.id()), folder.parentId(), folder.name(), folder.tags()))
101+
.doOnSuccess(ignored -> asyncLoadFolder(currentFolder))
102+
.map(ignored -> true);
98103
} else {
99104
return Single.error(new UnsupportedOperationException("Only type UPDATE is supported for updateFolderEvent"));
100105
}
@@ -263,15 +268,36 @@ private void loadInitialFolder() {
263268

264269
private void asyncLoadFolder(FolderApi folder) {
265270
// pull the folder
266-
var folderReq = folderService.getFolder(folder.id()).doOnSuccess(this::setCurrentFolder).doOnError(e -> showErrorDialog(e.getMessage(), "Failed to pull folder", null)).observeOn(JavaFxScheduler.platform()).toObservable().cache();
271+
var folderReq = folderService.getFolder(folder.id())
272+
.doOnSuccess(this::setCurrentFolder)
273+
.doOnError(e -> showErrorDialog(e.getMessage(), "Failed to pull folder", null))
274+
.observeOn(JavaFxScheduler.platform())
275+
.toObservable()
276+
.cache();
267277
// handle child folders
268-
folderReq.doOnNext(ignored -> folderPane.getChildren().clear()).flatMapIterable(FolderApi::folders).map(this::createFolderEntry).toList().doOnSuccess(this.folderPane.getChildren()::addAll).subscribe(ignored -> drawAddFolder());
278+
folderReq.doOnNext(ignored -> folderPane.getChildren().clear())
279+
.flatMapIterable(FolderApi::folders)
280+
.map(this::createFolderEntry)
281+
.toList()
282+
.doOnSuccess(this.folderPane.getChildren()::addAll)
283+
.subscribe(ignored -> drawAddFolder());
269284

270285
// handle child files
271286
folderReq.doOnNext(f -> {
272-
loadFilePreviews(f);
273-
filePane.getChildren().clear();
274-
}).flatMapIterable(FolderApi::files).map(this::createFileEntry).toList().doOnSuccess(filePane.getChildren()::addAll).subscribe(ignored -> drawAddFile());
287+
loadFilePreviews(f);
288+
filePane.getChildren().clear();
289+
})
290+
.flatMapIterable(FolderApi::files)
291+
.map(this::createFileEntry)
292+
.toList()
293+
.doOnSuccess(filePane.getChildren()::addAll)
294+
.subscribe(ignored -> drawAddFile());
295+
// pulling the folder was probably after an update or change of some sort, so update the title to reflect how much storage is next
296+
apiService.getStorageUsed()
297+
.subscribe(
298+
storageAmount -> Platform.runLater(() -> ((Stage) getScene().getWindow()).setTitle("Ploiu File Server " + storageAmount)),
299+
error -> log.error("Failed to pull storage amount", error)
300+
);
275301
}
276302

277303
private void loadFilePreviews(FolderApi folder) {

src/test/java/ploiu/ui/FileEntryTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void testSaveAsChosenDirectory(FxRobot robot) {
8787

8888
verify(fileReceiver).process(argThat(it -> {
8989
if (it instanceof FileSaveEvent evt) {
90-
return it.get().equals(fileEntry.getFile()) && ((FileSaveEvent) it).getDirectory() != null;
90+
return it.get().equals(fileEntry.getFile()) && evt.getDirectory() != null;
9191
} else {
9292
return false;
9393
}

0 commit comments

Comments
 (0)