diff --git a/lib/model/alarm.dart b/lib/model/alarm.dart index 67a7a37..7a6e8f9 100644 --- a/lib/model/alarm.dart +++ b/lib/model/alarm.dart @@ -1,18 +1,23 @@ +import 'fixed_time_alarm.dart'; import 'location_alarm.dart'; -import 'time_alarm.dart'; +import 'relative_time_alarm.dart'; abstract class Alarm { String get id; String get taskId; + AlarmType get alarmType; Map toJson(); factory Alarm.fromJson(Map json) { - if (json.containsKey('triggerAt')) { - return TimeAlarm.fromJson(json); - } - - if (json.containsKey('location')) { - return LocationAlarm.fromJson(json); + if (json.containsKey('alarmType')) { + switch (json['alarmType'] as String) { + case 'timeFixed': + return FixedTimeAlarm.fromJson(json); + case 'timeRelative': + return RelativeTimeAlarm.fromJson(json); + case 'location': + return LocationAlarm.fromJson(json); + } } throw ArgumentError('Unknown alarm type'); diff --git a/lib/model/callback_models/create_fixed_time_alarm_request.dart b/lib/model/callback_models/create_fixed_time_alarm_request.dart new file mode 100644 index 0000000..7bdeb06 --- /dev/null +++ b/lib/model/callback_models/create_fixed_time_alarm_request.dart @@ -0,0 +1,9 @@ +import '../alarm.dart'; +import 'create_alarm_request.dart'; + +class CreateFixedTimeAlarmRequest extends CreateAlarmRequest { + final DateTime? triggerAt; + + CreateFixedTimeAlarmRequest({this.triggerAt}) + : super(alarmType: AlarmType.timeFixed); +} diff --git a/lib/model/callback_models/create_relative_time_alarm_request.dart b/lib/model/callback_models/create_relative_time_alarm_request.dart new file mode 100644 index 0000000..93ea8fb --- /dev/null +++ b/lib/model/callback_models/create_relative_time_alarm_request.dart @@ -0,0 +1,9 @@ +import '../alarm.dart' show AlarmType; +import 'create_alarm_request.dart'; + +class CreateRelativeTimeAlarmRequest extends CreateAlarmRequest { + final DateTime? triggerAt; + + CreateRelativeTimeAlarmRequest({this.triggerAt}) + : super(alarmType: AlarmType.timeRelative); +} diff --git a/lib/model/callback_models/create_time_alarm_request.dart b/lib/model/callback_models/create_time_alarm_request.dart deleted file mode 100644 index 27f5b49..0000000 --- a/lib/model/callback_models/create_time_alarm_request.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'create_alarm_request.dart'; - -class CreateTimeAlarmRequest extends CreateAlarmRequest { - final DateTime? triggerAt; - - CreateTimeAlarmRequest({this.triggerAt, required super.alarmType}); -} diff --git a/lib/model/time_alarm.dart b/lib/model/fixed_time_alarm.dart similarity index 65% rename from lib/model/time_alarm.dart rename to lib/model/fixed_time_alarm.dart index f7aabc5..ba7d0d9 100644 --- a/lib/model/time_alarm.dart +++ b/lib/model/fixed_time_alarm.dart @@ -1,6 +1,6 @@ import 'alarm.dart'; -class TimeAlarm implements Alarm { +class FixedTimeAlarm implements Alarm { @override final String id; @@ -9,14 +9,17 @@ class TimeAlarm implements Alarm { final DateTime triggerAt; - const TimeAlarm({ + @override + final AlarmType alarmType; + + const FixedTimeAlarm({ required this.id, required this.taskId, required this.triggerAt, - }); + }) : alarmType = AlarmType.timeFixed; - factory TimeAlarm.fromJson(Map json) { - return TimeAlarm( + factory FixedTimeAlarm.fromJson(Map json) { + return FixedTimeAlarm( id: json['id'] as String, taskId: json['taskId'] as String, triggerAt: DateTime.parse(json['triggerAt'] as String), @@ -29,6 +32,7 @@ class TimeAlarm implements Alarm { 'id': id, 'taskId': taskId, 'triggerAt': triggerAt.toIso8601String(), + 'alarmType': alarmType, }; } } diff --git a/lib/model/location_alarm.dart b/lib/model/location_alarm.dart index 0d8d10a..695c6e7 100644 --- a/lib/model/location_alarm.dart +++ b/lib/model/location_alarm.dart @@ -12,12 +12,15 @@ class LocationAlarm implements Alarm { final int radiusMeters; + @override + final AlarmType alarmType; + const LocationAlarm({ required this.id, required this.taskId, required this.location, required this.radiusMeters, - }); + }) : alarmType = AlarmType.location; factory LocationAlarm.fromJson(Map json) { return LocationAlarm( @@ -35,6 +38,7 @@ class LocationAlarm implements Alarm { 'taskId': taskId, 'location': location.toJson(), 'radiusMeters': radiusMeters, + 'alarmType': alarmType, }; } } diff --git a/lib/model/relative_time_alarm.dart b/lib/model/relative_time_alarm.dart new file mode 100644 index 0000000..709aa97 --- /dev/null +++ b/lib/model/relative_time_alarm.dart @@ -0,0 +1,38 @@ +import 'alarm.dart'; + +class RelativeTimeAlarm implements Alarm { + @override + final String id; + + @override + final String taskId; + + final DateTime triggerAt; + + @override + final AlarmType alarmType; + + const RelativeTimeAlarm({ + required this.id, + required this.taskId, + required this.triggerAt, + }) : alarmType = AlarmType.timeRelative; + + factory RelativeTimeAlarm.fromJson(Map json) { + return RelativeTimeAlarm( + id: json['id'] as String, + taskId: json['taskId'] as String, + triggerAt: DateTime.parse(json['triggerAt'] as String), + ); + } + + @override + Map toJson() { + return { + 'id': id, + 'taskId': taskId, + 'triggerAt': triggerAt.toIso8601String(), + 'alarmType': alarmType, + }; + } +}