mirror of https://github.com/buster-so/buster.git
190 lines
8.8 KiB
Plaintext
190 lines
8.8 KiB
Plaintext
---
|
|
description:
|
|
globs:
|
|
alwaysApply: true
|
|
---
|
|
# Buster API Repository Navigation Guide
|
|
|
|
> **Last Updated**: April 7, 2025
|
|
> **Version**: 1.0.2
|
|
|
|
## Architecture Overview
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ Web Client │
|
|
└─────────────────┘
|
|
│
|
|
▼
|
|
┌───────────────────────────────────────────────┐
|
|
│ API Layer │
|
|
├───────────────┬──────────────┬────────────────┤
|
|
│ REST Routes │ WS Routes │ Authentication │
|
|
└───────────────┴──────────────┴────────────────┘
|
|
│
|
|
▼
|
|
┌───────────────────────────────────────────────┐
|
|
│ Handlers Layer │
|
|
├─────────┬───────────┬───────────┬─────────────┤
|
|
│ Metrics │ Dashboards│ Chats │ Collections │
|
|
└─────────┴───────────┴───────────┴─────────────┘
|
|
│
|
|
▼
|
|
┌───────────────────────────────────────────────┐
|
|
│ Libraries Layer │
|
|
├─────────┬───────────┬───────────┬─────────────┤
|
|
│ Database│ Agents │ Sharing │ Query Engine│
|
|
└─────────┴───────────┴───────────┴─────────────┘
|
|
│
|
|
▼
|
|
┌───────────────────────────────────────────────┐
|
|
│ External Services │
|
|
├─────────┬───────────┬───────────┬─────────────┤
|
|
│Postgres │ Redis │ LLMs │ Data Sources│
|
|
└─────────┴───────────┴───────────┴─────────────┘
|
|
```
|
|
|
|
## Row Limit Implementation Notes
|
|
All database query functions in the query_engine library have been updated to respect a 5000 row limit by default. The limit can be overridden by passing an explicit limit value. This is implemented in the libs/query_engine directory.
|
|
|
|
## Documentation
|
|
The project's detailed documentation is in the `/documentation` directory:
|
|
- `handlers.mdc` - Handler patterns
|
|
- `libs.mdc` - Library construction guidelines
|
|
- `rest.mdc` - REST API formatting
|
|
- `testing.mdc` - Testing standards
|
|
- `tools.mdc` - Tools documentation
|
|
- `websockets.mdc` - WebSocket patterns
|
|
|
|
While these files contain best practices for writing tests, REST patterns, etc., **each subdirectory should have its own README.md or CLAUDE.md** that should be referenced first when working in that specific area. These subdirectory-specific guides often contain implementation details and patterns specific to that component.
|
|
|
|
### Additional Documentation Resources
|
|
|
|
- ](./CLAUDE-LIBRARY-INDEX.md) - Comprehensive index of all functries
|
|
- [**Library Template**](./libs/CLAUDE-TEMPLATE.ing new library documentation
|
|
- [**Database Test Guide**](mdc:libs/database/tests/CLAUDE.md) - Detailed guide for using the database test infrastructure
|
|
|
|
## Library Relationships
|
|
- **agents** → depends on → **litellm**, **database**, **braintrust**
|
|
- **handlers** → depends on → **database**, **agents**, **sharing**
|
|
- **query_engine** → depends on → **database**
|
|
- All libraries depend on common workspace dependencies
|
|
|
|
## Repository Structure
|
|
- `src/` - Main server code (Axum application wiring)
|
|
- `routes/` - API endpoints (REST, WebSocket) - Defines routes, applies middleware
|
|
- `utils/` - Shared server-specific utilities
|
|
- `types/` - Common type definitions for the server layer
|
|
- `libs/` - Shared libraries (Core logic)
|
|
- `database/` - Database interactions, schema, models, migrations, **test utilities**
|
|
- `handlers/` - Request handling logic for specific routes/features
|
|
- `agents/`, `sharing/`, `query_engine/`, etc. - Other core logic libraries
|
|
- Each lib has its own `Cargo.toml`, `src/`, and `tests/` (for lib-specific integration tests)
|
|
- `server/tests/` - Focused integration tests for the `server` crate (routing, middleware), **mocks handlers**.
|
|
- `documentation/` - Detailed docs (`*.mdc` files)
|
|
- `prds/` - Product requirements
|
|
|
|
## Build Commands
|
|
- `make dev` - Start development
|
|
- `make stop` - Stop development
|
|
- `cargo test -- --test-threads=1 --nocapture` - Run tests
|
|
- `cargo clippy` - Run linter
|
|
- `cargo build` - Build project
|
|
|
|
## Common Test Commands
|
|
|
|
### Run Specific Tests
|
|
```bash
|
|
# Run tests for a specific library (e.g., database integration tests)
|
|
cargo test -p database
|
|
|
|
# Run tests for the handlers library
|
|
cargo test -p handlers
|
|
|
|
# Run focused server integration tests (routing, middleware)
|
|
cargo test -p server
|
|
|
|
# Run a specific test function (e.g., in handlers)
|
|
cargo test -p handlers -- test_get_dashboard_handler
|
|
|
|
# Run tests with filter (e.g., all tests containing "metric")
|
|
cargo test metric
|
|
|
|
# Run with output visible and single-threaded
|
|
cargo test -- --test-threads=1 --nocapture
|
|
```
|
|
|
|
### Test Database Environment (Using `database::test_utils`)
|
|
```rust
|
|
use database::test_utils::{TestDb, insert_test_metric_file, cleanup_test_data};
|
|
|
|
#[tokio::test] async fn my_db_test() -> anyhow::Result<()> {
|
|
// Assumes pools are initialized beforehand (e.g., via #[ctor])
|
|
let test_db = TestDb::new().await?;
|
|
|
|
// Create test data structs
|
|
let metric = test_db.create_test_metric_file(&test_db.user_id).await?;
|
|
let metric_id = metric.id;
|
|
|
|
// Insert data using helpers
|
|
insert_test_metric_file(&metric).await?;
|
|
|
|
// ... perform test logic ...
|
|
|
|
// Clean up specific test data
|
|
cleanup_test_data(&[metric_id]).await?;
|
|
Ok(())}
|
|
```
|
|
|
|
## Core Guidelines
|
|
- Use `anyhow::Result` for error handling
|
|
- Group imports (std lib, external, internal)
|
|
- Put shared types in `types/`, route-specific types in route files
|
|
- Use snake_case for variables/functions, CamelCase for types
|
|
- Never log secrets or sensitive data
|
|
- All dependencies inherit from workspace using `{ workspace = true }`
|
|
- Use database connection pool from `get_pg_pool().get().await?`
|
|
- Write tests with `#[tokio::test]` for async tests.
|
|
- Use database test utilities from `libs/database/src/test_utils.rs` for managing test data.
|
|
- Use mocking (`mockall`, `mockito`) for unit tests.
|
|
- Use `axum_test_helper::TestClient` for server integration tests (`server/tests/`).
|
|
|
|
## Common Database Pattern
|
|
```rust
|
|
let pool = get_pg_pool();
|
|
let mut conn = pool.get().await?;
|
|
|
|
diesel::update(table)
|
|
.filter(conditions)
|
|
.set(values)
|
|
.execute(&mut conn)
|
|
.await?
|
|
```
|
|
|
|
## Troubleshooting Guide
|
|
|
|
### Common Issues
|
|
|
|
1. **Test Database Connection Issues**
|
|
- **Symptom**: Tests fail with connection pool errors or timeouts.
|
|
- **Solution**: Ensure test database service is running. Verify `DATABASE_URL` in `.env.test` is correct. Check pool initialization logic (e.g., `#[ctor]` setup).
|
|
- **Example Error**: `Failed to get diesel connection: connection pool timeout`
|
|
|
|
2. **Test Cleanup Issues**
|
|
- **Symptom**: Tests fail with duplicate records, unique constraint violations, or unexpected data from previous runs.
|
|
- **Solution**: Ensure `cleanup_test_data(&[asset_ids])` is called at the end of *every* integration test that modifies the database, cleaning up precisely the data it created.
|
|
- **Example Error**: `duplicate key value violates unique constraint`
|
|
|
|
3. **Missing Permissions in Handlers**
|
|
- **Symptom**: 403 errors in REST or WebSocket endpoints
|
|
- **Solution**: Use the `check_permission_access` function from the sharing library
|
|
- **Example Error**: `You don't have permission to view this dashboard`
|
|
|
|
4. **Tool Execution Failures**
|
|
- **Symptom**: Agent tools fail to execute properly
|
|
- **Solution**: Implement the `ToolExecutor` trait fully with proper error handling
|
|
- **Example Error**: `Failed to execute tool: invalid schema`
|
|
|
|
### Library-Specific Troubleshooting
|
|
|
|
Check individual CLAUDE.md files or READMEs in each library directory for specific troubleshooting guidance. |