Skip to content

Commit 4012416

Browse files
committed
User registration
1 parent cd74437 commit 4012416

11 files changed

Lines changed: 279 additions & 73 deletions

File tree

src/main/java/org/pwss/Start.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static void main(String[] args) {
1515
// Create the main frame
1616
JFrame frame = new JFrame("Scan Integrity Scanner");
1717
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18-
frame.setSize(250, 250);
18+
frame.setSize(350, 250);
1919
frame.setLocationRelativeTo(null); // center on screen
2020

2121
// Create presenter factory

src/main/java/org/pwss/model/service/AuthService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public boolean userExists() throws UserExistsLookupException, ExecutionException
4040

4141
return switch (response.statusCode()) {
4242
case 200 -> Boolean.parseBoolean(response.body());
43-
case 404 -> throw new UserExistsLookupException("User existence check failed: No user found");
43+
case 404 -> false;
4444
case 500 -> throw new UserExistsLookupException("User existence check failed: Server error");
4545
default ->
4646
throw new UserExistsLookupException("User existence check failed: Unexpected status code " + response.statusCode());

src/main/java/org/pwss/model/service/network/Endpoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public enum Endpoint {
1414
/**
1515
* Endpoint for creating a user.
1616
*/
17-
CREATE_USER(HTTP_Method.POST, A.BASE_URL + A.USER + "create-user"),
17+
CREATE_USER(HTTP_Method.POST, A.BASE_URL + A.USER + "create"),
1818
/**
1919
* Endpoint for user login.
2020
*/

src/main/java/org/pwss/navigation/NavigationHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public NavigationHandler(JFrame frame, PresenterFactory factory) {
4747
*/
4848
public void navigateTo(Screen screen) {
4949
BasePresenter<?> presenter = presenters.computeIfAbsent(screen, factory::createPresenter);
50-
JPanel view = presenter.getView();
50+
JPanel view = presenter.getScreen();
5151

5252
frame.getContentPane().removeAll();
5353
frame.getContentPane().add(view);
Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,42 @@
11
package org.pwss.presenter;
22

3-
import javax.swing.JPanel;
3+
import org.pwss.view.screen.BaseScreen;
4+
45

56
/**
67
* An abstract base class for presenters in the application.
7-
* Provides a common structure for managing a `JFrame` view and initializing event listeners.
8+
* Provides a common structure for managing a `BaseScreen` view and initializing event listeners.
89
*/
9-
public abstract class BasePresenter<View extends JPanel> {
10+
public abstract class BasePresenter<Screen extends BaseScreen> {
1011
/**
1112
* The view instance managed by this presenter.
1213
* Represents the UI component associated with this presenter.
1314
*/
14-
protected View view;
15+
protected Screen screen;
1516

1617
/**
1718
* Constructs a `BasePresenter` with the specified view.
1819
* Initializes the view and sets up event listeners.
1920
*
20-
* @param view The `View` instance to be managed by this presenter.
21+
* @param screen The `Screen` instance to be managed by this presenter.
2122
*/
22-
public BasePresenter(View view) {
23-
this.view = view;
23+
public BasePresenter(Screen screen) {
24+
this.screen = screen;
2425
initListeners();
2526
}
2627

2728
/**
28-
* Abstract method to initialize event listeners for the view.
29+
* Abstract method to initialize event listeners for the Screen.
2930
* Subclasses must provide an implementation for this method.
3031
*/
3132
protected abstract void initListeners();
3233

3334
/**
3435
* Retrieves the view managed by this presenter.
3536
*
36-
* @return The `View` instance representing the managed view.
37+
* @return The `Screen` instance representing the managed view.
3738
*/
38-
public View getView() {
39-
return view;
39+
public Screen getScreen() {
40+
return screen;
4041
}
4142
}

src/main/java/org/pwss/presenter/HomePresenter.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,34 @@
77
import org.pwss.exception.scan.StartScanAllException;
88
import org.pwss.exception.scan.StopScanException;
99
import org.pwss.model.service.ScanService;
10-
import org.pwss.view.screen.HomeView;
10+
import org.pwss.view.screen.HomeScreen;
1111

12-
public class HomePresenter extends BasePresenter<HomeView> {
12+
public class HomePresenter extends BasePresenter<HomeScreen> {
1313
private final ScanService scanService;
1414

15-
public HomePresenter(HomeView view, ScanService scanService) {
15+
public HomePresenter(HomeScreen view, ScanService scanService) {
1616
super(view);
1717
this.scanService = scanService;
1818
}
1919

2020
@Override
2121
protected void initListeners() {
22-
view.getStartButton().addActionListener(e -> performStartScan());
23-
view.getStopButton().addActionListener(e -> performStopScan());
22+
getScreen().getStartButton().addActionListener(e -> performStartScan());
23+
getScreen().getStopButton().addActionListener(e -> performStopScan());
2424
}
2525

2626
private void performStartScan() {
2727
try {
2828
boolean startScanSuccess = scanService.startScan();
2929
SwingUtilities.invokeLater(() -> {
3030
if (startScanSuccess) {
31-
view.showSuccess("Scan started successfully!");
31+
getScreen().showSuccess("Scan started successfully!");
3232
} else {
33-
view.showError("Failed to start scan.");
33+
getScreen().showError("Failed to start scan.");
3434
}
3535
});
3636
} catch (ExecutionException | InterruptedException | StartScanAllException e) {
37-
SwingUtilities.invokeLater(() -> view.showError("Error starting scan: " + e.getMessage()));
37+
SwingUtilities.invokeLater(() -> screen.showError("Error starting scan: " + e.getMessage()));
3838
}
3939
}
4040

@@ -43,13 +43,13 @@ private void performStopScan() {
4343
boolean stopScanSuccess = scanService.stopScan();
4444
SwingUtilities.invokeLater(() -> {
4545
if (stopScanSuccess) {
46-
view.showSuccess("Scan stopped successfully!");
46+
getScreen().showSuccess("Scan stopped successfully!");
4747
} else {
48-
view.showError("Failed to stop scan.");
48+
getScreen().showError("Failed to stop scan.");
4949
}
5050
});
5151
} catch (ExecutionException | InterruptedException | StopScanException e) {
52-
SwingUtilities.invokeLater(() -> view.showError("Error stopping scan: " + e.getMessage()));
52+
SwingUtilities.invokeLater(() -> getScreen().showError("Error stopping scan: " + e.getMessage()));
5353
}
5454
}
5555
}

src/main/java/org/pwss/presenter/LoginPresenter.java

Lines changed: 143 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,183 @@
33
import javax.swing.SwingUtilities;
44

55
import org.pwss.exception.user.LoginException;
6+
import org.pwss.exception.user.UserExistsLookupException;
67
import org.pwss.model.service.AuthService;
78
import org.pwss.navigation.NavigationEvents;
89
import org.pwss.navigation.Screen;
9-
import org.pwss.view.screen.LoginView;
10+
import org.pwss.view.screen.LoginScreen;
1011

1112
import com.fasterxml.jackson.core.JsonProcessingException;
1213

13-
public class LoginPresenter extends BasePresenter<LoginView> {
14+
import java.util.concurrent.ExecutionException;
15+
16+
public class LoginPresenter extends BasePresenter<LoginScreen> {
17+
/**
18+
* Indicates whether the application is in create user mode (i.e., no users exist yet).
19+
*/
20+
private final boolean createUserMode;
21+
1422
private final AuthService authService;
1523

16-
public LoginPresenter(LoginView view, AuthService authService) {
24+
/**
25+
* Constructs a LoginPresenter with the specified view and authentication service.
26+
*
27+
* @param view The LoginView instance to be managed by this presenter.
28+
* @param authService The AuthService instance for handling authentication operations.
29+
*/
30+
public LoginPresenter(LoginScreen view, AuthService authService) {
1731
super(view);
1832
this.authService = authService;
33+
this.createUserMode = checkUserExists();
1934
}
2035

2136
@Override
2237
protected void initListeners() {
23-
getView().getLoginButton().addActionListener(e -> performLogin());
24-
getView().getCancelButton().addActionListener(e -> System.exit(0));
38+
getScreen().getProceedButton().addActionListener(e -> onProceedButtonClick());
39+
getScreen().getCancelButton().addActionListener(e -> System.exit(0));
40+
}
41+
42+
/**
43+
* Checks if any users exist in the system.
44+
* If no users exist, updates the view to prompt for user creation.
45+
*
46+
* @return true if no users exist (create user mode), false otherwise.
47+
*/
48+
private boolean checkUserExists() {
49+
try {
50+
if (!authService.userExists()) {
51+
// Notify user that no users exist and they need to create one
52+
getScreen().showInfo("No user found.\nCreate one by entering a username and password.");
53+
// Update message label to indicate user creation
54+
getScreen().setMessage("Create a user for the first login");
55+
// Change button text to "Register"
56+
getScreen().getProceedButton().setText("Register");
57+
return true;
58+
} else {
59+
// Update message label to indicate normal login
60+
getScreen().setMessage("Login with your username and password.");
61+
// Change button text to "Login"
62+
getScreen().getProceedButton().setText("Login");
63+
return false;
64+
}
65+
} catch (UserExistsLookupException | ExecutionException e) {
66+
SwingUtilities.invokeLater(() ->
67+
screen.showError("Error checking user existence: " + e.getMessage()));
68+
} catch (InterruptedException e) {
69+
Thread.currentThread().interrupt();
70+
SwingUtilities.invokeLater(() ->
71+
screen.showError("Operation interrupted: " + e.getMessage()));
72+
} catch (Exception e) {
73+
SwingUtilities.invokeLater(() ->
74+
screen.showError("An unexpected error occurred: " + e.getMessage()));
75+
}
76+
throw new IllegalStateException("Failed to determine user existence due to an error.");
77+
}
78+
79+
/**
80+
* Handles the proceed button click event.
81+
* Validates input and either creates a new user or performs login based on the mode.
82+
*/
83+
private void onProceedButtonClick() {
84+
if (!validateInput()) {
85+
return; // Input validation failed, do not proceed
86+
}
87+
88+
if (createUserMode) {
89+
// Handle user creation logic here and then login
90+
createUserAndLogin();
91+
} else {
92+
// Handle normal login logic here
93+
performLogin();
94+
}
95+
}
96+
97+
/**
98+
* Validates the input fields for username and password.
99+
*
100+
* @return true if both fields are non-empty, false otherwise.
101+
*/
102+
private boolean validateInput() {
103+
String username = getScreen().getUsername();
104+
String password = getScreen().getPassword();
105+
106+
if (username == null || username.trim().isEmpty()) {
107+
getScreen().showError("Username cannot be empty.");
108+
return false;
109+
}
110+
111+
if (password == null || password.trim().isEmpty()) {
112+
getScreen().showError("Password cannot be empty.");
113+
return false;
114+
}
115+
116+
return true;
117+
}
118+
119+
/**
120+
* Creates a new user and then performs login if creation is successful.
121+
*/
122+
private void createUserAndLogin() {
123+
if (createUser()) {
124+
performLogin();
125+
}
126+
}
127+
128+
/**
129+
* Creates a new user with the provided username and password.
130+
*
131+
* @return true if user creation is successful, false otherwise.
132+
*/
133+
private boolean createUser() {
134+
String username = getScreen().getUsername();
135+
String password = getScreen().getPassword();
136+
137+
try {
138+
return authService.createUser(username, password);
139+
} catch (JsonProcessingException e) {
140+
SwingUtilities.invokeLater(() ->
141+
screen.showError("Error preparing user creation request: " + e.getMessage()));
142+
return false;
143+
} catch (Exception e) {
144+
SwingUtilities.invokeLater(() ->
145+
screen.showError("An unexpected error occurred: " + e.getMessage()));
146+
return false;
147+
}
25148
}
26149

150+
/**
151+
* Performs the login operation using the provided username and password.
152+
* Displays success or error messages based on the outcome.
153+
*/
27154
private void performLogin() {
28-
String username = view.getUsername();
29-
String password = view.getPassword();
155+
String username = getScreen().getUsername();
156+
String password = getScreen().getPassword();
30157

31158
try {
32159
boolean loginSuccess = authService.login(username, password);
33160

34161
SwingUtilities.invokeLater(() -> {
35162
if (loginSuccess) {
36-
view.showSuccess("Login successful!");
163+
if (createUserMode) {
164+
screen.showInfo("User created and logged in successfully!");
165+
} else {
166+
screen.showInfo("Logged in successfully!");
167+
}
37168
NavigationEvents.navigateTo(Screen.HOME);
38169
} else {
39-
view.showError("Invalid username or password.");
170+
screen.showError("Invalid username or password.");
40171
}
41172
});
42173

43174
} catch (JsonProcessingException e) {
44175
SwingUtilities.invokeLater(() ->
45-
view.showError("Error preparing login request: " + e.getMessage()));
176+
screen.showError("Error preparing login request: " + e.getMessage()));
46177
} catch (LoginException e) {
47178
SwingUtilities.invokeLater(() ->
48-
view.showError("Login request failed: " + e.getMessage()));
179+
screen.showError("Login request failed: " + e.getMessage()));
49180
} catch (Exception e) {
50181
SwingUtilities.invokeLater(() ->
51-
view.showError("An unexpected error occurred: " + e.getMessage()));
182+
screen.showError("An unexpected error occurred: " + e.getMessage()));
52183
}
53184
}
54185
}

src/main/java/org/pwss/presenter/factory/AppPresenterFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import org.pwss.presenter.BasePresenter;
77
import org.pwss.presenter.LoginPresenter;
88
import org.pwss.presenter.HomePresenter;
9-
import org.pwss.view.screen.LoginView;
10-
import org.pwss.view.screen.HomeView;
9+
import org.pwss.view.screen.HomeScreen;
10+
import org.pwss.view.screen.LoginScreen;
1111

1212
/**
1313
* A factory class responsible for creating presenters for different screens in the application.
@@ -25,9 +25,9 @@ public class AppPresenterFactory implements PresenterFactory {
2525
public BasePresenter<?> createPresenter(Screen screen) {
2626
switch (screen) {
2727
case LOGIN:
28-
return new LoginPresenter(new LoginView(), new AuthService());
28+
return new LoginPresenter(new LoginScreen(), new AuthService());
2929
case HOME:
30-
return new HomePresenter(new HomeView(), new ScanService());
30+
return new HomePresenter(new HomeScreen(), new ScanService());
3131
default:
3232
throw new IllegalArgumentException("Unknown screen: " + screen);
3333
}

0 commit comments

Comments
 (0)