feat: Refactor session management and improve user session data retrieval

This commit is contained in:
Achintha Isuru
2026-02-17 16:05:45 -05:00
parent 631af65a2f
commit ddf270074b
8 changed files with 281 additions and 223 deletions

View File

@@ -16,16 +16,16 @@ import '../../domain/repositories/hub_repository_interface.dart';
/// Implementation of [HubRepositoryInterface] backed by Data Connect.
class HubRepositoryImpl implements HubRepositoryInterface {
HubRepositoryImpl({
required dc.DataConnectService service,
}) : _service = service;
HubRepositoryImpl({required dc.DataConnectService service})
: _service = service;
final dc.DataConnectService _service;
@override
Future<List<domain.Hub>> getHubs() async {
return _service.run(() async {
final dc.GetBusinessesByUserIdBusinesses business = await _getBusinessForCurrentUser();
final dc.GetBusinessesByUserIdBusinesses business =
await _getBusinessForCurrentUser();
final String teamId = await _getOrCreateTeamId(business);
return _fetchHubsForTeam(teamId: teamId, businessId: business.id);
});
@@ -45,10 +45,12 @@ class HubRepositoryImpl implements HubRepositoryInterface {
String? zipCode,
}) async {
return _service.run(() async {
final dc.GetBusinessesByUserIdBusinesses business = await _getBusinessForCurrentUser();
final dc.GetBusinessesByUserIdBusinesses business =
await _getBusinessForCurrentUser();
final String teamId = await _getOrCreateTeamId(business);
final _PlaceAddress? placeAddress =
placeId == null || placeId.isEmpty ? null : await _fetchPlaceAddress(placeId);
final _PlaceAddress? placeAddress = placeId == null || placeId.isEmpty
? null
: await _fetchPlaceAddress(placeId);
final String? cityValue = city ?? placeAddress?.city ?? business.city;
final String? stateValue = state ?? placeAddress?.state;
final String? streetValue = street ?? placeAddress?.street;
@@ -56,21 +58,17 @@ class HubRepositoryImpl implements HubRepositoryInterface {
final String? zipCodeValue = zipCode ?? placeAddress?.zipCode;
final OperationResult<dc.CreateTeamHubData, dc.CreateTeamHubVariables>
result = await _service.connector
.createTeamHub(
teamId: teamId,
hubName: name,
address: address,
)
.placeId(placeId)
.latitude(latitude)
.longitude(longitude)
.city(cityValue?.isNotEmpty == true ? cityValue : '')
.state(stateValue)
.street(streetValue)
.country(countryValue)
.zipCode(zipCodeValue)
.execute();
result = await _service.connector
.createTeamHub(teamId: teamId, hubName: name, address: address)
.placeId(placeId)
.latitude(latitude)
.longitude(longitude)
.city(cityValue?.isNotEmpty == true ? cityValue : '')
.state(stateValue)
.street(streetValue)
.country(countryValue)
.zipCode(zipCodeValue)
.execute();
final String createdId = result.data.teamHub_insert.id;
final List<domain.Hub> hubs = await _fetchHubsForTeam(
@@ -101,14 +99,13 @@ class HubRepositoryImpl implements HubRepositoryInterface {
return _service.run(() async {
final String businessId = await _service.getBusinessId();
final QueryResult<dc.ListOrdersByBusinessAndTeamHubData,
dc.ListOrdersByBusinessAndTeamHubVariables> result =
await _service.connector
.listOrdersByBusinessAndTeamHub(
businessId: businessId,
teamHubId: id,
)
.execute();
final QueryResult<
dc.ListOrdersByBusinessAndTeamHubData,
dc.ListOrdersByBusinessAndTeamHubVariables
>
result = await _service.connector
.listOrdersByBusinessAndTeamHub(businessId: businessId, teamHubId: id)
.execute();
if (result.data.orders.isNotEmpty) {
throw HubHasOrdersException(
@@ -121,14 +118,14 @@ class HubRepositoryImpl implements HubRepositoryInterface {
}
@override
Future<void> assignNfcTag({
required String hubId,
required String nfcTagId,
}) {
throw UnimplementedError('NFC tag assignment is not supported for team hubs.');
Future<void> assignNfcTag({required String hubId, required String nfcTagId}) {
throw UnimplementedError(
'NFC tag assignment is not supported for team hubs.',
);
}
Future<dc.GetBusinessesByUserIdBusinesses> _getBusinessForCurrentUser() async {
Future<dc.GetBusinessesByUserIdBusinesses>
_getBusinessForCurrentUser() async {
final dc.ClientSession? session = dc.ClientSessionStore.instance.session;
final dc.ClientBusinessSession? cachedBusiness = session?.business;
if (cachedBusiness != null) {
@@ -136,7 +133,9 @@ class HubRepositoryImpl implements HubRepositoryInterface {
id: cachedBusiness.id,
businessName: cachedBusiness.businessName,
userId: _service.auth.currentUser?.uid ?? '',
rateGroup: const dc.Known<dc.BusinessRateGroup>(dc.BusinessRateGroup.STANDARD),
rateGroup: const dc.Known<dc.BusinessRateGroup>(
dc.BusinessRateGroup.STANDARD,
),
status: const dc.Known<dc.BusinessStatus>(dc.BusinessStatus.ACTIVE),
contactName: cachedBusiness.contactName,
companyLogoUrl: cachedBusiness.companyLogoUrl,
@@ -160,11 +159,13 @@ class HubRepositoryImpl implements HubRepositoryInterface {
);
}
final QueryResult<dc.GetBusinessesByUserIdData,
dc.GetBusinessesByUserIdVariables> result =
await _service.connector.getBusinessesByUserId(
userId: user.uid,
).execute();
final QueryResult<
dc.GetBusinessesByUserIdData,
dc.GetBusinessesByUserIdVariables
>
result = await _service.connector
.getBusinessesByUserId(userId: user.uid)
.execute();
if (result.data.businesses.isEmpty) {
await _service.auth.signOut();
throw BusinessNotFoundException(
@@ -172,12 +173,11 @@ class HubRepositoryImpl implements HubRepositoryInterface {
);
}
final dc.GetBusinessesByUserIdBusinesses business = result.data.businesses.first;
final dc.GetBusinessesByUserIdBusinesses business =
result.data.businesses.first;
if (session != null) {
dc.ClientSessionStore.instance.setSession(
dc.ClientSession(
user: session.user,
userPhotoUrl: session.userPhotoUrl,
business: dc.ClientBusinessSession(
id: business.id,
businessName: business.businessName,
@@ -197,26 +197,26 @@ class HubRepositoryImpl implements HubRepositoryInterface {
dc.GetBusinessesByUserIdBusinesses business,
) async {
final QueryResult<dc.GetTeamsByOwnerIdData, dc.GetTeamsByOwnerIdVariables>
teamsResult = await _service.connector.getTeamsByOwnerId(
ownerId: business.id,
).execute();
teamsResult = await _service.connector
.getTeamsByOwnerId(ownerId: business.id)
.execute();
if (teamsResult.data.teams.isNotEmpty) {
return teamsResult.data.teams.first.id;
}
final dc.CreateTeamVariablesBuilder createTeamBuilder = _service.connector.createTeam(
teamName: '${business.businessName} Team',
ownerId: business.id,
ownerName: business.contactName ?? '',
ownerRole: 'OWNER',
);
final dc.CreateTeamVariablesBuilder createTeamBuilder = _service.connector
.createTeam(
teamName: '${business.businessName} Team',
ownerId: business.id,
ownerName: business.contactName ?? '',
ownerRole: 'OWNER',
);
if (business.email != null) {
createTeamBuilder.email(business.email);
}
final OperationResult<dc.CreateTeamData, dc.CreateTeamVariables>
createTeamResult =
await createTeamBuilder.execute();
createTeamResult = await createTeamBuilder.execute();
final String teamId = createTeamResult.data.team_insert.id;
return teamId;
@@ -226,11 +226,13 @@ class HubRepositoryImpl implements HubRepositoryInterface {
required String teamId,
required String businessId,
}) async {
final QueryResult<dc.GetTeamHubsByTeamIdData,
dc.GetTeamHubsByTeamIdVariables> hubsResult =
await _service.connector.getTeamHubsByTeamId(
teamId: teamId,
).execute();
final QueryResult<
dc.GetTeamHubsByTeamIdData,
dc.GetTeamHubsByTeamIdVariables
>
hubsResult = await _service.connector
.getTeamHubsByTeamId(teamId: teamId)
.execute();
return hubsResult.data.teamHubs
.map(
@@ -240,10 +242,9 @@ class HubRepositoryImpl implements HubRepositoryInterface {
name: hub.hubName,
address: hub.address,
nfcTagId: null,
status:
hub.isActive
? domain.HubStatus.active
: domain.HubStatus.inactive,
status: hub.isActive
? domain.HubStatus.active
: domain.HubStatus.inactive,
),
)
.toList();
@@ -288,7 +289,8 @@ class HubRepositoryImpl implements HubRepositoryInterface {
for (final dynamic entry in components) {
final Map<String, dynamic> component = entry as Map<String, dynamic>;
final List<dynamic> types = component['types'] as List<dynamic>? ?? <dynamic>[];
final List<dynamic> types =
component['types'] as List<dynamic>? ?? <dynamic>[];
final String? longName = component['long_name'] as String?;
final String? shortName = component['short_name'] as String?;