mirror of
https://github.com/Iconica-Development/flutter_availability.git
synced 2025-05-19 13:13:44 +02:00
feat: add local interface implementation for in memory version of the userstory
This commit is contained in:
parent
61bc0a8b53
commit
06a6e25fa7
1 changed files with 153 additions and 0 deletions
153
packages/flutter_availability/lib/src/service/local_service.dart
Normal file
153
packages/flutter_availability/lib/src/service/local_service.dart
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
import "dart:async";
|
||||||
|
|
||||||
|
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
|
||||||
|
|
||||||
|
/// A local implementation of the [AvailabilityDataInterface] that stores data
|
||||||
|
/// in memory.
|
||||||
|
class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
|
||||||
|
final Map<String, List<AvailabilityModel>> _userAvailabilities = {};
|
||||||
|
|
||||||
|
final StreamController<Map<String, List<AvailabilityModel>>>
|
||||||
|
_availabilityController = StreamController.broadcast();
|
||||||
|
|
||||||
|
void _notifyChanges() {
|
||||||
|
_availabilityController.add(_userAvailabilities);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<AvailabilityModel>> applyTemplateForUser(
|
||||||
|
String userId,
|
||||||
|
AvailabilityTemplateModel template,
|
||||||
|
DateTime start,
|
||||||
|
DateTime end,
|
||||||
|
) async {
|
||||||
|
// Implementation for applying a template
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<AvailabilityModel> createAvailabilityForUser(
|
||||||
|
String userId,
|
||||||
|
AvailabilityModel availability,
|
||||||
|
) async {
|
||||||
|
var availabilities = _userAvailabilities.putIfAbsent(userId, () => []);
|
||||||
|
var newAvailability = availability.copyWith(id: _generateId());
|
||||||
|
availabilities.add(newAvailability);
|
||||||
|
_notifyChanges();
|
||||||
|
return newAvailability;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<AvailabilityTemplateModel> createTemplateForUser(
|
||||||
|
String userId,
|
||||||
|
AvailabilityTemplateModel template,
|
||||||
|
) {
|
||||||
|
// Implementation for creating a template
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> deleteAvailabilityForUser(
|
||||||
|
String userId,
|
||||||
|
String availabilityId,
|
||||||
|
) async {
|
||||||
|
var availabilities = _userAvailabilities[userId];
|
||||||
|
if (availabilities != null) {
|
||||||
|
availabilities
|
||||||
|
.removeWhere((availability) => availability.id == availabilityId);
|
||||||
|
_notifyChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> deleteTemplateForUser(String userId, String templateId) {
|
||||||
|
// Implementation for deleting a template
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<List<AvailabilityModel>> getAvailabilityForUser({
|
||||||
|
required String userId,
|
||||||
|
DateTime? start,
|
||||||
|
DateTime? end,
|
||||||
|
}) =>
|
||||||
|
_availabilityController.stream.map((availabilitiesMap) {
|
||||||
|
var availabilities = availabilitiesMap[userId];
|
||||||
|
if (availabilities != null) {
|
||||||
|
if (start != null && end != null) {
|
||||||
|
return availabilities
|
||||||
|
.where(
|
||||||
|
(availability) =>
|
||||||
|
availability.startDate.isBefore(end) &&
|
||||||
|
availability.endDate.isAfter(start),
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
|
} else {
|
||||||
|
return availabilities;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<AvailabilityModel> getAvailabilityForUserById(
|
||||||
|
String userId,
|
||||||
|
String availabilityId,
|
||||||
|
) =>
|
||||||
|
_availabilityController.stream.map((availabilitiesMap) {
|
||||||
|
var availabilities = availabilitiesMap[userId];
|
||||||
|
if (availabilities != null) {
|
||||||
|
return availabilities
|
||||||
|
.firstWhere((availability) => availability.id == availabilityId);
|
||||||
|
} else {
|
||||||
|
throw Exception("Availability not found");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<AvailabilityTemplateModel> getTemplateForUserById(
|
||||||
|
String userId,
|
||||||
|
String templateId,
|
||||||
|
) {
|
||||||
|
// Implementation for getting a template by ID
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<List<AvailabilityTemplateModel>> getTemplatesForUser(String userId) {
|
||||||
|
// Implementation for getting all templates for a user
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<AvailabilityModel> updateAvailabilityForUser(
|
||||||
|
String userId,
|
||||||
|
String availabilityId,
|
||||||
|
AvailabilityModel updatedModel,
|
||||||
|
) async {
|
||||||
|
var availabilities = _userAvailabilities[userId];
|
||||||
|
if (availabilities != null) {
|
||||||
|
var index = availabilities
|
||||||
|
.indexWhere((availability) => availability.id == availabilityId);
|
||||||
|
if (index != -1) {
|
||||||
|
availabilities[index] = updatedModel.copyWith(id: availabilityId);
|
||||||
|
_notifyChanges();
|
||||||
|
return availabilities[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw Exception("Availability not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<AvailabilityTemplateModel> updateTemplateForUser(
|
||||||
|
String userId,
|
||||||
|
String templateId,
|
||||||
|
AvailabilityTemplateModel updatedModel,
|
||||||
|
) {
|
||||||
|
// Implementation for updating a template
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
String _generateId() => DateTime.now().millisecondsSinceEpoch.toString();
|
||||||
|
}
|
Loading…
Reference in a new issue