diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 9b8abb1..140b045 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:filcnaplo/utils/jwt.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index ea6a653..3d27729 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -9,7 +9,7 @@ Future initDB() async { var settingsDB = await createSettingsTable(db); // Create table Users - await db.execute("CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT, username TEXT, password TEXT, institute_code TEXT, student TEXT)"); + var usersDB = await createUsersTable(db); await db.execute("CREATE TABLE IF NOT EXISTS user_data (" "id TEXT NOT NULL, grades TEXT, timetable TEXT, exams TEXT, homework TEXT, messages TEXT, notes TEXT, events TEXT, absences TEXT)"); @@ -18,7 +18,9 @@ Future initDB() async { await db.insert("settings", SettingsProvider.defaultSettings().toMap()); } - await migrateDB(db, settingsDB.struct.keys); + // Migrate Databases + await migrateDB(db, "settings", settingsDB.struct.keys, SettingsProvider.defaultSettings().toMap(), createSettingsTable); + await migrateDB(db, "users", usersDB.struct.keys, {"role": 0}, createUsersTable); return db; } @@ -38,35 +40,59 @@ Future createSettingsTable(Database db) async { return settingsDB; } -Future migrateDB(Database db, Iterable keys) async { - var settings = (await db.query("settings"))[0]; +Future createUsersTable(Database db) async { + var usersDB = DatabaseStruct( + {"id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": String}); - bool migrationRequired = keys.any((key) => !settings.containsKey(key) || settings[key] == null); + // Create table Users + await db.execute("CREATE TABLE IF NOT EXISTS users ($usersDB)"); - if (migrationRequired) { - var defaultSettings = SettingsProvider.defaultSettings(); - var settingsCopy = Map.from(settings); - - // Delete settings - await db.execute("drop table settings"); - - // Fill missing columns - keys.forEach((key) { - if (!keys.contains(key)) { - print("debug: dropping $key"); - settingsCopy.remove(key); - } - - if (!settings.containsKey(key) || settings[key] == null) { - print("DEBUG: migrating $key"); - settingsCopy[key] = defaultSettings.toMap()[key]; - } - }); - - // Recreate settings - await createSettingsTable(db); - await db.insert("settings", settingsCopy); - - print("INFO: Database migrated"); - } + return usersDB; +} + +Future migrateDB( + Database db, + String table, + Iterable keys, + Map defaultValues, + Future Function(Database) create, +) async { + var originalRows = (await db.query(table)); + + if (originalRows.length == 0) { + await db.execute("drop table $table"); + await create(db); + return; + } + + await Future.forEach>(originalRows, (original) async { + bool migrationRequired = keys.any((key) => !original.containsKey(key) || original[key] == null); + + if (migrationRequired) { + print("INFO: Migrating $table"); + var copy = Map.from(original); + + // Delete table + await db.execute("drop table $table"); + + // Fill missing columns + keys.forEach((key) { + if (!keys.contains(key)) { + print("DEBUG: dropping $key"); + copy.remove(key); + } + + if (!original.containsKey(key) || original[key] == null) { + print("DEBUG: migrating $key"); + copy[key] = defaultValues[key]; + } + }); + + // Recreate table + await create(db); + await db.insert(table, copy); + + print("INFO: Database migrated"); + } + }); } diff --git a/filcnaplo/lib/database/struct.dart b/filcnaplo/lib/database/struct.dart index 50b3355..cec8e48 100644 --- a/filcnaplo/lib/database/struct.dart +++ b/filcnaplo/lib/database/struct.dart @@ -15,7 +15,7 @@ class DatabaseStruct { break; } - return "${name} ${typeName.toUpperCase()}"; + return "${name} ${typeName.toUpperCase()} ${name == 'id' ? 'NOT NULL' : ''}"; } @override