feat(availability): Refactor AvailabilityRepositoryImpl to use DataConnectService and simplify dependency injection
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user