Resolve stash conflicts and integrate team changes
This commit is contained in:
@@ -1,11 +1,12 @@
|
|||||||
package org.example.petshopdesktop.auth;
|
package org.example.petshopdesktop.auth;
|
||||||
|
|
||||||
public class UserSession {
|
public class UserSession {
|
||||||
|
|
||||||
private static UserSession instance;
|
private static UserSession instance;
|
||||||
|
|
||||||
|
private Integer userId;
|
||||||
|
private Integer employeeId;
|
||||||
private String username;
|
private String username;
|
||||||
|
private String employeeName;
|
||||||
private Role role;
|
private Role role;
|
||||||
|
|
||||||
private UserSession() {}
|
private UserSession() {}
|
||||||
@@ -17,29 +18,47 @@ public class UserSession {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void login(String username, Role role) {
|
public void login(int userId, int employeeId, String username, String employeeName, Role role) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.employeeId = employeeId;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
this.employeeName = employeeName;
|
||||||
this.role = role;
|
this.role = role;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logout() {
|
public void logout() {
|
||||||
|
this.userId = null;
|
||||||
|
this.employeeId = null;
|
||||||
this.username = null;
|
this.username = null;
|
||||||
|
this.employeeName = null;
|
||||||
this.role = null;
|
this.role = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getEmployeeId() {
|
||||||
|
return employeeId;
|
||||||
|
}
|
||||||
|
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Role getRole() {
|
public String getEmployeeName() {
|
||||||
return role;
|
return employeeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAdmin() {
|
public Role getRole() {
|
||||||
return Role.ADMIN.equals(role);
|
return role;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isLoggedIn() {
|
public boolean isLoggedIn() {
|
||||||
return username != null && role != null;
|
return username != null && role != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAdmin() {
|
||||||
|
return Role.ADMIN.equals(role);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import org.example.petshopdesktop.database.PetDB;
|
|||||||
import org.example.petshopdesktop.models.Adoption;
|
import org.example.petshopdesktop.models.Adoption;
|
||||||
import org.example.petshopdesktop.models.Customer;
|
import org.example.petshopdesktop.models.Customer;
|
||||||
import org.example.petshopdesktop.models.Pet;
|
import org.example.petshopdesktop.models.Pet;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
@@ -82,6 +83,10 @@ public class AdoptionDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AdoptionDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading pets for combo box");
|
||||||
System.out.println("Error loading pets: " + e.getMessage());
|
System.out.println("Error loading pets: " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +96,10 @@ public class AdoptionDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AdoptionDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading customers for combo box");
|
||||||
System.out.println("Error loading customers: " + e.getMessage());
|
System.out.println("Error loading customers: " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +153,10 @@ public class AdoptionDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AdoptionDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new adoption record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,6 +168,10 @@ public class AdoptionDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AdoptionDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating adoption with ID: " + adoption.getAdoptionId());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,13 +182,12 @@ public class AdoptionDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//DB operation worked!
|
//DB operation worked!
|
||||||
else {
|
else {
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import javafx.scene.control.ListCell;
|
|||||||
import org.example.petshopdesktop.DTOs.AppointmentDTO;
|
import org.example.petshopdesktop.DTOs.AppointmentDTO;
|
||||||
import org.example.petshopdesktop.database.*;
|
import org.example.petshopdesktop.database.*;
|
||||||
import org.example.petshopdesktop.models.*;
|
import org.example.petshopdesktop.models.*;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.Time;
|
import java.sql.Time;
|
||||||
|
|
||||||
@@ -71,6 +72,10 @@ public class AppointmentDialogController {
|
|||||||
cbCustomer.setItems(CustomerDB.getCustomers());
|
cbCustomer.setItems(CustomerDB.getCustomers());
|
||||||
cbPet.setItems(PetDB.getPets());
|
cbPet.setItems(PetDB.getPets());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AppointmentDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading combo box data for services, customers, and pets");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,6 +191,10 @@ public class AppointmentDialogController {
|
|||||||
closeStage(e);
|
closeStage(e);
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"AppointmentDialogController.buttonSaveClicked",
|
||||||
|
ex,
|
||||||
|
"Saving appointment in " + mode + " mode");
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
showError("Error saving appointment");
|
showError("Error saving appointment");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import org.example.petshopdesktop.database.InventoryDB;
|
|||||||
import org.example.petshopdesktop.database.ProductDB;
|
import org.example.petshopdesktop.database.ProductDB;
|
||||||
import org.example.petshopdesktop.models.Inventory;
|
import org.example.petshopdesktop.models.Inventory;
|
||||||
import org.example.petshopdesktop.models.Product;
|
import org.example.petshopdesktop.models.Product;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@@ -65,6 +66,10 @@ public class InventoryDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"InventoryDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading products for combo box");
|
||||||
System.out.println("Error loading products: " + e.getMessage());
|
System.out.println("Error loading products: " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,6 +123,10 @@ public class InventoryDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"InventoryDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Checking if product exists in inventory");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,6 +138,10 @@ public class InventoryDialogController {
|
|||||||
try {
|
try {
|
||||||
numRow = InventoryDB.insertInventory(inventory);
|
numRow = InventoryDB.insertInventory(inventory);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"InventoryDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new inventory record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,6 +153,10 @@ public class InventoryDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"InventoryDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating inventory with ID: " + inventory.getInventoryId());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,12 +167,11 @@ public class InventoryDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import org.example.petshopdesktop.Validator;
|
|||||||
import org.example.petshopdesktop.database.PetDB;
|
import org.example.petshopdesktop.database.PetDB;
|
||||||
import org.example.petshopdesktop.models.Category;
|
import org.example.petshopdesktop.models.Category;
|
||||||
import org.example.petshopdesktop.models.Pet;
|
import org.example.petshopdesktop.models.Pet;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@@ -107,6 +108,10 @@ public class PetDialogController {
|
|||||||
numRow = PetDB.insertPet(pet);
|
numRow = PetDB.insertPet(pet);
|
||||||
}
|
}
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"PetDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new pet record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -115,6 +120,10 @@ public class PetDialogController {
|
|||||||
numRow = PetDB.updatePet(pet.getPetId(), pet);
|
numRow = PetDB.updatePet(pet.getPetId(), pet);
|
||||||
}
|
}
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"PetDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating pet with ID: " + pet.getPetId());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -125,12 +134,11 @@ public class PetDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//tell the user operation was successful
|
//tell the user operation was successful
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.example.petshopdesktop.database.ProductDB;
|
|||||||
import org.example.petshopdesktop.models.Category;
|
import org.example.petshopdesktop.models.Category;
|
||||||
import org.example.petshopdesktop.models.Product;
|
import org.example.petshopdesktop.models.Product;
|
||||||
import org.example.petshopdesktop.models.Supplier;
|
import org.example.petshopdesktop.models.Supplier;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -74,6 +75,10 @@ public class ProductDialogController {
|
|||||||
categories = CategoryDB.getCategories();
|
categories = CategoryDB.getCategories();
|
||||||
cbProdCategory.setItems(categories);
|
cbProdCategory.setItems(categories);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading categories for combo box");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +114,10 @@ public class ProductDialogController {
|
|||||||
try{
|
try{
|
||||||
numRow = ProductDB.insertProduct(product);
|
numRow = ProductDB.insertProduct(product);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new product record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,6 +125,10 @@ public class ProductDialogController {
|
|||||||
try{
|
try{
|
||||||
numRow = ProductDB.updateProduct(product.getProdId(),product);
|
numRow = ProductDB.updateProduct(product.getProdId(),product);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating product with ID: " + product.getProdId());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,12 +139,11 @@ public class ProductDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//tell the user operation was successful
|
//tell the user operation was successful
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import org.example.petshopdesktop.database.SupplierDB;
|
|||||||
import org.example.petshopdesktop.models.Product;
|
import org.example.petshopdesktop.models.Product;
|
||||||
import org.example.petshopdesktop.models.ProductSupplier;
|
import org.example.petshopdesktop.models.ProductSupplier;
|
||||||
import org.example.petshopdesktop.models.Supplier;
|
import org.example.petshopdesktop.models.Supplier;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.SQLIntegrityConstraintViolationException;
|
import java.sql.SQLIntegrityConstraintViolationException;
|
||||||
@@ -80,6 +81,10 @@ public class ProductSupplierDialogController {
|
|||||||
cbProduct.setItems(products);
|
cbProduct.setItems(products);
|
||||||
}
|
}
|
||||||
catch(SQLException e){
|
catch(SQLException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductSupplierDialogController.initialize",
|
||||||
|
e,
|
||||||
|
"Loading suppliers and products for combo boxes");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +121,10 @@ public class ProductSupplierDialogController {
|
|||||||
numRows = ProductSupplierDB.insertProductSupplier(productSupplier);
|
numRows = ProductSupplierDB.insertProductSupplier(productSupplier);
|
||||||
}
|
}
|
||||||
catch(SQLIntegrityConstraintViolationException e){
|
catch(SQLIntegrityConstraintViolationException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductSupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting product-supplier (integrity constraint violation)");
|
||||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText("Add failed \n" +
|
alert.setContentText("Add failed \n" +
|
||||||
@@ -125,6 +134,10 @@ public class ProductSupplierDialogController {
|
|||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
}
|
}
|
||||||
catch(SQLException e){
|
catch(SQLException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductSupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new product-supplier record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -133,6 +146,10 @@ public class ProductSupplierDialogController {
|
|||||||
numRows = ProductSupplierDB.updateProductSupplier(selectedSupId, selectedProdId, productSupplier);
|
numRows = ProductSupplierDB.updateProductSupplier(selectedSupId, selectedProdId, productSupplier);
|
||||||
}
|
}
|
||||||
catch(SQLIntegrityConstraintViolationException e){
|
catch(SQLIntegrityConstraintViolationException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductSupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating product-supplier (integrity constraint violation) - SupID: " + selectedSupId + ", ProdID: " + selectedProdId);
|
||||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText("Edit failed \n" +
|
alert.setContentText("Edit failed \n" +
|
||||||
@@ -142,6 +159,10 @@ public class ProductSupplierDialogController {
|
|||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
}
|
}
|
||||||
catch(SQLException e){
|
catch(SQLException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ProductSupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating product-supplier - SupID: " + selectedSupId + ", ProdID: " + selectedProdId);
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,12 +173,11 @@ public class ProductSupplierDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
else if (numRows > 0){
|
else if (numRows > 0){
|
||||||
//tell the user operation was successful
|
//tell the user operation was successful
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import javafx.scene.input.MouseEvent;
|
|||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import org.example.petshopdesktop.database.ServiceDB;
|
import org.example.petshopdesktop.database.ServiceDB;
|
||||||
import org.example.petshopdesktop.models.Service;
|
import org.example.petshopdesktop.models.Service;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
import javafx.scene.control.Alert;
|
import javafx.scene.control.Alert;
|
||||||
import javafx.scene.control.ComboBox;
|
import javafx.scene.control.ComboBox;
|
||||||
|
|
||||||
@@ -134,6 +135,10 @@ public class ServiceDialogController {
|
|||||||
close();
|
close();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ServiceDialogController.saveService",
|
||||||
|
e,
|
||||||
|
"Saving service in " + mode + " mode");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
showError("Database error while saving service.");
|
showError("Database error while saving service.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import javafx.stage.Stage;
|
|||||||
import org.example.petshopdesktop.Validator;
|
import org.example.petshopdesktop.Validator;
|
||||||
import org.example.petshopdesktop.database.SupplierDB;
|
import org.example.petshopdesktop.database.SupplierDB;
|
||||||
import org.example.petshopdesktop.models.Supplier;
|
import org.example.petshopdesktop.models.Supplier;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@@ -99,6 +100,10 @@ public class SupplierDialogController {
|
|||||||
try{
|
try{
|
||||||
numRow = SupplierDB.insertSupplier(supplier);
|
numRow = SupplierDB.insertSupplier(supplier);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"SupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Inserting new supplier record");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,6 +111,10 @@ public class SupplierDialogController {
|
|||||||
try{
|
try{
|
||||||
numRow = SupplierDB.updateSupplier(supplier.getSupId(),supplier);
|
numRow = SupplierDB.updateSupplier(supplier.getSupId(),supplier);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"SupplierDialogController.buttonSaveClicked",
|
||||||
|
e,
|
||||||
|
"Updating supplier with ID: " + supplier.getSupId());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,12 +125,11 @@ public class SupplierDialogController {
|
|||||||
alert.setHeaderText("Database Operation Error");
|
alert.setHeaderText("Database Operation Error");
|
||||||
alert.setContentText(mode + " failed");
|
alert.setContentText(mode + " failed");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//tell the user operation was successful
|
//tell the user operation was successful
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setHeaderText("Database Operation Confirmed");
|
alert.setHeaderText("Saved");
|
||||||
alert.setContentText(mode + " succeeded");
|
alert.setContentText(mode + " succeeded");
|
||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
closeStage(mouseEvent);
|
closeStage(mouseEvent);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import javafx.collections.ObservableList;
|
|||||||
import org.example.petshopdesktop.models.Adoption;
|
import org.example.petshopdesktop.models.Adoption;
|
||||||
import org.example.petshopdesktop.models.Customer;
|
import org.example.petshopdesktop.models.Customer;
|
||||||
import org.example.petshopdesktop.models.Pet;
|
import org.example.petshopdesktop.models.Pet;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -76,6 +77,14 @@ public class AdoptionDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("adoption",
|
||||||
|
"N/A",
|
||||||
|
String.format("Adoption record added for Pet ID %d, Customer ID %d", adoption.getPetId(), adoption.getCustomerId()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +102,14 @@ public class AdoptionDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("adoption",
|
||||||
|
String.valueOf(adoptionId),
|
||||||
|
String.format("Adoption ID %d updated", adoptionId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +123,14 @@ public class AdoptionDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("adoption",
|
||||||
|
String.valueOf(adoptionId),
|
||||||
|
String.format("Adoption ID %d deleted", adoptionId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import javafx.collections.ObservableList;
|
|||||||
|
|
||||||
import org.example.petshopdesktop.DTOs.AppointmentDTO;
|
import org.example.petshopdesktop.DTOs.AppointmentDTO;
|
||||||
import org.example.petshopdesktop.models.Appointment;
|
import org.example.petshopdesktop.models.Appointment;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -103,6 +104,14 @@ public class AppointmentDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (newId > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("appointment",
|
||||||
|
String.valueOf(newId),
|
||||||
|
String.format("Appointment created for Customer ID %d, Service ID %d", appt.getCustomerId(), appt.getServiceId()));
|
||||||
|
}
|
||||||
|
|
||||||
return newId;
|
return newId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,9 +130,16 @@ public class AppointmentDB {
|
|||||||
PreparedStatement ps = conn.prepareStatement(sql);
|
PreparedStatement ps = conn.prepareStatement(sql);
|
||||||
ps.setInt(1, appointmentId);
|
ps.setInt(1, appointmentId);
|
||||||
ps.setInt(2, petId);
|
ps.setInt(2, petId);
|
||||||
ps.executeUpdate();
|
int numRows = ps.executeUpdate();
|
||||||
|
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("appointmentPet",
|
||||||
|
String.valueOf(appointmentId),
|
||||||
|
String.format("Pet ID %d linked to Appointment ID %d", petId, appointmentId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -161,6 +177,12 @@ public class AppointmentDB {
|
|||||||
ps2.executeUpdate();
|
ps2.executeUpdate();
|
||||||
|
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
ActivityLogger.getInstance().logUpdate("appointment",
|
||||||
|
String.valueOf(id),
|
||||||
|
String.format("Appointment ID %d updated", id));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +210,14 @@ public class AppointmentDB {
|
|||||||
int rows = ps2.executeUpdate();
|
int rows = ps2.executeUpdate();
|
||||||
|
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (rows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("appointment",
|
||||||
|
String.valueOf(id),
|
||||||
|
String.format("Appointment ID %d deleted", id));
|
||||||
|
}
|
||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.example.petshopdesktop.database;
|
package org.example.petshopdesktop.database;
|
||||||
|
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -43,6 +45,10 @@ public class ConnectionDB {
|
|||||||
password = prop.getProperty("password");
|
password = prop.getProperty("password");
|
||||||
}
|
}
|
||||||
catch(IOException e){
|
catch(IOException e){
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ConnectionDB.getConnection",
|
||||||
|
e,
|
||||||
|
"Reading connection properties file");
|
||||||
throw new RuntimeException("Problem with reading connection info: "+e.getMessage());
|
throw new RuntimeException("Problem with reading connection info: "+e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,6 +56,10 @@ public class ConnectionDB {
|
|||||||
return DriverManager.getConnection(url,user,password);
|
return DriverManager.getConnection(url,user,password);
|
||||||
}
|
}
|
||||||
catch (SQLException e) {
|
catch (SQLException e) {
|
||||||
|
ActivityLogger.getInstance().logException(
|
||||||
|
"ConnectionDB.getConnection",
|
||||||
|
e,
|
||||||
|
"Establishing database connection");
|
||||||
throw new RuntimeException("Problem with database connection: "+e.getMessage());
|
throw new RuntimeException("Problem with database connection: "+e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.example.petshopdesktop.database;
|
|||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import org.example.petshopdesktop.models.Inventory;
|
import org.example.petshopdesktop.models.Inventory;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -90,6 +91,14 @@ public class InventoryDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("inventory",
|
||||||
|
"N/A",
|
||||||
|
String.format("Inventory added for Product ID %d, Quantity %d", inventory.getProdId(), inventory.getQuantity()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +114,14 @@ public class InventoryDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("inventory",
|
||||||
|
String.valueOf(inventoryId),
|
||||||
|
String.format("Inventory ID %d updated", inventoryId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,6 +135,14 @@ public class InventoryDB {
|
|||||||
|
|
||||||
int numRows = stmt.executeUpdate();
|
int numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("inventory",
|
||||||
|
String.valueOf(inventoryId),
|
||||||
|
String.format("Inventory ID %d deleted", inventoryId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.example.petshopdesktop.database;
|
|||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import org.example.petshopdesktop.models.Pet;
|
import org.example.petshopdesktop.models.Pet;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -98,6 +99,13 @@ public class PetDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("pet",
|
||||||
|
String.valueOf(pet.getPetId()),
|
||||||
|
String.format("Pet '%s' added", pet.getPetName()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +133,13 @@ public class PetDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("pet",
|
||||||
|
String.valueOf(petId),
|
||||||
|
String.format("Pet '%s' updated", pet.getPetName()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,6 +155,13 @@ public class PetDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("pet",
|
||||||
|
String.valueOf(petId),
|
||||||
|
String.format("Pet ID %d deleted", petId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import javafx.collections.ObservableList;
|
|||||||
import org.example.petshopdesktop.DTOs.ProductDTO;
|
import org.example.petshopdesktop.DTOs.ProductDTO;
|
||||||
import org.example.petshopdesktop.models.Product;
|
import org.example.petshopdesktop.models.Product;
|
||||||
import org.example.petshopdesktop.models.Supplier;
|
import org.example.petshopdesktop.models.Supplier;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -102,6 +103,13 @@ public class ProductDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("product",
|
||||||
|
String.valueOf(product.getProdId()),
|
||||||
|
String.format("Product '%s' added", product.getProdName()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,6 +143,13 @@ public class ProductDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("product",
|
||||||
|
String.valueOf(prodId),
|
||||||
|
String.format("Product '%s' updated", product.getProdName()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,6 +172,13 @@ public class ProductDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("product",
|
||||||
|
String.valueOf(prodId),
|
||||||
|
String.format("Product ID %d deleted", prodId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.example.petshopdesktop.database;
|
|||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import org.example.petshopdesktop.models.Service;
|
import org.example.petshopdesktop.models.Service;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -58,6 +59,13 @@ public class ServiceDB {
|
|||||||
int rows = stmt.executeUpdate();
|
int rows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (rows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("service",
|
||||||
|
"N/A",
|
||||||
|
String.format("Service '%s' added", service.getServiceName()));
|
||||||
|
}
|
||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +92,13 @@ public class ServiceDB {
|
|||||||
int rows = stmt.executeUpdate();
|
int rows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (rows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("service",
|
||||||
|
String.valueOf(id),
|
||||||
|
String.format("Service '%s' updated", service.getServiceName()));
|
||||||
|
}
|
||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,6 +117,13 @@ public class ServiceDB {
|
|||||||
int rows = stmt.executeUpdate();
|
int rows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (rows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("service",
|
||||||
|
String.valueOf(id),
|
||||||
|
String.format("Service ID %d deleted", id));
|
||||||
|
}
|
||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ import javafx.collections.FXCollections;
|
|||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import org.example.petshopdesktop.models.Product;
|
import org.example.petshopdesktop.models.Product;
|
||||||
import org.example.petshopdesktop.models.Supplier;
|
import org.example.petshopdesktop.models.Supplier;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@@ -68,6 +69,13 @@ public class SupplierDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("supplier",
|
||||||
|
String.valueOf(supplier.getSupId()),
|
||||||
|
String.format("Supplier '%s' added", supplier.getSupCompany()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,6 +111,13 @@ public class SupplierDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logUpdate("supplier",
|
||||||
|
String.valueOf(supId),
|
||||||
|
String.format("Supplier '%s' updated", supplier.getSupCompany()));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +140,13 @@ public class SupplierDB {
|
|||||||
numRows = stmt.executeUpdate();
|
numRows = stmt.executeUpdate();
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
|
// Log the operation
|
||||||
|
if (numRows > 0) {
|
||||||
|
ActivityLogger.getInstance().logDelete("supplier",
|
||||||
|
String.valueOf(supId),
|
||||||
|
String.format("Supplier ID %d deleted", supId));
|
||||||
|
}
|
||||||
|
|
||||||
return numRows;
|
return numRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
package org.example.petshopdesktop.database;
|
package org.example.petshopdesktop.database;
|
||||||
|
|
||||||
import org.example.petshopdesktop.auth.Role;
|
import org.example.petshopdesktop.auth.Role;
|
||||||
|
import org.example.petshopdesktop.models.StaffAccount;
|
||||||
import org.example.petshopdesktop.models.User;
|
import org.example.petshopdesktop.models.User;
|
||||||
|
import org.example.petshopdesktop.util.ActivityLogger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class UserDB {
|
public class UserDB {
|
||||||
|
|
||||||
/**
|
|
||||||
* Authenticate a user by username and password.
|
|
||||||
* Passwords are stored as SHA-256 hex digests in the database.
|
|
||||||
*
|
|
||||||
* @param username the username to authenticate
|
|
||||||
* @param password the plaintext password
|
|
||||||
* @return the User if credentials are valid, or null if authentication fails
|
|
||||||
*/
|
|
||||||
public static User authenticate(String username, String password) throws SQLException {
|
public static User authenticate(String username, String password) throws SQLException {
|
||||||
String sql = "SELECT user_id, username, role FROM users " +
|
String sql = "SELECT u.user_id, u.employee_id, u.username, u.role, e.firstName, e.lastName "
|
||||||
"WHERE username = ? AND password_hash = SHA2(?, 256)";
|
+ "FROM users u "
|
||||||
|
+ "JOIN employee e ON u.employee_id = e.employeeId "
|
||||||
|
+ "WHERE u.username = ? AND u.password_hash = SHA2(?, 256) AND e.isActive = TRUE";
|
||||||
|
|
||||||
try (Connection conn = ConnectionDB.getConnection();
|
try (Connection conn = ConnectionDB.getConnection();
|
||||||
PreparedStatement ps = conn.prepareStatement(sql)) {
|
PreparedStatement ps = conn.prepareStatement(sql)) {
|
||||||
@@ -28,46 +30,169 @@ public class UserDB {
|
|||||||
try (ResultSet rs = ps.executeQuery()) {
|
try (ResultSet rs = ps.executeQuery()) {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
int userId = rs.getInt("user_id");
|
int userId = rs.getInt("user_id");
|
||||||
|
int employeeId = rs.getInt("employee_id");
|
||||||
String uname = rs.getString("username");
|
String uname = rs.getString("username");
|
||||||
|
|
||||||
Role role = Role.valueOf(rs.getString("role").toUpperCase());
|
Role role = Role.valueOf(rs.getString("role").toUpperCase());
|
||||||
|
String firstName = rs.getString("firstName");
|
||||||
|
String lastName = rs.getString("lastName");
|
||||||
|
|
||||||
return new User(userId, uname, role);
|
return new User(userId, employeeId, uname, firstName, lastName, role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the users table and seed default admin/staff accounts if they do not exist.
|
|
||||||
* Passwords are stored as SHA2-256 hashes.
|
|
||||||
*/
|
|
||||||
public static void initializeTable() throws SQLException {
|
public static void initializeTable() throws SQLException {
|
||||||
String createTable = """
|
String createTable = """
|
||||||
CREATE TABLE IF NOT EXISTS users (
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
user_id INT AUTO_INCREMENT PRIMARY KEY,
|
user_id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
employee_id INT NOT NULL,
|
||||||
username VARCHAR(100) NOT NULL UNIQUE,
|
username VARCHAR(100) NOT NULL UNIQUE,
|
||||||
password_hash CHAR(64) NOT NULL,
|
password_hash CHAR(64) NOT NULL,
|
||||||
role ENUM('ADMIN','STAFF') NOT NULL
|
role ENUM('ADMIN','STAFF') NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||||
|
FOREIGN KEY (employee_id) REFERENCES employee(employeeId)
|
||||||
)
|
)
|
||||||
""";
|
""";
|
||||||
|
|
||||||
String seedAdmin = """
|
|
||||||
INSERT IGNORE INTO users (username, password_hash, role)
|
|
||||||
VALUES ('admin', SHA2('admin123', 256), 'ADMIN')
|
|
||||||
""";
|
|
||||||
|
|
||||||
String seedStaff = """
|
|
||||||
INSERT IGNORE INTO users (username, password_hash, role)
|
|
||||||
VALUES ('staff', SHA2('staff123', 256), 'STAFF')
|
|
||||||
""";
|
|
||||||
|
|
||||||
try (Connection conn = ConnectionDB.getConnection();
|
try (Connection conn = ConnectionDB.getConnection();
|
||||||
Statement st = conn.createStatement()) {
|
Statement st = conn.createStatement()) {
|
||||||
st.executeUpdate(createTable);
|
st.executeUpdate(createTable);
|
||||||
st.executeUpdate(seedAdmin);
|
}
|
||||||
st.executeUpdate(seedStaff);
|
|
||||||
|
ensureCompatibleSchema();
|
||||||
|
|
||||||
|
int adminEmployeeId = EmployeeDB.ensureDefaultEmployee("John", "Doe", "john@petshop.com", "111-222-3333", "Manager", true);
|
||||||
|
int staffEmployeeId = EmployeeDB.ensureDefaultEmployee("Sara", "Smith", "sara@petshop.com", "444-555-6666", "Staff", true);
|
||||||
|
|
||||||
|
ensureDefaultUser(adminEmployeeId, "admin", "admin123", Role.ADMIN);
|
||||||
|
ensureDefaultUser(staffEmployeeId, "staff", "staff123", Role.STAFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int createStaffAccount(String firstName, String lastName, String email, String phone, String username, String password) throws SQLException {
|
||||||
|
if (username == null || username.isBlank()) {
|
||||||
|
throw new SQLException("Username is required.");
|
||||||
|
}
|
||||||
|
if (password == null || password.isBlank()) {
|
||||||
|
throw new SQLException("Password is required.");
|
||||||
|
}
|
||||||
|
|
||||||
|
int storeId = EmployeeDB.getDefaultStoreId();
|
||||||
|
|
||||||
|
try (Connection conn = ConnectionDB.getConnection()) {
|
||||||
|
conn.setAutoCommit(false);
|
||||||
|
try {
|
||||||
|
int employeeId = EmployeeDB.createEmployee(conn, firstName, lastName, email, phone, "Staff", true);
|
||||||
|
EmployeeDB.assignEmployeeToStore(conn, employeeId, storeId);
|
||||||
|
|
||||||
|
String insertUser = "INSERT INTO users (employee_id, username, password_hash, role) VALUES (?, ?, SHA2(?, 256), 'STAFF')";
|
||||||
|
try (PreparedStatement ps = conn.prepareStatement(insertUser, Statement.RETURN_GENERATED_KEYS)) {
|
||||||
|
ps.setInt(1, employeeId);
|
||||||
|
ps.setString(2, username);
|
||||||
|
ps.setString(3, password);
|
||||||
|
ps.executeUpdate();
|
||||||
|
|
||||||
|
try (ResultSet keys = ps.getGeneratedKeys()) {
|
||||||
|
if (keys.next()) {
|
||||||
|
int userId = keys.getInt(1);
|
||||||
|
conn.commit();
|
||||||
|
ActivityLogger.getInstance().logInsert("users", String.valueOf(userId), "Created staff account: " + username);
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.rollback();
|
||||||
|
throw new SQLException("Could not create staff account.");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
conn.rollback();
|
||||||
|
throw e;
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
conn.rollback();
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
conn.setAutoCommit(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<StaffAccount> getStaffAccounts() throws SQLException {
|
||||||
|
String sql = "SELECT u.user_id, u.username, u.created_at, e.employeeId, e.firstName, e.lastName, e.email, e.phone, e.isActive "
|
||||||
|
+ "FROM users u "
|
||||||
|
+ "JOIN employee e ON u.employee_id = e.employeeId "
|
||||||
|
+ "WHERE u.role = 'STAFF' "
|
||||||
|
+ "ORDER BY u.created_at DESC";
|
||||||
|
|
||||||
|
List<StaffAccount> accounts = new ArrayList<>();
|
||||||
|
|
||||||
|
try (Connection conn = ConnectionDB.getConnection();
|
||||||
|
PreparedStatement ps = conn.prepareStatement(sql);
|
||||||
|
ResultSet rs = ps.executeQuery()) {
|
||||||
|
|
||||||
|
while (rs.next()) {
|
||||||
|
accounts.add(new StaffAccount(
|
||||||
|
rs.getInt("user_id"),
|
||||||
|
rs.getInt("employeeId"),
|
||||||
|
rs.getString("username"),
|
||||||
|
rs.getString("firstName"),
|
||||||
|
rs.getString("lastName"),
|
||||||
|
rs.getString("email"),
|
||||||
|
rs.getString("phone"),
|
||||||
|
rs.getBoolean("isActive"),
|
||||||
|
rs.getTimestamp("created_at")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ensureCompatibleSchema() throws SQLException {
|
||||||
|
try (Connection conn = ConnectionDB.getConnection();
|
||||||
|
Statement st = conn.createStatement()) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
st.executeUpdate("ALTER TABLE users ADD COLUMN employee_id INT NULL");
|
||||||
|
} catch (SQLException ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
st.executeUpdate("ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");
|
||||||
|
} catch (SQLException ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
st.executeUpdate("ALTER TABLE users ADD CONSTRAINT fk_users_employee FOREIGN KEY (employee_id) REFERENCES employee(employeeId)");
|
||||||
|
} catch (SQLException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ensureDefaultUser(int employeeId, String username, String password, Role role) throws SQLException {
|
||||||
|
String insert = "INSERT IGNORE INTO users (employee_id, username, password_hash, role) VALUES (?, ?, SHA2(?, 256), ?)";
|
||||||
|
String updateIfMissingEmployeeId = "UPDATE users SET employee_id = ? WHERE username = ? AND (employee_id IS NULL OR employee_id = 0)";
|
||||||
|
|
||||||
|
try (Connection conn = ConnectionDB.getConnection()) {
|
||||||
|
int rows;
|
||||||
|
try (PreparedStatement ps = conn.prepareStatement(insert)) {
|
||||||
|
ps.setInt(1, employeeId);
|
||||||
|
ps.setString(2, username);
|
||||||
|
ps.setString(3, password);
|
||||||
|
ps.setString(4, role.name());
|
||||||
|
rows = ps.executeUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
try (PreparedStatement ps = conn.prepareStatement(updateIfMissingEmployeeId)) {
|
||||||
|
ps.setInt(1, employeeId);
|
||||||
|
ps.setString(2, username);
|
||||||
|
ps.executeUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows > 0) {
|
||||||
|
ActivityLogger.getInstance().logInsert("users", username, "Default " + role.name().toLowerCase() + " user created");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,19 @@ package org.example.petshopdesktop.models;
|
|||||||
import org.example.petshopdesktop.auth.Role;
|
import org.example.petshopdesktop.auth.Role;
|
||||||
|
|
||||||
public class User {
|
public class User {
|
||||||
private int userId;
|
private final int userId;
|
||||||
private String username;
|
private final int employeeId;
|
||||||
private Role role;
|
private final String username;
|
||||||
|
private final String employeeFirstName;
|
||||||
|
private final String employeeLastName;
|
||||||
|
private final Role role;
|
||||||
|
|
||||||
public User(int userId, String username, Role role) {
|
public User(int userId, int employeeId, String username, String employeeFirstName, String employeeLastName, Role role) {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
|
this.employeeId = employeeId;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
this.employeeFirstName = employeeFirstName;
|
||||||
|
this.employeeLastName = employeeLastName;
|
||||||
this.role = role;
|
this.role = role;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,10 +23,29 @@ public class User {
|
|||||||
return userId;
|
return userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getEmployeeId() {
|
||||||
|
return employeeId;
|
||||||
|
}
|
||||||
|
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getEmployeeFirstName() {
|
||||||
|
return employeeFirstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmployeeLastName() {
|
||||||
|
return employeeLastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmployeeFullName() {
|
||||||
|
String fn = employeeFirstName == null ? "" : employeeFirstName.trim();
|
||||||
|
String ln = employeeLastName == null ? "" : employeeLastName.trim();
|
||||||
|
String full = (fn + " " + ln).trim();
|
||||||
|
return full.isBlank() ? username : full;
|
||||||
|
}
|
||||||
|
|
||||||
public Role getRole() {
|
public Role getRole() {
|
||||||
return role;
|
return role;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<?import javafx.scene.layout.VBox?>
|
<?import javafx.scene.layout.VBox?>
|
||||||
<?import javafx.scene.text.Font?>
|
<?import javafx.scene.text.Font?>
|
||||||
|
|
||||||
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="380.0" spacing="16.0"
|
<VBox alignment="CENTER" prefHeight="420.0" prefWidth="380.0" spacing="16.0"
|
||||||
style="-fx-background-color: #2C3E50;"
|
style="-fx-background-color: #2C3E50;"
|
||||||
xmlns="http://javafx.com/javafx/17"
|
xmlns="http://javafx.com/javafx/17"
|
||||||
xmlns:fx="http://javafx.com/fxml/1"
|
xmlns:fx="http://javafx.com/fxml/1"
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
<Insets bottom="40.0" left="50.0" right="50.0" top="40.0" />
|
<Insets bottom="40.0" left="50.0" right="50.0" top="40.0" />
|
||||||
</padding>
|
</padding>
|
||||||
<children>
|
<children>
|
||||||
<Label text="🐾 Pet Shop Manager" textFill="WHITE">
|
<Label text="Pet Shop Manager" textFill="WHITE">
|
||||||
<font>
|
<font>
|
||||||
<Font name="Comic Sans MS Bold" size="22.0" />
|
<Font name="System Bold" size="22.0" />
|
||||||
</font>
|
</font>
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets bottom="10.0" />
|
<Insets bottom="10.0" />
|
||||||
@@ -76,5 +76,17 @@
|
|||||||
<Insets top="8.0" />
|
<Insets top="8.0" />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
<Button fx:id="btnCreateStaff" mnemonicParsing="false" onAction="#btnCreateStaffClicked"
|
||||||
|
prefWidth="280.0"
|
||||||
|
style="-fx-background-color: transparent; -fx-text-fill: #D5DDE6; -fx-cursor: hand; -fx-underline: true;"
|
||||||
|
text="Create Staff Account">
|
||||||
|
<font>
|
||||||
|
<Font name="System Bold" size="13.0" />
|
||||||
|
</font>
|
||||||
|
<VBox.margin>
|
||||||
|
<Insets top="4.0" />
|
||||||
|
</VBox.margin>
|
||||||
|
</Button>
|
||||||
</children>
|
</children>
|
||||||
</VBox>
|
</VBox>
|
||||||
|
|||||||
Reference in New Issue
Block a user