mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 22:34:56 +00:00
410 lines
12 KiB
Markdown
410 lines
12 KiB
Markdown
# DBAL Integration Guide
|
|
|
|
This document explains how the C++ and TypeScript DBAL (Database Abstraction Layer) components are integrated into the MetaBuilder project.
|
|
|
|
## Overview
|
|
|
|
The DBAL system provides a unified interface for data storage and retrieval across the MetaBuilder application. It consists of:
|
|
|
|
1. **C++ DBAL Daemon** - Production-ready HTTP server with database abstraction
|
|
2. **TypeScript DBAL Client** - Browser-compatible client for development
|
|
3. **Integration Layer** - Bridges the DBAL with existing MetaBuilder components
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ MetaBuilder App │
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ React Hooks │ │ Integration │ │ Database │ │
|
|
│ │ (useDBAL) │→ │ Layer │→ │ Class │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
│ ↓ ↓ │
|
|
│ ┌─────────────────────────────────┐ │
|
|
│ │ TypeScript DBAL Client │ │
|
|
│ │ - KV Store (In-Memory) │ │
|
|
│ │ - Blob Storage (In-Memory) │ │
|
|
│ │ - Tenant Management │ │
|
|
│ └─────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────┘
|
|
│
|
|
│ HTTP API
|
|
↓
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ C++ DBAL Daemon (Production) │
|
|
│ - HTTP/1.1 Server (Nginx-compatible) │
|
|
│ - PostgreSQL Adapter │
|
|
│ - Blob Storage (S3/Filesystem) │
|
|
│ - Multi-tenant System │
|
|
│ - Access Control & Quotas │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Directory Structure
|
|
|
|
```
|
|
metabuilder/
|
|
├── dbal/
|
|
│ ├── cpp/ # C++ DBAL Daemon
|
|
│ │ ├── src/
|
|
│ │ │ ├── daemon/ # HTTP server & main
|
|
│ │ │ ├── core/ # Core DBAL logic
|
|
│ │ │ ├── adapters/ # Database adapters
|
|
│ │ │ └── blob/ # Blob storage
|
|
│ │ ├── include/
|
|
│ │ ├── tests/
|
|
│ │ ├── Dockerfile
|
|
│ │ └── CMakeLists.txt
|
|
│ └── ts/ # TypeScript DBAL Client
|
|
│ └── src/
|
|
│ ├── core/ # Client, types, validation
|
|
│ ├── adapters/ # Memory adapter
|
|
│ ├── blob/ # Blob storage implementations
|
|
│ └── runtime/ # Runtime utilities
|
|
├── src/
|
|
│ ├── lib/
|
|
│ │ └── dbal-integration.ts # Integration layer
|
|
│ ├── hooks/
|
|
│ │ └── useDBAL.ts # React hooks
|
|
│ └── components/
|
|
│ └── DBALDemo.tsx # Demo component
|
|
└── deployment/ # Docker deployment configs
|
|
```
|
|
|
|
## Integration Components
|
|
|
|
### 1. DBAL Integration Layer (`src/lib/dbal-integration.ts`)
|
|
|
|
The integration layer provides a singleton interface to the DBAL system:
|
|
|
|
```typescript
|
|
import { dbal } from '@/lib/dbal-integration'
|
|
|
|
// Initialize DBAL (happens automatically)
|
|
await dbal.initialize()
|
|
|
|
// Key-Value operations
|
|
await dbal.kvSet('user-preferences', { theme: 'dark' })
|
|
const prefs = await dbal.kvGet('user-preferences')
|
|
|
|
// Blob storage operations
|
|
await dbal.blobUpload('avatar.png', imageData)
|
|
const data = await dbal.blobDownload('avatar.png')
|
|
|
|
// List operations
|
|
await dbal.kvListAdd('recent-files', ['file1.txt', 'file2.txt'])
|
|
const files = await dbal.kvListGet('recent-files')
|
|
```
|
|
|
|
### 2. React Hooks (`src/hooks/useDBAL.ts`)
|
|
|
|
React hooks for easy DBAL access in components:
|
|
|
|
```typescript
|
|
import { useKVStore, useBlobStorage, useCachedData } from '@/hooks/useDBAL'
|
|
|
|
// In your component
|
|
function MyComponent() {
|
|
// KV Store hook
|
|
const kv = useKVStore()
|
|
await kv.set('key', 'value')
|
|
const value = await kv.get('key')
|
|
|
|
// Blob Storage hook
|
|
const blob = useBlobStorage()
|
|
await blob.upload('file.txt', data)
|
|
const fileData = await blob.download('file.txt')
|
|
|
|
// Cached Data hook (automatic serialization)
|
|
const { data, save, clear } = useCachedData('user-settings')
|
|
await save({ theme: 'light' })
|
|
}
|
|
```
|
|
|
|
### 3. Demo Component (`src/components/DBALDemo.tsx`)
|
|
|
|
A comprehensive demonstration component showing all DBAL features:
|
|
|
|
- Key-Value store operations
|
|
- List management
|
|
- Blob storage upload/download
|
|
- Cached data with React hooks
|
|
|
|
Access it by importing:
|
|
|
|
```typescript
|
|
import { DBALDemo } from '@/components/DBALDemo'
|
|
|
|
<DBALDemo />
|
|
```
|
|
|
|
## Usage Examples
|
|
|
|
### Storing User Preferences
|
|
|
|
```typescript
|
|
import { useKVStore } from '@/hooks/useDBAL'
|
|
|
|
function UserSettings() {
|
|
const kv = useKVStore()
|
|
|
|
const savePreferences = async () => {
|
|
await kv.set('user-preferences', {
|
|
theme: 'dark',
|
|
language: 'en',
|
|
notifications: true
|
|
}, 3600) // Cache for 1 hour
|
|
}
|
|
|
|
const loadPreferences = async () => {
|
|
const prefs = await kv.get('user-preferences')
|
|
return prefs
|
|
}
|
|
}
|
|
```
|
|
|
|
### Uploading Files
|
|
|
|
```typescript
|
|
import { useBlobStorage } from '@/hooks/useDBAL'
|
|
|
|
function FileUploader() {
|
|
const blob = useBlobStorage()
|
|
|
|
const handleUpload = async (file: File) => {
|
|
const arrayBuffer = await file.arrayBuffer()
|
|
const data = new Uint8Array(arrayBuffer)
|
|
|
|
await blob.upload(`uploads/${file.name}`, data, {
|
|
'content-type': file.type,
|
|
'uploaded-at': new Date().toISOString()
|
|
})
|
|
}
|
|
}
|
|
```
|
|
|
|
### Managing Lists
|
|
|
|
```typescript
|
|
import { useKVStore } from '@/hooks/useDBAL'
|
|
|
|
function RecentFiles() {
|
|
const kv = useKVStore()
|
|
|
|
const addRecentFile = async (filename: string) => {
|
|
await kv.listAdd('recent-files', [filename])
|
|
}
|
|
|
|
const getRecentFiles = async () => {
|
|
const files = await kv.listGet('recent-files', 0, 10) // Get first 10
|
|
return files
|
|
}
|
|
}
|
|
```
|
|
|
|
### Automatic Caching
|
|
|
|
```typescript
|
|
import { useCachedData } from '@/hooks/useDBAL'
|
|
|
|
function UserProfile() {
|
|
const { data, loading, save } = useCachedData('user-profile')
|
|
|
|
// data is automatically loaded from cache on mount
|
|
// save() automatically updates both cache and local state
|
|
|
|
const updateProfile = async (newData) => {
|
|
await save(newData, 7200) // Cache for 2 hours
|
|
}
|
|
}
|
|
```
|
|
|
|
## Multi-Tenant Support
|
|
|
|
The DBAL system includes full multi-tenant support with isolation, access control, and quotas:
|
|
|
|
```typescript
|
|
import { dbal } from '@/lib/dbal-integration'
|
|
|
|
// Create a new tenant
|
|
const tenantManager = dbal.getTenantManager()
|
|
await tenantManager.createTenant('company-123', {
|
|
maxBlobStorageBytes: 1024 * 1024 * 1024, // 1GB
|
|
maxBlobCount: 10000,
|
|
maxRecords: 100000
|
|
})
|
|
|
|
// Use tenant-specific storage
|
|
const kv = useKVStore('company-123', 'user-456')
|
|
await kv.set('company-data', { ... })
|
|
```
|
|
|
|
## Production Deployment
|
|
|
|
In production, the TypeScript client can connect to the C++ DBAL daemon via HTTP:
|
|
|
|
```typescript
|
|
// Configure DBAL to use remote server
|
|
await dbal.initialize({
|
|
adapter: 'http',
|
|
endpoint: 'http://dbal-daemon:8080'
|
|
})
|
|
```
|
|
|
|
The C++ daemon provides:
|
|
- High-performance HTTP/1.1 server
|
|
- PostgreSQL adapter for persistent storage
|
|
- S3/Filesystem blob storage
|
|
- Nginx-compatible reverse proxy headers
|
|
- Health checks and monitoring
|
|
- Multi-tenant isolation
|
|
- Access control and quotas
|
|
|
|
## Testing
|
|
|
|
Run the DBAL demo component to test all features:
|
|
|
|
```bash
|
|
# Start the development server
|
|
npm run dev
|
|
|
|
# Navigate to the DBAL Demo page
|
|
# Or import <DBALDemo /> in any component
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
```bash
|
|
# For TypeScript client
|
|
DBAL_ADAPTER=memory # or 'http' for production
|
|
DBAL_ENDPOINT=http://dbal-daemon:8080 # if using HTTP adapter
|
|
|
|
# TODO: deployment docs live under docs/deployments/; update this reference.
|
|
# For C++ daemon (see deployment/README.md)
|
|
DBAL_BIND_ADDRESS=0.0.0.0
|
|
DBAL_PORT=8080
|
|
DBAL_LOG_LEVEL=info
|
|
DBAL_MODE=production
|
|
```
|
|
|
|
### TypeScript Configuration
|
|
|
|
The DBAL module is aliased in `tsconfig.json` and `vite.config.ts`:
|
|
|
|
```json
|
|
{
|
|
"paths": {
|
|
"@/*": ["./src/*"],
|
|
"@/dbal/*": ["./dbal/*"]
|
|
}
|
|
}
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### DBALIntegration
|
|
|
|
Main singleton class for DBAL access.
|
|
|
|
**Methods:**
|
|
- `initialize(config?)` - Initialize DBAL system
|
|
- `getClient()` - Get DBAL client instance
|
|
- `getTenantManager()` - Get tenant manager
|
|
- `getKVStore()` - Get KV store instance
|
|
- `getBlobStorage()` - Get blob storage instance
|
|
- `kvSet(key, value, ttl?, tenantId?, userId?)` - Store key-value data
|
|
- `kvGet(key, tenantId?, userId?)` - Retrieve key-value data
|
|
- `kvDelete(key, tenantId?, userId?)` - Delete key-value data
|
|
- `kvListAdd(key, items, tenantId?, userId?)` - Add items to list
|
|
- `kvListGet(key, tenantId?, userId?, start?, end?)` - Get list items
|
|
- `blobUpload(key, data, metadata?)` - Upload blob data
|
|
- `blobDownload(key)` - Download blob data
|
|
- `blobDelete(key)` - Delete blob data
|
|
- `blobList(prefix?)` - List all blobs
|
|
- `blobGetMetadata(key)` - Get blob metadata
|
|
|
|
### React Hooks
|
|
|
|
**useDBAL()**
|
|
- Returns: `{ isReady, error }`
|
|
- Ensures DBAL is initialized
|
|
|
|
**useKVStore(tenantId?, userId?)**
|
|
- Returns: `{ isReady, set, get, delete, listAdd, listGet }`
|
|
- KV store operations with automatic error handling
|
|
|
|
**useBlobStorage()**
|
|
- Returns: `{ isReady, upload, download, delete, list, getMetadata }`
|
|
- Blob storage operations with automatic error handling
|
|
|
|
**useCachedData(key, tenantId?, userId?)**
|
|
- Returns: `{ data, loading, error, save, clear, isReady }`
|
|
- Automatic caching with React state management
|
|
|
|
## Troubleshooting
|
|
|
|
### DBAL not initializing
|
|
|
|
Check browser console for errors. Common issues:
|
|
- Path alias not configured correctly in vite.config.ts
|
|
- TypeScript path mapping missing in tsconfig.json
|
|
|
|
### Can't import DBAL modules
|
|
|
|
Ensure path aliases are configured:
|
|
```typescript
|
|
// Should work
|
|
import { dbal } from '@/lib/dbal-integration'
|
|
import { DBALClient } from '@/dbal/ts/src'
|
|
```
|
|
|
|
### Type errors
|
|
|
|
Run `npm run build` to check for TypeScript errors:
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
### Memory adapter limitations
|
|
|
|
The in-memory adapter stores data in browser memory:
|
|
- Data is lost on page reload
|
|
- Limited by browser memory constraints
|
|
- For production, use HTTP adapter with C++ daemon
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] HTTP adapter for TypeScript client
|
|
- [ ] Prisma integration for SQL queries
|
|
- [ ] Real-time sync between clients
|
|
- [ ] Offline support with sync
|
|
- [ ] Encryption at rest
|
|
- [ ] Advanced query builder
|
|
- [ ] GraphQL API layer
|
|
- [ ] WebSocket support for real-time updates
|
|
|
|
## Related Documentation
|
|
|
|
TODO: Fix related doc links (deployments path and local implementation docs).
|
|
- [C++ DBAL Documentation](../dbal/cpp/README.md)
|
|
- [TypeScript DBAL Documentation](../dbal/ts/README.md)
|
|
- [Docker Deployment](../deployment/README.md)
|
|
- [Multi-Tenant System](../MULTI_TENANT_SYSTEM.md)
|
|
- [Blob Storage](../BLOB_STORAGE_IMPLEMENTATION.md)
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
1. Check this documentation
|
|
2. Review the demo component (`src/components/DBALDemo.tsx`)
|
|
3. Check the integration tests
|
|
4. Create a GitHub issue
|
|
|
|
## License
|
|
|
|
TODO: No LICENSE file exists at repo root; update to correct location (e.g., docs/LICENSE) or add one.
|
|
See LICENSE file in project root.
|