From b4562323828065af20197e97daae5277afb01aca Mon Sep 17 00:00:00 2001 From: Om Bhardwaj <115864495+ombhardwajj@users.noreply.github.com> Date: Sat, 31 Aug 2024 11:10:37 +0530 Subject: [PATCH] avniproject#762 | Proper object for field details created --- .../dao/metabase/DatabaseRepository.java | 13 +++- .../server/domain/metabase/FieldDetails.java | 59 +++++++++++++++++++ .../service/metabase/DatabaseService.java | 9 +-- 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldDetails.java diff --git a/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java b/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java index c01236900..395f26180 100644 --- a/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java +++ b/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java @@ -1,12 +1,16 @@ package org.avni.server.dao.metabase; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import org.avni.server.domain.metabase.Database; +import org.avni.server.domain.metabase.FieldDetails; import org.avni.server.domain.metabase.MetabaseDatabaseInfo; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Repository; import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; + @Repository public class DatabaseRepository extends MetabaseConnector { private final ObjectMapper objectMapper; @@ -32,9 +36,14 @@ public MetabaseDatabaseInfo getDatabaseDetails(int databaseId) { } } - public JsonNode getFields(int databaseId) { + public List getFields(int databaseId) { String url = metabaseApiUrl + "/database/" + databaseId + "/fields"; - return getForObject(url, JsonNode.class); + String jsonResponse = getForObject(url, String.class); + try { + return objectMapper.readValue(jsonResponse, new TypeReference>() {}); + } catch (Exception e) { + throw new RuntimeException("Failed to parse fields", e); + } } public JsonNode getInitialSyncStatus(int databaseId) { diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldDetails.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldDetails.java new file mode 100644 index 000000000..94b8e5827 --- /dev/null +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldDetails.java @@ -0,0 +1,59 @@ +package org.avni.server.domain.metabase; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class FieldDetails { + + @JsonProperty("id") + private int id; + + @JsonProperty("name") + private String name; + + @JsonProperty("display_name") + private String displayName; + + @JsonProperty("base_type") + private String baseType; + + @JsonProperty("semantic_type") + private String semanticType; + + @JsonProperty("table_name") + private String tableName; + + @JsonProperty("schema") + private String schema; + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDisplayName() { + return displayName; + } + + public String getBaseType() { + return baseType; + } + + public String getSemanticType() { + return semanticType; + } + + public String getTableName() { + return tableName; + } + + + public String getSchema() { + return schema; + } + +} diff --git a/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java b/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java index 6ebbbf8ae..e478394da 100644 --- a/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java +++ b/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java @@ -88,11 +88,12 @@ private String createRequestBodyForDataset(int sourceTableId) { } public int getFieldIdByTableNameAndFieldName(String tableName, String fieldName) { - JsonNode fieldsArray = databaseRepository.getFields(getDatabaseId()); + List fieldsList = databaseRepository.getFields(getDatabaseId()); String snakeCaseTableName = S.toSnakeCase(tableName); - for (JsonNode fieldNode : fieldsArray) { - if (snakeCaseTableName.equals(fieldNode.path("table_name").asText()) && fieldName.equals(fieldNode.path("name").asText())) { - return fieldNode.path("id").asInt(); + + for (FieldDetails field : fieldsList) { + if (snakeCaseTableName.equals(field.getTableName()) && fieldName.equals(field.getName())) { + return field.getId(); } } return -1;