Commit bc0336f

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-03-28 10:41:14
implement seconds extension for DateTime
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent d8a90af
health_data_store/lib/src/extensions/datetime_seconds.dart
@@ -0,0 +1,9 @@
+/// Add the ability to interact with the original seconds based unix timestamp.
+extension DateTimeS on DateTime {
+  /// The number of seconds since the "Unix epoch" 1970-01-01T00:00:00Z (UTC).
+  int get secondsSinceEpoch => millisecondsSinceEpoch ~/ 1000;
+
+  /// Constructs a new DateTime instance with the given [secondsSinceEpoch].
+  static DateTime fromSecondsSinceEpoch(int secondsSinceEpoch)
+      => DateTime.fromMillisecondsSinceEpoch(secondsSinceEpoch * 1000);
+}
health_data_store/lib/src/repositories/blood_pressure_repository.dart
@@ -1,6 +1,7 @@
 import 'package:health_data_store/health_data_store.dart';
 import 'package:health_data_store/src/database_helper.dart';
 import 'package:health_data_store/src/database_manager.dart';
+import 'package:health_data_store/src/extensions/datetime_seconds.dart';
 import 'package:health_data_store/src/repositories/repository.dart';
 import 'package:sqflite_common/sqflite.dart';
 
@@ -20,7 +21,7 @@ class BloodPressureRepository extends Repository<BloodPressureRecord> {
     assert(record.sys != null || record.dia != null || record.pul != null,
      "Adding records that don't contain values(sys,dia,pul) can't be accessed"
      'and should therefore not be added to the repository.');
-    final timeSec = record.time.millisecondsSinceEpoch ~/ 1000;
+    final timeSec = record.time.secondsSinceEpoch;
     await _db.transaction((txn) async {
       final entryID = await DBHelper.getEntryID(
         txn,
@@ -63,7 +64,7 @@ class BloodPressureRepository extends Repository<BloodPressureRecord> {
     for (final r in results) {
       final timeS = r['timestampUnixS'] as int;
       final newRec = BloodPressureRecord(
-        time: DateTime.fromMillisecondsSinceEpoch(timeS * 1000),
+        time: DateTimeS.fromSecondsSinceEpoch(timeS),
         sys: r['sys'] as int?,
         dia: r['dia'] as int?,
         pul: r['pul'] as int?,
@@ -95,7 +96,7 @@ class BloodPressureRepository extends Repository<BloodPressureRecord> {
         query += 'AND pul = ? ';
 
       final entryResult = await txn.rawQuery(query, [
-        value.time.millisecondsSinceEpoch ~/ 1000,
+        value.time.secondsSinceEpoch,
         if (value.sys != null)
           value.sys,
         if (value.dia != null)
health_data_store/lib/src/repositories/medicine_intake_repository.dart
@@ -1,6 +1,7 @@
 import 'package:health_data_store/health_data_store.dart';
 import 'package:health_data_store/src/database_helper.dart';
 import 'package:health_data_store/src/database_manager.dart';
+import 'package:health_data_store/src/extensions/datetime_seconds.dart';
 import 'package:health_data_store/src/repositories/repository.dart';
 import 'package:sqflite_common/sqflite.dart';
 
@@ -12,7 +13,7 @@ class MedicineIntakeRepository extends Repository<MedicineIntake> {
   /// Create a repository for medicine intakes.
   MedicineIntakeRepository(this._db);
 
-  /// The [DatabaseManager] managed database
+  /// The [DatabaseManager] managed database.
   final Database _db;
 
   @override
@@ -38,7 +39,7 @@ class MedicineIntakeRepository extends Repository<MedicineIntake> {
 
     // obtain free entry id
     final id = await DBHelper.getEntryID(
-      txn, intake.time.millisecondsSinceEpoch ~/ 1000,
+      txn, intake.time.secondsSinceEpoch,
       ['Intake'],
     );
 
@@ -65,7 +66,7 @@ class MedicineIntakeRepository extends Repository<MedicineIntake> {
     for (final r in results) {
       final timeS = r['timestampUnixS'] as int;
       intakes.add(MedicineIntake(
-        time: DateTime.fromMillisecondsSinceEpoch(timeS * 1000),
+        time: DateTimeS.fromSecondsSinceEpoch(timeS * 1000),
         dosis: r['dosis'] as double,
         medicine: Medicine(
           designation: r['designation'] as String,
@@ -92,7 +93,7 @@ class MedicineIntakeRepository extends Repository<MedicineIntake> {
         + ((intake.medicine.dosis != null) ? '= ?' : 'IS NULL') +
     ')',
     [
-      intake.time.millisecondsSinceEpoch ~/ 1000,
+      intake.time.secondsSinceEpoch,
       intake.dosis,
       intake.medicine.designation,
       if (intake.medicine.color != null)
health_data_store/lib/src/types/date_range.dart
@@ -1,4 +1,5 @@
 import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:health_data_store/src/extensions/datetime_seconds.dart';
 
 part 'date_range.freezed.dart';
 
@@ -27,8 +28,8 @@ class DateRange with _$DateRange {
   Duration get duration => end.difference(start);
 
   /// Gets the [start] timestamp in seconds since epoch.
-  int get startStamp => start.millisecondsSinceEpoch ~/ 1000;
+  int get startStamp => start.secondsSinceEpoch;
 
   /// Gets the [end] timestamp in seconds since epoch.
-  int get endStamp => end.millisecondsSinceEpoch ~/ 1000;
+  int get endStamp => end.secondsSinceEpoch;
 }
health_data_store/test/src/extensions/detetime_seconds_test.dart
@@ -0,0 +1,14 @@
+import 'package:health_data_store/src/extensions/datetime_seconds.dart';
+import 'package:test/expect.dart';
+import 'package:test/scaffolding.dart';
+
+void main() {
+  test('should create DateTime correctly', () {
+    final t = DateTimeS.fromSecondsSinceEpoch(42);
+    expect(t.millisecondsSinceEpoch, 42 * 1000);
+  });
+  test('should return time since epoch correctly', () {
+    final t = DateTimeS.fromSecondsSinceEpoch(42);
+    expect(t.secondsSinceEpoch, 42);
+  });
+}
health_data_store/test/src/database_manager_test.dart
@@ -1,4 +1,5 @@
 import 'package:health_data_store/src/database_manager.dart';
+import 'package:health_data_store/src/extensions/datetime_seconds.dart';
 import 'package:sqflite_common/sqflite.dart';
 import 'package:sqflite_common_ffi/sqflite_ffi.dart';
 import 'package:test/test.dart';
@@ -91,7 +92,7 @@ void main() {
     addTearDown(db.close);
     await db.db.insert('Timestamps', {
       'entryID': 1,
-      'timestampUnixS': DateTime.now().millisecondsSinceEpoch ~/ 1000,
+      'timestampUnixS': DateTime.now().secondsSinceEpoch,
     });
     final data = await db.db.query('Timestamps');
     expect(data, hasLength(1));
@@ -99,7 +100,7 @@ void main() {
 
     await expectLater(() async => db.db.insert('Timestamps', {
       'entryID': 1,
-      'timestampUnixS': DateTime.now().millisecondsSinceEpoch ~/ 1000,
+      'timestampUnixS': DateTime.now().secondsSinceEpoch,
     }), throwsException);
     await expectLater(() async => db.db.insert('Timestamps', {
       'entryID': 1,