Skip to content

Correción de SRP en clase Admi.java #4

@marandradec

Description

@marandradec

Problema actual

Actualmente, Admin.java hace tres cosas a la vez:

  • Interfaz gráfica (UI): Crear botones, tablas, labels, etc.
  • Lógica de negocio: Aprobar o rechazar usuarios, decidir acciones según su estado.
  • Acceso a base de datos: Conectar, ejecutar consultas y actualizar datos.

Esto hace que la clase sea difícil de mantener y de probar.

Propuesta de solución usando SRP

Se propone separar responsabilidades en clases distintas:

  • User → Modelo de datos
  • AdminUI → Interfaz y eventos
  • AdminService → Lógica de negocio
  • UserRepository → Acceso a base de datos

Código ejemplo de User

public class User {
    private String name;
    private String email;
    private String password;
    private String sq;
    private String answer;
    private String status;

    public User(String name, String email, String password, String sq, String answer, String status) {
        this.name = name;
        this.email = email;
        this.password = password;
        this.sq = sq;
        this.answer = answer;
        this.status = status;
    }

    public String getName() { return name; }
    public String getEmail() { return email; }
    public String getPassword() { return password; }
    public String getSq() { return sq; }
    public String getAnswer() { return answer; }
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}

Código ejemplo de AdminUI

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.*;
import java.util.List;
import java.util.Vector;

public class AdminUI extends JFrame {
    private JTable jTable1;
    private JTextField txtEmail;
    private JButton jButtonSearch, jButtonRefresh, jButtonClose;
    private JLabel jLabel1, jLabel2, jLabel4;

    private AdminService adminService;

    public AdminUI(AdminService adminService) {
        this.adminService = adminService;
        initComponents();
        refreshTable();
        txtEmail.requestFocus();
    }

    private void initComponents() {
        setUndecorated(true);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1 = new JLabel("Double Click on Table row to change Status");
        jLabel1.setFont(new java.awt.Font("Segoe UI", 1, 18));
        jLabel1.setForeground(new java.awt.Color(0,0,153));
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 50, 410, 36));

        jLabel2 = new JLabel("Search by Email");
        jLabel2.setFont(new java.awt.Font("Segoe UI", 1, 18));
        jLabel2.setForeground(new java.awt.Color(0,153,153));
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(390, 150, 140, 30));

        txtEmail = new JTextField();
        getContentPane().add(txtEmail, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 140, 186, 40));

        jButtonSearch = new JButton("Search");
        jButtonSearch.setBackground(new java.awt.Color(204,0,0));
        jButtonSearch.setForeground(new java.awt.Color(255,255,255));
        jButtonSearch.setFont(new java.awt.Font("Segoe UI",1,14));
        jButtonSearch.addActionListener(e -> onSearchButtonClicked());
        getContentPane().add(jButtonSearch, new org.netbeans.lib.awtextra.AbsoluteConstraints(740, 150, -1, -1));

        jButtonRefresh = new JButton("Refresh");
        jButtonRefresh.setBackground(new java.awt.Color(204,0,0));
        jButtonRefresh.setForeground(new java.awt.Color(255,255,255));
        jButtonRefresh.setFont(new java.awt.Font("Segoe UI",1,14));
        jButtonRefresh.addActionListener(e -> refreshTable());
        getContentPane().add(jButtonRefresh, new org.netbeans.lib.awtextra.AbsoluteConstraints(820, 150, -1, -1));

        jButtonClose = new JButton(new ImageIcon(getClass().getResource("/image/close.png")));
        jButtonClose.addActionListener(e -> dispose());
        getContentPane().add(jButtonClose, new org.netbeans.lib.awtextra.AbsoluteConstraints(1309, 0, -1, -1));

        jTable1 = new JTable();
        jTable1.setFont(new java.awt.Font("Segoe UI Semilight", 1, 14));
        jTable1.setModel(new DefaultTableModel(
            new Object [][] {},
            new String [] {"Name", "Email", "Password", "Security Question", "Answer", "Status"}
        ) {
            boolean[] canEdit = new boolean[] {false,false,false,false,false,false};
            public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; }
        });

        jTable1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                if(evt.getClickCount()==2) onTableRowDoubleClicked();
            }
        });

        JScrollPane jScrollPane1 = new JScrollPane(jTable1);
        getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 200, 1340, 550));

        jLabel4 = new JLabel(new ImageIcon(getClass().getResource("/image/admin Home.png")));
        getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1390, 770));

        pack();
    }

    private void onSearchButtonClicked() {
        String email = txtEmail.getText();
        if(email.isEmpty()) {
            JOptionPane.showMessageDialog(this,"Record Not Found");
        } else {
            List<User> users = adminService.getUsersByEmail(email);
            updateTable(users);
        }
    }

    private void onTableRowDoubleClicked() {
        int selectedRow = jTable1.getSelectedRow();
        if(selectedRow < 0) return;
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        String email = (String) model.getValueAt(selectedRow, 1);
        String status = (String) model.getValueAt(selectedRow, 5);

        User user = new User(
            (String)model.getValueAt(selectedRow,0),
            email,
            (String)model.getValueAt(selectedRow,2),
            (String)model.getValueAt(selectedRow,3),
            (String)model.getValueAt(selectedRow,4),
            status
        );

        int yes = JOptionPane.showConfirmDialog(this, "Change status for " + status + "?");
        if(yes == JOptionPane.YES_OPTION) {
            adminService.toggleUserStatus(user);
            refreshTable();
        }
    }

    private void updateTable(List<User> users) {
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        model.setRowCount(0);
        for(User user : users) {
            Vector<String> row = new Vector<>();
            row.add(user.getName());
            row.add(user.getEmail());
            row.add(user.getPassword());
            row.add(user.getSq());
            row.add(user.getAnswer());
            row.add(user.getStatus());
            model.addRow(row);
        }
    }

    private void refreshTable() {
        List<User> users = adminService.getAllUsers();
        updateTable(users);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            UserRepository repo = new UserRepository();
            AdminService service = new AdminService(repo);
            new AdminUI(service).setVisible(true);
        });
    }
}

Código ejemplo de AdminService

import java.util.List;

public class AdminService {
    private UserRepository userRepository;

    public AdminService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.getAllUsers();
    }

    public List<User> getUsersByEmail(String email) {
        return userRepository.findByEmail(email);
    }

    public void toggleUserStatus(User user) {
        String newStatus = user.getStatus().equalsIgnoreCase("pending") ? "approved" : "pending";
        user.setStatus(newStatus);
        userRepository.updateStatus(user.getEmail(), newStatus);
    }
}

Código ejemplo de UserRepository

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserRepository {

    private Connection getConnection() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel","root","Sudhir@123");
    }

    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        try (Connection con = getConnection();
             PreparedStatement pst = con.prepareStatement("SELECT * FROM signup");
             ResultSet rs = pst.executeQuery()) {

            while(rs.next()) {
                users.add(new User(
                    rs.getString("name"),
                    rs.getString("email"),
                    rs.getString("password"),
                    rs.getString("sq"),
                    rs.getString("answer"),
                    rs.getString("status")
                ));
            }
        } catch(Exception e) { e.printStackTrace(); }
        return users;
    }

    public List<User> findByEmail(String email) {
        List<User> users = new ArrayList<>();
        try (Connection con = getConnection();
             PreparedStatement pst = con.prepareStatement("SELECT * FROM signup WHERE email=?")) {
            pst.setString(1, email);
            try (ResultSet rs = pst.executeQuery()) {
                while(rs.next()) {
                    users.add(new User(
                        rs.getString("name"),
                        rs.getString("email"),
                        rs.getString("password"),
                        rs.getString("sq"),
                        rs.getString("answer"),
                        rs.getString("status")
                    ));
                }
            }
        } catch(Exception e) { e.printStackTrace(); }
        return users;
    }

    public void updateStatus(String email, String status) {
        try (Connection con = getConnection();
             PreparedStatement pst = con.prepareStatement("UPDATE signup SET status=? WHERE email=?")) {
            pst.setString(1, status);
            pst.setString(2, email);
            pst.executeUpdate();
        } catch(Exception e) { e.printStackTrace(); }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions