Added possible crypt password, create repository user implementation, etc...

This commit is contained in:
maciejrusek
2026-04-27 20:14:21 +02:00
parent e5c5670ac5
commit f306606b34
13 changed files with 278 additions and 31 deletions

6
.idea/data_source_mapping.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourcePerFileMappings">
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/ff48017c-ca9a-4bd4-8b7f-b8031139bce6/console.sql" value="ff48017c-ca9a-4bd4-8b7f-b8031139bce6" />
</component>
</project>

View File

@@ -78,10 +78,9 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.testcontainers</groupId> <groupId>org.mindrot</groupId>
<artifactId>postgresql</artifactId> <artifactId>jbcrypt</artifactId>
<version>1.19.8</version> <version>0.4</version>
<scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -2,12 +2,13 @@ package repository;
import models.Task; import models.Task;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
public interface TaskRepository { public interface TaskRepository {
List<Task> getUserTasks(int userId); ArrayList<Task> getUserTasks(int userId);
List<Task> findUserTasksByTitle(int userId, String title); ArrayList<Task> findUserTasksByTitle(int userId, String title);
Optional<Task> getUserTask(int userId, int taskId); Optional<Task> getUserTask(int userId, int taskId);
void save(Task task); void save(Task task);
void update(int taskId, Task task); void update(int taskId, Task task);

View File

@@ -0,0 +1,41 @@
package repository;
import models.Task;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class TaskRepositoryJdbc implements TaskRepository {
@Override
public ArrayList<Task> getUserTasks(int userId) {
return new ArrayList<>();
}
@Override
public ArrayList<Task> findUserTasksByTitle(int userId, String title) {
return new ArrayList<>();
}
@Override
public Optional<Task> getUserTask(int userId, int taskId) {
return Optional.empty();
}
@Override
public void save(Task task) {
}
@Override
public void update(int taskId, Task task) {
}
@Override
public void delete(int taskId) {
}
}

View File

@@ -0,0 +1,11 @@
package repository;
import models.User;
import java.util.Optional;
public interface UserRepository {
Optional<User> getUser(String username, String password);
Optional<User> saveUser(String username, String email, String password);
boolean deleteUser(int userId);
}

View File

@@ -0,0 +1,85 @@
package repository;
import models.User;
import org.flywaydb.core.internal.proprietaryStubs.PrepareCommandExtensionStub;
import util.PasswordService;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Optional;
public class UserRepositoryJdbc implements UserRepository {
private final Connection connection;
public UserRepositoryJdbc(Connection connection) {
this.connection = connection;
}
@Override
public Optional<User> getUser(String username, String password) {
try {
PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT * FROM users WHERE name=(?);"
);
preparedStatement.setString(1, username);
ResultSet resultSet = preparedStatement.executeQuery();
String passwordFromDB = resultSet.getString("password");
String emailFromDB = resultSet.getString("email");
if (!PasswordService.checkPassword(password, passwordFromDB)) {
return Optional.empty();
}
User user = new User(username, emailFromDB);
return Optional.of(user);
} catch (SQLException e) {
e.printStackTrace();
return Optional.empty();
}
}
@Override
public Optional<User> saveUser(String username, String email, String password) {
try {
String hashedPassword = PasswordService.hashPassword(password);
PreparedStatement preparedStatement = connection.prepareStatement(
"INSERT INTO users (name, email, password) VALUES (?, ?, ?);"
);
preparedStatement.setString(1, username);
preparedStatement.setString(2, email);
preparedStatement.setString(3, hashedPassword);
preparedStatement.executeUpdate();
User user = new User(username, email);
return Optional.of(user);
} catch (SQLException e) {
e.printStackTrace();
return Optional.empty();
}
}
@Override
public boolean deleteUser(int userId) {
try {
PreparedStatement preparedStatement = connection.prepareStatement(
"DELETE FROM users WHERE id=(?);"
);
preparedStatement.setInt(1, userId);
preparedStatement.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}

View File

@@ -1,9 +0,0 @@
package repository.impl;
import repository.TaskRepository;
public class TaskRepositoryImpl {
}

View File

@@ -1,11 +1,18 @@
package service; package service;
import models.User; import models.User;
import repository.UserRepository;
import java.util.Optional; import java.util.Optional;
public class UserService { public class UserService {
UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public Optional<User> login(String username, String password) { public Optional<User> login(String username, String password) {
try { try {
@@ -18,13 +25,11 @@ public class UserService {
} }
} }
public Optional<User> register(String username, String password) { public Optional<User> register(String username, String email, String password) {
try { try {
return userRepository.saveUser(username, email, password);
return Optional.empty();
} catch (Exception e) { } catch (Exception e) {
System.out.println(e.getMessage()); e.printStackTrace();
return Optional.empty(); return Optional.empty();
} }
} }

View File

@@ -1,6 +1,7 @@
package ui; package ui;
import models.User; import models.User;
import repository.UserRepository;
import service.UserService; import service.UserService;
import util.Session; import util.Session;
@@ -21,19 +22,24 @@ public class LoginPanel {
JButton loginButton = new JButton("Login"); JButton loginButton = new JButton("Login");
loginButton.addActionListener(e -> { loginButton.addActionListener(e -> {
String usernameText = username.getText(); try {
String passwordText = new String(password.getPassword()); String usernameText = username.getText();
String passwordText = new String(password.getPassword());
UserService service = new UserService(); UserRepository userRepository = Session.getUserRepository();
UserService service = new UserService(userRepository);
Optional<User> user = service.login(usernameText, passwordText); Optional<User> user = service.login(usernameText, passwordText);
if (user.isPresent()) { if (user.isPresent()) {
Session.getInstance().setUser(user.get()); Session.getInstance().setUser(user.get());
// Wywoałeni jakeiś metody która by mi zmieniała Panele } else {
// Home JOptionPane.showMessageDialog(panel, "User not found");
} else { }
JOptionPane.showMessageDialog(panel, "User not found");
} catch (Exception ex) {
JOptionPane.showMessageDialog(panel, "Error");
} }
}); });
panel.add(loginButton, BorderLayout.SOUTH); panel.add(loginButton, BorderLayout.SOUTH);

View File

@@ -19,18 +19,25 @@ public class MyFrame extends JFrame {
JPanel startPanel = new JPanel(); JPanel startPanel = new JPanel();
JButton loginButton = new JButton("Login"); JButton loginButton = new JButton("Login");
JButton registryButton = new JButton("Registry");
startPanel.add(loginButton); startPanel.add(loginButton);
startPanel.add(registryButton);
mainPanel.add(startPanel, "start"); mainPanel.add(startPanel, "start");
mainPanel.add(LoginPanel.getLoginPanel(), "login"); mainPanel.add(LoginPanel.getLoginPanel(), "login");
mainPanel.add(RegistryPanel.getRegistryPanel(), "registry");
loginButton.addActionListener(e -> { loginButton.addActionListener(e -> {
CardLayout cl = (CardLayout)mainPanel.getLayout(); CardLayout cl = (CardLayout)mainPanel.getLayout();
cl.show(mainPanel, "login"); cl.show(mainPanel, "login");
}); });
add(mainPanel); registryButton.addActionListener(e -> {
CardLayout cl = (CardLayout)mainPanel.getLayout();
cl.show(mainPanel, "registry");
});
add(mainPanel);
setVisible(true); setVisible(true);
} }
} }

View File

@@ -0,0 +1,55 @@
package ui;
import models.User;
import repository.UserRepository;
import service.UserService;
import util.Session;
import javax.swing.*;
import java.awt.*;
import java.util.Optional;
public class RegistryPanel {
public static JPanel getRegistryPanel(){
JPanel panel = new JPanel();
JTextField username = new JTextField("Login");
JTextField email = new JTextField("email@email.com");
JPasswordField password = new JPasswordField("Password");
panel.add(username, BorderLayout.NORTH);
panel.add(email, BorderLayout.NORTH);
panel.add(password, BorderLayout.CENTER);
JButton loginButton = new JButton("Registry");
loginButton.addActionListener(e -> {
try {
String usernameText = username.getText();
String emailText = email.getText();
String passwordText = new String(password.getPassword());
UserRepository userRepository = Session.getUserRepository();
UserService service = new UserService(userRepository);
Optional<User> user = service.register(usernameText, emailText, passwordText);
if (user.isPresent()) {
Session.getInstance().setUser(user.get());
} else {
JOptionPane.showMessageDialog(panel, "User not found");
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(panel, "Error");
}
});
panel.add(loginButton, BorderLayout.SOUTH);
return panel;
}
}

View File

@@ -0,0 +1,16 @@
package util;
import org.mindrot.jbcrypt.BCrypt;
public class PasswordService {
public static String hashPassword(String password) {
String salt = BCrypt.gensalt(12);
return BCrypt.hashpw(password, salt);
}
public static boolean checkPassword(String password, String hashedPassword) {
return BCrypt.checkpw(password, hashedPassword);
}
}

View File

@@ -1,9 +1,19 @@
package util; package util;
import models.User; import models.User;
import repository.UserRepository;
import repository.UserRepositoryJdbc;
import java.sql.Connection;
import java.sql.SQLException;
import static util.DatabaseConnection.getConnection;
public class Session { public class Session {
private static Session instance; private static Session instance;
private static Connection connection;
private static UserRepository userRepository;
private User user; private User user;
public static Session getInstance() { public static Session getInstance() {
@@ -13,6 +23,20 @@ public class Session {
return instance; return instance;
} }
public static Connection getConn() throws SQLException {
if (connection == null) {
connection = getConnection();
}
return connection;
}
public static UserRepository getUserRepository() throws SQLException {
if (userRepository == null) {
userRepository = new UserRepositoryJdbc(getConn());
}
return userRepository;
}
public User getUser() { public User getUser() {
return user; return user;
} }