Skip to content
Merged
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);

/**
Comment thread
az2924 marked this conversation as resolved.
* @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 @@ -17,21 +18,21 @@

private final DataSource ds;

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();
}

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

private QuestionTopic mapResultSetToQuestionTopic(final ResultSet rs) throws SQLException {
return QuestionTopic.builder()
.id(rs.getString("id"))
.createdAt(rs.getTimestamp("createdAt").toLocalDateTime())
.questionId(rs.getString("questionId"))

Check failure on line 29 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

Define a constant instead of duplicating this literal "questionId" 5 times.

See more on https://sonarcloud.io/project/issues?id=codebloom_backend&issues=AZ0l16f2EKILp0ioVRip&open=AZ0l16f2EKILp0ioVRip&pullRequest=862
.questionBankId(rs.getString("questionBankId"))

Check failure on line 30 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

Define a constant instead of duplicating this literal "questionBankId" 4 times.

See more on https://sonarcloud.io/project/issues?id=codebloom_backend&issues=AZ0l16f2EKILp0ioVRiq&open=AZ0l16f2EKILp0ioVRiq&pullRequest=862
.topicSlug(rs.getString("topicSlug"))

Check failure on line 31 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

Define a constant instead of duplicating this literal "topicSlug" 3 times.

See more on https://sonarcloud.io/project/issues?id=codebloom_backend&issues=AZ0l16f2EKILp0ioVRis&open=AZ0l16f2EKILp0ioVRis&pullRequest=862
.topic(LeetcodeTopicEnum.fromValue(rs.getString("topic")))

Check failure on line 32 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

Define a constant instead of duplicating this literal "topic" 4 times.

See more on https://sonarcloud.io/project/issues?id=codebloom_backend&issues=AZ0l16f2EKILp0ioVRir&open=AZ0l16f2EKILp0ioVRir&pullRequest=862
.build();
Comment thread
az2924 marked this conversation as resolved.
}

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

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
Expand Down Expand Up @@ -82,7 +83,7 @@
"QuestionTopic" qt
WHERE
qt."questionBankId" = :questionBankId
""";
""";

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
Expand All @@ -101,41 +102,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("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);
}
Comment thread
az2924 marked this conversation as resolved.
}

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

try (Connection conn = ds.getConnection();
NamedPreparedStatement stmt = new NamedPreparedStatement(conn, sql)) {
Expand All @@ -160,45 +159,35 @@

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 168 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
}
Comment thread
az2924 marked this conversation as resolved.
}

@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.setObject(
"questionId",
questionTopic.getQuestionId().map(UUID::fromString).orElse(null));
stmt.setObject(
"questionBankId",
questionTopic.getQuestionBankId().map(UUID::fromString).orElse(null));
stmt.setString("topicSlug", questionTopic.getTopicSlug());
stmt.setObject("topic", questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);

Expand All @@ -215,33 +204,24 @@
@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.setObject(
"questionId",
questionTopic.getQuestionId().map(UUID::fromString).orElse(null));
stmt.setObject(
"questionBankId",
questionTopic.getQuestionBankId().map(UUID::fromString).orElse(null));
stmt.setString("topicSlug", questionTopic.getTopicSlug());
stmt.setObject("topic", questionTopic.getTopic().getLeetcodeEnum(), java.sql.Types.OTHER);

Expand All @@ -254,18 +234,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;
return stmt.executeUpdate() > 0;
} catch (SQLException e) {
throw new RuntimeException("Failed to delete tag by tag ID", e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.patinanetwork.codebloom.common.dto.question.topic;

import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDateTime;
import java.util.Optional;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -15,13 +17,17 @@
@Jacksonized
@ToString
@EqualsAndHashCode
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class QuestionTopicDto {

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String id;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String questionId;
@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Optional<String> questionId;

@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Optional<String> questionBankId;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String topicSlug;
Expand All @@ -36,6 +42,7 @@ public static QuestionTopicDto fromQuestionTopic(final QuestionTopic questionTop
return QuestionTopicDto.builder()
.id(questionTopic.getId())
.questionId(questionTopic.getQuestionId())
.questionBankId(questionTopic.getQuestionBankId())
.topicSlug(questionTopic.getTopicSlug())
.topic(questionTopic.getTopic())
.createdAt(questionTopic.getCreatedAt())
Expand Down
Loading
Loading