feat(availability): Refactor AvailabilityRepositoryImpl to use DataConnectService and simplify dependency injection

This commit is contained in:
Achintha Isuru
2026-02-16 15:48:45 -05:00
parent d0585d12ab
commit 1f7134799b
2 changed files with 13 additions and 44 deletions

View File

@@ -1,4 +1,3 @@
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:firebase_data_connect/firebase_data_connect.dart'; import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'package:krow_data_connect/krow_data_connect.dart' as dc; import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'package:krow_domain/krow_domain.dart'; import 'package:krow_domain/krow_domain.dart';
@@ -10,44 +9,19 @@ import '../../domain/repositories/availability_repository.dart';
/// not specific date availability. Therefore, updating availability for a specific /// not specific date availability. Therefore, updating availability for a specific
/// date will update the availability for that Day of Week globally (Recurring). /// date will update the availability for that Day of Week globally (Recurring).
class AvailabilityRepositoryImpl class AvailabilityRepositoryImpl
with dc.DataErrorHandler
implements AvailabilityRepository { implements AvailabilityRepository {
final dc.ExampleConnector _dataConnect; final dc.DataConnectService _service;
final firebase.FirebaseAuth _firebaseAuth;
String? _cachedStaffId;
AvailabilityRepositoryImpl({ AvailabilityRepositoryImpl() : _service = dc.DataConnectService.instance;
required dc.ExampleConnector dataConnect,
required firebase.FirebaseAuth firebaseAuth,
}) : _dataConnect = dataConnect,
_firebaseAuth = firebaseAuth;
Future<String> _getStaffId() async {
if (_cachedStaffId != null) return _cachedStaffId!;
final firebase.User? user = _firebaseAuth.currentUser;
if (user == null) {
throw NotAuthenticatedException(
technicalMessage: 'User not authenticated');
}
final QueryResult<dc.GetStaffByUserIdData, dc.GetStaffByUserIdVariables> result =
await _dataConnect.getStaffByUserId(userId: user.uid).execute();
if (result.data.staffs.isEmpty) {
throw const ServerException(technicalMessage: 'Staff profile not found');
}
_cachedStaffId = result.data.staffs.first.id;
return _cachedStaffId!;
}
@override @override
Future<List<DayAvailability>> getAvailability(DateTime start, DateTime end) async { Future<List<DayAvailability>> getAvailability(DateTime start, DateTime end) async {
return executeProtected(() async { return _service.run(() async {
final String staffId = await _getStaffId(); final String staffId = await _service.getStaffId();
// 1. Fetch Weekly recurring availability // 1. Fetch Weekly recurring availability
final QueryResult<dc.ListStaffAvailabilitiesByStaffIdData, dc.ListStaffAvailabilitiesByStaffIdVariables> result = final QueryResult<dc.ListStaffAvailabilitiesByStaffIdData, dc.ListStaffAvailabilitiesByStaffIdVariables> result =
await _dataConnect.listStaffAvailabilitiesByStaffId(staffId: staffId).limit(100).execute(); await _service.connector.listStaffAvailabilitiesByStaffId(staffId: staffId).limit(100).execute();
final List<dc.ListStaffAvailabilitiesByStaffIdStaffAvailabilities> items = result.data.staffAvailabilities; final List<dc.ListStaffAvailabilitiesByStaffIdStaffAvailabilities> items = result.data.staffAvailabilities;
@@ -124,8 +98,8 @@ class AvailabilityRepositoryImpl
@override @override
Future<DayAvailability> updateDayAvailability(DayAvailability availability) async { Future<DayAvailability> updateDayAvailability(DayAvailability availability) async {
return executeProtected(() async { return _service.run(() async {
final String staffId = await _getStaffId(); final String staffId = await _service.getStaffId();
final dc.DayOfWeek dow = _toBackendDay(availability.date.weekday); final dc.DayOfWeek dow = _toBackendDay(availability.date.weekday);
// Update each slot in the backend. // Update each slot in the backend.
@@ -143,8 +117,8 @@ class AvailabilityRepositoryImpl
@override @override
Future<List<DayAvailability>> applyQuickSet(DateTime start, DateTime end, String type) async { Future<List<DayAvailability>> applyQuickSet(DateTime start, DateTime end, String type) async {
return executeProtected(() async { return _service.run(() async {
final String staffId = await _getStaffId(); final String staffId = await _service.getStaffId();
// QuickSet updates the Recurring schedule for all days involved. // QuickSet updates the Recurring schedule for all days involved.
// However, if the user selects a range that covers e.g. Mon-Fri, we update Mon-Fri. // However, if the user selects a range that covers e.g. Mon-Fri, we update Mon-Fri.
@@ -204,7 +178,7 @@ class AvailabilityRepositoryImpl
Future<void> _upsertSlot(String staffId, dc.DayOfWeek day, dc.AvailabilitySlot slot, dc.AvailabilityStatus status) async { Future<void> _upsertSlot(String staffId, dc.DayOfWeek day, dc.AvailabilitySlot slot, dc.AvailabilityStatus status) async {
// Check if exists // Check if exists
final result = await _dataConnect.getStaffAvailabilityByKey( final result = await _service.connector.getStaffAvailabilityByKey(
staffId: staffId, staffId: staffId,
day: day, day: day,
slot: slot, slot: slot,
@@ -212,14 +186,14 @@ class AvailabilityRepositoryImpl
if (result.data.staffAvailability != null) { if (result.data.staffAvailability != null) {
// Update // Update
await _dataConnect.updateStaffAvailability( await _service.connector.updateStaffAvailability(
staffId: staffId, staffId: staffId,
day: day, day: day,
slot: slot, slot: slot,
).status(status).execute(); ).status(status).execute();
} else { } else {
// Create // Create
await _dataConnect.createStaffAvailability( await _service.connector.createStaffAvailability(
staffId: staffId, staffId: staffId,
day: day, day: day,
slot: slot, slot: slot,

View File

@@ -18,12 +18,7 @@ class StaffAvailabilityModule extends Module {
@override @override
void binds(Injector i) { void binds(Injector i) {
// Repository // Repository
i.add<AvailabilityRepository>( i.add<AvailabilityRepository>(AvailabilityRepositoryImpl.new);
() => AvailabilityRepositoryImpl(
dataConnect: ExampleConnector.instance,
firebaseAuth: FirebaseAuth.instance,
),
);
// UseCases // UseCases
i.add(GetWeeklyAvailabilityUseCase.new); i.add(GetWeeklyAvailabilityUseCase.new);