feat(time-card-repository): Refactor TimeCardRepositoryImpl to utilize DataConnectService and simplify authentication handling
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user