From 4186a87e40fffc6297c6dfb2df62fb432006af5c Mon Sep 17 00:00:00 2001
From: C24053098 <akbarb@cardiff.ac.uk>
Date: Wed, 11 Dec 2024 18:52:13 +0000
Subject: [PATCH] Bug fix search function Add and delete hospital

See merge request c24025433/healthcare!78
---
 .../nursinghome/NursingHomeController.java    | 22 ++++++++++++-
 .../mapper/NursingHomeMapper.java             | 32 ++++++++++++++++++
 .../service/NursingHomeService.java           |  1 +
 .../service/imp/NursingHomeServiceImp.java    | 33 ++++++++++++++++++-
 src/main/resources/static/js/beds.js          | 25 +++++++-------
 5 files changed, 100 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/cardiff/client_project/controller/nursinghome/NursingHomeController.java b/src/main/java/com/cardiff/client_project/controller/nursinghome/NursingHomeController.java
index e4bada7..f1ba66c 100644
--- a/src/main/java/com/cardiff/client_project/controller/nursinghome/NursingHomeController.java
+++ b/src/main/java/com/cardiff/client_project/controller/nursinghome/NursingHomeController.java
@@ -3,18 +3,24 @@ package com.cardiff.client_project.controller.nursinghome;
 import com.cardiff.client_project.pojo.dto.HospitalDTO;
 import com.cardiff.client_project.service.NursingHomeService;
 import com.cardiff.client_project.utils.Result;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
+@Slf4j
 @RestController
 @RequestMapping("/api/hospitals")
 @CrossOrigin(origins = "*")
 public class NursingHomeController {
 
+    private final NursingHomeService nursingHomeService;
+
     @Autowired
-    private NursingHomeService nursingHomeService;
+    public NursingHomeController(NursingHomeService nursingHomeService) {
+        this.nursingHomeService = nursingHomeService;
+    }
 
     // READ - Get available beds
     @GetMapping("/available")
@@ -58,4 +64,18 @@ public class NursingHomeController {
             return Result.error("Error deleting hospital: " + e.getMessage());
         }
     }
+
+    @GetMapping("/search")
+    public Result<List<HospitalDTO>> searchHospitals(@RequestParam(required = false) String name) {
+        try {
+            log.info("Searching hospitals with name: {}", name);
+            if (name == null || name.trim().isEmpty()) {
+                return nursingHomeService.getAvailableBeds();
+            }
+            return nursingHomeService.searchHospitals(name.trim());
+        } catch (Exception e) {
+            log.error("Error searching hospitals: ", e);
+            return Result.error("Error searching hospitals: " + e.getMessage());
+        }
+    }
 }
diff --git a/src/main/java/com/cardiff/client_project/mapper/NursingHomeMapper.java b/src/main/java/com/cardiff/client_project/mapper/NursingHomeMapper.java
index 5303ec1..612c72d 100644
--- a/src/main/java/com/cardiff/client_project/mapper/NursingHomeMapper.java
+++ b/src/main/java/com/cardiff/client_project/mapper/NursingHomeMapper.java
@@ -107,4 +107,36 @@ public class NursingHomeMapper {
         """;
         return jdbcTemplate.update(sql, currentPatients, hospitalId, currentPatients);
     }
+
+    public List<HospitalDTO> searchHospitals(String name) {
+        String sql = """
+            SELECT 
+                id,
+                name,
+                address,
+                phone,
+                maxAmount,
+                amountPatient
+            FROM hospital 
+            WHERE status = 1 
+            AND name LIKE CONCAT('%', ?, '%')
+            ORDER BY name ASC
+        """;
+
+        return jdbcTemplate.query(sql, 
+            ps -> ps.setString(1, name),
+            (rs, rowNum) -> {
+                HospitalDTO dto = new HospitalDTO();
+                dto.setId(rs.getInt("id"));
+                dto.setName(rs.getString("name"));
+                dto.setLocation(rs.getString("address"));
+                dto.setPhone(rs.getString("phone"));
+                int maxAmount = rs.getInt("maxAmount");
+                int amountPatient = rs.getInt("amountPatient");
+                dto.setTotalBeds(maxAmount);
+                dto.setAvailableBeds(maxAmount - amountPatient);
+                dto.setOccupancyRate(calculateOccupancy(maxAmount, amountPatient));
+                return dto;
+            });
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/cardiff/client_project/service/NursingHomeService.java b/src/main/java/com/cardiff/client_project/service/NursingHomeService.java
index c0e0026..48bcfe9 100644
--- a/src/main/java/com/cardiff/client_project/service/NursingHomeService.java
+++ b/src/main/java/com/cardiff/client_project/service/NursingHomeService.java
@@ -11,4 +11,5 @@ public interface NursingHomeService {
     Result<String> deletePatientById(List<Integer> ids);
     Result<List<HospitalDTO>> getAllPatients();
     Result<String> updateBedCount(int hospitalId, int currentPatients);
+    Result<List<HospitalDTO>> searchHospitals(String name);
 }
\ No newline at end of file
diff --git a/src/main/java/com/cardiff/client_project/service/imp/NursingHomeServiceImp.java b/src/main/java/com/cardiff/client_project/service/imp/NursingHomeServiceImp.java
index 8a3a75e..731f46c 100644
--- a/src/main/java/com/cardiff/client_project/service/imp/NursingHomeServiceImp.java
+++ b/src/main/java/com/cardiff/client_project/service/imp/NursingHomeServiceImp.java
@@ -7,14 +7,22 @@ import com.cardiff.client_project.utils.Result;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.dao.DataAccessException;
+import org.springframework.transaction.annotation.Transactional;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.List;
 
 @Service
+@Transactional
+@Slf4j
 public class NursingHomeServiceImp implements NursingHomeService {
 
+    private final NursingHomeMapper nursingHomeMapper;
+
     @Autowired
-    private NursingHomeMapper nursingHomeMapper;
+    public NursingHomeServiceImp(NursingHomeMapper nursingHomeMapper) {
+        this.nursingHomeMapper = nursingHomeMapper;
+    }
 
     @Override
     public Result<List<HospitalDTO>> getAvailableBeds() {
@@ -96,6 +104,29 @@ public class NursingHomeServiceImp implements NursingHomeService {
         }
     }
 
+    @Override
+    @Transactional(readOnly = true)
+    public Result<List<HospitalDTO>> searchHospitals(String name) {
+        try {
+            log.info("Searching hospitals with name: {}", name);
+            if (name == null || name.trim().isEmpty()) {
+                return Result.error("Search term cannot be empty");
+            }
+
+            List<HospitalDTO> hospitals = nursingHomeMapper.searchHospitals(name.trim());
+            if (hospitals.isEmpty()) {
+                log.info("No hospitals found matching: {}", name);
+                return Result.error("No hospitals found");
+            }
+
+            log.info("Found {} hospitals matching search term", hospitals.size());
+            return Result.success(hospitals);
+        } catch (Exception e) {
+            log.error("Error searching hospitals: ", e);
+            return Result.error("Failed to search hospitals");
+        }
+    }
+
     private boolean validateHospitalData(HospitalDTO hospitalDTO) {
         if (hospitalDTO == null) return false;
         return hospitalDTO.getName() != null &&
diff --git a/src/main/resources/static/js/beds.js b/src/main/resources/static/js/beds.js
index d251cb4..301f523 100644
--- a/src/main/resources/static/js/beds.js
+++ b/src/main/resources/static/js/beds.js
@@ -78,9 +78,6 @@ $(document).ready(function () {
     }
 
     function initializeEventHandlers() {
-        // Search Handler
-        $("#searchButton").click(handleSearch);
-
         // Add Hospital Handler
         $("#addHospitalBtn").click(function() {
             $("#hospitalModal").fadeIn();
@@ -159,17 +156,23 @@ $(document).ready(function () {
                 });
             }
         });
+
+        // Update event handler binding
+        $("#searchButton").click(handleSearch);
     }
 
     function handleSearch(event) {
         event.preventDefault();
         const searchTerm = $("#searchName").val().trim();
         
+        if (!searchTerm) {
+            loadHospitals();
+            return;
+        }
+
         $.ajax({
-            url: `${API_BASE_URL}/search`,
-            method: 'POST',
-            contentType: 'application/json',
-            data: JSON.stringify({ name: searchTerm }),
+            url: `${API_BASE_URL}/search?name=${encodeURIComponent(searchTerm)}`,
+            method: 'GET',
             success: function(response) {
                 if(response && response.code === 1) {
                     updateTable(response.data || []);
@@ -177,7 +180,10 @@ $(document).ready(function () {
                     showError('No hospitals found');
                 }
             },
-            error: handleAjaxError
+            error: function(xhr) {
+                console.error('Search Error:', xhr);
+                showError('Search failed');
+            }
         });
     }
 
@@ -326,9 +332,6 @@ $(document).ready(function () {
 
     $('<style>').text(styles).appendTo('head');
 
-    // Initialize tooltips and other UI enhancements
-    $('[data-toggle="tooltip"]').tooltip();
-    
     // Add fade effects for smoother transitions
     $('.table-container').hide().fadeIn();
 });
-- 
GitLab