From 9665dec8aec80277b92b4cfc6cef6dcfcb9adf5c Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 07:18:26 +0100 Subject: [PATCH 1/6] Working migrations script from resources --- src/main/java/datamodel/Database.java | 22 ++++++++++++ src/main/java/gui/MainApplication.java | 1 + src/main/resources/migration.sql | 50 ++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/main/resources/migration.sql diff --git a/src/main/java/datamodel/Database.java b/src/main/java/datamodel/Database.java index f619557..46bd3d4 100755 --- a/src/main/java/datamodel/Database.java +++ b/src/main/java/datamodel/Database.java @@ -49,6 +49,28 @@ public class Database { } return true; } + + // Reads a file from the resources folder and returns the content as a string + private String readResourceFile(String fileName) { + String content = ""; + try { + content = new String(getClass().getResourceAsStream(fileName).readAllBytes()); + } catch (Exception e) { + e.printStackTrace(); + } + return content; + } + + public void runMigration() { + // This path needs to start with a / + String migration = readResourceFile("/migration.sql"); + try { + Statement stmt = conn.createStatement(); + stmt.execute(migration); + } catch (SQLException e) { + e.printStackTrace(); + } + } /** * Close the connection to the database. diff --git a/src/main/java/gui/MainApplication.java b/src/main/java/gui/MainApplication.java index d607036..4d77118 100755 --- a/src/main/java/gui/MainApplication.java +++ b/src/main/java/gui/MainApplication.java @@ -48,6 +48,7 @@ public class MainApplication extends Application { alert.setContentText("Could not connect to the database! Check console for details."); alert.showAndWait(); } + db.runMigration(); } catch(Exception e) { e.printStackTrace(); } diff --git a/src/main/resources/migration.sql b/src/main/resources/migration.sql new file mode 100644 index 0000000..8b26d84 --- /dev/null +++ b/src/main/resources/migration.sql @@ -0,0 +1,50 @@ +PRAGMA foreign_keys = OFF; + +DROP TABLE IF EXISTS Tickets; +DROP TABLE IF EXISTS Reservations; +DROP TABLE IF EXISTS Showings; +DROP TABLE IF EXISTS Movies; +DROP TABLE IF EXISTS Theaters; + +PRAGMA foreign_keys = ON; + +CREATE TABLE IF NOT EXISTS Users ( + username VARCHAR(50) PRIMARY KEY, + name VARCHAR(100), + address VARCHAR(255), + telephone VARCHAR(20) +); + +CREATE TABLE IF NOT EXISTS Theaters ( + theater_id SERIAL PRIMARY KEY, + name VARCHAR(100) UNIQUE, + total_seats INTEGER +); + +CREATE TABLE IF NOT EXISTS Movies ( + movie_id SERIAL PRIMARY KEY, + name VARCHAR(255) UNIQUE +); + +CREATE TABLE IF NOT EXISTS Showings ( + showing_id SERIAL PRIMARY KEY, + movie_id INTEGER REFERENCES Movies(movie_id), + theater_id INTEGER REFERENCES Theaters(theater_id), + show_date DATE, + UNIQUE(movie_id, show_date) +); + +CREATE TABLE IF NOT EXISTS Reservations ( + reservation_id SERIAL PRIMARY KEY, + username VARCHAR(50) REFERENCES Users(username), + showing_id INTEGER REFERENCES Showings(showing_id), + reservation_number VARCHAR(50), + FOREIGN KEY (showing_id, reservation_number) REFERENCES Tickets(showing_id, reservation_number) +); + +CREATE TABLE IF NOT EXISTS Tickets ( + showing_id INTEGER REFERENCES Showings(showing_id), + reservation_number VARCHAR(50), + PRIMARY KEY (showing_id, reservation_number), + FOREIGN KEY (showing_id, reservation_number) REFERENCES Reservations(showing_id, reservation_number) +); \ No newline at end of file From d434e8fb0f3766a6ef69e81483cf9eebd4ae1f32 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 07:20:13 +0100 Subject: [PATCH 2/6] Sample data added to migration script --- src/main/resources/migration.sql | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/resources/migration.sql b/src/main/resources/migration.sql index 8b26d84..9157905 100644 --- a/src/main/resources/migration.sql +++ b/src/main/resources/migration.sql @@ -47,4 +47,20 @@ CREATE TABLE IF NOT EXISTS Tickets ( reservation_number VARCHAR(50), PRIMARY KEY (showing_id, reservation_number), FOREIGN KEY (showing_id, reservation_number) REFERENCES Reservations(showing_id, reservation_number) -); \ No newline at end of file +); + +INSERT INTO Theaters (name, total_seats) VALUES ('Theater 1', 100); +INSERT INTO Theaters (name, total_seats) VALUES ('Theater 2', 150); + +INSERT INTO Movies (name) VALUES ('Movie 1'); +INSERT INTO Movies (name) VALUES ('Movie 2'); +INSERT INTO Movies (name) VALUES ('Movie 3'); + +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 1, '2021-01-01'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 1, '2021-01-02'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 2, '2021-01-01'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (2, 2, '2021-01-01'); + +INSERT INTO Users (username, name, address, telephone) VALUES ('user1', 'User 1', 'Address 1', '1234567890'); +INSERT INTO Users (username, name, address, telephone) VALUES ('user2', 'User 2', 'Address 2', '1234567890'); +INSERT INTO Users (username, name, address, telephone) VALUES ('user3', 'User 3', 'Address 3', '1234567890'); \ No newline at end of file From 33c67ff4de3932790ec1819518c371cd3d9c7ccf Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 07:31:29 +0100 Subject: [PATCH 3/6] Migration method fix --- src/main/java/datamodel/Database.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/datamodel/Database.java b/src/main/java/datamodel/Database.java index 46bd3d4..fd92fc5 100755 --- a/src/main/java/datamodel/Database.java +++ b/src/main/java/datamodel/Database.java @@ -66,7 +66,7 @@ public class Database { String migration = readResourceFile("/migration.sql"); try { Statement stmt = conn.createStatement(); - stmt.execute(migration); + stmt.executeUpdate(migration); } catch (SQLException e) { e.printStackTrace(); } From a1f691de6a08a4acfdde76da81a718e4bd9cd160 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 08:00:53 +0100 Subject: [PATCH 4/6] Migration fixing --- src/main/resources/migration.sql | 48 +++++++++++++++----------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/main/resources/migration.sql b/src/main/resources/migration.sql index 9157905..66dacd5 100644 --- a/src/main/resources/migration.sql +++ b/src/main/resources/migration.sql @@ -1,5 +1,6 @@ PRAGMA foreign_keys = OFF; +DROP TABLE IF EXISTS Users; DROP TABLE IF EXISTS Tickets; DROP TABLE IF EXISTS Reservations; DROP TABLE IF EXISTS Showings; @@ -9,44 +10,35 @@ DROP TABLE IF EXISTS Theaters; PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS Users ( - username VARCHAR(50) PRIMARY KEY, - name VARCHAR(100), + id INTEGER PRIMARY KEY, + username VARCHAR(50), address VARCHAR(255), telephone VARCHAR(20) ); CREATE TABLE IF NOT EXISTS Theaters ( - theater_id SERIAL PRIMARY KEY, + theater_id INTEGER PRIMARY KEY, name VARCHAR(100) UNIQUE, total_seats INTEGER ); CREATE TABLE IF NOT EXISTS Movies ( - movie_id SERIAL PRIMARY KEY, + movie_id INTEGER PRIMARY KEY, name VARCHAR(255) UNIQUE ); CREATE TABLE IF NOT EXISTS Showings ( - showing_id SERIAL PRIMARY KEY, + showing_id INTEGER PRIMARY KEY, movie_id INTEGER REFERENCES Movies(movie_id), theater_id INTEGER REFERENCES Theaters(theater_id), - show_date DATE, - UNIQUE(movie_id, show_date) + show_date DATE ); CREATE TABLE IF NOT EXISTS Reservations ( - reservation_id SERIAL PRIMARY KEY, - username VARCHAR(50) REFERENCES Users(username), + reservation_id INTEGER PRIMARY KEY, + username VARCHAR(50) REFERENCES Users(id), showing_id INTEGER REFERENCES Showings(showing_id), - reservation_number VARCHAR(50), - FOREIGN KEY (showing_id, reservation_number) REFERENCES Tickets(showing_id, reservation_number) -); - -CREATE TABLE IF NOT EXISTS Tickets ( - showing_id INTEGER REFERENCES Showings(showing_id), - reservation_number VARCHAR(50), - PRIMARY KEY (showing_id, reservation_number), - FOREIGN KEY (showing_id, reservation_number) REFERENCES Reservations(showing_id, reservation_number) + reservation_number VARCHAR(50) UNIQUE NOT NULL DEFAULT (hex(randomblob(2))) -- 4 characters ); INSERT INTO Theaters (name, total_seats) VALUES ('Theater 1', 100); @@ -56,11 +48,17 @@ INSERT INTO Movies (name) VALUES ('Movie 1'); INSERT INTO Movies (name) VALUES ('Movie 2'); INSERT INTO Movies (name) VALUES ('Movie 3'); -INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 1, '2021-01-01'); -INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 1, '2021-01-02'); -INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 2, '2021-01-01'); -INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (2, 2, '2021-01-01'); +INSERT INTO Users (username, address, telephone) VALUES ('user1', 'address1', '1234567890'); +INSERT INTO Users (username, address, telephone) VALUES ('user2', 'address2', '1234567890'); +INSERT INTO Users (username, address, telephone) VALUES ('user3', 'address3', '1234567890'); -INSERT INTO Users (username, name, address, telephone) VALUES ('user1', 'User 1', 'Address 1', '1234567890'); -INSERT INTO Users (username, name, address, telephone) VALUES ('user2', 'User 2', 'Address 2', '1234567890'); -INSERT INTO Users (username, name, address, telephone) VALUES ('user3', 'User 3', 'Address 3', '1234567890'); \ No newline at end of file +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 1, '2024-04-01'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (2, 1, '2024-02-24'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (3, 1, '2024-08-12'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (1, 2, '2024-03-04'); +INSERT INTO Showings (movie_id, theater_id, show_date) VALUES (2, 2, '2024-01-10'); + +INSERT INTO Reservations (username, showing_id) VALUES (1, 1); +INSERT INTO Reservations (username, showing_id) VALUES (2, 2); +INSERT INTO Reservations (username, showing_id) VALUES (3, 3); +INSERT INTO Reservations (username, showing_id) VALUES (1, 4); \ No newline at end of file From 2a829509fcbde50e9fa14b8c7b45d6f0821901b6 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 08:01:26 +0100 Subject: [PATCH 5/6] Removing unused drop --- src/main/resources/migration.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/migration.sql b/src/main/resources/migration.sql index 66dacd5..aadf70d 100644 --- a/src/main/resources/migration.sql +++ b/src/main/resources/migration.sql @@ -1,7 +1,6 @@ PRAGMA foreign_keys = OFF; DROP TABLE IF EXISTS Users; -DROP TABLE IF EXISTS Tickets; DROP TABLE IF EXISTS Reservations; DROP TABLE IF EXISTS Showings; DROP TABLE IF EXISTS Movies; From c789c24af30015f956acce5e0310becc39acad9b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 7 Feb 2024 08:42:55 +0100 Subject: [PATCH 6/6] Half finished, loads of queries implemented --- src/main/java/datamodel/Database.java | 88 ++++++++++++++++++++++++++- src/main/java/gui/BookingTab.java | 17 ++---- src/main/java/gui/LoginTab.java | 21 +++---- src/main/resources/application.css | 4 +- 4 files changed, 103 insertions(+), 27 deletions(-) diff --git a/src/main/java/datamodel/Database.java b/src/main/java/datamodel/Database.java index fd92fc5..163e336 100755 --- a/src/main/java/datamodel/Database.java +++ b/src/main/java/datamodel/Database.java @@ -1,6 +1,7 @@ package datamodel; import java.sql.*; +import java.util.ArrayList; /** * Database is a class that specifies the interface to the * movie database. Uses JDBC and the MySQL Connector/J driver. @@ -97,14 +98,97 @@ public class Database { return conn != null; } + // Gets the Show object with the given title and date public Show getShowData(String mTitle, String mDate) { Integer mFreeSeats = 42; String mVenue = "Kino 2"; - - /* --- TODO: add code for database query --- */ + + if(!isConnected()) { + System.err.println("getShowData: no connection to database"); + return null; + } + + try { + Statement stmt = conn.createStatement(); + // ResultSet rs = stmt.executeQuery("SELECT * FROM Showings WHERE title = '" + mTitle + "' AND date = '" + mDate + "'"); + ResultSet rs = stmt.executeQuery("SELECT *, Theaters.name AS theater_name FROM Showings JOIN Movies ON Showings.movie_id = Movies.movie_id JOIN Theaters ON Showings.theater_id = Theaters.theater_id"); + if (rs.next()) { + mFreeSeats = rs.getInt("total_seats"); + mVenue = rs.getString("theater_name"); + } else { + System.err.println("getShowData: no show found"); + return null; + } + } catch (SQLException e) { + e.printStackTrace(); + } return new Show(mTitle, mDate, mVenue, mFreeSeats); } + public ArrayList getAllShows() { + ArrayList shows = new ArrayList(); + + if(!isConnected()) { + System.err.println("getAllShows: no connection to database"); + return shows; + } + + try { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT *, Theaters.name AS theater_name FROM Showings JOIN Movies ON Showings.movie_id = Movies.movie_id JOIN Theaters ON Showings.theater_id = Theaters.theater_id"); + while (rs.next()) { + String mTitle = rs.getString("name"); + String mDate = rs.getString("show_date"); + Integer mFreeSeats = rs.getInt("total_seats"); + String mVenue = rs.getString("theater_name"); + shows.add(new Show(mTitle, mDate, mVenue, mFreeSeats)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return shows; + } + + public ArrayList getDatesForMovie(String mTitle) { + ArrayList dates = new ArrayList(); + + if(!isConnected()) { + System.err.println("getDatesForMovie: no connection to database"); + return dates; + } + + try { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT show_date FROM Showings JOIN Movies ON Showings.movie_id = Movies.movie_id WHERE name = '" + mTitle + "'"); + while (rs.next()) { + dates.add(rs.getString("show_date")); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return dates; + } + + public boolean login(String username) { + if(!isConnected()) { + System.err.println("login: no connection to database"); + return false; + } + + try { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = '" + username + "'"); + if (rs.next()) { + return true; + } + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + /* --- TODO: insert more own code here --- */ } diff --git a/src/main/java/gui/BookingTab.java b/src/main/java/gui/BookingTab.java index 1fd41cc..276f547 100755 --- a/src/main/java/gui/BookingTab.java +++ b/src/main/java/gui/BookingTab.java @@ -92,14 +92,11 @@ public class BookingTab { } private void fillNamesList() { + System.out.println("Filling names list"); List allmovies = new ArrayList(); - - // query the database via db - /* --- TODO: replace with own code --- */ - allmovies.add("Pulp Fiction"); - allmovies.add("The Big Lebowski"); - allmovies.add("Whiplash"); - /* --- END TODO --- */ + + // Spooky functional voodoo + db.getAllShows().stream().map(Show::getTitle).distinct().forEach(allmovies::add); moviesList.setItems(FXCollections.observableList(allmovies)); // remove any selection @@ -109,11 +106,7 @@ public class BookingTab { private void fillDatesList(String m) { List alldates = new ArrayList(); if(m!=null) { - // query the database via db - /* --- TODO: replace with own code --- */ - alldates.add("2016-02-01"); - alldates.add("2016-01-15"); - /* --- END TODO --- */ + db.getDatesForMovie(m).forEach(alldates::add); } datesList.setItems(FXCollections.observableList(alldates)); // remove any selection diff --git a/src/main/java/gui/LoginTab.java b/src/main/java/gui/LoginTab.java index a1da2e7..05cbbac 100755 --- a/src/main/java/gui/LoginTab.java +++ b/src/main/java/gui/LoginTab.java @@ -31,22 +31,21 @@ public class LoginTab { } else { String uname = username.getText(); - /* --- TODO: add code to query the database credentials --- */ - // could be if(!db.login(uname)) alert... + // Check if the user exists in the database + if(!db.login(uname)) { + Alert alert = new Alert(AlertType.ERROR); + alert.setTitle("Login fail"); + alert.setHeaderText(null); + alert.setContentText("User "+uname+" not found!"); + alert.showAndWait(); + return; + } - // inform the user that there is no check against the database - Alert alert = new Alert(AlertType.INFORMATION); - alert.setTitle("Login fail"); - alert.setHeaderText(null); - alert.setContentText("No user check implemented yet!"); - alert.showAndWait(); - /* --- END TODO --- */ - // setting the user name CurrentUser.instance().loginAs(uname); // inform the user about logging in - actiontarget.setText("Sign in user "+uname); + actiontarget.setText(String.format("User %s logged in.", uname)); // inform booking tab of user change bookingTabCtrl.userChanged(); diff --git a/src/main/resources/application.css b/src/main/resources/application.css index d21e50b..70d1304 100755 --- a/src/main/resources/application.css +++ b/src/main/resources/application.css @@ -34,9 +34,9 @@ root { display: block; } -.root { +/* .root { -fx-background-image: url("background.jpg"); -} +} */ .label { -fx-font-size: 12px;