Files
GroovyBox/lib/data/db.dart

95 lines
3.1 KiB
Dart

import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
part 'db.g.dart';
class Tracks extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text()();
TextColumn get artist => text().nullable()();
TextColumn get album => text().nullable()();
IntColumn get duration => integer().nullable()(); // Duration in milliseconds
TextColumn get path => text().unique()();
TextColumn get artUri => text().nullable()(); // Path to local cover art
TextColumn get lyrics => text().nullable()(); // JSON formatted lyrics
IntColumn get lyricsOffset => integer().withDefault(
const Constant(0),
)(); // Offset in milliseconds for lyrics timing
DateTimeColumn get addedAt => dateTime().withDefault(currentDateAndTime)();
}
class Playlists extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text()();
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
}
class PlaylistEntries extends Table {
IntColumn get id => integer().autoIncrement()();
IntColumn get playlistId => integer().references(Playlists, #id)();
IntColumn get trackId =>
integer().references(Tracks, #id, onDelete: KeyAction.cascade)();
DateTimeColumn get addedAt => dateTime().withDefault(currentDateAndTime)();
}
class WatchFolders extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get path => text().unique()();
TextColumn get name => text()();
BoolColumn get isActive => boolean().withDefault(const Constant(true))();
BoolColumn get recursive => boolean().withDefault(const Constant(true))();
DateTimeColumn get addedAt => dateTime().withDefault(currentDateAndTime)();
DateTimeColumn get lastScanned => dateTime().nullable()();
}
class AppSettings extends Table {
TextColumn get key => text()();
TextColumn get value => text()();
@override
Set<Column> get primaryKey => {key};
}
@DriftDatabase(
tables: [Tracks, Playlists, PlaylistEntries, WatchFolders, AppSettings],
)
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 6; // Bump version for watch folders and settings
@override
MigrationStrategy get migration {
return MigrationStrategy(
onCreate: (Migrator m) async {
await m.createAll();
},
onUpgrade: (Migrator m, int from, int to) async {
if (from < 2) {
await m.addColumn(tracks, tracks.artUri);
}
if (from < 3) {
await m.createTable(playlists);
await m.createTable(playlistEntries);
}
if (from < 4) {
await m.addColumn(tracks, tracks.lyrics);
}
if (from < 5) {
await m.addColumn(tracks, tracks.lyricsOffset);
}
if (from < 6) {
// Create tables for watch folders and settings
await m.createTable(watchFolders);
await m.createTable(appSettings);
}
},
);
}
static QueryExecutor _openConnection() {
return driftDatabase(name: 'groovybox_db');
}
}