buster/api/prds/active/api_add_assets_to_get_colle...

5.0 KiB

API: Add Assets to GET Collection Response

Problem Statement

Currently, the GET Collection endpoint (get_collection_handler.rs) doesn't populate the assets field in the response, even though the CollectionState type already contains this field. This is a critical functionality gap as clients need to see what assets (metrics and dashboards) are contained within a collection.

The frontend is expecting a BusterCollection type that includes an assets array containing BusterCollectionItemAsset objects with information from both metric_files and dashboard_files tables.

Proposed Solution

Modify the GET Collection handler to populate the assets field in the response. We'll fetch assets from the collections_to_assets junction table and join with metric_files and dashboard_files tables to get the complete asset information.

Technical Design

Code Changes

  1. Update the get_collection_handler.rs to:
    • Query assets from collections_to_assets junction table
    • Join with metric_files and dashboard_files tables based on asset_type
    • Join with users table to get creator information
    • Format the data into CollectionAsset structure
    • Include formatted assets in the CollectionState response

Database Queries

We'll need to execute two queries to fetch both metric and dashboard assets:

// For metrics
let metric_assets = collections_to_assets::table
    .inner_join(metric_files::table.on(metric_files::id.eq(collections_to_assets::asset_id)))
    .inner_join(users::table.on(users::id.eq(metric_files::created_by)))
    .filter(collections_to_assets::collection_id.eq(req.id))
    .filter(collections_to_assets::asset_type.eq(AssetType::Metric))
    .filter(collections_to_assets::deleted_at.is_null())
    .filter(metric_files::deleted_at.is_null())
    .select((
        metric_files::id,
        metric_files::name,
        (users::name, users::email),
        metric_files::created_at,
        metric_files::updated_at,
        collections_to_assets::asset_type,
    ))
    .load::<AssetQueryResult>(&mut conn)
    .await?;

// For dashboards
let dashboard_assets = collections_to_assets::table
    .inner_join(dashboard_files::table.on(dashboard_files::id.eq(collections_to_assets::asset_id)))
    .inner_join(users::table.on(users::id.eq(dashboard_files::created_by)))
    .filter(collections_to_assets::collection_id.eq(req.id))
    .filter(collections_to_assets::asset_type.eq(AssetType::Dashboard))
    .filter(collections_to_assets::deleted_at.is_null())
    .filter(dashboard_files::deleted_at.is_null())
    .select((
        dashboard_files::id,
        dashboard_files::name,
        (users::name, users::email),
        dashboard_files::created_at,
        dashboard_files::updated_at,
        collections_to_assets::asset_type,
    ))
    .load::<AssetQueryResult>(&mut conn)
    .await?;

// Combine results
let combined_assets = [metric_assets, dashboard_assets].concat();

Utility Functions

We'll need a helper function to format the database results into the CollectionAsset type:

fn format_assets(assets: Vec<AssetQueryResult>) -> Vec<CollectionAsset> {
    assets
        .into_iter()
        .map(|(id, name, (user_name, email), created_at, updated_at, asset_type)| {
            CollectionAsset {
                id,
                name,
                created_by: AssetUser {
                    name: user_name,
                    email,
                },
                created_at,
                updated_at,
                asset_type,
            }
        })
        .collect()
}

Implementation Plan

Phase 1: Update get_collection_handler.rs

  • Define AssetQueryResult type for fetching asset data
  • Implement the query logic to fetch assets from both tables
  • Add the combined assets to the CollectionState response

Phase 2: Update Tests

  • Update existing tests to include assertions for the assets field
  • Add test cases with different combinations of metrics and dashboards

Testing Strategy

Unit Tests

  • Test the handler with collections that have:
    • No assets
    • Only metrics
    • Only dashboards
    • Both metrics and dashboards
    • Deleted assets (should not be included)

Integration Tests

  • Update integration tests to verify the full API response structure
  • Test that assets are correctly formatted and included in the response

Success Criteria

  • GET Collection API returns the assets field in its response
  • Assets field contains correctly formatted data from both metric_files and dashboard_files tables
  • Frontend can successfully display the assets associated with a collection

Affected Files

  • libs/handlers/src/collections/get_collection_handler.rs
  • tests/integration/collections/get_collection_test.rs (for updated tests)

Dependencies

  • Schema structure for collections_to_assets, metric_files, and dashboard_files tables
  • The types for CollectionAsset and AssetUser already exist in types.rs

Implementation Status

  • Update get_collection_handler to fetch assets
  • Add appropriate tests
  • Manual verification with frontend