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
|
||||
- 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] 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>
|
||||
</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
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 {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
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()
|
||||
)) {
|
||||
assertFalse(conn.isClosed());
|
||||
}
|
||||
Connection conn = DriverManager.getConnection(
|
||||
"jdbc:h2:mem:testdb"
|
||||
);
|
||||
|
||||
assertFalse(conn.isClosed());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user