diff --git a/Java/Spring/covidTracker/README.md b/Java/Spring/covidTracker/README.md new file mode 100644 index 0000000..cb7c5f6 --- /dev/null +++ b/Java/Spring/covidTracker/README.md @@ -0,0 +1,19 @@ +# Simple COVID-19 Tracker +#### Simple project made using Spring to track the total and new cases of COVID around the world. + +This project works with the help of a CSV data extracted from https://github.com/CSSEGISandData/COVID-19. + + + +## How to run the program: + +> Clone the repository + +> Use an IDE that you prefer, I use IntelliJ + +> Run CovidTrackerApplication.java + +> Enter your favorite browser, and access http://localhost:8080 + + +#### This tracker refreshes for new cases every hour. diff --git a/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/CovidTrackerApplication.java b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/CovidTrackerApplication.java new file mode 100644 index 0000000..d703bf6 --- /dev/null +++ b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/CovidTrackerApplication.java @@ -0,0 +1,14 @@ +package com.github.covidtracker; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class CovidTrackerApplication { + + public static void main(String[] args) { + SpringApplication.run(CovidTrackerApplication.class, args); + } +} diff --git a/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/controllers/HomeController.java b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/controllers/HomeController.java new file mode 100644 index 0000000..cec6a92 --- /dev/null +++ b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/controllers/HomeController.java @@ -0,0 +1,30 @@ +package com.github.covidtracker.controllers; + +import com.github.covidtracker.models.LocationStats; +import com.github.covidtracker.services.CovidDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +@Controller +public class HomeController { + + @Autowired + CovidDataService covidDataService; + + @GetMapping("/") + public String home(Model model) { + List allStats = covidDataService.getAllStats(); + int totalReportedCases = allStats.stream().mapToInt(LocationStats::getLatestTotalCases).sum(); + int dailyCases = allStats.stream().mapToInt(LocationStats::getNewDailyCases).sum(); + int newCases = totalReportedCases - dailyCases; + model.addAttribute("locationStats", allStats); + model.addAttribute("totalReportedCases", totalReportedCases); + model.addAttribute("newCases", newCases); + return "home"; + } + +} diff --git a/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/models/LocationStats.java b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/models/LocationStats.java new file mode 100644 index 0000000..8db1ecd --- /dev/null +++ b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/models/LocationStats.java @@ -0,0 +1,54 @@ +package com.github.covidtracker.models; + +public class LocationStats { + + private String state; + private String country; + private int latestTotalCases; + private int newDailyCases; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public int getLatestTotalCases() { + return latestTotalCases; + } + + public void setLatestTotalCases(int latestTotalCases) { + this.latestTotalCases = latestTotalCases; + } + + public int getNewDailyCases() { + return newDailyCases; + } + + public void setNewDailyCases(int newDailyCases) { + this.newDailyCases = newDailyCases; + } + + public int dailyNew() { + return latestTotalCases - newDailyCases; + } + @Override + public String toString() { + return "LocationStats{" + + "state='" + state + '\'' + + ", country='" + country + '\'' + + ", latestTotalCases=" + latestTotalCases + + ", newDailyCases=" + dailyNew() + + '}'; + } +} diff --git a/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/services/CovidDataService.java b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/services/CovidDataService.java new file mode 100644 index 0000000..1c9f1d9 --- /dev/null +++ b/Java/Spring/covidTracker/src/main/java/com/github/covidtracker/services/CovidDataService.java @@ -0,0 +1,52 @@ +package com.github.covidtracker.services; +import com.github.covidtracker.models.LocationStats; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVRecord; +import org.apache.tomcat.util.http.parser.HttpParser; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.io.StringReader; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.ArrayList; +import java.util.List; + +@Service +public class CovidDataService { + + private static String VIRUS_DATA_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; + + private List allStats = new ArrayList<>(); + + public List getAllStats() { + return allStats; + } + + @PostConstruct + @Scheduled(cron = "* * 1 * * *") + public void fetchData() throws IOException, InterruptedException { + List newStats = new ArrayList<>(); + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(VIRUS_DATA_URL)) + .build(); + HttpResponse httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); + StringReader csvBodyReader = new StringReader(httpResponse.body()); + Iterable records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(csvBodyReader); + for (CSVRecord record : records) { + LocationStats locationStat = new LocationStats(); + locationStat.setState(record.get("Province/State")); + locationStat.setCountry(record.get("Country/Region")); + locationStat.setLatestTotalCases(Integer.parseInt(record.get(record.size() - 1))); + locationStat.setNewDailyCases(Integer.parseInt(record.get(record.size() - 2))); + newStats.add(locationStat); + } + this.allStats = newStats; + } + +} diff --git a/Java/Spring/covidTracker/src/main/resources/application.properties b/Java/Spring/covidTracker/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Java/Spring/covidTracker/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/Java/Spring/covidTracker/src/main/resources/templates/home.html b/Java/Spring/covidTracker/src/main/resources/templates/home.html new file mode 100644 index 0000000..c7a1a30 --- /dev/null +++ b/Java/Spring/covidTracker/src/main/resources/templates/home.html @@ -0,0 +1,51 @@ + + + + + + COVID Tracker + + + + + + + +
+
+

Simple COVID-19 Tracker

+
+

This application shows current number of cases from all over Za Warudo!

+

Made with Spring Spring icon.

+ +
+

Total cases reported as of today:

+

+
+

+ New cases reported since previous day:
+ +

+
+ +
+ + + + + + + + + + + + + +
Country/RegionProvince/StateTotal Cases ReportedDaily New Cases
N/AN/A00
+
+
+ + + \ No newline at end of file diff --git a/Java/Spring/covidTracker/src/test/java/com/github/covidtracker/CovidTrackerApplicationTests.java b/Java/Spring/covidTracker/src/test/java/com/github/covidtracker/CovidTrackerApplicationTests.java new file mode 100644 index 0000000..10a824e --- /dev/null +++ b/Java/Spring/covidTracker/src/test/java/com/github/covidtracker/CovidTrackerApplicationTests.java @@ -0,0 +1,13 @@ +package com.github.covidtracker; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CovidTrackerApplicationTests { + + @Test + void contextLoads() { + } + +}