app/src/main/java/hexlet/code/repository/UrlsCheckRepository.java
package hexlet.code.repository;
import hexlet.code.model.UrlCheck;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static hexlet.code.repository.BaseRepository.dataSource;
public class UrlsCheckRepository {
public static void save(UrlCheck urlCheck) throws SQLException {
String sql = "INSERT INTO url_checks (url_id, status_code, h1, title, description, created_at) "
+ "VALUES (?, ?, ?, ?, ?, ?)";
var createdAt = new Timestamp(System.currentTimeMillis());
try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
stmt.setLong(1, urlCheck.getUrlId());
stmt.setInt(2, urlCheck.getStatusCode());
stmt.setString(3, urlCheck.getH1());
stmt.setString(4, urlCheck.getTitle());
stmt.setString(5, urlCheck.getDescription());
stmt.setTimestamp(6, createdAt);
stmt.executeUpdate();
var generatedKeys = stmt.getGeneratedKeys();
if (generatedKeys.next()) {
urlCheck.setId(generatedKeys.getLong(1));
} else {
throw new SQLException("DB have not returned an id after saving an entity");
}
}
}
public static Optional<List<UrlCheck>> getEntities(Long searchId) throws SQLException {
var sql = "SELECT * FROM url_checks where url_id = ?";
try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement(sql)) {
stmt.setLong(1, searchId);
var resultSet = stmt.executeQuery();
var result = new ArrayList<UrlCheck>();
while (resultSet.next()) {
var id = resultSet.getLong("id");
var urlId = resultSet.getLong("url_id");
var statusCode = resultSet.getInt("status_code");
var h1 = resultSet.getString("h1");
var title = resultSet.getString("title");
var description = resultSet.getString("description");
var createdAt = resultSet.getTimestamp("created_at");
var urlCheck = UrlCheck.builder()
.id(id)
.urlId(urlId)
.statusCode(statusCode)
.h1(h1)
.title(title)
.description(description)
.createdAt(createdAt)
.build();
result.add(urlCheck);
}
return Optional.of(result);
}
}
public static Optional<UrlCheck> find(Long id) throws SQLException {
var sql = "SELECT * FROM url_checks WHERE id = ?";
try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement(sql)) {
stmt.setLong(1, id);
var resultSet = stmt.executeQuery();
if (resultSet.next()) {
var urlId = resultSet.getLong("url_id");
var statusCode = resultSet.getInt("status_code");
var h1 = resultSet.getString("h1");
var title = resultSet.getString("title");
var description = resultSet.getString("description");
var createdAt = resultSet.getTimestamp("created_at");
var urlCheck = UrlCheck.builder()
.id(id)
.urlId(urlId)
.statusCode(statusCode)
.h1(h1)
.title(title)
.description(description)
.createdAt(createdAt)
.build();
return Optional.of(urlCheck);
}
return Optional.empty();
}
}
public static Map<Long, UrlCheck> findLatestChecks() throws SQLException {
var sql = "SELECT DISTINCT ON (url_id) * from url_checks order by url_id DESC, id DESC";
try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement(sql)) {
var resultSet = stmt.executeQuery();
var result = new HashMap<Long, UrlCheck>();
while (resultSet.next()) {
var id = resultSet.getLong("id");
var urlId = resultSet.getLong("url_id");
var statusCode = resultSet.getInt("status_code");
var title = resultSet.getString("title");
var h1 = resultSet.getString("h1");
var description = resultSet.getString("description");
var createdAt = resultSet.getTimestamp("created_at");
var check = new UrlCheck(statusCode, title, h1, description);
check.setId(id);
check.setUrlId(urlId);
check.setCreatedAt(createdAt);
result.put(urlId, check);
}
return result;
}
}
}