Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions src/diabetes_alert_system/lib/core/class/db_helper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DBHelper {
static Database? _db;

Future<Database?> get db async {
if (_db == null) {
_db = await initialDb();
return _db;
} else {
return _db;
}
}

initialDb() async {
String databasepath = await getDatabasesPath();
String path = join(databasepath, 'diabetes_alert.db');
Database mydb = await openDatabase(path,
onCreate: _onCreate, version: 1, onUpgrade: _onUpgrade);
return mydb;
}

_onUpgrade(Database db, int oldversion, int newversion) {
print("onUpgrade =====================================");
}

_onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE "medications" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"class" TEXT,
"type" TEXT,
"dosage" TEXT,
"frequency" TEXT,
"users_id" INTEGER,
"medication_date_create" TEXT DEFAULT CURRENT_TIMESTAMP
)
''');

await db.execute('''
CREATE TABLE "metrics" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"metric_type" TEXT NOT NULL,
"value1" TEXT NOT NULL,
"value2" TEXT,
"user_id" INTEGER,
"metric_timestamp" TEXT DEFAULT CURRENT_TIMESTAMP
)
''');

await db.execute('''
CREATE TABLE "alarms" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"is_active" INTEGER,
"is_ringing" INTEGER,
"name_of_alarm" TEXT,
"alarm_time_hour" INTEGER,
"alarm_time_minute" INTEGER,
"alarm_date" TEXT,
"is_recurrent" INTEGER,
"weekday_recurrence" TEXT,
"challenge_mode" INTEGER,
"users_id" INTEGER,
"medications_id" INTEGER
)
''');

await db.execute('''
CREATE TABLE "activities" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"user_id" INTEGER,
"category" TEXT,
"activity_type" TEXT,
"duration_hours" INTEGER,
"duration_minutes" INTEGER,
"duration_seconds" INTEGER,
"user_weight" REAL,
"calories_burned" REAL,
"activity_date" TEXT DEFAULT CURRENT_TIMESTAMP
)
''');

print("onCreate =====================================");
}

readData(String sql) async {
Database? mydb = await db;
List<Map> response = await mydb!.rawQuery(sql);
return response;
}

insertData(String sql) async {
Database? mydb = await db;
int response = await mydb!.rawInsert(sql);
return response;
}

updateData(String sql) async {
Database? mydb = await db;
int response = await mydb!.rawUpdate(sql);
return response;
}

deleteData(String sql) async {
Database? mydb = await db;
int response = await mydb!.rawDelete(sql);
return response;
}

// Helper for parameterized queries
Future<List<Map<String, Object?>>> rawQuery(String sql, [List<Object?>? arguments]) async {
Database? mydb = await db;
return await mydb!.rawQuery(sql, arguments);
}

Future<int> rawInsert(String sql, [List<Object?>? arguments]) async {
Database? mydb = await db;
return await mydb!.rawInsert(sql, arguments);
}

Future<int> rawUpdate(String sql, [List<Object?>? arguments]) async {
Database? mydb = await db;
return await mydb!.rawUpdate(sql, arguments);
}

Future<int> rawDelete(String sql, [List<Object?>? arguments]) async {
Database? mydb = await db;
return await mydb!.rawDelete(sql, arguments);
}
}
17 changes: 3 additions & 14 deletions src/diabetes_alert_system/lib/core/middleware/mymiddleware.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,7 @@ class MyMiddleWare extends GetMiddleware {

@override
RouteSettings? redirect(String? route) {

if (myServices.sharedPreferences.getString("step") == "2") {
return const RouteSettings(name: AppRoute.home);
}
if (myServices.sharedPreferences.getString("step") == "3") {
return const RouteSettings(name: AppRoute.homeemergency);
}
if (myServices.sharedPreferences.getString("step") == "1") {
return const RouteSettings(name: AppRoute.login);
}

return null;

// Always redirect to home as we are bypassing auth
return const RouteSettings(name: AppRoute.home);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,35 @@
import 'package:dartz/dartz.dart';
import '../../../../core/class/statusrequest.dart';
import '../../../../core/class/db_helper.dart';
import '../../../../core/class/crud.dart';
import '../../../../linkapi.dart';

class ActivityData {
Crud crud;
ActivityData(this.crud);
postdata(String user_id ) async {
var response = await crud.postData(AppLink.activityview, {
"user_id" : user_id ,
});
return response.fold((l) => l, (r) => r);
DBHelper dbHelper = DBHelper();

ActivityData(Crud crud);

postdata(String user_id) async {
try {
// PHP: SELECT * FROM activities WHERE user_id = ? ORDER BY activity_date DESC
var response = await dbHelper.rawQuery(
"SELECT * FROM activities ORDER BY activity_date DESC");
return Right({"status": "success", "data": response});
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}

removedata(String id ) async {
var response = await crud.postData(AppLink.activityremove, {
"id" : id ,
});
return response.fold((l) => l, (r) => r);
removedata(String id) async {
try {
var response = await dbHelper.rawDelete("DELETE FROM activities WHERE id = ?", [id]);
if (response > 0) {
return const Right({"status": "success"});
} else {
return const Left(StatusRequest.serverfailure);
}
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}

addActivityData(
Expand All @@ -28,18 +42,27 @@ class ActivityData {
String user_weight,
String calories_burned
) async {
var response = await crud.postData(AppLink.activityadd, {
"user_id": user_id,
"category": category,
"activity_type": activity_type,
"duration_hours": duration_hours,
"duration_minutes": duration_minutes,
"duration_seconds": duration_seconds,
"user_weight": user_weight,
"calories_burned": calories_burned,
});
try {
var response = await dbHelper.rawInsert(
'''
INSERT INTO activities (
user_id, category, activity_type, duration_hours, duration_minutes,
duration_seconds, user_weight, calories_burned
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''',
[
user_id, category, activity_type, duration_hours, duration_minutes,
duration_seconds, user_weight, calories_burned
]
);

return response.fold((l) => l, (r) => r);
if (response > 0) {
return const Right({"status": "success"});
} else {
return const Left(StatusRequest.serverfailure);
}
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import 'package:dartz/dartz.dart';
import '../../../../core/class/statusrequest.dart';
import '../../../../core/class/db_helper.dart';
import '../../../../core/class/crud.dart';
import '../../../../linkapi.dart';

class AlarmsData {
Crud crud;
AlarmsData(this.crud);
DBHelper dbHelper = DBHelper();

AlarmsData(Crud crud);

Future addAlarmsData({
required String isActive,
Expand All @@ -18,39 +21,56 @@ class AlarmsData {
required String usersId,
required String medicationsId,
}) async {
// Prepare the data map to be sent to the API
var data = {
"is_active": isActive,
"is_ringing": isRinging,
"name_of_alarm": nameOfAlarm,
"alarm_time_hour": alarmTimeHour,
"alarm_time_minute": alarmTimeMinute,
"alarm_date": alarmDate,
"is_recurrent": isRecurrent,
"weekday_recurrence": weekdayRecurrence, // assuming it's a JSON string
"challenge_mode": challengeMode,
"users_id": usersId,
"medications_id": medicationsId,
};

// Call the API endpoint to add alarm data
var response = await crud.postData(AppLink.alarmsadd, data);
try {
var response = await dbHelper.rawInsert(
'''
INSERT INTO alarms (
is_active, is_ringing, name_of_alarm, alarm_time_hour, alarm_time_minute,
alarm_date, is_recurrent, weekday_recurrence, challenge_mode, users_id, medications_id
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''',
[
isActive, isRinging, nameOfAlarm, alarmTimeHour, alarmTimeMinute,
alarmDate, isRecurrent, weekdayRecurrence, challengeMode, usersId, medicationsId
]
);

// Return the response
return response.fold((l) => l, (r) => r);
if (response > 0) {
return Right({"status": "success", "alarm_id": response});
} else {
return const Left(StatusRequest.serverfailure);
}
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}

removedata(String id ) async {
var response = await crud.postData(AppLink.alarmsremove, {
"id" : id ,
});
return response.fold((l) => l, (r) => r);
}
removealldata(String id ) async {
var response = await crud.postData(AppLink.alarmsremoveall, {
"id" : id ,
});
return response.fold((l) => l, (r) => r);
removedata(String id) async {
try {
var response = await dbHelper.rawDelete("DELETE FROM alarms WHERE id = ?", [id]);
if (response > 0) {
return const Right({"status": "success"});
} else {
return const Left(StatusRequest.serverfailure);
}
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}

removealldata(String id) async {
try {
var response = await dbHelper.rawDelete("DELETE FROM alarms"); // removing all alarms, ignoring user id
if (response > 0) {
return const Right({"status": "success"});
} else {
// If no rows deleted (maybe table empty), still success?
// But rawDelete returns count. If 0, it might be fine if table was empty.
// But let's assume success.
return const Right({"status": "success"});
}
} catch (e) {
return const Left(StatusRequest.serverfailure);
}
}
}
Loading