All GCC vendors and employee details for IT department management
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

393 lines
15 KiB

package com.gcc_manpower.gcctapaldetailsmanagement.controller;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.CacheControl;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.gcc_manpower.gcctapaldetailsmanagement.service.TapalService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@Controller
@RequestMapping("/gcctapaldetailsmanagement")
public class TapalController {
@Autowired
private TapalService tapalService;
@Autowired
private AuthenticationManager authenticationManager;
@Value("${tapal.upload.path:gcctapalfiles}")
private String tapalUploadPathConfig;
@GetMapping({ "", "/", "/dashboard" })
public String viewDashboard(Model model, HttpSession session) {
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
return "redirect:/gcctapaldetailsmanagement/login";
}
String usrRole = (String) session.getAttribute("tap_usrRole");
boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole);
model.addAttribute("isLoggedIn", true);
model.addAttribute("isAdmin", isAdmin);
model.addAttribute("usrName", username);
model.addAttribute("curPage", "gcctapaldetailsmanagement");
return "gcctapaldetailsmanagement/dashboard";
}
@GetMapping("/details")
public String viewDetails(HttpSession session, Model model) {
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
return "redirect:/gcctapaldetailsmanagement/login";
}
String usrRole = (String) session.getAttribute("tap_usrRole");
boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole);
model.addAttribute("isLoggedIn", true);
model.addAttribute("isAdmin", isAdmin);
model.addAttribute("usrName", username);
model.addAttribute("curPage", "gcctapaldetailsmanagement");
return "gcctapaldetailsmanagement/details";
}
@GetMapping("/login")
public String login(HttpSession session) {
return "gcctapaldetailsmanagement/login";
}
@PostMapping("/api/login")
@ResponseBody
public Map<String, Object> validateLogin(
@RequestParam("usrName") String usrName,
@RequestParam("usrPass") String usrPass,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
try {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(usrName,
usrPass);
Authentication authentication = authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
SecurityContextHolder.getContext());
String role = authentication.getAuthorities().stream()
.map(auth -> auth.getAuthority().replace("ROLE_", ""))
.findFirst()
.orElse("USER");
session.setAttribute("tap_usrName", usrName);
session.setAttribute("tap_usrRole", role);
session.setMaxInactiveInterval(1800); // 30 minutes session timeout
response.put("result", true);
response.put("usrName", usrName);
} catch (AuthenticationException e) {
response.put("result", false);
response.put("error", e.getMessage() != null ? e.getMessage() : "Invalid username or password!");
}
return response;
}
@GetMapping("/logout")
public String logout(HttpSession session, HttpServletRequest request) {
SecurityContextHolder.clearContext();
if (session != null) {
session.removeAttribute("tap_usrName");
session.removeAttribute("tap_usrRole");
session.invalidate();
}
request.getSession(true);
return "redirect:/gcctapaldetailsmanagement/login";
}
@GetMapping("/api/counts")
@ResponseBody
public ResponseEntity<Map<String, Integer>> getCounts() {
return ResponseEntity.ok()
.cacheControl(CacheControl.noCache().mustRevalidate())
.body(tapalService.getCountsByCategory());
}
@GetMapping("/api/list")
@ResponseBody
public ResponseEntity<List<Map<String, Object>>> listDetails(
@RequestParam(value = "category", required = false) String category,
@RequestParam(value = "fromDate", required = false) String fromDate,
@RequestParam(value = "toDate", required = false) String toDate,
@RequestParam(value = "status", required = false) String status) {
List<Map<String, Object>> details = tapalService.searchTapals(category, fromDate, toDate, status);
return ResponseEntity.ok()
.cacheControl(CacheControl.noCache().mustRevalidate())
.body(details);
}
@PostMapping("/api/save")
@ResponseBody
public Map<String, Object> saveDetail(
@RequestBody Map<String, Object> payload,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
response.put("success", false);
response.put("error", "Unauthorized access! Please log in.");
return response;
}
String usrRole = (String) session.getAttribute("tap_usrRole");
if (usrRole == null) {
usrRole = (String) session.getAttribute("usrRole");
}
if (!"ADMIN".equalsIgnoreCase(usrRole)) {
response.put("success", false);
response.put("error", "Access denied! Only admins can save or update records.");
return response;
}
try {
boolean saved = tapalService.saveOrUpdateTapal(payload, username);
response.put("success", saved);
if (!saved) {
response.put("error", "Failed to save Tapal details to database.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "Error: " + e.getMessage());
}
return response;
}
@PostMapping("/api/delete")
@ResponseBody
public Map<String, Object> deleteDetail(
@RequestParam("id") int id,
@RequestParam(value = "remarks", required = false, defaultValue = "") String remarks,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
response.put("success", false);
response.put("error", "Unauthorized access! Please log in.");
return response;
}
String usrRole = (String) session.getAttribute("tap_usrRole");
if (usrRole == null) {
usrRole = (String) session.getAttribute("usrRole");
}
if (!"ADMIN".equalsIgnoreCase(usrRole)) {
response.put("success", false);
response.put("error", "Access denied! Only admins can delete records.");
return response;
}
try {
boolean deleted = tapalService.deleteTapal(id, remarks, username);
response.put("success", deleted);
if (!deleted) {
response.put("error", "Failed to delete record.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "Error: " + e.getMessage());
}
return response;
}
@PostMapping("/api/upload-file")
@ResponseBody
public Map<String, Object> uploadFile(
@RequestParam("file") MultipartFile file,
@RequestParam(value = "type", required = false, defaultValue = "tapal") String type,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
response.put("success", false);
response.put("error", "Unauthorized access! Please log in.");
return response;
}
String usrRole = (String) session.getAttribute("tap_usrRole");
if (usrRole == null) {
usrRole = (String) session.getAttribute("usrRole");
}
if (!"ADMIN".equalsIgnoreCase(usrRole)) {
response.put("success", false);
response.put("error", "Access denied! Only admins can upload files.");
return response;
}
if (file.isEmpty()) {
response.put("success", false);
response.put("error", "Please select a file to upload.");
return response;
}
try {
File parentDir = new File(tapalUploadPathConfig).getAbsoluteFile();
File destDir = parentDir;
String webPathPrefix = "/gcctapalfiles/";
if ("oc".equalsIgnoreCase(type)) {
destDir = new File(parentDir, "oc");
webPathPrefix = "/gcctapalfiles/oc/";
}
if (!destDir.exists()) {
destDir.mkdirs();
}
String originalFilename = file.getOriginalFilename();
String nameWithoutExt = type;
String ext = ".pdf";
if (originalFilename != null && originalFilename.contains(".")) {
int dotIdx = originalFilename.lastIndexOf(".");
nameWithoutExt = originalFilename.substring(0, dotIdx);
ext = originalFilename.substring(dotIdx);
}
nameWithoutExt = nameWithoutExt.replaceAll("[^a-zA-Z0-9-_]", "_");
String savedFilename = nameWithoutExt + "_" + System.currentTimeMillis() + ext;
File destFile = new File(destDir, savedFilename).getAbsoluteFile();
file.transferTo(destFile);
String fileWebUrl = webPathPrefix + savedFilename;
response.put("success", true);
response.put("filePath", fileWebUrl);
} catch (Exception e) {
response.put("success", false);
response.put("error", "File upload failed: " + e.getMessage());
}
return response;
}
@GetMapping("/api/categories")
@ResponseBody
public List<Map<String, Object>> getActiveCategories() {
return tapalService.getActiveCategories();
}
@GetMapping("/api/statuslist")
@ResponseBody
public List<Map<String, Object>> getStatusList() {
return tapalService.getActiveStatuses();
}
@GetMapping("/api/history")
@ResponseBody
public ResponseEntity<List<Map<String, Object>>> getHistory(
@RequestParam("tapalNo") String tapalNo,
HttpSession session) {
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
return ResponseEntity.status(401).body(null);
}
return ResponseEntity.ok()
.cacheControl(CacheControl.noCache().mustRevalidate())
.body(tapalService.getHistory(tapalNo));
}
@GetMapping("/api/deleted-list")
@ResponseBody
public ResponseEntity<List<Map<String, Object>>> getDeletedList(HttpSession session) {
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
return ResponseEntity.status(401).body(null);
}
return ResponseEntity.ok()
.cacheControl(CacheControl.noCache().mustRevalidate())
.body(tapalService.getDeletedTapals());
}
@PostMapping("/api/restore")
@ResponseBody
public Map<String, Object> restoreDetail(
@RequestParam("id") int id,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
String username = (String) session.getAttribute("tap_usrName");
if (username == null) {
username = (String) session.getAttribute("usrName");
}
if (username == null) {
response.put("success", false);
response.put("error", "Unauthorized access! Please log in.");
return response;
}
String usrRole = (String) session.getAttribute("tap_usrRole");
if (usrRole == null) {
usrRole = (String) session.getAttribute("usrRole");
}
if (!"ADMIN".equalsIgnoreCase(usrRole)) {
response.put("success", false);
response.put("error", "Access denied! Only admins can restore records.");
return response;
}
try {
boolean restored = tapalService.restoreTapal(id, username);
response.put("success", restored);
if (!restored) {
response.put("error", "Failed to restore record.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "Error: " + e.getMessage());
}
return response;
}
}