Added some migrations and Simple GUI

This commit is contained in:
maciejrusek
2026-04-26 16:18:14 +02:00
parent c1af31f41d
commit e5c5670ac5
16 changed files with 283 additions and 29 deletions

12
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="TodoApp@localhost" uuid="ff48017c-ca9a-4bd4-8b7f-b8031139bce6">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://localhost:12900/TodoApp</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

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

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/main/resources/db/migration/V1.0__create_user_schema.sql" dialect="PostgreSQL" />
</component>
</project>

View File

@@ -13,7 +13,14 @@
- Connection Pool - HikariCP
- Migracje Flyway
### Tips:
``` shell
# Uruchomienie migracji
mvn clean flyway:migrate -Dflyway.user= -Dflyway.password= -Dflyway.url=
```
## TODO:
- [x] Fabryka połączenia do bazy danych
- [x] Testy bazy
- [x] Zmienić to na h2 w testach unit...
- [x] Dodać jakąs migracje danych, proste 2 tabelki jako 2 migracje.

43
pom.xml
View File

@@ -14,6 +14,16 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>12.4.0</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.zaxxer</groupId>
@@ -27,6 +37,19 @@
<version>42.7.10</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>12.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-database-postgresql</artifactId>
<version>12.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
@@ -40,18 +63,26 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.19.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.4.240</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.19.8</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

18
src/main/java/main.java Normal file
View File

@@ -0,0 +1,18 @@
import ui.MyFrame;
import java.awt.*;
public class main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
}
}

View File

@@ -5,16 +5,26 @@ import java.util.Objects;
public class Task {
private User user;
private String title;
private String description;
private Date createdAt;
public Task(String title, String description) {
public Task(String title, String description, User user) {
this.user = user;
this.title = title;
this.description = description;
this.createdAt = new Date();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getTitle() {
return title;
}
@@ -43,6 +53,7 @@ public class Task {
public String toString() {
return "Task{" +
"title='" + title + '\'' +
", user='" + user + '\'' +
", description='" + description + '\'' +
", createdAt=" + createdAt +
'}';
@@ -52,11 +63,11 @@ public class Task {
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Task task = (Task) o;
return Objects.equals(title, task.title) && Objects.equals(description, task.description) && Objects.equals(createdAt, task.createdAt);
return Objects.equals(user, task.user) && Objects.equals(title, task.title) && Objects.equals(description, task.description) && Objects.equals(createdAt, task.createdAt);
}
@Override
public int hashCode() {
return Objects.hash(title, description, createdAt);
return Objects.hash(user, title, description, createdAt);
}
}

View File

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

View File

@@ -0,0 +1,32 @@
package service;
import models.User;
import java.util.Optional;
public class UserService {
public Optional<User> login(String username, String password) {
try {
return Optional.empty();
} catch (Exception e) {
System.out.println(e.getMessage());
return Optional.empty();
}
}
public Optional<User> register(String username, String password) {
try {
return Optional.empty();
} catch (Exception e) {
System.out.println(e.getMessage());
return Optional.empty();
}
}
}

View File

@@ -0,0 +1,43 @@
package ui;
import models.User;
import service.UserService;
import util.Session;
import javax.swing.*;
import java.awt.*;
import java.util.Optional;
public class LoginPanel {
public static JPanel getLoginPanel(){
JPanel panel = new JPanel();
JTextField username = new JTextField("Login");
JPasswordField password = new JPasswordField("Password");
panel.add(username, BorderLayout.NORTH);
panel.add(password, BorderLayout.CENTER);
JButton loginButton = new JButton("Login");
loginButton.addActionListener(e -> {
String usernameText = username.getText();
String passwordText = new String(password.getPassword());
UserService service = new UserService();
Optional<User> user = service.login(usernameText, passwordText);
if (user.isPresent()) {
Session.getInstance().setUser(user.get());
// Wywoałeni jakeiś metody która by mi zmieniała Panele
// Home
} else {
JOptionPane.showMessageDialog(panel, "User not found");
}
});
panel.add(loginButton, BorderLayout.SOUTH);
return panel;
}
}

View File

@@ -0,0 +1,36 @@
package ui;
import javax.swing.*;
import java.awt.*;
public class MyFrame extends JFrame {
JPanel mainPanel = new JPanel(new CardLayout());
public void changePanel(String panel) {
}
public MyFrame() {
super("Todo App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocation(50, 50);
setLayout(new CardLayout());
JPanel startPanel = new JPanel();
JButton loginButton = new JButton("Login");
startPanel.add(loginButton);
mainPanel.add(startPanel, "start");
mainPanel.add(LoginPanel.getLoginPanel(), "login");
loginButton.addActionListener(e -> {
CardLayout cl = (CardLayout)mainPanel.getLayout();
cl.show(mainPanel, "login");
});
add(mainPanel);
setVisible(true);
}
}

View File

@@ -0,0 +1,28 @@
package util;
import models.User;
public class Session {
private static Session instance;
private User user;
public static Session getInstance() {
if (instance == null) {
instance = new Session();
}
return instance;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public void logout() {
this.user = null;
}
}

View File

@@ -0,0 +1,5 @@
CREATE TABLE IF NOT EXISTS users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL
);

View File

@@ -0,0 +1 @@
ALTER TABLE users ADD email varchar(255)

View File

@@ -0,0 +1,11 @@
CREATE TABLE IF NOT EXISTS tasks (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id INT NOT NULL,
title varchar(50) NOT NULL,
description TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_tasks_user_id ON tasks (user_id);
ALTER TABLE tasks ADD FOREIGN KEY(user_id) REFERENCES users(id) ON UPDATE NO ACTION ON DELETE CASCADE;

View File

@@ -10,28 +10,26 @@ import org.testcontainers.containers.PostgreSQLContainer;
public class DatabaseConnectionTest {
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
"postgres:16-alpine"
);
// static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
// "postgres:16-alpine"
// );
@BeforeAll
static void beforeAll() {
postgres.start();
}
@AfterAll
static void afterAll() {
postgres.stop();
}
// @BeforeAll
// static void beforeAll() {
// postgres.start();
// }
//
// @AfterAll
// static void afterAll() {
// postgres.stop();
// }
@Test
public void shouldConnect() throws Exception {
try (Connection conn = DriverManager.getConnection(
postgres.getJdbcUrl(),
postgres.getUsername(),
postgres.getPassword()
)) {
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:testdb"
);
assertFalse(conn.isClosed());
}
}
}