Refactor dataset API to deploy datasets and update related structures

- Replaced the existing `post_datasets` endpoint with a new `deploy_datasets` endpoint to better reflect its purpose.
- Deleted the `post_datasets` module and its associated logic, streamlining the codebase.
- Updated the request and response structures to use `DeployDatasetsRequest` and related types, enhancing clarity and maintainability.
- Adjusted the BusterClient to utilize the new endpoint for deploying datasets, ensuring consistency across the API.

These changes improve the API's functionality by providing a clearer and more focused approach to dataset deployment, facilitating better data management.
This commit is contained in:
dal 2025-01-09 09:31:29 -07:00
parent 51e3c0cc2e
commit c2cd564251
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
5 changed files with 30 additions and 30 deletions

View File

@ -25,7 +25,7 @@ use crate::{
};
#[derive(Debug, Deserialize)]
pub struct PostDatasetsRequest {
pub struct DeployDatasetsRequest {
pub data_source_name: String,
pub env: String,
pub name: String,
@ -33,13 +33,13 @@ pub struct PostDatasetsRequest {
pub schema: String,
pub description: String,
pub sql_definition: Option<String>,
pub entity_relationships: Option<Vec<PostDatasetsEntityRelationshipsRequest>>,
pub columns: Vec<PostDatasetsColumnsRequest>,
pub entity_relationships: Option<Vec<DeployDatasetsEntityRelationshipsRequest>>,
pub columns: Vec<DeployDatasetsColumnsRequest>,
pub yml_file: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct PostDatasetsColumnsRequest {
pub struct DeployDatasetsColumnsRequest {
pub name: String,
pub description: String,
pub semantic_type: Option<String>,
@ -50,7 +50,7 @@ pub struct PostDatasetsColumnsRequest {
}
#[derive(Debug, Deserialize)]
pub struct PostDatasetsEntityRelationshipsRequest {
pub struct DeployDatasetsEntityRelationshipsRequest {
pub name: String,
pub expr: String,
#[serde(rename = "type")]
@ -58,15 +58,15 @@ pub struct PostDatasetsEntityRelationshipsRequest {
}
#[derive(Serialize)]
pub struct PostDatasetsResponse {
pub struct DeployDatasetsResponse {
pub ids: Vec<Uuid>,
}
pub async fn post_datasets(
pub async fn deploy_datasets(
Extension(user): Extension<User>,
Json(request): Json<Vec<PostDatasetsRequest>>,
) -> Result<ApiResponse<PostDatasetsResponse>, (axum::http::StatusCode, String)> {
let _ = match post_datasets_handler(&user.id, request).await {
Json(request): Json<Vec<DeployDatasetsRequest>>,
) -> Result<ApiResponse<DeployDatasetsResponse>, (axum::http::StatusCode, String)> {
let _ = match deploy_datasets_handler(&user.id, request).await {
Ok(dataset) => dataset,
Err(e) => {
tracing::error!("Error creating dataset: {:?}", e);
@ -77,7 +77,7 @@ pub async fn post_datasets(
Ok(ApiResponse::OK)
}
async fn post_datasets_handler(user_id: &Uuid, requests: Vec<PostDatasetsRequest>) -> Result<()> {
async fn deploy_datasets_handler(user_id: &Uuid, requests: Vec<DeployDatasetsRequest>) -> Result<()> {
// Get the user organization id.
let organization_id = get_user_organization_id(&user_id).await?;

View File

@ -2,7 +2,7 @@ mod assets;
mod get_dataset;
mod get_dataset_data_sample;
mod list_datasets;
mod post_datasets;
mod deploy_datasets;
use axum::{
routing::{get, post},
@ -12,7 +12,7 @@ use axum::{
pub fn router() -> Router {
Router::new()
.route("/", get(list_datasets::list_datasets))
.route("/", post(post_datasets::post_datasets))
.route("/deploy", post(deploy_datasets::deploy_datasets))
.route("/:dataset_id", get(get_dataset::get_dataset))
.route(
"/:dataset_id/data/sample",

View File

@ -5,7 +5,7 @@ use reqwest::{
};
use super::{
PostDataSourcesRequest, PostDatasetsRequest, ValidateApiKeyRequest, ValidateApiKeyResponse,
PostDataSourcesRequest, DeployDatasetsRequest, ValidateApiKeyRequest, ValidateApiKeyResponse,
};
pub struct BusterClient {
@ -85,12 +85,12 @@ impl BusterClient {
}
}
pub async fn post_datasets(&self, req_body: Vec<PostDatasetsRequest>) -> Result<()> {
pub async fn deploy_datasets(&self, req_body: Vec<DeployDatasetsRequest>) -> Result<()> {
let headers = self.build_headers()?;
match self
.client
.post(format!("{}/api/v1/datasets", self.base_url))
.post(format!("{}/api/v1/datasets/deploy", self.base_url))
.headers(headers)
.json(&req_body)
.send()
@ -99,13 +99,13 @@ impl BusterClient {
Ok(res) => {
if !res.status().is_success() {
return Err(anyhow::anyhow!(
"POST /api/v1/datasets failed: {}",
"POST /api/v1/datasets/deploy failed: {}",
res.text().await?
));
}
Ok(())
}
Err(e) => Err(anyhow::anyhow!("POST /api/v1/datasets failed: {}", e)),
Err(e) => Err(anyhow::anyhow!("POST /api/v1/datasets/deploy failed: {}", e)),
}
}
}

View File

@ -21,7 +21,7 @@ pub struct PostDataSourcesRequest {
}
#[derive(Debug, Serialize)]
pub struct PostDatasetsRequest {
pub struct DeployDatasetsRequest {
pub data_source_name: String,
pub env: String,
pub name: String,
@ -29,13 +29,13 @@ pub struct PostDatasetsRequest {
pub schema: String,
pub description: String,
pub sql_definition: Option<String>,
pub entity_relationships: Option<Vec<PostDatasetsEntityRelationshipsRequest>>,
pub columns: Vec<PostDatasetsColumnsRequest>,
pub entity_relationships: Option<Vec<DeployDatasetsEntityRelationshipsRequest>>,
pub columns: Vec<DeployDatasetsColumnsRequest>,
pub yml_file: String,
}
#[derive(Debug, Serialize)]
pub struct PostDatasetsColumnsRequest {
pub struct DeployDatasetsColumnsRequest {
pub name: String,
pub description: String,
pub semantic_type: Option<String>,
@ -46,7 +46,7 @@ pub struct PostDatasetsColumnsRequest {
}
#[derive(Debug, Serialize)]
pub struct PostDatasetsEntityRelationshipsRequest {
pub struct DeployDatasetsEntityRelationshipsRequest {
pub name: String,
pub expr: String,
#[serde(rename = "type")]

View File

@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize};
use tokio::fs;
use crate::utils::{
BusterClient, PostDatasetsColumnsRequest, PostDatasetsEntityRelationshipsRequest,
PostDatasetsRequest,
BusterClient, DeployDatasetsColumnsRequest, DeployDatasetsEntityRelationshipsRequest,
DeployDatasetsRequest,
};
use super::{
@ -121,7 +121,7 @@ pub async fn upload_model_files(
let mut columns = Vec::new();
for column in semantic_model.dimensions {
columns.push(PostDatasetsColumnsRequest {
columns.push(DeployDatasetsColumnsRequest {
name: column.name,
description: column.description,
semantic_type: Some(String::from("dimension")),
@ -132,7 +132,7 @@ pub async fn upload_model_files(
}
for column in semantic_model.measures {
columns.push(PostDatasetsColumnsRequest {
columns.push(DeployDatasetsColumnsRequest {
name: column.name,
description: column.description,
semantic_type: Some(String::from("measure")),
@ -145,14 +145,14 @@ pub async fn upload_model_files(
let mut entity_relationships = Vec::new();
for entity in semantic_model.entities {
entity_relationships.push(PostDatasetsEntityRelationshipsRequest {
entity_relationships.push(DeployDatasetsEntityRelationshipsRequest {
name: entity.name,
expr: entity.expr,
type_: entity.entity_type,
});
}
let dataset = PostDatasetsRequest {
let dataset = DeployDatasetsRequest {
data_source_name: profile_name.clone(),
env: profile.target.clone(),
name: semantic_model.name,
@ -171,7 +171,7 @@ pub async fn upload_model_files(
let buster = BusterClient::new(buster_creds.url, buster_creds.api_key)?;
if let Err(e) = buster.post_datasets(post_datasets_req_body).await {
if let Err(e) = buster.deploy_datasets(post_datasets_req_body).await {
return Err(anyhow::anyhow!(
"Failed to upload model files to Buster: {}",
e