diff --git a/lib/core/database/app_database.dart b/lib/core/database/app_database.dart new file mode 100644 index 0000000..16d499c --- /dev/null +++ b/lib/core/database/app_database.dart @@ -0,0 +1,70 @@ +import 'dart:io'; + +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as p; + +part 'app_database.g.dart'; + +class Tasks extends Table { + TextColumn get id => text()(); + TextColumn get title => text().withLength(min: 1, max: 500)(); + TextColumn get description => text().nullable()(); + DateTimeColumn get date => dateTime()(); + TextColumn get time => text().nullable()(); + TextColumn get priority => text().withDefault(const Constant('medium'))(); + BoolColumn get isDone => boolean().withDefault(const Constant(false))(); + DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); + DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)(); + + @override + Set get primaryKey => {id}; +} + +@DriftDatabase(tables: [Tasks]) +class AppDatabase extends _$AppDatabase { + AppDatabase() : super(_openConnection()); + + @override + int get schemaVersion => 1; + + // Task CRUD operations + Future> getTasksByDate(DateTime date) { + final startOfDay = DateTime(date.year, date.month, date.day); + final endOfDay = startOfDay.add(const Duration(days: 1)); + return (select(tasks) + ..where((t) => t.date.isBiggerOrEqualValue(startOfDay)) + ..where((t) => t.date.isSmallerThanValue(endOfDay)) + ..orderBy([(t) => OrderingTerm.asc(t.priority)])) + .get(); + } + + Future getTaskById(String id) { + return (select(tasks)..where((t) => t.id.equals(id))).getSingleOrNull(); + } + + Future insertTask(TasksCompanion task) { + return into(tasks).insert(task); + } + + Future updateTask(TasksCompanion task) { + return update(tasks).replace(task); + } + + Future deleteTaskById(String id) { + return (delete(tasks)..where((t) => t.id.equals(id))).go(); + } + + Future> getAllTasks() { + return select(tasks).get(); + } +} + +LazyDatabase _openConnection() { + return LazyDatabase(() async { + final dbFolder = await getApplicationDocumentsDirectory(); + final file = File(p.join(dbFolder.path, 'agenda_tasks.sqlite')); + return NativeDatabase.createInBackground(file); + }); +}