feat(time-card-repository): Refactor TimeCardRepositoryImpl to utilize DataConnectService and simplify authentication handling

This commit is contained in:
Achintha Isuru
2026-02-16 16:35:26 -05:00
parent 24a13488da
commit 8889b8876e
2 changed files with 28 additions and 49 deletions

View File

@@ -1,63 +1,46 @@
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:firebase_data_connect/firebase_data_connect.dart' as fdc; import 'package:firebase_data_connect/firebase_data_connect.dart' as fdc;
import 'package:intl/intl.dart'; import 'package:intl/intl.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';
// ignore: implementation_imports // ignore: implementation_imports
import 'package:krow_domain/src/adapters/financial/time_card_adapter.dart'; import 'package:krow_domain/src/adapters/financial/time_card_adapter.dart';
import 'package:krow_core/core.dart';
import '../../domain/repositories/time_card_repository.dart'; import '../../domain/repositories/time_card_repository.dart';
/// Implementation of [TimeCardRepository] using Firebase Data Connect. /// Implementation of [TimeCardRepository] using Firebase Data Connect.
class TimeCardRepositoryImpl class TimeCardRepositoryImpl implements TimeCardRepository {
with dc.DataErrorHandler final dc.DataConnectService _service;
implements TimeCardRepository {
final dc.ExampleConnector _dataConnect;
final firebase.FirebaseAuth _firebaseAuth;
/// Creates a [TimeCardRepositoryImpl]. /// Creates a [TimeCardRepositoryImpl].
TimeCardRepositoryImpl({ TimeCardRepositoryImpl({dc.DataConnectService? service})
required dc.ExampleConnector dataConnect, : _service = service ?? dc.DataConnectService.instance;
required firebase.FirebaseAuth firebaseAuth,
}) : _dataConnect = dataConnect,
_firebaseAuth = firebaseAuth;
Future<String> _getStaffId() async {
final firebase.User? user = _firebaseAuth.currentUser;
if (user == null) {
throw const NotAuthenticatedException(
technicalMessage: 'User not authenticated');
}
final fdc.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');
}
return result.data.staffs.first.id;
}
@override @override
Future<List<TimeCard>> getTimeCards(DateTime month) async { Future<List<TimeCard>> getTimeCards(DateTime month) async {
return executeProtected(() async { return _service.run(() async {
final String staffId = await _getStaffId(); final String staffId = await _service.getStaffId();
// Fetch applications. Limit can be adjusted, assuming 100 is safe for now. // Fetch applications. Limit can be adjusted, assuming 100 is safe for now.
final fdc.QueryResult<dc.GetApplicationsByStaffIdData, dc.GetApplicationsByStaffIdVariables> result = final fdc.QueryResult<dc.GetApplicationsByStaffIdData,
await _dataConnect.getApplicationsByStaffId(staffId: staffId).limit(100).execute(); dc.GetApplicationsByStaffIdVariables> result =
await _service.connector
.getApplicationsByStaffId(staffId: staffId)
.limit(100)
.execute();
return result.data.applications return result.data.applications
.where((dc.GetApplicationsByStaffIdApplications app) { .where((dc.GetApplicationsByStaffIdApplications app) {
final DateTime? shiftDate = app.shift.date == null final DateTime? shiftDate = _service.toDateTime(app.shift.date);
? null
: DateTimeUtils.toDeviceTime(app.shift.date!.toDateTime());
if (shiftDate == null) return false; if (shiftDate == null) return false;
return shiftDate.year == month.year && shiftDate.month == month.month; return shiftDate.year == month.year &&
shiftDate.month == month.month;
}) })
.map((dc.GetApplicationsByStaffIdApplications app) { .map((dc.GetApplicationsByStaffIdApplications app) {
final DateTime shiftDate = final DateTime shiftDate = _service.toDateTime(app.shift.date)!;
DateTimeUtils.toDeviceTime(app.shift.date!.toDateTime()); final String startTime = _formatTime(app.checkInTime) ??
final String startTime = _formatTime(app.checkInTime) ?? _formatTime(app.shift.startTime) ?? ''; _formatTime(app.shift.startTime) ??
final String endTime = _formatTime(app.checkOutTime) ?? _formatTime(app.shift.endTime) ?? ''; '';
final String endTime = _formatTime(app.checkOutTime) ??
_formatTime(app.shift.endTime) ??
'';
// Prefer shiftRole values for pay/hours // Prefer shiftRole values for pay/hours
final double hours = app.shiftRole.hours ?? 0.0; final double hours = app.shiftRole.hours ?? 0.0;
@@ -84,7 +67,8 @@ class TimeCardRepositoryImpl
String? _formatTime(fdc.Timestamp? timestamp) { String? _formatTime(fdc.Timestamp? timestamp) {
if (timestamp == null) return null; if (timestamp == null) return null;
return DateFormat('HH:mm') final DateTime? dt = _service.toDateTime(timestamp);
.format(DateTimeUtils.toDeviceTime(timestamp.toDateTime())); if (dt == null) return null;
return DateFormat('HH:mm').format(dt);
} }
} }

View File

@@ -1,6 +1,6 @@
library staff_time_card; library staff_time_card;
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart'; import 'package:krow_core/core.dart';
import 'package:krow_data_connect/krow_data_connect.dart'; import 'package:krow_data_connect/krow_data_connect.dart';
@@ -24,12 +24,7 @@ class StaffTimeCardModule extends Module {
@override @override
void binds(Injector i) { void binds(Injector i) {
// Repositories // Repositories
i.add<TimeCardRepository>( i.addLazySingleton<TimeCardRepository>(TimeCardRepositoryImpl.new);
() => TimeCardRepositoryImpl(
dataConnect: ExampleConnector.instance,
firebaseAuth: FirebaseAuth.instance,
),
);
// UseCases // UseCases
i.add<GetTimeCardsUseCase>(GetTimeCardsUseCase.new); i.add<GetTimeCardsUseCase>(GetTimeCardsUseCase.new);
@@ -42,7 +37,7 @@ class StaffTimeCardModule extends Module {
void routes(RouteManager r) { void routes(RouteManager r) {
r.child( r.child(
StaffPaths.childRoute(StaffPaths.timeCard, StaffPaths.timeCard), StaffPaths.childRoute(StaffPaths.timeCard, StaffPaths.timeCard),
child: (context) => const TimeCardPage(), child: (BuildContext context) => const TimeCardPage(),
); );
} }
} }