package com.kritsit.casetracker.server.datalayer; import com.kritsit.casetracker.shared.domain.model.Defendant; import com.kritsit.casetracker.shared.domain.model.Incident; import java.sql.SQLException; import java.time.LocalDate; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class IncidentRepository implements IIncidentRepository { private final Logger logger = LoggerFactory.getLogger(IncidentRepository.class); private final IPersistenceService db; public IncidentRepository(IPersistenceService db){ this.db = db; } public Incident getIncident(String caseNumber) throws RowToModelParseException { try { logger.info("Fetching incident for case {}", caseNumber); String sql = "SELECT incidents.* FROM incidents INNER JOIN(cases) " + "WHERE incidents.id=cases.incidentId AND cases.caseNumber=?;"; List<Map<String, String>> rs = db.executeQuery(sql, caseNumber); if(rs == null || rs.isEmpty()) { logger.debug("No incident found for case {}", caseNumber); return null; } int indexId = Integer.parseInt(rs.get(0).get("id")); String region = rs.get(0).get("region"); LocalDate date = LocalDate.parse(rs.get(0).get("incidentDate")); LocalDate followUpDate = LocalDate.parse(rs.get(0).get("followUpDate")); boolean isFollowedUp = "1".equals(rs.get(0).get("followedUp")); if (rs.get(0).get("address") == null) { float longitude = Float.parseFloat(rs.get(0).get("longitude")); float latitude = Float.parseFloat(rs.get(0).get("latitude")); Incident i = new Incident(indexId, longitude, latitude, region, date, followUpDate, isFollowedUp); return i; } else { String address = rs.get(0).get("address"); Incident i = new Incident(indexId, address, region, date, followUpDate, isFollowedUp); return i; } } catch (SQLException e){ logger.error("Error retrieving incident for {}", caseNumber, e); throw new RowToModelParseException("Error retrieving incident from " + "database for case number: " + caseNumber, e); } } public int insertIncident(Incident incident) throws RowToModelParseException { try { logger.info("Adding {}", incident.toString()); String isFollowedUp = incident.isFollowedUp() ? "1" : "0"; List<Map<String, String>> rs = null; if (incident.getAddress() == null || incident.getAddress().isEmpty()) { String update = "INSERT INTO incidents VALUES (NULL, ?, ?, NULL, ?, ?, ?, ?);"; db.executeUpdate(update, String.valueOf(incident.getLongitude()), String.valueOf(incident.getLatitude()), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString(), isFollowedUp); String query = "SELECT id FROM incidents WHERE longitude=? AND " + "latitude=? AND region=? AND incidentDate=? AND followUpDate=?;"; rs = db.executeQuery(query, String.valueOf(incident.getLongitude()), String.valueOf(incident.getLatitude()), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString()); } else { String sql = "INSERT INTO incidents VALUES (NULL, NULL, NULL, ?, ?, ?, ?, ?);"; db.executeUpdate(sql, incident.getAddress(), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString(), isFollowedUp); String query = "SELECT id FROM incidents WHERE address=? AND " + "region=? AND incidentDate=? AND followUpDate=?;"; rs = db.executeQuery(query, incident.getAddress(), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString()); } if (rs == null || rs.isEmpty()) { logger.warn("No incident added"); throw new RowToModelParseException("Error inserting " + incident.toString(), null); } return Integer.parseInt(rs.get(0).get("id")); } catch (SQLException e) { logger.error("Error inserting {}", incident.toString(), e); throw new RowToModelParseException("Error inserting " + incident.toString(), e); } } public void updateIncident(Incident incident) throws RowToModelParseException { try { logger.info("Updating {}", incident.toString()); String isFollowedUp = incident.isFollowedUp() ? "1" : "0"; if (incident.getAddress() == null || incident.getAddress().isEmpty()) { String update = "UPDATE incidents SET latitude=?, longitude=?, " + "address=NULL, region=?, incidentDate=?, followUpDate=?, " + "followedUp=? WHERE id=?;"; db.executeUpdate(update, String.valueOf(incident.getLongitude()), String.valueOf(incident.getLatitude()), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString(), isFollowedUp, String.valueOf(incident.getIndexId())); } else { String update = "UPDATE incidents SET latitude=NULL, longitude=NULL, " + "address=?, region=?, incidentDate=?, followUpDate=?, " + "followedUp=? WHERE id=?;"; db.executeUpdate(update, incident.getAddress(), incident.getRegion(), incident.getDate().toString(), incident.getFollowUpDate().toString(), isFollowedUp, String.valueOf(incident.getIndexId())); } } catch (SQLException e) { logger.error("Error updating {}", incident.toString(), e); throw new RowToModelParseException("Error updating " + incident.toString(), e); } } }