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

View File

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