CLAUDE.md files

This commit is contained in:
daniel-c-harvey
2025-09-04 19:57:05 -04:00
parent 97ad4e3ac7
commit 5e02d004e3
9 changed files with 1219 additions and 1 deletions
+52
View File
@@ -0,0 +1,52 @@
{
"permissions": {
"allow": [
"Read(/F:\\Development\\DeepDrftHome/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\FileDatabase/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\Controllers/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\FileDatabase\\Services/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb\\Data/**)",
"Read(/F:\\Development\\DeepDrftHome/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\environment/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb\\Data/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels\\Entities/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb\\Services/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb\\Data\\Repositories/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client\\Clients/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client\\ViewModels/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftWeb.Client\\Controls/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\Middleware/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\Middleware/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftContent\\FileDatabase\\Services/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels\\Models/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels\\Models/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftModels\\DTOs/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)",
"Read(/F:\\Development\\DeepDrftHome\\DeepDrftTests/**)"
],
"deny": [],
"ask": []
}
}
+4 -1
View File
@@ -299,4 +299,7 @@ __pycache__/
**/deepdrft.db*
# NetBlocks symlink for tool-assisted library code search
**/NetBlocks
**/NetBlocks
# File Database files
Database/Vaults/*
+113
View File
@@ -0,0 +1,113 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Architecture Overview
DeepDrftHome is a .NET 9 solution consisting of multiple projects that implement a dual-database media management system:
### Core Projects
- **DeepDrftWeb**: Blazor Server/WebAssembly hybrid web application using MudBlazor UI framework
- **DeepDrftWeb.Client**: Blazor WebAssembly client components
- **DeepDrftContent**: Web API project providing content management endpoints with API key authentication
- **DeepDrftModels**: Shared data models and entities
- **DeepDrftTests**: NUnit test project with comprehensive FileDatabase tests
- **NetBlocks**: External dependency located at `C:\lib\NetBlocks\`
### Database Architecture
The application uses a **dual-database approach**:
1. **SQL Database (SQLite)**: Stores metadata and track information via Entity Framework
- Located: `../Database/deepdrft.db`
- Entity: `TrackEntity` with fields for MediaPath, TrackName, Artist, Album, Genre, etc.
- Context: `DeepDrftContext` with SQLite provider
2. **FileDatabase**: Custom file-based storage system for binary media content
- Located: `../Database/Vaults` (configurable via `filedatabase.json`)
- Manages **MediaVaults** with different types: Media, Image, Audio
- Supports structured binary storage with metadata (duration, bitrate, aspect ratio)
### FileDatabase System Details
The FileDatabase is the core innovation of this project:
- **Vault-based Organization**: Content organized into typed vaults (MediaVaultType: Media, Image, Audio)
- **Index System**: Uses JSON-based indexing with DirectoryIndex and VaultIndex structures
- **Media Types**:
- `AudioBinary`: Buffer + Duration + Bitrate + Extension
- `ImageBinary`: Buffer + AspectRatio + Extension
- `MediaBinary`: Base buffer + Extension + MIME type support
- **Factory Pattern**: `MediaVaultFactory` creates appropriate vault types
- **Async Operations**: All database operations are async with error swallowing
## Development Commands
### Build and Test
```bash
# Build entire solution
dotnet build DeepDrftHome.sln
# Run all tests
dotnet test DeepDrftTests/
# Run specific test class
dotnet test DeepDrftTests/ --filter "FileDatabaseTests"
# Build specific project
dotnet build DeepDrftWeb/
dotnet build DeepDrftContent/
```
### Running Applications
```bash
# Run main web application
dotnet run --project DeepDrftWeb
# Run content API
dotnet run --project DeepDrftContent
```
### Entity Framework (SQL Database)
```bash
# Add migration
dotnet ef migrations add MigrationName --project DeepDrftWeb
# Update database
dotnet ef database update --project DeepDrftWeb
```
## Key Configuration Files
- `DeepDrftWeb/appsettings.json`: SQL connection string, logging configuration
- `DeepDrftContent/environment/filedatabase.json`: FileDatabase vault path configuration
- `DeepDrftContent/environment/apikey.json`: API authentication (not in repo)
## Important Patterns
### FileDatabase Usage
```csharp
// Initialize FileDatabase
var fileDatabase = await FileDatabase.FromAsync(rootPath);
// Register audio content
await fileDatabase.RegisterResourceAsync("tracks", trackId, audioBinary);
// Load audio content
var audio = await fileDatabase.LoadResourceAsync<AudioBinary>("tracks", trackId);
```
### Dependency Injection
- FileDatabase service registration occurs in startup configuration
- SQL context registered via `AddDbContext<DeepDrftContext>`
- Repository pattern with `TrackRepository` and `TrackService`
### Testing Strategy
- Comprehensive FileDatabase integration tests with temporary directories
- Uses NUnit framework with async test patterns
- Test isolation via unique temp directories per test
- Covers vault creation, media storage, and retrieval scenarios
## Project Dependencies
External dependencies include Entity Framework Core (SQLite), MudBlazor, and the custom NetBlocks library. The FileDatabase system is entirely custom-built and forms the backbone of the media storage architecture.
+192
View File
@@ -0,0 +1,192 @@
# CLAUDE.md - DeepDrftCli
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftCli project.
## Project Overview
DeepDrftCli is a **console application** for managing audio tracks in the DeepDrft system. It provides command-line interface for adding WAV files to both the SQL database and FileDatabase, leveraging services from both DeepDrftWeb and DeepDrftContent projects.
## Architecture
### Technology Stack
- **.NET 9.0 Console Application**: Command-line interface
- **Microsoft.Extensions.Hosting**: Dependency injection and configuration
- **Entity Framework Core**: SQL database operations via DeepDrftWeb
- **FileDatabase**: Binary storage via DeepDrftContent
### Project Structure
```
DeepDrftCli/
├── Services/
│ ├── CliService.cs # Main CLI command handler
│ └── [Processors moved to DeepDrftContent]
├── Program.cs # Application entry point with DI setup
├── appsettings.json # Configuration
└── DeepDrftCli.csproj # Project file with references
```
### Service Dependencies
- **DeepDrftWeb**: SQL database operations, TrackService, TrackRepository
- **DeepDrftContent**: FileDatabase, AudioProcessor (in /Processors)
- **DeepDrftModels**: Shared entities and DTOs
- **NetBlocks**: Result pattern (ResultContainer<T>)
## Audio Processing Architecture
### AudioProcessor (DeepDrftContent/Processors/)
Handles WAV file processing with full metadata extraction:
```csharp
public async Task<AudioBinary?> ProcessWavFileAsync(string filePath)
{
// WAV header parsing for duration, bitrate, sample rate
// Creates AudioBinary with extracted metadata
}
```
### TrackService (DeepDrftContent/Services/)
Orchestrates dual-database operations:
```csharp
public async Task<TrackEntity?> AddTrackFromWavAsync(
string wavFilePath, string trackName, string artist, ...)
{
// 1. Process WAV file → AudioBinary
// 2. Store in FileDatabase → get trackId
// 3. Create TrackEntity with MediaPath = trackId
// 4. Return entity for SQL storage
}
```
## Command-Line Interface
### Available Commands
#### Add Track
```bash
DeepDrftCli add <wav-file-path> <track-name> <artist> [album] [genre] [release-date]
```
**Example:**
```bash
DeepDrftCli add "mysong.wav" "My Song" "Artist Name" "Album" "Rock" "2024-01-01"
```
#### List Tracks
```bash
DeepDrftCli list
```
Shows all tracks from SQL database with formatted table output.
#### Help
```bash
DeepDrftCli help
# or
DeepDrftCli --help
# or
DeepDrftCli -h
```
## Development Commands
### Building
```bash
# Build CLI project
dotnet build DeepDrftCli/
# Build entire solution
dotnet build DeepDrftHome.sln
```
### Running
```bash
# Run from project directory
cd DeepDrftCli
dotnet run -- add "song.wav" "Track Name" "Artist"
# Run from solution root
dotnet run --project DeepDrftCli -- list
# Run built executable
./DeepDrftCli/bin/Debug/net9.0/DeepDrftCli.exe add "song.wav" "Track" "Artist"
```
### Database Requirements
Ensure databases exist and are accessible:
```bash
# SQL Database: ../Database/deepdrft.db
# FileDatabase: ../Database/Vaults
```
## Configuration
### appsettings.json
```json
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=../Database/deepdrft.db"
},
"FileDatabaseSettings": {
"VaultPath": "../Database/Vaults"
}
}
```
### Dependency Injection Setup
Program.cs configures full DI container:
- **SQL Context**: DeepDrftContext with SQLite
- **FileDatabase**: Singleton initialized from vault path
- **Services**: TrackRepository, TrackServices (both Web and Content), AudioProcessor
- **Logging**: Console logging for development
## Important Patterns
### Result Pattern (NetBlocks)
All service operations return ResultContainer<T>:
```csharp
var result = await _webTrackService.Create(trackEntity);
if (result.Success && result.Value != null)
{
// Success handling
}
else
{
var errorMessage = result.Messages.FirstOrDefault()?.Message ?? "Unknown error";
// Error handling
}
```
### Dual Database Strategy
1. **Process WAV** → AudioBinary (metadata + buffer)
2. **Store in FileDatabase** → generates unique trackId
3. **Create TrackEntity** with MediaPath = trackId
4. **Store in SQL** → gets database ID and full entity
### WAV File Processing
- **RIFF/WAVE format parsing**: Header validation and chunk parsing
- **Metadata extraction**: Duration, bitrate, sample rate, channels
- **Fallback handling**: Default values if parsing fails
- **Binary preservation**: Full WAV file stored as-is
### Error Handling
- **File validation**: Existence and .wav extension checking
- **Graceful degradation**: Default metadata if parsing fails
- **User-friendly messages**: Clear error reporting for CLI users
- **Logging integration**: Structured logging for debugging
## CLI Usage Notes
### File Path Handling
- Supports absolute and relative paths
- Arguments with spaces must be quoted
- Only .wav files are supported currently
### Date Format
Release dates must be in YYYY-MM-DD format:
```bash
DeepDrftCli add "song.wav" "Title" "Artist" "Album" "Genre" "2024-01-01"
```
### Output Format
- Success: Detailed track information display
- List: Formatted table with ID, Name, Artist, Album, Genre
- Errors: Clear, actionable error messages
When working with this project, focus on maintaining the dual-database consistency and the established patterns for CLI argument handling and user feedback.
+187
View File
@@ -0,0 +1,187 @@
# CLAUDE.md - DeepDrftContent
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftContent project.
## Project Overview
DeepDrftContent is a **Web API project** that serves as the content management backend for the DeepDrft system. It provides secure API endpoints for managing the FileDatabase system and handles binary media content storage and retrieval.
## Architecture
### Technology Stack
- **ASP.NET Core Web API 9.0**: RESTful API framework
- **Custom FileDatabase System**: Binary file storage with vault management
- **API Key Authentication**: Secure endpoint protection
- **OpenAPI/Swagger**: Development API documentation
### Project Structure
```
DeepDrftContent/
├── Controllers/ # API endpoint controllers
│ ├── TrackController.cs # Track media management
│ └── WeatherForecastController.cs # Demo endpoint
├── FileDatabase/ # Core FileDatabase implementation
│ ├── Services/ # Database and vault services
│ ├── Models/ # Data models and DTOs
│ ├── Utils/ # Utility classes
│ └── Abstractions/ # Interfaces and contracts
├── Middleware/ # Custom middleware
│ ├── ApiKeyAuthenticationMiddleware.cs
│ └── ApiKeyAuthorizeAttribute.cs
├── Models/ # Application models
├── environment/ # Configuration files
│ ├── filedatabase.json # FileDatabase settings
│ └── apikey.json # API authentication (not in repo)
└── Program.cs # Application entry point
```
## Core FileDatabase System
### Key Components
#### FileDatabase Service
Main orchestration class managing multiple MediaVaults:
```csharp
public class FileDatabase : DirectoryIndexDirectory
{
// Factory creation
public static async Task<FileDatabase?> FromAsync(string rootPath)
// Vault management
public async Task CreateVaultAsync(string vaultId, MediaVaultType vaultType)
public MediaVault? GetVault(string vaultId)
// Resource operations
public async Task<T?> LoadResourceAsync<T>(string vaultId, string entryId) where T : FileBinary
public async Task<bool> RegisterResourceAsync(string vaultId, string entryId, FileBinary media)
}
```
#### MediaVault Types
- **MediaVaultType.Media**: General binary media storage
- **MediaVaultType.Audio**: Audio-specific storage with duration/bitrate
- **MediaVaultType.Image**: Image storage with aspect ratio
#### Media Models Hierarchy
```
FileBinary (base)
├── MediaBinary (+ Extension, MIME type)
├── AudioBinary (+ Duration, Bitrate)
└── ImageBinary (+ AspectRatio)
```
### Index System
- **DirectoryIndex**: Manages vault organization
- **VaultIndex**: Individual vault metadata and type information
- **JSON-based storage**: All indexes stored as JSON files
## API Authentication
### Custom API Key Middleware
```csharp
// Usage in controllers
[ApiKeyAuthorize]
[HttpPut("{trackId}")]
public async Task<ActionResult> PutTrack([FromQuery] string trackId, [FromBody] AudioBinaryDto track)
```
### Authentication Flow
1. Client sends request with `ApiKey` header
2. `ApiKeyAuthenticationMiddleware` validates against configured key
3. Endpoints marked with `[ApiKeyAuthorize]` require valid API key
4. Returns 401 for missing/invalid keys
## Development Commands
### Running the API
```bash
# Run development server
dotnet run --project DeepDrftContent
# Run with specific environment
dotnet run --project DeepDrftContent --environment Development
```
### Building
```bash
# Build project
dotnet build DeepDrftContent
# Publish for deployment
dotnet publish DeepDrftContent -c Release
```
### Testing FileDatabase
```bash
# Run FileDatabase-specific tests
dotnet test DeepDrftTests/ --filter "FileDatabaseTests"
```
## Configuration
### FileDatabase Settings
`environment/filedatabase.json`:
```json
{
"FileDatabaseSettings": {
"VaultPath": "../Database/Vaults"
}
}
```
### API Key Configuration
`environment/apikey.json` (not in repository):
```json
{
"ApiKeySettings": {
"ApiKey": "your-secret-api-key"
}
}
```
## Key Patterns
### Factory Pattern
MediaVault creation uses factory pattern:
```csharp
var directoryVault = await MediaVaultFactory.From(path, vaultType);
```
### Async/Await Throughout
All FileDatabase operations are async with consistent error handling:
```csharp
// Swallow exceptions and return null/false for failed operations
try { /* operation */ }
catch { return null; } // or return false;
```
### Type-Safe Media Handling
Generic methods ensure type safety for media operations:
```csharp
var audio = await fileDatabase.LoadResourceAsync<AudioBinary>("tracks", trackId);
```
### MIME Type Management
Automatic extension/MIME type conversion via `MimeTypeExtensions`:
```csharp
// Supported audio formats: mp3, wav, flac, aac, ogg, m4a
// Supported image formats: jpg, png, gif, webp, svg, bmp
```
## Important Notes
### Vault Organization
- Each vault is a directory with its own index
- Entry IDs are sanitized to create safe filenames
- Media keys generated via regex: `[^a-zA-Z0-9]``-`
### Error Handling Philosophy
FileDatabase uses "swallow and return null" pattern to match TypeScript behavior:
- Failed operations return `null` or `false`
- No exceptions propagated to callers
- Consistent behavior across all async operations
### Binary Data Handling
All media stored as `byte[]` buffers with associated metadata (size, extension, duration, etc.)
When working with this project, focus on the FileDatabase system architecture and maintain the established patterns for vault management, async operations, and API security.
+163
View File
@@ -0,0 +1,163 @@
# CLAUDE.md - DeepDrftModels
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftModels project.
## Project Overview
DeepDrftModels is a **shared models library** that defines common data structures, entities, DTOs, and model classes used across the entire DeepDrft solution. It serves as the data contract layer between all projects.
## Architecture
### Technology Stack
- **.NET 9.0 Class Library**: Shared library targeting .NET 9
- **Entity Framework Compatible**: Entities work with EF Core
- **JSON Serializable**: Models support JSON serialization for APIs
### Project Structure
```
DeepDrftModels/
├── Entities/ # Database entities
│ └── TrackEntity.cs # Core track data model
├── DTOs/ # Data Transfer Objects
│ └── TrackDto.cs # Track DTO for API transfers
├── Models/ # Shared model classes
│ ├── PagingParameters.cs # Pagination configuration
│ └── PagedResult.cs # Paginated result wrapper
└── DeepDrftModels.csproj # Project file
```
## Core Models
### TrackEntity
Primary database entity for track metadata:
```csharp
public class TrackEntity
{
public long Id { get; set; } // Primary key
public required string MediaPath { get; set; } // FileDatabase vault reference
public required string TrackName { get; set; } // Track title
public required string Artist { get; set; } // Artist name
public string? Album { get; set; } // Optional album
public string? Genre { get; set; } // Optional genre
public DateOnly? ReleaseDate { get; set; } // Optional release date
public string? ImagePath { get; set; } // Optional cover image path
}
```
### TrackDto
Data transfer object matching TrackEntity structure for API operations:
- Mirrors all TrackEntity properties
- Used for JSON serialization/deserialization
- Client-server data exchange
## Pagination System
### PagingParameters<T>
Generic pagination configuration with LINQ expression support:
```csharp
public class PagingParameters<T> : PagingParameters
{
public Expression<Func<T, object>>? OrderBy { get; set; } // Sorting expression
public bool IsDescending { get; set; } = false; // Sort direction
public int Skip => (Page - 1) * PageSize; // Calculated skip count
}
```
### PagingParameters
Base pagination class with size constraints:
```csharp
public class PagingParameters
{
public int Page { get; set; } = 1; // Current page (1-based)
public int PageSize { get; set; } = 20; // Items per page (max 100)
}
```
### PagedResult<T>
Container for paginated data with metadata:
```csharp
public class PagedResult<T>
{
public IEnumerable<T> Items { get; set; } // Page items
public int TotalCount { get; set; } // Total items available
public int Page { get; set; } // Current page
public int PageSize { get; set; } // Items per page
// Calculated properties
public int TotalPages { get; } // Total pages available
public bool HasNextPage { get; } // Can navigate forward
public bool HasPreviousPage { get; } // Can navigate backward
}
```
## Key Patterns
### Required Properties
Uses C# required modifier for essential properties:
```csharp
public required string MediaPath { get; set; } // Compile-time requirement
```
### Nullable Reference Types
Explicit nullability throughout:
```csharp
public string? Album { get; set; } // Optional nullable
public required string Artist { get; set; } // Required non-null
```
### Generic Type Conversion
PagedResult supports type transformation:
```csharp
public static PagedResult<T> From<TOther>(PagedResult<TOther> other, IEnumerable<T> items)
```
### Expression-Based Sorting
Type-safe LINQ expressions for dynamic sorting:
```csharp
parameters.OrderBy = entity => entity.TrackName; // Compile-time checked
```
## Integration Points
### Entity Framework
- `TrackEntity` configured for EF Core in `DeepDrftWeb.Data.Configurations`
- Long Id as primary key for SQLite compatibility
- DateOnly support for release dates
### API Serialization
- All models JSON-serializable for web API usage
- DTO pattern separates data transfer from domain models
### Cross-Project Usage
Referenced by:
- **DeepDrftWeb**: Entity Framework, services, repositories
- **DeepDrftWeb.Client**: API client communication
- **DeepDrftContent**: API DTOs (potential future usage)
- **DeepDrftTests**: Test data and assertions
## External Dependencies
### NetBlocks Library
Some projects reference `NetBlocks.Models` for:
- `ResultContainer<T>`: Consistent result handling pattern
- `ApiResult<T>`: API response wrapper
- `Result`: Simple operation result
## Development Notes
### Page Size Limits
Maximum page size enforced at 100 items to prevent performance issues:
```csharp
set => _pageSize = value > _maxPageSize ? _maxPageSize : value;
```
### 1-Based Pagination
Page numbers start at 1 (not 0) following common UI patterns:
```csharp
public int Skip => (Page - 1) * PageSize; // Convert to 0-based for queries
```
### Immutable Design
Models favor immutability where possible, using init-only properties and required fields.
When working with this project, maintain consistency in data models across the solution and preserve the established patterns for pagination, nullability, and type safety.
+217
View File
@@ -0,0 +1,217 @@
# CLAUDE.md - DeepDrftTests
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftTests project.
## Project Overview
DeepDrftTests is a **comprehensive test suite** using **NUnit framework** that validates the FileDatabase system and related components. The tests follow SOLID principles and provide extensive coverage of the custom FileDatabase functionality.
## Architecture
### Technology Stack
- **NUnit 4.2.2**: Testing framework with modern async support
- **NUnit3TestAdapter**: Visual Studio test adapter
- **.NET 9.0**: Latest framework features
- **Coverlet**: Code coverage collection
### Project Structure
```
DeepDrftTests/
├── FileDatabaseTests.cs # Main FileDatabase integration tests
├── MediaVaultTests.cs # MediaVault component tests
├── MediaVaultFactoryTests.cs # Factory pattern tests
├── IndexSystemTests.cs # Index management tests
├── SimpleMediaTypeRegistryTests.cs # Media type registry tests
├── UtilityTests.cs # Utility class tests
├── ModelTests.cs # Model validation tests
├── TestData.cs # Shared test data and helpers
├── environment/ # Test configuration files
│ └── filedatabase.json # FileDatabase test settings
└── DeepDrftTests.csproj # Project configuration
```
## Test Organization
### SOLID Principles Implementation
Tests follow SOLID design principles:
- **Single Responsibility**: Each test class focuses on one component
- **Open/Closed**: Base test classes allow extension without modification
- **Liskov Substitution**: All vault implementations tested consistently
- **Interface Segregation**: Tests through abstractions where possible
- **Dependency Inversion**: Tests depend on abstractions, not concretions
### DRY Pattern with Base Classes
```csharp
// Base class eliminates test setup duplication
public abstract class MediaVaultTestBase
{
protected string TestDirectory { get; private set; }
[SetUp] public virtual void SetUp() { /* Common setup */ }
[TearDown] public virtual void TearDown() { /* Common cleanup */ }
}
```
## Key Test Classes
### FileDatabaseTests
**Core integration tests** for the main FileDatabase functionality:
- Database creation and initialization
- Vault management (create, retrieve, check existence)
- Resource operations (register, load, type safety)
- Multi-vault scenarios and error handling
### MediaVaultTests
**Component tests** for individual MediaVault implementations:
- Entry storage and retrieval
- Media type handling (Audio, Image, Media)
- File path sanitization
- Index maintenance
### IndexSystemTests
**Index management** validation:
- DirectoryIndex creation and persistence
- VaultIndex type management
- JSON serialization/deserialization
- Index factory service operations
### MediaVaultFactoryTests
**Factory pattern** validation:
- Vault creation for different MediaVaultTypes
- Path handling and directory creation
- Type-specific vault instantiation
## Test Data Management
### TestData Class
Centralized test data and helper methods:
```csharp
public static class TestData
{
// Real PNG bytes for authentic image testing
public static readonly byte[] TestPngBytes = [...];
// Factory methods for test objects
public static ImageBinary CreateTestImageBinary(double aspectRatio = 1.0)
public static AudioBinary CreateTestAudioBinary(double duration = 120.0, int bitrate = 320)
// Consistent test keys
public static class TestKeys
{
public const string TestImageEntry = "test";
public const string ImageVaultKey = "img";
public const MediaVaultType ImageVaultType = MediaVaultType.Image;
}
}
```
## Development Commands
### Running All Tests
```bash
# Run entire test suite
dotnet test DeepDrftTests/
# Run with detailed output
dotnet test DeepDrftTests/ --verbosity normal
# Run with code coverage
dotnet test DeepDrftTests/ --collect:"XPlat Code Coverage"
```
### Running Specific Tests
```bash
# Run FileDatabase tests only
dotnet test DeepDrftTests/ --filter "FileDatabaseTests"
# Run specific test method
dotnet test DeepDrftTests/ --filter "FileDatabase_CanBeCreatedAtSpecifiedLocation"
# Run tests by category
dotnet test DeepDrftTests/ --filter "Category=Integration"
```
### Build and Clean
```bash
# Build test project
dotnet build DeepDrftTests/
# Clean test outputs
dotnet clean DeepDrftTests/
```
## Test Isolation Strategy
### Temporary Directory Management
Each test uses isolated temporary directories:
```csharp
_testDatabasePath = Path.Combine(Path.GetTempPath(), "DeepDrftTests", Guid.NewGuid().ToString());
```
### Setup and Cleanup Pattern
```csharp
[SetUp]
public void SetUp()
{
// Create unique test directory
Directory.CreateDirectory(_testDatabasePath);
}
[TearDown]
public void TearDown()
{
// Clean up test directory (with error tolerance)
try { Directory.Delete(_testDatabasePath, true); }
catch { /* Ignore cleanup errors */ }
}
```
## Testing Patterns
### Async Test Methods
All database operations tested with async/await:
```csharp
[Test]
public async Task FileDatabase_CanRegisterAndRetrieveAudio()
{
var fileDatabase = await FileDatabase.FromAsync(_testDatabasePath);
// ... async operations
}
```
### Type-Safe Media Testing
Generic type parameters ensure type safety:
```csharp
var audio = await fileDatabase.LoadResourceAsync<AudioBinary>("tracks", trackId);
Assert.That(audio, Is.Not.Null);
Assert.That(audio.Duration, Is.EqualTo(120.0));
```
### Error Scenario Coverage
Tests validate error handling patterns:
- Non-existent vaults return null
- Invalid entry IDs return null
- File system errors are handled gracefully
## Important Testing Principles
### Authentic Test Data
Uses real PNG bytes instead of mock data for realistic testing scenarios.
### Comprehensive Coverage
Tests cover:
- Happy path scenarios
- Edge cases and error conditions
- Type safety and generics
- Async operation patterns
- File system interactions
### Performance Considerations
Tests are designed for speed:
- Minimal test data sizes
- Parallel test execution support
- Efficient cleanup strategies
When working with this test project, maintain the established patterns for test isolation, async operations, and comprehensive coverage of the FileDatabase system.
+146
View File
@@ -0,0 +1,146 @@
# CLAUDE.md - DeepDrftWeb.Client
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftWeb.Client project.
## Project Overview
DeepDrftWeb.Client is a **Blazor WebAssembly** client project that provides interactive UI components for the DeepDrft music management system. It runs in the browser and communicates with the server-side DeepDrftWeb application.
## Architecture
### Technology Stack
- **Blazor WebAssembly**: Client-side .NET runtime in browser
- **MudBlazor**: Material Design UI components
- **HttpClient**: API communication with server
- **ASP.NET Core 9.0**: Framework components
### Project Structure
```
DeepDrftWeb.Client/
├── Pages/ # Routable page components
│ ├── Home.razor # Home page
│ ├── Counter.razor # Demo counter page
│ ├── Weather.razor # Demo weather page
│ └── TracksView.razor # Main tracks interface
├── Controls/ # Reusable UI components
│ ├── TracksGallery.razor # Grid layout for tracks
│ └── TrackPlayer.razor # Individual track player
├── Layout/ # Layout components
│ ├── MainLayout.razor # Primary layout
│ └── NavMenu.razor # Navigation menu
├── Clients/ # HTTP API clients
├── ViewModels/ # Component view models
├── wwwroot/ # Static web assets
└── Program.cs # WebAssembly entry point
```
## Key Patterns
### MVVM Pattern
Components use ViewModels for data management and business logic separation:
```csharp
// TracksViewModel.cs - Manages tracks data and pagination
public class TracksViewModel
{
public PagedResult<TrackEntity>? Page { get; set; }
public int PageNumber { get; set; } = 1;
public int PageSize { get; set; }
public string SortBy { get; set; }
public bool IsDescending { get; set; }
}
```
### HTTP Client Pattern
API communication through dedicated client classes:
```csharp
// TrackClient.cs - Handles track-related API calls
public async Task<ApiResult<PagedResult<TrackEntity>>> GetPage(
int pageNumber, int pageSize, string? sortColumn = null, bool sortDescending = false)
```
### Component Architecture
- **Pages**: Routable components (URL endpoints)
- **Controls**: Reusable components with parameters
- **Layout**: Shared layout structures
## Key Components
### TracksGallery.razor
Grid-based track display using MudBlazor responsive grid:
```razor
<MudGrid Spacing="3" Justify="Justify.Center">
@foreach (var track in Tracks)
{
<MudItem xs="12" sm="6" md="4" lg="2" xl="2">
<TrackPlayer Track="@track" />
</MudItem>
}
</MudGrid>
```
### TrackPlayer.razor
Individual track player component with audio controls and track information display.
### TracksView.razor
Main tracks management interface combining gallery view with pagination and sorting controls.
## Development Commands
### Building
```bash
# Build WebAssembly project
dotnet build DeepDrftWeb.Client
# Publish for production
dotnet publish DeepDrftWeb.Client -c Release
```
### Running
The client runs as part of the DeepDrftWeb host application:
```bash
# Run from DeepDrftWeb (hosts the client)
dotnet run --project DeepDrftWeb
```
## Configuration
### Service Registration
Services registered in `Startup.ConfigureDomainServices()`:
```csharp
// Clients for API communication
builder.Services.AddTransient<TrackClient>();
// ViewModels for component state management
builder.Services.AddTransient<TracksViewModel>();
```
### HTTP Client Setup
Configured to communicate with the hosting DeepDrftWeb server:
- Uses dependency injection for HttpClient
- JSON serialization with case-insensitive property matching
- Query string building for API parameters
## Important Patterns
### API Communication
All API calls use the established result pattern:
- `ApiResult<T>` for typed responses
- JSON deserialization with `JsonSerializer`
- Query string construction for GET parameters
### MudBlazor Integration
- Responsive grid system (`MudGrid`, `MudItem`)
- Breakpoint-aware layout (xs, sm, md, lg, xl)
- Material Design components throughout
### Component Parameters
Components accept parameters for data binding:
```razor
[Parameter] public List<TrackEntity> Tracks { get; set; } = [];
[Parameter] public TrackEntity Track { get; set; } = null!;
```
### State Management
ViewModels handle component state, pagination, and sorting logic, keeping components focused on presentation.
When working with this project, maintain the separation between presentation (Razor components) and logic (ViewModels/Clients), and follow the established MudBlazor patterns for responsive UI design.
+145
View File
@@ -0,0 +1,145 @@
# CLAUDE.md - DeepDrftWeb
This file provides guidance to Claude Code (claude.ai/code) when working with the DeepDrftWeb project.
## Project Overview
DeepDrftWeb is the main web application using **Blazor Server/WebAssembly hybrid** architecture with **MudBlazor** UI framework. It serves as the front-end interface for the DeepDrft music management system.
## Architecture
### Technology Stack
- **Blazor Hybrid**: Interactive Server + WebAssembly components
- **MudBlazor**: Material Design UI framework
- **Entity Framework Core**: SQLite database access
- **ASP.NET Core 9.0**: Web framework
### Project Structure
```
DeepDrftWeb/
├── Components/ # Blazor components (.razor files)
│ ├── App.razor # Root application component
│ ├── Pages/ # Page components
│ └── _Imports.razor # Global using statements
├── Controllers/ # MVC API controllers
├── Data/ # Database layer
│ ├── DeepDrftContext.cs # EF DbContext
│ ├── Configurations/ # EF configurations
│ ├── Migrations/ # EF migrations
│ └── Repositories/ # Data access layer
├── Services/ # Business logic layer
└── Program.cs # Application entry point
```
## Key Patterns
### Service Architecture
```csharp
// Three-layer pattern: Controller → Service → Repository
TrackController TrackService TrackRepository DeepDrftContext
```
### Result Pattern
All service methods return `ResultContainer<T>` or `Result` for consistent error handling:
```csharp
public async Task<ResultContainer<TrackEntity?>> GetById(long id)
{
try
{
var track = await _repository.GetById(id);
return ResultContainer<TrackEntity?>.CreatePassResult(track);
}
catch (Exception e)
{
return ResultContainer<TrackEntity?>.CreateFailResult(e.Message);
}
}
```
### Paging Support
Uses `PagingParameters<T>` and `PagedResult<T>` from DeepDrftModels for consistent pagination:
```csharp
var parameters = new PagingParameters<TrackEntity>()
{
Page = pageNumber,
PageSize = pageSize,
OrderBy = entity => entity.TrackName,
IsDescending = sortDescending
};
```
## Development Commands
### Running the Application
```bash
# Run web application
dotnet run --project DeepDrftWeb
# Watch for changes during development
dotnet watch run --project DeepDrftWeb
```
### Entity Framework
```bash
# Add migration
dotnet ef migrations add MigrationName --project DeepDrftWeb
# Update database
dotnet ef database update --project DeepDrftWeb
# Drop database
dotnet ef database drop --project DeepDrftWeb
```
### Building
```bash
# Build project
dotnet build DeepDrftWeb
# Clean build
dotnet clean DeepDrftWeb && dotnet build DeepDrftWeb
```
## Configuration
### Database Connection
- **Connection String**: `appsettings.json``ConnectionStrings.DefaultConnection`
- **Database Location**: `../Database/deepdrft.db` (SQLite)
- **Context**: `DeepDrftContext` with `TrackEntity` DbSet
### Service Registration
Key services registered in `Startup.ConfigureDomainServices()`:
- `DeepDrftContext` (EF DbContext)
- `TrackRepository` (Scoped)
- `TrackService` (Scoped)
### HttpClient Setup
Configured for API communication with DeepDrftContent:
```csharp
builder.Services.AddHttpClient("DeepDrft.API", client =>
client.BaseAddress = new Uri(Startup.GetKestrelUrl(builder)));
```
## Important Notes
### Blazor Hybrid Architecture
- Server-side rendering with interactive components
- WebAssembly components from `DeepDrftWeb.Client`
- Shared assemblies for interactive modes
### MudBlazor Integration
- UI framework providing Material Design components
- Registered via `builder.Services.AddMudServices()`
### Repository Pattern
- Clean separation of concerns
- Async operations throughout
- CRUD operations for TrackEntity
### URL Configuration
Dynamic URL resolution via `Startup.GetKestrelUrl()` supporting:
- `ASPNETCORE_URLS` environment variable
- `Kestrel:Endpoints` configuration
- Development defaults (https://localhost:5001)
When working with this project, focus on maintaining the established patterns for service layer interaction, result handling, and Blazor component structure.