From 423e3285e99eb2614bd3513beba470d0a94d4cf2 Mon Sep 17 00:00:00 2001 From: Sandeep Gaur Date: Sun, 16 Feb 2025 16:40:58 +0530 Subject: [PATCH] Copied OOPS basics payment service, created new payment service which will store details in sql db --- design-patterns/pom.xml | 21 ++++ .../prateek/PaymentServiceDb/Basics/Card.java | 11 ++ .../PaymentServiceDb/Basics/CreditCard.java | 11 ++ .../PaymentServiceDb/Basics/DebitCard.java | 12 ++ .../Basics/PaymentMethod.java | 5 + .../Basics/PaymentService.java | 107 ++++++++++++++++++ .../PaymentServiceDb/Basics/PaymentType.java | 5 + .../prateek/PaymentServiceDb/Basics/UPI.java | 15 +++ .../org/prateek/PaymentServiceDb/Client.java | 26 +++++ 9 files changed, 213 insertions(+) create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java create mode 100644 design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java diff --git a/design-patterns/pom.xml b/design-patterns/pom.xml index c772522..b7bf343 100644 --- a/design-patterns/pom.xml +++ b/design-patterns/pom.xml @@ -13,5 +13,26 @@ 21 UTF-8 + + + + mysql + mysql-connector-java + 8.0.33 + runtime + + + + + org.slf4j + slf4j-api + 1.7.36 + + + org.slf4j + slf4j-simple + 1.7.36 + + \ No newline at end of file diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java new file mode 100644 index 0000000..417b133 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java @@ -0,0 +1,11 @@ +package org.prateek.PaymentServiceDb.Basics; + +public class Card { + String cardNo; + String userName; + + public Card(String cardNo, String userName) { + this.cardNo = cardNo; + this.userName = userName; + } +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java new file mode 100644 index 0000000..d4bab29 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java @@ -0,0 +1,11 @@ +package org.prateek.PaymentServiceDb.Basics; + +public class CreditCard extends Card implements PaymentMethod { + public CreditCard(String cardNo, String name) { + super(cardNo, name); + } + + public void pay() { + System.out.println("Making payment via Credit Card"); + } +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java new file mode 100644 index 0000000..ac88c92 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java @@ -0,0 +1,12 @@ +package org.prateek.PaymentServiceDb.Basics; + +public class DebitCard extends Card implements PaymentMethod { + public DebitCard(String cardNo, String userName) { + super(cardNo, userName); + } + + @Override + public void pay() { + System.out.println("Making payment via Debit Card"); + } +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java new file mode 100644 index 0000000..6d1ead2 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java @@ -0,0 +1,5 @@ +package org.prateek.PaymentServiceDb.Basics; + +public interface PaymentMethod { + void pay(); +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java new file mode 100644 index 0000000..9204e50 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java @@ -0,0 +1,107 @@ +package org.prateek.PaymentServiceDb.Basics; + +import java.sql.*; + +public class PaymentService { + private static PaymentService instance; + private Connection connection; + + // Singleton Constructor + private PaymentService() { + try { + this.connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdatabase", "root", "AdminSandeep"); + createTableIfNotExists(); + } catch (Exception e) { + throw new RuntimeException("Database connection failed!", e); + } + } + + public static synchronized PaymentService getInstance() { + if (instance == null) { + instance = new PaymentService(); + } + return instance; + } + + // Ensures Table Exists + private void createTableIfNotExists() { + try (Statement stmt = connection.createStatement()) { + String sql = "CREATE TABLE IF NOT EXISTS payment_methods (" + + "id INT AUTO_INCREMENT PRIMARY KEY, " + + "name VARCHAR(255) UNIQUE NOT NULL, " + + "type ENUM('CREDIT_CARD', 'DEBIT_CARD', 'UPI') NOT NULL, " + + "details TEXT NOT NULL)"; + stmt.executeUpdate(sql); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // Add Payment Method with ENUM + public void addPaymentMethod(String name, PaymentMethod pm) { + try { + PaymentType type; + String details; + + if (pm instanceof CreditCard) { + type = PaymentType.CREDIT_CARD; + details = ((CreditCard) pm).cardNo; + } else if (pm instanceof DebitCard) { + type = PaymentType.DEBIT_CARD; + details = ((DebitCard) pm).cardNo; + } else if (pm instanceof UPI) { + type = PaymentType.UPI; + details = ((UPI) pm).upiId; + } else { + throw new IllegalArgumentException("Unknown Payment Method"); + } + + PreparedStatement stmt = connection.prepareStatement( + "INSERT INTO payment_methods (name, type, details) VALUES (?, ?, ?) " + + "ON DUPLICATE KEY UPDATE type=VALUES(type), details=VALUES(details)"); + + stmt.setString(1, name); + stmt.setString(2, type.name()); // Store ENUM as String + stmt.setString(3, details); + stmt.executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // Retrieve and Make Payment + public void makePayment(String name) { + try { + PreparedStatement stmt = connection.prepareStatement( + "SELECT type, details FROM payment_methods WHERE name = ?"); + stmt.setString(1, name); + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + PaymentType type = PaymentType.valueOf(rs.getString("type")); // Convert DB String to Enum + String details = rs.getString("details"); + + PaymentMethod pm; + switch (type) { + case CREDIT_CARD: + pm = new CreditCard(details, name); + break; + case DEBIT_CARD: + pm = new DebitCard(details, name); + break; + case UPI: + pm = new UPI(details, name); + break; + default: + throw new IllegalArgumentException("Unknown Payment Type"); + } + + pm.pay(); + } else { + throw new IllegalArgumentException("Payment method not found: " + name); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java new file mode 100644 index 0000000..00c1305 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java @@ -0,0 +1,5 @@ +package org.prateek.PaymentServiceDb.Basics; + +public enum PaymentType { + CREDIT_CARD, DEBIT_CARD, UPI, WALLET; +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java new file mode 100644 index 0000000..f746c46 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java @@ -0,0 +1,15 @@ +package org.prateek.PaymentServiceDb.Basics; + +public class UPI implements PaymentMethod { + String upiId; + String userName; + + public UPI(String upiId, String userName) { + this.upiId = upiId; + this.userName = userName; + } + + public void pay() { + System.out.println("Making payment via UPI" + upiId); + } +} diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java new file mode 100644 index 0000000..6248d94 --- /dev/null +++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java @@ -0,0 +1,26 @@ +package org.prateek.PaymentServiceDb; + +import org.prateek.PaymentServiceDb.Basics.CreditCard; +import org.prateek.PaymentServiceDb.Basics.DebitCard; +import org.prateek.PaymentServiceDb.Basics.PaymentService; +import org.prateek.PaymentServiceDb.Basics.UPI; + +public class Client { + public static void main(String[] args) { + System.out.println("Hello, World!"); + PaymentService ps = PaymentService.getInstance(); + + ps.addPaymentMethod("sandeepCreditCardId", new CreditCard("1234", "Sandeep")); + ps.addPaymentMethod("JohnCredit", new CreditCard("1234-5678-9876", "John")); + ps.addPaymentMethod("JohnUPI", new UPI("john@upi", "John")); + ps.makePayment("JohnCredit"); + + ps.makePayment("sandeepCreditCardId"); + ps.addPaymentMethod("sgDebitCardId", new DebitCard("5678", "Sandeep")); + ps.makePayment("sgDebitCardId"); + ps.addPaymentMethod("SgUPIID", new UPI("sg@okhdfcbank", "Sandeep")); + ps.makePayment("SgUPIID"); + + } +} +