mirror of
https://github.com/Iconica-Development/flutter_availability.git
synced 2025-05-20 13:43:43 +02:00
feat(flutter_availability_data_interface): define the models and interface for availabilities
This commit is contained in:
parent
e61c04350d
commit
d88d468837
2 changed files with 145 additions and 0 deletions
|
@ -0,0 +1,40 @@
|
||||||
|
import "package:flutter_availability_data_interface/src/models/availability.dart";
|
||||||
|
|
||||||
|
/// A base interface that defines the communication from the availability user
|
||||||
|
/// story to its persistance solution.
|
||||||
|
///
|
||||||
|
/// This class needs to be implemented for your use case, for example a REST API
|
||||||
|
/// or a Firebase database.
|
||||||
|
abstract interface class AvailabilityDataInterface {
|
||||||
|
/// Retrieves a list of availabilities for the given [userId].
|
||||||
|
///
|
||||||
|
/// Whether this is a one time value or a continuous stream of values is up to
|
||||||
|
/// the implementation.
|
||||||
|
Stream<List<AvailabilityModel>> getAvailabilityForUser(String userId);
|
||||||
|
|
||||||
|
/// Retrieves a specific availability for the given
|
||||||
|
/// [userId] and [availabilityId]
|
||||||
|
Stream<AvailabilityModel> getAvailabilityForUserById(
|
||||||
|
String userId,
|
||||||
|
String availabilityId,
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Deletes a specific availability for the given
|
||||||
|
/// [userId] and [availabilityId]
|
||||||
|
Future<void> deleteAvailabilityForUser(String userId, String availabilityId);
|
||||||
|
|
||||||
|
/// Updates the availability for the given [userId] and [availabilityId]
|
||||||
|
///
|
||||||
|
/// This will not work if no [availabilityId] for [userId] exists
|
||||||
|
Future<AvailabilityModel> updateAvailabilityForUser(
|
||||||
|
String userId,
|
||||||
|
String availabilityId,
|
||||||
|
AvailabilityModel updatedModel,
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Creates a new persistant representation of an availability model
|
||||||
|
Future<AvailabilityModel> createAvailabilityForUser(
|
||||||
|
String userId,
|
||||||
|
AvailabilityModel availability,
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/// A model defining the data structure for an availability
|
||||||
|
class AvailabilityModel {
|
||||||
|
/// Creates a new availability
|
||||||
|
const AvailabilityModel({
|
||||||
|
required this.userId,
|
||||||
|
required this.startDate,
|
||||||
|
required this.endDate,
|
||||||
|
required this.breaks,
|
||||||
|
this.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
/// the identifier for this availability
|
||||||
|
final String? id;
|
||||||
|
|
||||||
|
/// The uniquely identifiable string for who or what the
|
||||||
|
final String userId;
|
||||||
|
|
||||||
|
/// The from date of this availability.
|
||||||
|
///
|
||||||
|
/// [startDate] will always have to be before the end date.
|
||||||
|
final DateTime startDate;
|
||||||
|
|
||||||
|
/// The until date of this availability
|
||||||
|
///
|
||||||
|
/// [endDate] will always be before the start date.
|
||||||
|
final DateTime endDate;
|
||||||
|
|
||||||
|
/// A list of breaks during the specified time period
|
||||||
|
final List<AvailabilityBreakModel> breaks;
|
||||||
|
|
||||||
|
/// Copies the current properties into a new instance of [AvailabilityModel],
|
||||||
|
/// except for the properties provided to this method.
|
||||||
|
AvailabilityModel copyWith({
|
||||||
|
String? id,
|
||||||
|
String? userId,
|
||||||
|
DateTime? startDate,
|
||||||
|
DateTime? endDate,
|
||||||
|
List<AvailabilityBreakModel>? breaks,
|
||||||
|
}) =>
|
||||||
|
AvailabilityModel(
|
||||||
|
id: id ?? this.id,
|
||||||
|
userId: userId ?? this.userId,
|
||||||
|
startDate: startDate ?? this.startDate,
|
||||||
|
endDate: endDate ?? this.endDate,
|
||||||
|
breaks: breaks ?? this.breaks,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A model defining the structure of a break within an [AvailabilityModel]
|
||||||
|
class AvailabilityBreakModel {
|
||||||
|
/// Create a new AvailabilityBreakModel
|
||||||
|
const AvailabilityBreakModel({
|
||||||
|
required this.startTime,
|
||||||
|
required this.endTime,
|
||||||
|
Duration? duration,
|
||||||
|
}) : _duration = duration;
|
||||||
|
|
||||||
|
/// The start time for this break
|
||||||
|
///
|
||||||
|
/// If duration is not the same as the difference between [startTime] and
|
||||||
|
/// [endTime], the [startTime] is considered the start of the period of which
|
||||||
|
/// a break of [_duration] can be held.
|
||||||
|
final DateTime startTime;
|
||||||
|
|
||||||
|
/// The end time for this break
|
||||||
|
///
|
||||||
|
/// If duration is not the same as the difference between [startTime] and
|
||||||
|
/// [endTime], the [endTime] is considered the end of the period of which
|
||||||
|
/// a break of [_duration] can be held.
|
||||||
|
final DateTime endTime;
|
||||||
|
|
||||||
|
/// The full duration of the actual break.
|
||||||
|
///
|
||||||
|
/// This is allowed to diverge from the difference between [startTime] and
|
||||||
|
/// [endTime] to indicate that the break is somewhere between [startTime] and
|
||||||
|
/// [endTime]
|
||||||
|
final Duration? _duration;
|
||||||
|
|
||||||
|
/// Results in the set duration, or the difference between [startTime] and
|
||||||
|
/// [endTime] if no duration is set.
|
||||||
|
Duration get duration => _duration ?? period;
|
||||||
|
|
||||||
|
/// The period in which the break will take place.
|
||||||
|
///
|
||||||
|
/// Will be the same as [duration] if the initial [_duration] is null
|
||||||
|
Duration get period => endTime.difference(startTime);
|
||||||
|
|
||||||
|
/// Whether the duration of the break matches the difference between
|
||||||
|
/// [startTime] and [endTime]
|
||||||
|
bool get isTight => _duration == null || _duration == period;
|
||||||
|
|
||||||
|
/// Copies the current properties into a new instance of
|
||||||
|
/// [AvailabilityBreakModel], except for the properties provided
|
||||||
|
/// to this method.
|
||||||
|
AvailabilityBreakModel copyWith({
|
||||||
|
DateTime? startTime,
|
||||||
|
DateTime? endTime,
|
||||||
|
Duration? duration,
|
||||||
|
}) =>
|
||||||
|
AvailabilityBreakModel(
|
||||||
|
startTime: startTime ?? this.startTime,
|
||||||
|
endTime: endTime ?? this.endTime,
|
||||||
|
duration: duration ?? _duration,
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in a new issue