creek

The AI Image Editor of 2030

database.dart (3011B)


import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class AppDatabase {
  static Database? _db;
  static const String _dbName = 'database_v7.db';

  static Future<Database> get db async {
    if (_db != null) return _db!;
    _db = await _init();
    return _db!;
  }

  static Future<Database> _init() async {
    final path = join(await getDatabasesPath(), _dbName);

    return await openDatabase(
      path,
      version: 1,
      onConfigure: (db) async {
        await db.execute('PRAGMA foreign_keys = ON');
      },
      onCreate: (db, version) async {
        // 1. PROJECTS
        await db.execute('''
          CREATE TABLE projects (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            description TEXT,
            parent_id INTEGER, 
            global_stylesheet TEXT,
            last_accessed_at TEXT,
            assets_path TEXT DEFAULT '[]',
            created_at TEXT,
            FOREIGN KEY (parent_id) REFERENCES projects (id) ON DELETE CASCADE
          )
        ''');

        // Create Inbox Project (ID 0) for Drafts
        await db.rawInsert(
          '''
          INSERT INTO projects (id, title, description, last_accessed_at, created_at)
          VALUES (0, 'Inbox', 'Holding area for shared images', ?, ?)
        ''',
          [DateTime.now().toIso8601String(), DateTime.now().toIso8601String()],
        );

        // 2. IMAGES (Moodboard)
        await db.execute('''
          CREATE TABLE images (
            id TEXT PRIMARY KEY,
            project_id INTEGER NOT NULL,
            file_path TEXT NOT NULL,
            name TEXT,
            tags TEXT DEFAULT '[]', 
            analysis_data TEXT,
            created_at TEXT,
            status TEXT DEFAULT 'pending',
            FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
          )
        ''');

        // 3. FILES (Project Work)
        await db.execute('''
          CREATE TABLE files (
            id TEXT PRIMARY KEY,
            project_id INTEGER NOT NULL,
            file_path TEXT NOT NULL,
            name TEXT,
            description TEXT,
            tags TEXT DEFAULT '[]',
            last_updated TEXT,
            created_at TEXT,
            FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
          )
        ''');

        // 4. NOTES
        await db.execute('''
          CREATE TABLE notes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            image_id TEXT NOT NULL,
            content TEXT NOT NULL,
            category TEXT NOT NULL,
            created_at TEXT,
            norm_x REAL DEFAULT 0.5,
            norm_y REAL DEFAULT 0.5,
            norm_width REAL DEFAULT 0.0,
            norm_height REAL DEFAULT 0.0,
            analysis_data TEXT,
            crop_file_path TEXT,
            status TEXT DEFAULT 'pending',
            FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE
          )
        ''');
      },
    );
  }
}