Skip to content
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
6 changes: 2 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,12 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.11</version>
<version>2.18.8</version>
</dependency>

<!-- 2. Модуль Jackson для поддержки дат (LocalDateTime) -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.17.0</version>
<version>2.18.8</version>
</dependency>
<dependency>
<groupId>org.testfx</groupId>
Expand Down
244 changes: 108 additions & 136 deletions src/main/java/com/DesktopApplicationClientJava/Api/ApiClient.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,3 +1,90 @@
package com.DesktopApplicationClientJava.Api;

public class ApiConfig {}
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public final class ApiConfig {

private static final Properties PROPS = new Properties();

static {
try (InputStream in = ApiConfig.class.getResourceAsStream("/api.properties")) {
if (in == null) {
throw new IllegalStateException("api.properties not found on classpath");
}
PROPS.load(in);
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}

private ApiConfig() {}

public static String baseUrl() {
return required("api.baseUrl");
}

public static long connectTimeoutMs() {
return Long.parseLong(required("api.connectTimeoutMs"));
}

public static long readTimeoutMs() {
return Long.parseLong(required("api.readTimeoutMs"));
}

public static String pathLogin() {
return required("api.path.login");
}

public static String pathRefresh() {
return required("api.path.refresh");
}

public static String pathLogout() {
return required("api.path.logout");
}

public static String pathMe() {
return required("api.path.me");
}

public static String pathResource() {
return required("api.path.resource");
}

public static String pathAdmin() {
return required("api.path.admin");
}

public static String pathExportUsers() {
return required("api.path.export.users");
}

public static String pathExportResources() {
return required("api.path.export.resources");
}

/** /api/v1/admin/resource/{uuid}/files/export */
public static String pathExportResourceFiles(String resourceId) {
return pathAdmin() + "/resource/" + resourceId + "/files/export";
}

/** /api/v1/resource/{uuid}/file */
public static String pathResourceFiles(String resourceId) {
return pathResource() + "/" + resourceId + "/file";
}

/** /api/v1/resource/{uuid}/file/{fileId} */
public static String pathResourceFile(String resourceId, String fileId) {
return pathResource() + "/" + resourceId + "/file/" + fileId;
}

private static String required(String key) {
String value = PROPS.getProperty(key);
if (value == null || value.isBlank()) {
throw new IllegalStateException("Missing config property: " + key);
}
return value;
}
}
42 changes: 33 additions & 9 deletions src/main/java/com/DesktopApplicationClientJava/Program.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.DesktopApplicationClientJava;

import com.DesktopApplicationClientJava.Api.ApiClient;
import com.DesktopApplicationClientJava.navigation.Navigator;
import com.DesktopApplicationClientJava.services.ServiceRegistry;
import com.DesktopApplicationClientJava.session.Session;
import com.DesktopApplicationClientJava.utils.ControllerWiring;
import java.io.IOException;
Expand All @@ -10,29 +13,50 @@
import javafx.stage.Stage;

public class Program extends Application {
private static final String INITIAL_PAGE_PATH = "/fxml/Search.fxml";
private static final double WINDOW_WIDTH = 800.0;
private static final double WINDOW_HEIGHT = 600.0;

private final Session session = new Session();
private static final double windowWidthPx = 400.0;
private static final double windowHeightPx = 400.0;
private final ApiClient apiClient = new ApiClient(session);
private final ServiceRegistry services = new ServiceRegistry(apiClient, session);

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/LoginForm.fxml"));
Navigator navigator = new Navigator(stage, session, services);

FXMLLoader loader = new FXMLLoader(getClass().getResource(INITIAL_PAGE_PATH));
loader.setControllerFactory(
clazz -> {
try {
Object controller = clazz.getDeclaredConstructor().newInstance();
ControllerWiring.wire(controller, navigator, session, services);
return controller;
} catch (Exception e) {
throw new RuntimeException("Cannot create controller: " + clazz, e);
}
});

Parent root = loader.load();
Scene scene = new Scene(root);
loadStyleSheet(scene, "/styles.css");

ControllerWiring.wire(loader.getController(), stage, session);

stage.setScene(scene);
stage.setTitle("JavaFX Application");
stage.setWidth(windowWidthPx);
stage.setHeight(windowHeightPx);
stage.setWidth(WINDOW_WIDTH);
stage.setHeight(WINDOW_HEIGHT);
stage.centerOnScreen();

stage.show();
}

private void loadStyleSheet(Scene scene, String path) {
scene.getStylesheets().add(getClass().getResource(path).toExternalForm());
var url = getClass().getResource(path);
if (url != null) {
scene.getStylesheets().add(url.toExternalForm());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.DesktopApplicationClientJava.controllers;

import com.DesktopApplicationClientJava.controllers.utils.Controller;
import com.DesktopApplicationClientJava.entities.Role;
import com.DesktopApplicationClientJava.entities.User;
import com.DesktopApplicationClientJava.utils.FieldError;
import com.DesktopApplicationClientJava.validation.EmailValidator;
Expand All @@ -9,6 +10,7 @@
import com.DesktopApplicationClientJava.validation.PasswordValidator;
import com.DesktopApplicationClientJava.validation.ThirdNameValidator;
import com.DesktopApplicationClientJava.validation.utils.Validator;
import java.util.UUID;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
Expand Down Expand Up @@ -103,6 +105,6 @@ private boolean isFieldValid(TextField field, Validator validator, FieldError er
}

private User authenticate(String firstName, String lastName, String email) {
return new User(firstName, lastName, email);
return new User(UUID.randomUUID(), email, Role.USER, firstName, lastName, true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,29 @@

import com.DesktopApplicationClientJava.navigation.Navigator;
import com.DesktopApplicationClientJava.navigation.NavigatorAware;
import com.DesktopApplicationClientJava.services.ServiceRegistry;
import com.DesktopApplicationClientJava.services.ServicesAware;
import com.DesktopApplicationClientJava.session.Session;
import com.DesktopApplicationClientJava.session.SessionAware;

public abstract class Controller implements SessionAware, NavigatorAware {
public abstract class Controller implements SessionAware, NavigatorAware, ServicesAware {

protected Session session;
protected Navigator navigator;
protected ServiceRegistry services;

@Override
public void setSession(Session session) {
this.session = session;
}

@Override
public void setNavigator(Navigator navigator) {
this.navigator = navigator;
}

@Override
public void setServices(ServiceRegistry services) {
this.services = services;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.DesktopApplicationClientJava.entities;

import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class FileInfo {
private UUID uuid;
private String name;
private String contentType;
private Long size;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.DesktopApplicationClientJava.entities;

import java.time.LocalDateTime;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Resource {
private UUID uuid;
private String title;
private String description;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.DesktopApplicationClientJava.entities;

import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/** User */
@AllArgsConstructor
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
private UUID uuid;
private String email;
private Role role;
private String firstName;
private String lastName;
private String email;
private Boolean enabled;
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package com.DesktopApplicationClientJava.navigation;

import com.DesktopApplicationClientJava.services.ServiceRegistry;
import com.DesktopApplicationClientJava.session.Session;
import com.DesktopApplicationClientJava.session.SessionAware;
import com.DesktopApplicationClientJava.utils.ControllerWiring;
import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.stage.Stage;
import lombok.AllArgsConstructor;

/** Navigator */
@AllArgsConstructor
public class Navigator {
private final Stage stage;
private final Session session;
private final ServiceRegistry services;

public Navigator(Stage stage, Session session, ServiceRegistry services) {
this.stage = stage;
this.session = session;
this.services = services;
}

public void goTo(String fxmlFile) {
var url = Navigator.class.getResource(fxmlFile);
Expand All @@ -21,15 +28,28 @@ public void goTo(String fxmlFile) {
}

FXMLLoader loader = new FXMLLoader(url);
loader.setControllerFactory(
clazz -> {
try {
Object controller = clazz.getDeclaredConstructor().newInstance();
ControllerWiring.wire(controller, this, session, services);
return controller;
} catch (Exception e) {
throw new RuntimeException("Cannot create controller: " + clazz, e);
}
});

try {
Parent root = loader.load();
var controller = loader.getController();

Object controller = loader.getController();
if (controller instanceof SessionAware sa) {
sa.setSession(session);
}
if (controller instanceof NavigatorAware na) {
na.setNavigator(this);
}

stage.getScene().setRoot(root);
} catch (IOException e) {
throw new RuntimeException("Failed to load FXML: " + fxmlFile, e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
package com.DesktopApplicationClientJava.services;

public class AuthService {}
import com.DesktopApplicationClientJava.entities.Role;
import com.DesktopApplicationClientJava.entities.User;

public interface AuthService {

/** Логин. При успехе user попадает в Session. */
User login(String email, String password);

/** Выход. Сбрасывает Session. */
void logout();

/** Текущий пользователь из Session (или null). */
User getCurrentUser();

/** Проверка роли текущего пользователя. */
boolean hasRole(Role required);

boolean isAdmin();

boolean isModerator();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.DesktopApplicationClientJava.services;

import java.nio.file.Path;
import java.util.UUID;

public interface ExportService {

Path exportUsers(Path destinationDir);

Path exportResources(Path destinationDir);

Path exportResourceFiles(UUID resourceUuid, Path destinationDir);
}
Loading
Loading