CLAUDE.md files
This commit is contained in:
@@ -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
@@ -299,4 +299,7 @@ __pycache__/
|
||||
**/deepdrft.db*
|
||||
|
||||
# NetBlocks symlink for tool-assisted library code search
|
||||
**/NetBlocks
|
||||
**/NetBlocks
|
||||
|
||||
# File Database files
|
||||
Database/Vaults/*
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user