From 8393bfce432343f348e62ab6e3bf9f36fa811338 Mon Sep 17 00:00:00 2001 From: KaNi-04 <136799210+KaNi-04@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:45:48 +0530 Subject: [PATCH] News API Controller Added --- pom.xml | 12 ++ .../CsvImagePdfGenerator.java | 199 ++++++++++++++++++ .../configuration/DataSourceConfig.java | 11 + .../controller/NewsAPIController.java | 30 +++ .../service/NewsAPIService.java | 69 ++++++ 5 files changed, 321 insertions(+) create mode 100644 src/main/java/com/gcc/commissionerreview/CsvImagePdfGenerator.java create mode 100644 src/main/java/com/gcc/commissionerreview/controller/NewsAPIController.java create mode 100644 src/main/java/com/gcc/commissionerreview/service/NewsAPIService.java diff --git a/pom.xml b/pom.xml index 324f0a5..0799679 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,18 @@ test --> + + com.opencsv + opencsv + 5.9 + + + + com.itextpdf + itextpdf + 5.5.13.3 + + diff --git a/src/main/java/com/gcc/commissionerreview/CsvImagePdfGenerator.java b/src/main/java/com/gcc/commissionerreview/CsvImagePdfGenerator.java new file mode 100644 index 0000000..5627565 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/CsvImagePdfGenerator.java @@ -0,0 +1,199 @@ +package com.gcc.commissionerreview; + +import com.opencsv.CSVReader; +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +import java.io.*; +import java.net.URL; +import java.util.*; +import java.util.List; + +public class CsvImagePdfGenerator { + + // Base output directory for generated PDFs + private static final String OUTPUT_DIR = "C:/Users/prave/Downloads/Banner Removal Report/14052026/"; + private static final String REPORT_DATE = "14/05/2026"; + + public static void main(String[] args) { + + String csvFile = "C:/Users/prave/Downloads/Banner_Removal_Report_14052026.csv"; + + try { + + CSVReader reader = new CSVReader(new FileReader(csvFile)); + + String[] row; + + // Skip Header + reader.readNext(); + + // Group rows by zone value (preserves insertion order) + Map> zoneGroupedRows = new LinkedHashMap<>(); + + while ((row = reader.readNext()) != null) { + + String zone = row[6]; + + zoneGroupedRows + .computeIfAbsent(zone, k -> new ArrayList<>()) + .add(row); + } + + reader.close(); + + // Generate a separate PDF for each zone + for (Map.Entry> entry : zoneGroupedRows.entrySet()) { + + String zone = entry.getKey(); + List rows = entry.getValue(); + + // Sanitize zone name for use in filename + String safeZoneName = zone.replaceAll("[^a-zA-Z0-9_\\-]", "_"); + + String outputPdf = OUTPUT_DIR + + "banner_removal_report_zone_" + safeZoneName + + "_14052026.pdf"; + + generatePdfForZone(zone, rows, outputPdf); + + System.out.println("PDF Generated for Zone: " + zone + + " -> " + outputPdf); + } + + System.out.println("All PDFs Generated Successfully!"); + + } catch (Exception e) { + + e.printStackTrace(); + } + } + + /** + * Generates a PDF file containing all records for the given zone. + */ + private static void generatePdfForZone(String zone, List rows, + String outputPdf) throws Exception { + + Document document = new Document(PageSize.A4.rotate()); + PdfWriter.getInstance(document, new FileOutputStream(outputPdf)); + + document.open(); + + for (String[] row : rows) { + + String id = row[0]; + String name = row[1]; + String categoryId = row[2]; + String latitude = row[4]; + String longitude = row[5]; + // zone is already known from the parameter + String ward = row[7]; + String streetId = row[8]; + String streetName = row[9]; + String cdate = row[10]; + + String beforeImageUrl = row[11]; + String afterImageUrl = row[13]; + + // Title + Font boldFont = new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD); + + Paragraph title = new Paragraph( + "Banner Removal Report - " + REPORT_DATE + + " | Zone: " + zone, + boldFont); + + document.add(title); + document.add(new Paragraph(" ")); + + // Details Table + PdfPTable detailsTable = new PdfPTable(2); + detailsTable.setWidthPercentage(100); + + detailsTable.addCell("Category ID"); + detailsTable.addCell(categoryId); + + detailsTable.addCell("Zone"); + detailsTable.addCell(zone); + + detailsTable.addCell("Ward"); + detailsTable.addCell(ward); + + detailsTable.addCell("Street"); + detailsTable.addCell(streetName); + + detailsTable.addCell("Latitude"); + detailsTable.addCell(latitude); + + detailsTable.addCell("Longitude"); + detailsTable.addCell(longitude); + + detailsTable.addCell("Enumerated Date"); + detailsTable.addCell(cdate); + + detailsTable.addCell("Removal Date"); + detailsTable.addCell(REPORT_DATE); + + document.add(detailsTable); + + document.add(new Paragraph(" ")); + + // Image Table + PdfPTable imageTable = new PdfPTable(2); + imageTable.setWidthPercentage(100); + + imageTable.addCell("Before Image"); + imageTable.addCell("After Image"); + + // BEFORE IMAGE + PdfPCell beforeCell; + + try { + + Image beforeImage = Image.getInstance(new URL(beforeImageUrl)); + + beforeImage.scaleToFit(250, 250); + + beforeCell = new PdfPCell(beforeImage); + + } catch (Exception e) { + + beforeCell = new PdfPCell( + new Phrase("Before Image Not Available")); + } + + // AFTER IMAGE + PdfPCell afterCell; + + try { + + Image afterImage = Image.getInstance(new URL(afterImageUrl)); + + afterImage.scaleToFit(250, 250); + + afterCell = new PdfPCell(afterImage); + + } catch (Exception e) { + + afterCell = new PdfPCell( + new Phrase("After Image Not Available")); + } + + imageTable.addCell(beforeCell); + imageTable.addCell(afterCell); + + document.add(imageTable); + + // Separator + document.add(new Paragraph( + "------------------------------------------------------------")); + + document.newPage(); + } + + document.close(); + } +} diff --git a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java index aec60c1..72b892d 100644 --- a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java +++ b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java @@ -180,4 +180,15 @@ public class DataSourceConfig { return dataSource; } + ////////////////////////////// News Feed ///////////////// + @Bean(name = "mysqlNewsFeedDataSource") + public DataSource mysqlNewsFeedDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/coc_web"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/controller/NewsAPIController.java b/src/main/java/com/gcc/commissionerreview/controller/NewsAPIController.java new file mode 100644 index 0000000..80e97a4 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/NewsAPIController.java @@ -0,0 +1,30 @@ +package com.gcc.commissionerreview.controller; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.gcc.commissionerreview.service.NewsAPIService; + +@RestController +@RequestMapping("/commissionerreview/api/newsapi") +public class NewsAPIController { + + @Autowired + NewsAPIService newsAPIService; + + @GetMapping("/getNewsFeed") + public List> getNewsFeed() { + return newsAPIService.getNewsFeed(); + } + + // @GetMapping("/getNewsContent") + // public Map getNewsContent() { + // return newsAPIService.getNewsContent(); + // } + +} diff --git a/src/main/java/com/gcc/commissionerreview/service/NewsAPIService.java b/src/main/java/com/gcc/commissionerreview/service/NewsAPIService.java new file mode 100644 index 0000000..aa911f7 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/NewsAPIService.java @@ -0,0 +1,69 @@ +package com.gcc.commissionerreview.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class NewsAPIService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("mysqlNewsFeedDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List> getNewsFeed() { + String sql = "SELECT REGEXP_REPLACE(REGEXP_REPLACE(news_content, '<[^>]+>', ''),'[\r\n]+',' ') AS Content " + + "FROM tbl_news ORDER BY news_id DESC LIMIT 15"; + return jdbcTemplate.queryForList(sql); + } + + /* + * public Map getNewsContent() { + * + * String sql = "SELECT news_title, news_type FROM tbl_news " + * + "WHERE news_type = 1 ORDER BY news_id DESC LIMIT 10"; + * + * List> rows = jdbcTemplate.queryForList(sql); + * + * List> unicodeList = new ArrayList<>(); + * + * for (Map row : rows) { + * String content = row.get("news_title") != null ? + * row.get("news_title").toString() : ""; + * if (!content.isEmpty()) { + * + * content = content.replaceAll( + * "

" + * + "", + * ""); + * content = content.replaceAll("

", ""); + * content = content.replaceAll("\n", ""); + * content = content.replaceAll("\r", ""); + * content = content.replaceAll("\r\n", ""); + * + * content = content.replaceAll("<[^>]+>", "").trim(); + * + * Map entry = new HashMap<>(); + * entry.put("Content", content); + * unicodeList.add(entry); + * } + * } + * + * Map result = new HashMap<>(); + * result.put("Unicode", unicodeList); + * return result; + * } + */ +}