Added some migrations and Simple GUI
This commit is contained in:
12
.idea/dataSources.xml
generated
Normal file
12
.idea/dataSources.xml
generated
Normal 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>
|
||||||
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal 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
6
.idea/sqldialects.xml
generated
Normal 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>
|
||||||
@@ -13,7 +13,14 @@
|
|||||||
- Connection Pool - HikariCP
|
- Connection Pool - HikariCP
|
||||||
- Migracje Flyway
|
- Migracje Flyway
|
||||||
|
|
||||||
|
### Tips:
|
||||||
|
``` shell
|
||||||
|
# Uruchomienie migracji
|
||||||
|
mvn clean flyway:migrate -Dflyway.user= -Dflyway.password= -Dflyway.url=
|
||||||
|
```
|
||||||
|
|
||||||
## TODO:
|
## TODO:
|
||||||
- [x] Fabryka połączenia do bazy danych
|
- [x] Fabryka połączenia do bazy danych
|
||||||
- [x] Testy bazy
|
- [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
43
pom.xml
@@ -14,6 +14,16 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.flywaydb</groupId>
|
||||||
|
<artifactId>flyway-maven-plugin</artifactId>
|
||||||
|
<version>12.4.0</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.zaxxer</groupId>
|
<groupId>com.zaxxer</groupId>
|
||||||
@@ -27,6 +37,19 @@
|
|||||||
<version>42.7.10</version>
|
<version>42.7.10</version>
|
||||||
</dependency>
|
</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>
|
<dependency>
|
||||||
<groupId>io.github.cdimascio</groupId>
|
<groupId>io.github.cdimascio</groupId>
|
||||||
<artifactId>dotenv-java</artifactId>
|
<artifactId>dotenv-java</artifactId>
|
||||||
@@ -40,18 +63,26 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.testcontainers</groupId>
|
|
||||||
<artifactId>postgresql</artifactId>
|
|
||||||
<version>1.19.8</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter</artifactId>
|
<artifactId>junit-jupiter</artifactId>
|
||||||
<version>5.9.3</version>
|
<version>5.9.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
18
src/main/java/main.java
Normal file
18
src/main/java/main.java
Normal 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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,16 +5,26 @@ import java.util.Objects;
|
|||||||
|
|
||||||
public class Task {
|
public class Task {
|
||||||
|
|
||||||
|
private User user;
|
||||||
private String title;
|
private String title;
|
||||||
private String description;
|
private String description;
|
||||||
private Date createdAt;
|
private Date createdAt;
|
||||||
|
|
||||||
public Task(String title, String description) {
|
public Task(String title, String description, User user) {
|
||||||
|
this.user = user;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.createdAt = new Date();
|
this.createdAt = new Date();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public User getUser() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUser(User user) {
|
||||||
|
this.user = user;
|
||||||
|
}
|
||||||
|
|
||||||
public String getTitle() {
|
public String getTitle() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
@@ -43,6 +53,7 @@ public class Task {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return "Task{" +
|
return "Task{" +
|
||||||
"title='" + title + '\'' +
|
"title='" + title + '\'' +
|
||||||
|
", user='" + user + '\'' +
|
||||||
", description='" + description + '\'' +
|
", description='" + description + '\'' +
|
||||||
", createdAt=" + createdAt +
|
", createdAt=" + createdAt +
|
||||||
'}';
|
'}';
|
||||||
@@ -52,11 +63,11 @@ public class Task {
|
|||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
Task task = (Task) o;
|
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
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(title, description, createdAt);
|
return Objects.hash(user, title, description, createdAt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
9
src/main/java/repository/impl/TaskRepositoryImpl.java
Normal file
9
src/main/java/repository/impl/TaskRepositoryImpl.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package repository.impl;
|
||||||
|
|
||||||
|
import repository.TaskRepository;
|
||||||
|
|
||||||
|
public class TaskRepositoryImpl {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
32
src/main/java/service/UserService.java
Normal file
32
src/main/java/service/UserService.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
43
src/main/java/ui/LoginPanel.java
Normal file
43
src/main/java/ui/LoginPanel.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/main/java/ui/MyFrame.java
Normal file
36
src/main/java/ui/MyFrame.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/main/java/util/Session.java
Normal file
28
src/main/java/util/Session.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE users ADD email varchar(255)
|
||||||
11
src/main/resources/db/migration/V3.0__create_task_schema.sql
Normal file
11
src/main/resources/db/migration/V3.0__create_task_schema.sql
Normal 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;
|
||||||
@@ -10,28 +10,26 @@ import org.testcontainers.containers.PostgreSQLContainer;
|
|||||||
|
|
||||||
public class DatabaseConnectionTest {
|
public class DatabaseConnectionTest {
|
||||||
|
|
||||||
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
// static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
||||||
"postgres:16-alpine"
|
// "postgres:16-alpine"
|
||||||
);
|
// );
|
||||||
|
|
||||||
@BeforeAll
|
// @BeforeAll
|
||||||
static void beforeAll() {
|
// static void beforeAll() {
|
||||||
postgres.start();
|
// postgres.start();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@AfterAll
|
// @AfterAll
|
||||||
static void afterAll() {
|
// static void afterAll() {
|
||||||
postgres.stop();
|
// postgres.stop();
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldConnect() throws Exception {
|
public void shouldConnect() throws Exception {
|
||||||
try (Connection conn = DriverManager.getConnection(
|
Connection conn = DriverManager.getConnection(
|
||||||
postgres.getJdbcUrl(),
|
"jdbc:h2:mem:testdb"
|
||||||
postgres.getUsername(),
|
);
|
||||||
postgres.getPassword()
|
|
||||||
)) {
|
assertFalse(conn.isClosed());
|
||||||
assertFalse(conn.isClosed());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user