From 1ab9ed63f682d50bf29773ec7985ac5b62a2f374 Mon Sep 17 00:00:00 2001 From: Freek van de Ven Date: Fri, 26 Jul 2024 14:12:07 +0200 Subject: [PATCH] feat: add validation check for break outside availability --- .../flutter_availability/lib/src/service/errors.dart | 5 +++++ .../lib/src/ui/screens/availability_modification.dart | 2 ++ .../lib/src/models/availability.dart | 11 ++++++++++- .../lib/src/utils.dart | 3 +++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/flutter_availability/lib/src/service/errors.dart b/packages/flutter_availability/lib/src/service/errors.dart index cf005ce..ed6c953 100644 --- a/packages/flutter_availability/lib/src/service/errors.dart +++ b/packages/flutter_availability/lib/src/service/errors.dart @@ -13,6 +13,11 @@ enum AvailabilityError { "and end time", ), + /// Error identifier for when a break is outside the availability time + breakOutsideAvailabilityTime( + "The break is outside the availability time", + ), + /// Error identifier for when the end of the day is before the start endBeforeStart("The end of the day is before the start"), diff --git a/packages/flutter_availability/lib/src/ui/screens/availability_modification.dart b/packages/flutter_availability/lib/src/ui/screens/availability_modification.dart index 4b824b4..15e0983 100644 --- a/packages/flutter_availability/lib/src/ui/screens/availability_modification.dart +++ b/packages/flutter_availability/lib/src/ui/screens/availability_modification.dart @@ -99,6 +99,8 @@ class _AvailabilitiesModificationScreenState error = AvailabilityError.breakEndBeforeStart; } on BreakSubmittedDurationTooLongException { error = AvailabilityError.breakSubmittedDurationTooLong; + } on BreakOutsideAvailabilityTimeException { + error = AvailabilityError.breakOutsideAvailabilityTime; } if (error != null && context.mounted) { diff --git a/packages/flutter_availability_data_interface/lib/src/models/availability.dart b/packages/flutter_availability_data_interface/lib/src/models/availability.dart index 5aa7ca1..b1bfff1 100644 --- a/packages/flutter_availability_data_interface/lib/src/models/availability.dart +++ b/packages/flutter_availability_data_interface/lib/src/models/availability.dart @@ -8,6 +8,9 @@ class BreakEndBeforeStartException implements Exception {} /// between the start and end time class BreakSubmittedDurationTooLongException implements Exception {} +/// Exception thrown when a break is outside the availability time +class BreakOutsideAvailabilityTimeException implements Exception {} + /// Exception thrown when the end is before the start class AvailabilityEndBeforeStartException implements Exception {} @@ -100,6 +103,12 @@ class AvailabilityModel { for (var breakData in breaks) { breakData.validate(); + var breakStart = breakData.startTime.time; + var breakEnd = breakData.endTime.time; + if (breakStart.isBefore(startDate.time) || + breakEnd.isAfter(endDate.time)) { + throw BreakOutsideAvailabilityTimeException(); + } } } } @@ -201,7 +210,7 @@ class AvailabilityBreakModel { /// Verify the validity of this break void validate() { - if (endTime.compareTo(startTime) < 0) { + if (!startTime.isBefore(endTime)) { throw BreakEndBeforeStartException(); } diff --git a/packages/flutter_availability_data_interface/lib/src/utils.dart b/packages/flutter_availability_data_interface/lib/src/utils.dart index 48f08fe..e16f1c7 100644 --- a/packages/flutter_availability_data_interface/lib/src/utils.dart +++ b/packages/flutter_availability_data_interface/lib/src/utils.dart @@ -3,6 +3,9 @@ extension DateUtils on DateTime { /// Gets the date without the time DateTime get date => DateTime(year, month, day); + /// Gets the time without the date + DateTime get time => DateTime(0, 0, 0, hour, minute); + /// Returns true if the time of the date matches the time of the other date bool timeMatches(DateTime other) => other.hour == hour && other.minute == minute;