mirror of
https://github.com/DocNR/POWR.git
synced 2025-06-06 18:31:03 +00:00
126 lines
3.6 KiB
TypeScript
126 lines
3.6 KiB
TypeScript
// lib/db/services/DevSeederService.ts
|
|
import { SQLiteDatabase } from 'expo-sqlite';
|
|
import { ExerciseService } from './ExerciseService';
|
|
import { logDatabaseInfo } from '../debug';
|
|
import { mockExerciseEvents, convertNostrToExercise } from '../../mocks/exercises';
|
|
import NDK, { NDKEvent } from '@nostr-dev-kit/ndk-mobile';
|
|
|
|
export class DevSeederService {
|
|
private db: SQLiteDatabase;
|
|
private exerciseService: ExerciseService;
|
|
private ndk: NDK | null = null;
|
|
|
|
constructor(
|
|
db: SQLiteDatabase,
|
|
exerciseService: ExerciseService
|
|
) {
|
|
this.db = db;
|
|
this.exerciseService = exerciseService;
|
|
}
|
|
|
|
setNDK(ndk: NDK) {
|
|
this.ndk = ndk;
|
|
}
|
|
|
|
async seedDatabase() {
|
|
if (!__DEV__) return;
|
|
|
|
try {
|
|
console.log('Starting development database seeding...');
|
|
|
|
// Log initial database state
|
|
await logDatabaseInfo();
|
|
|
|
// Check if we already have exercises
|
|
const existingCount = (await this.exerciseService.getAllExercises()).length;
|
|
|
|
if (existingCount > 0) {
|
|
console.log('Database already seeded with', existingCount, 'exercises');
|
|
return;
|
|
}
|
|
|
|
// Start transaction for all seeding operations
|
|
await this.db.withTransactionAsync(async () => {
|
|
console.log('Seeding mock exercises...');
|
|
|
|
// Process all events within the same transaction
|
|
for (const eventData of mockExerciseEvents) {
|
|
if (this.ndk) {
|
|
// If NDK is available, use it to cache the event
|
|
const event = new NDKEvent(this.ndk);
|
|
Object.assign(event, eventData);
|
|
|
|
// Cache the event in NDK
|
|
if (this.ndk) {
|
|
const ndkEvent = new NDKEvent(this.ndk);
|
|
|
|
// Copy event properties
|
|
ndkEvent.kind = eventData.kind;
|
|
ndkEvent.content = eventData.content;
|
|
ndkEvent.created_at = eventData.created_at;
|
|
ndkEvent.tags = eventData.tags;
|
|
|
|
// If we have mock signatures, use them
|
|
if (eventData.sig) {
|
|
ndkEvent.sig = eventData.sig;
|
|
ndkEvent.id = eventData.id || '';
|
|
ndkEvent.pubkey = eventData.pubkey || '';
|
|
} else if (this.ndk.signer) {
|
|
// Otherwise sign if possible
|
|
await ndkEvent.sign();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Create exercise from the mock data regardless of NDK availability
|
|
const exercise = convertNostrToExercise(eventData);
|
|
await this.exerciseService.createExercise(exercise, true);
|
|
}
|
|
|
|
console.log('Successfully seeded', mockExerciseEvents.length, 'exercises');
|
|
});
|
|
|
|
// Log final database state
|
|
await logDatabaseInfo();
|
|
|
|
} catch (error) {
|
|
console.error('Error seeding database:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async clearDatabase() {
|
|
if (!__DEV__) return;
|
|
|
|
try {
|
|
console.log('Clearing development database...');
|
|
|
|
await this.db.withTransactionAsync(async () => {
|
|
const tables = [
|
|
'exercises',
|
|
'exercise_tags',
|
|
'nostr_events',
|
|
'event_tags',
|
|
'cache_metadata',
|
|
'ndk_cache' // Add the NDK Mobile cache table
|
|
];
|
|
|
|
for (const table of tables) {
|
|
await this.db.runAsync(`DELETE FROM ${table}`);
|
|
}
|
|
});
|
|
|
|
console.log('Successfully cleared database');
|
|
} catch (error) {
|
|
console.error('Error clearing database:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async resetDatabase() {
|
|
if (!__DEV__) return;
|
|
|
|
await this.clearDatabase();
|
|
await this.seedDatabase();
|
|
}
|
|
} |