1
0
mirror of https://github.com/DocNR/POWR.git synced 2025-05-14 10:15:52 +00:00

design doc update

This commit is contained in:
DocNR 2025-02-15 14:10:51 -05:00
parent 147ea582fc
commit 7d07beb7d6

@ -1,231 +1,137 @@
# POWR Database Implementation PRD # [Feature Name] Design Document
## Problem Statement ## Problem Statement
POWR requires a robust SQLite database implementation that enables local-first fitness tracking while supporting future Nostr protocol integration. The database must efficiently handle exercise definitions (NIP-33401), workout templates (NIP-33402), and workout records (NIP-33403) while maintaining a clean separation between local storage needs and Nostr protocol compatibility. [Concise description of the problem being solved]
## Requirements ## Requirements
### Functional Requirements ### Functional Requirements
- Store and process exercise definitions with complete metadata - [List of must-have functionality]
- Support workout template creation and management - [User-facing features]
- Track workout records and performance history - [Core capabilities]
- Enable efficient content querying and filtering
- Handle both local and Nostr-sourced content seamlessly
- Support offline-first operations with sync capabilities
- Manage template dependencies and incomplete references
- Track exercise history and performance metrics
- Support batch operations and migrations
### Non-Functional Requirements ### Non-Functional Requirements
- Query response time < 100ms for common operations - Performance targets
- Support concurrent read/write operations safely - Security requirements
- Minimize memory usage through efficient caching - Reliability goals
- Maintain data integrity across sync operations - Usability standards
- Scale to handle 1000+ exercises and 100+ templates
- Support incremental sync with Nostr relays
- Ensure consistent performance on mobile devices
- Support automated testing and validation
## Design Decisions ## Design Decisions
### 1. Storage Architecture ### 1. [Major Decision Area]
Use a dual storage approach with separate tables for raw events and processed data: [Description of approach chosen]
Rationale: Rationale:
- Maintains perfect relay replication capability - [Key reason]
- Enables efficient local querying - [Supporting factors]
- Supports dependency tracking - [Trade-offs considered]
- Facilitates future sync operations
- Allows for flexible schema evolution
### 2. Cache Management ### 2. [Major Decision Area]
Implement an LRU cache system with configurable limits: [Description of approach chosen]
Rationale: Rationale:
- Improves read performance for common queries - [Key reason]
- Manages memory usage effectively - [Supporting factors]
- Supports write buffering for batch operations - [Trade-offs considered]
- Provides tunable performance controls
### 3. Schema Design
Use a normalized schema with proper constraints and indexing:
Rationale:
- Ensures data integrity
- Enables efficient querying
- Supports future extensions
- Maintains clear relationships
## Technical Design ## Technical Design
### Core Schema
```sql
-- Schema Version
CREATE TABLE schema_version (
version INTEGER PRIMARY KEY,
updated_at INTEGER NOT NULL
);
-- Raw Events
CREATE TABLE nostr_events (
id TEXT PRIMARY KEY,
kind INTEGER NOT NULL,
pubkey TEXT NOT NULL,
created_at INTEGER NOT NULL,
content TEXT,
raw_event TEXT NOT NULL,
source TEXT DEFAULT 'local'
);
-- Processed Exercises
CREATE TABLE exercise_definitions (
event_id TEXT PRIMARY KEY,
title TEXT NOT NULL,
type TEXT NOT NULL,
category TEXT NOT NULL,
equipment TEXT,
description TEXT,
format_json TEXT,
format_units_json TEXT,
FOREIGN KEY(event_id) REFERENCES nostr_events(id)
);
-- Templates
CREATE TABLE workout_templates (
event_id TEXT PRIMARY KEY,
title TEXT NOT NULL,
type TEXT NOT NULL,
category TEXT NOT NULL,
description TEXT,
rounds INTEGER,
duration INTEGER,
interval_time INTEGER,
rest_between_rounds INTEGER,
created_at INTEGER NOT NULL,
FOREIGN KEY(event_id) REFERENCES nostr_events(id)
);
```
### Core Components ### Core Components
```typescript ```typescript
interface DbService { // Key interfaces/types
// Core database operations interface ComponentName {
executeSql(sql: string, params?: any[]): Promise<SQLiteResult>; // Critical fields
withTransaction<T>(operation: () => Promise<T>): Promise<T>;
// Migration handling
getCurrentVersion(): Promise<number>;
migrate(targetVersion?: number): Promise<void>;
} }
interface CacheManager { // Core functionality
// Cache configuration function mainOperation() {
maxExercises: number; // Key logic
maxTemplates: number;
writeBufferSize: number;
// Cache operations
get<T>(key: string): Promise<T | undefined>;
set<T>(key: string, value: T): Promise<void>;
invalidate(key: string): Promise<void>;
} }
``` ```
### Integration Points
- [System interfaces]
- [External dependencies]
- [API definitions]
## Implementation Plan ## Implementation Plan
### Phase 1: Core Infrastructure (Week 1-2) ### Phase 1: [Initial Phase]
1. Set up base schema and migrations 1. [Step 1]
2. Implement DbService class 2. [Step 2]
3. Add basic CRUD operations 3. [Step 3]
4. Create test infrastructure
### Phase 2: Cache Layer (Week 2-3) ### Phase 2: [Next Phase]
1. Implement CacheManager 1. [Step 1]
2. Add LRU caching 2. [Step 2]
3. Configure write buffering 3. [Step 3]
4. Add cache invalidation
### Phase 3: Query Layer (Week 3-4)
1. Build query builders
2. Implement common queries
3. Add search functionality
4. Optimize performance
### Phase 4: Nostr Integration (Week 4-5)
1. Add event processing
2. Implement sync logic
3. Handle dependencies
4. Add relay management
## Testing Strategy ## Testing Strategy
### Unit Tests ### Unit Tests
- Schema creation and migrations - [Key test areas]
- CRUD operations for all entities - [Critical test cases]
- Cache operations and invalidation - [Test tooling]
- Query builder functions
### Integration Tests ### Integration Tests
- End-to-end workflow testing - [End-to-end scenarios]
- Template dependency handling - [Cross-component tests]
- Sync operations - [Test environments]
- Performance benchmarks
### Performance Tests
- Query response times
- Cache hit rates
- Write operation latency
- Memory usage patterns
## Observability ## Observability
### Logging ### Logging
- Schema migrations - [Key log points]
- Cache operations - [Log levels]
- Query performance - [Critical events]
- Error conditions
### Metrics ### Metrics
- Query response times - [Performance metrics]
- Cache hit/miss rates - [Business metrics]
- Database size - [System health metrics]
- Operation counts
## Future Considerations ## Future Considerations
### Potential Enhancements ### Potential Enhancements
- Advanced caching strategies - [Future feature ideas]
- Full-text search - [Scalability improvements]
- Data compression - [Technical debt items]
- Cloud backup options
### Known Limitations ### Known Limitations
- SQLite concurrent access - [Current constraints]
- Initial sync performance - [Technical restrictions]
- Cache memory constraints - [Scope boundaries]
- Platform-specific issues
## Dependencies ## Dependencies
### Runtime Dependencies ### Runtime Dependencies
- expo-sqlite - [External services]
- @react-native-async-storage/async-storage - [Libraries]
- NDK (future) - [System requirements]
### Development Dependencies ### Development Dependencies
- Jest - [Build tools]
- TypeScript - [Test frameworks]
- SQLite development tools - [Development utilities]
## Security Considerations ## Security Considerations
- Input validation - [Security measures]
- Query parameterization - [Privacy concerns]
- Event signature verification - [Data protection]
- Access control
## Rollout Strategy
### Development Phase
1. [Development steps]
2. [Testing approach]
3. [Documentation needs]
### Production Deployment
1. [Deployment steps]
2. [Migration plan]
3. [Monitoring setup]
## References ## References
- NDK SQLite Implementation - [Related documents]
- Nostr NIP-01 Specification - [External resources]
- POWR Exercise NIP Draft - [Research materials]
- React Native SQLite Documentation