Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.patinanetwork.codebloom.common.db.models.question.topic;

import java.time.LocalDateTime;
import java.util.Optional;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
Expand All @@ -22,10 +23,10 @@ public class QuestionTopic {
private String id;

@NullColumn
private String questionId;
private Optional<String> questionId;

@NullColumn
private String questionBankId;
private Optional<String> questionBankId;

@NotNullColumn
private String topicSlug;
Expand All @@ -35,4 +36,26 @@ public class QuestionTopic {

@NotNullColumn
private LocalDateTime createdAt;

public static class QuestionTopicBuilder {
public QuestionTopicBuilder questionId(String questionId) {
this.questionId = Optional.ofNullable(questionId);
return this;
}

public QuestionTopicBuilder questionBankId(String questionBankId) {
this.questionBankId = Optional.ofNullable(questionBankId);
return this;
}

public QuestionTopic build() {
if (this.questionId == null) {
this.questionId = Optional.empty();
}
if (this.questionBankId == null) {
this.questionBankId = Optional.empty();
}
return new QuestionTopic(id, questionId, questionBankId, topicSlug, topic, createdAt);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package org.patinanetwork.codebloom.common.db.repos.question.topic;

import java.util.List;
import java.util.Optional;
import org.patinanetwork.codebloom.common.db.models.question.topic.LeetcodeTopicEnum;
import org.patinanetwork.codebloom.common.db.models.question.topic.QuestionTopic;

public interface QuestionTopicRepository {

List<QuestionTopic> findQuestionTopicsByQuestionId(String questionId);

List<QuestionTopic> findQuestionTopicsByQuestionBankId(String questionBankId);

QuestionTopic findQuestionTopicById(String id);
Optional<QuestionTopic> findQuestionTopicById(String id);

QuestionTopic findQuestionTopicByQuestionIdAndTopicEnum(String questionId, LeetcodeTopicEnum topicEnum);
Optional<QuestionTopic> findQuestionTopicByQuestionIdAndTopicEnum(String questionId, LeetcodeTopicEnum topicEnum);

/**
* @note - The provided object's methods will be overridden with any returned data from the database.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import javax.sql.DataSource;
import org.patinanetwork.codebloom.common.db.helper.NamedPreparedStatement;
Expand All @@ -15,23 +16,30 @@
@Component
public class QuestionTopicSqlRepository implements QuestionTopicRepository {

private final DataSource ds;
private static final String COL_ID = "id";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this a little redundant?

private static final String COL_QUESTION_ID = "questionId";
private static final String COL_QUESTION_BANK_ID = "questionBankId";
private static final String COL_TOPIC_SLUG = "topicSlug";
private static final String COL_TOPIC = "topic";
private static final String COL_CREATED_AT = "createdAt";

private QuestionTopic mapResultSetToQuestionTopic(final ResultSet resultSet) throws SQLException {
return QuestionTopic.builder()
.id(resultSet.getString("id"))
.createdAt(resultSet.getTimestamp("createdAt").toLocalDateTime())
.questionId(resultSet.getString("questionId"))
.questionBankId(resultSet.getString("questionBankId"))
.topicSlug(resultSet.getString("topicSlug"))
.topic(LeetcodeTopicEnum.fromValue(resultSet.getString("topic")))
.build();
}
private final DataSource ds;

public QuestionTopicSqlRepository(final DataSource ds) {
this.ds = ds;
}

private QuestionTopic mapResultSetToQuestionTopic(final ResultSet rs) throws SQLException {
return QuestionTopic.builder()
.id(rs.getString(COL_ID))
.createdAt(rs.getTimestamp(COL_CREATED_AT).toLocalDateTime())
.questionId(rs.getString(COL_QUESTION_ID))
.questionBankId(rs.getString(COL_QUESTION_BANK_ID))
.topicSlug(rs.getString(COL_TOPIC_SLUG))
.topic(LeetcodeTopicEnum.fromValue(rs.getString(COL_TOPIC)))
.build();
}

@Override
public List<QuestionTopic> findQuestionTopicsByQuestionId(final String questionId) {
List<QuestionTopic> result = new ArrayList<>();
Expand All @@ -48,11 +56,11 @@
"QuestionTopic" qt
WHERE
qt."questionId" = :questionId
""";
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("questionId", UUID.fromString(questionId));
stmt.setObject(COL_QUESTION_ID, UUID.fromString(questionId));

try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Expand Down Expand Up @@ -82,11 +90,11 @@
"QuestionTopic" qt
WHERE
qt."questionBankId" = :questionBankId
""";
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("questionBankId", UUID.fromString(questionBankId));
stmt.setObject(COL_QUESTION_BANK_ID, UUID.fromString(questionBankId));

try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Expand All @@ -101,41 +109,39 @@
}

@Override
public QuestionTopic findQuestionTopicById(final String id) {
try {
String sql = """
SELECT
id,
"questionId",
"questionBankId",
"topicSlug",
"createdAt",
"topic"
FROM
"QuestionTopic" qt
WHERE
qt.id = :id
public Optional<QuestionTopic> findQuestionTopicById(final String id) {
String sql = """
SELECT
id,
"questionId",
"questionBankId",
"topicSlug",
"createdAt",
"topic"
FROM
"QuestionTopic" qt
WHERE
qt.id = :id
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("id", UUID.fromString(id));
try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject(COL_ID, UUID.fromString(id));

try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return mapResultSetToQuestionTopic(rs);
}
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return Optional.of(mapResultSetToQuestionTopic(rs));
}
}

return null;
return Optional.empty();
} catch (Exception e) {
throw new RuntimeException("Failed to get question topic by ID", e);
}
}

@Override
public QuestionTopic findQuestionTopicByQuestionIdAndTopicEnum(
public Optional<QuestionTopic> findQuestionTopicByQuestionIdAndTopicEnum(
final String questionId, final LeetcodeTopicEnum topicEnum) {
String sql = """
SELECT
Expand All @@ -151,60 +157,50 @@
qt."questionId" = :questionId
AND
qt.topic = :topic
""";
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("questionId", UUID.fromString(questionId));
stmt.setObject("topic", topicEnum.getLeetcodeEnum(), java.sql.Types.OTHER);
stmt.setObject(COL_QUESTION_ID, UUID.fromString(questionId));
stmt.setObject(COL_TOPIC, topicEnum.getLeetcodeEnum(), java.sql.Types.OTHER);

try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return mapResultSetToQuestionTopic(rs);
return Optional.of(mapResultSetToQuestionTopic(rs));
}
}

return null;
return Optional.empty();
} catch (Exception e) {
throw new RuntimeException("Failed to get question topic by ID", e);
throw new RuntimeException("Failed to get question topic by question ID and topic enum", e);

Check warning on line 175 in src/main/java/org/patinanetwork/codebloom/common/db/repos/question/topic/QuestionTopicSqlRepository.java

View check run for this annotation

SonarQubeCloud / [codebloom_backend] SonarCloud Code Analysis

Replace generic exceptions with specific library exceptions or a custom exception.

See more on https://sonarcloud.io/project/issues?id=codebloom_backend&issues=AZz8IPso8kKnt5SDptsa&open=AZz8IPso8kKnt5SDptsa&pullRequest=862
}
}

@Override
public void createQuestionTopic(final QuestionTopic questionTopic) {
String sql = """
INSERT INTO "QuestionTopic"
("id", "questionId", "questionBankId", "topicSlug", "topic")
VALUES
(:id, :questionId, :questionBankId, :topicSlug, :topic)
RETURNING
"createdAt"
""";
INSERT INTO "QuestionTopic" ("id", "questionId", "questionBankId", "topicSlug", "topic")
VALUES (:id, :questionId, :questionBankId, :topicSlug, :topic)
RETURNING "createdAt"
""";

questionTopic.setId(UUID.randomUUID().toString());

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("id", UUID.fromString(questionTopic.getId()));

if (questionTopic.getQuestionId() == null) {
stmt.setNull("questionId", java.sql.Types.NULL);
} else {
stmt.setObject("questionId", UUID.fromString(questionTopic.getQuestionId()));
}

if (questionTopic.getQuestionBankId() == null) {
stmt.setNull("questionBankId", java.sql.Types.NULL);
} else {
stmt.setObject("questionBankId", UUID.fromString(questionTopic.getQuestionBankId()));
}

stmt.setString("topicSlug", questionTopic.getTopicSlug());
stmt.setObject("topic", questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);
stmt.setObject(COL_ID, UUID.fromString(questionTopic.getId()));
stmt.setObject(
COL_QUESTION_ID,
questionTopic.getQuestionId().map(UUID::fromString).orElse(null));
stmt.setObject(
COL_QUESTION_BANK_ID,
questionTopic.getQuestionBankId().map(UUID::fromString).orElse(null));
stmt.setString(COL_TOPIC_SLUG, questionTopic.getTopicSlug());
stmt.setObject(COL_TOPIC, questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);

try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
questionTopic.setCreatedAt(rs.getTimestamp("createdAt").toLocalDateTime());
questionTopic.setCreatedAt(rs.getTimestamp(COL_CREATED_AT).toLocalDateTime());
}
}
} catch (Exception e) {
Expand All @@ -215,35 +211,26 @@
@Override
public boolean updateQuestionTopicById(final QuestionTopic questionTopic) {
String sql = """
UPDATE
"QuestionTopic"
SET
"questionId" = :questionId,
"questionBankId" = :questionBankId,
"topicSlug" = :topicSlug,
"topic" = :topic
WHERE
id = :id
""";
UPDATE "QuestionTopic"
SET
"questionId" = :questionId,
"questionBankId" = :questionBankId,
"topicSlug" = :topicSlug,
"topic" = :topic
WHERE id = :id
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("id", UUID.fromString(questionTopic.getId()));

if (questionTopic.getQuestionId() == null) {
stmt.setNull("questionId", java.sql.Types.NULL);
} else {
stmt.setObject("questionId", UUID.fromString(questionTopic.getQuestionId()));
}

if (questionTopic.getQuestionBankId() == null) {
stmt.setNull("questionBankId", java.sql.Types.NULL);
} else {
stmt.setObject("questionBankId", UUID.fromString(questionTopic.getQuestionBankId()));
}

stmt.setString("topicSlug", questionTopic.getTopicSlug());
stmt.setObject("topic", questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);
stmt.setObject(COL_ID, UUID.fromString(questionTopic.getId()));
stmt.setObject(
COL_QUESTION_ID,
questionTopic.getQuestionId().map(UUID::fromString).orElse(null));
stmt.setObject(
COL_QUESTION_BANK_ID,
questionTopic.getQuestionBankId().map(UUID::fromString).orElse(null));
stmt.setString(COL_TOPIC_SLUG, questionTopic.getTopicSlug());
stmt.setObject(COL_TOPIC, questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);

return stmt.executeUpdate() > 0;
} catch (Exception e) {
Expand All @@ -254,18 +241,14 @@
@Override
public boolean deleteQuestionTopicById(final String id) {
String sql = """
DELETE FROM
"QuestionTopic"
WHERE
id = :id
""";
DELETE FROM "QuestionTopic"
WHERE id = :id
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
stmt.setObject("id", UUID.fromString(id));
int rowsAffected = stmt.executeUpdate();

return rowsAffected > 0;
stmt.setObject(COL_ID, UUID.fromString(id));
return stmt.executeUpdate() > 0;
} catch (SQLException e) {
throw new RuntimeException("Failed to delete tag by tag ID", e);
}
Expand Down
Loading
Loading