new schemas of teams and hubs

This commit is contained in:
José Salazar
2026-01-22 12:25:24 -05:00
parent c211c4712d
commit fdf28beae4
10 changed files with 18825 additions and 18667 deletions

View File

@@ -1,16 +1,16 @@
# Basic Usage # Basic Usage
```dart ```dart
ExampleConnector.instance.createDocument(createDocumentVariables).execute(); ExampleConnector.instance.createFaqData(createFaqDataVariables).execute();
ExampleConnector.instance.updateDocument(updateDocumentVariables).execute(); ExampleConnector.instance.updateFaqData(updateFaqDataVariables).execute();
ExampleConnector.instance.deleteDocument(deleteDocumentVariables).execute(); ExampleConnector.instance.deleteFaqData(deleteFaqDataVariables).execute();
ExampleConnector.instance.createConversation(createConversationVariables).execute(); ExampleConnector.instance.createLevel(createLevelVariables).execute();
ExampleConnector.instance.updateConversation(updateConversationVariables).execute(); ExampleConnector.instance.updateLevel(updateLevelVariables).execute();
ExampleConnector.instance.updateConversationLastMessage(updateConversationLastMessageVariables).execute(); ExampleConnector.instance.deleteLevel(deleteLevelVariables).execute();
ExampleConnector.instance.deleteConversation(deleteConversationVariables).execute(); ExampleConnector.instance.listMessages().execute();
ExampleConnector.instance.listHubs().execute(); ExampleConnector.instance.getMessageById(getMessageByIdVariables).execute();
ExampleConnector.instance.getHubById(getHubByIdVariables).execute(); ExampleConnector.instance.getMessagesByConversationId(getMessagesByConversationIdVariables).execute();
ExampleConnector.instance.getHubsByOwnerId(getHubsByOwnerIdVariables).execute(); ExampleConnector.instance.createRole(createRoleVariables).execute();
``` ```
@@ -23,8 +23,8 @@ Optional fields can be discovered based on classes that have `Optional` object t
This is an example of a mutation with an optional field: This is an example of a mutation with an optional field:
```dart ```dart
await ExampleConnector.instance.filterVendorBenefitPlans({ ... }) await ExampleConnector.instance.updateBusiness({ ... })
.vendorId(...) .businessName(...)
.execute(); .execute();
``` ```

View File

@@ -5,13 +5,25 @@ class CreateTeamHubVariablesBuilder {
String hubName; String hubName;
String address; String address;
String city; String city;
String state; Optional<String> _state = Optional.optional(nativeFromJson, nativeToJson);
String zipCode; Optional<String> _zipCode = Optional.optional(nativeFromJson, nativeToJson);
String managerName; Optional<String> _managerName = Optional.optional(nativeFromJson, nativeToJson);
Optional<bool> _isActive = Optional.optional(nativeFromJson, nativeToJson); Optional<bool> _isActive = Optional.optional(nativeFromJson, nativeToJson);
Optional<AnyValue> _departments = Optional.optional(AnyValue.fromJson, defaultSerializer); Optional<AnyValue> _departments = Optional.optional(AnyValue.fromJson, defaultSerializer);
final FirebaseDataConnect _dataConnect; CreateTeamHubVariablesBuilder isActive(bool? t) { final FirebaseDataConnect _dataConnect; CreateTeamHubVariablesBuilder state(String? t) {
_state.value = t;
return this;
}
CreateTeamHubVariablesBuilder zipCode(String? t) {
_zipCode.value = t;
return this;
}
CreateTeamHubVariablesBuilder managerName(String? t) {
_managerName.value = t;
return this;
}
CreateTeamHubVariablesBuilder isActive(bool? t) {
_isActive.value = t; _isActive.value = t;
return this; return this;
} }
@@ -20,7 +32,7 @@ class CreateTeamHubVariablesBuilder {
return this; return this;
} }
CreateTeamHubVariablesBuilder(this._dataConnect, {required this.teamId,required this.hubName,required this.address,required this.city,required this.state,required this.zipCode,required this.managerName,}); CreateTeamHubVariablesBuilder(this._dataConnect, {required this.teamId,required this.hubName,required this.address,required this.city,});
Deserializer<CreateTeamHubData> dataDeserializer = (dynamic json) => CreateTeamHubData.fromJson(jsonDecode(json)); Deserializer<CreateTeamHubData> dataDeserializer = (dynamic json) => CreateTeamHubData.fromJson(jsonDecode(json));
Serializer<CreateTeamHubVariables> varsSerializer = (CreateTeamHubVariables vars) => jsonEncode(vars.toJson()); Serializer<CreateTeamHubVariables> varsSerializer = (CreateTeamHubVariables vars) => jsonEncode(vars.toJson());
Future<OperationResult<CreateTeamHubData, CreateTeamHubVariables>> execute() { Future<OperationResult<CreateTeamHubData, CreateTeamHubVariables>> execute() {
@@ -28,7 +40,7 @@ class CreateTeamHubVariablesBuilder {
} }
MutationRef<CreateTeamHubData, CreateTeamHubVariables> ref() { MutationRef<CreateTeamHubData, CreateTeamHubVariables> ref() {
CreateTeamHubVariables vars= CreateTeamHubVariables(teamId: teamId,hubName: hubName,address: address,city: city,state: state,zipCode: zipCode,managerName: managerName,isActive: _isActive,departments: _departments,); CreateTeamHubVariables vars= CreateTeamHubVariables(teamId: teamId,hubName: hubName,address: address,city: city,state: _state,zipCode: _zipCode,managerName: _managerName,isActive: _isActive,departments: _departments,);
return _dataConnect.mutation("createTeamHub", dataDeserializer, varsSerializer, vars); return _dataConnect.mutation("createTeamHub", dataDeserializer, varsSerializer, vars);
} }
} }
@@ -107,9 +119,9 @@ class CreateTeamHubVariables {
final String hubName; final String hubName;
final String address; final String address;
final String city; final String city;
final String state; late final Optional<String>state;
final String zipCode; late final Optional<String>zipCode;
final String managerName; late final Optional<String>managerName;
late final Optional<bool>isActive; late final Optional<bool>isActive;
late final Optional<AnyValue>departments; late final Optional<AnyValue>departments;
@Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.') @Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.')
@@ -118,18 +130,24 @@ class CreateTeamHubVariables {
teamId = nativeFromJson<String>(json['teamId']), teamId = nativeFromJson<String>(json['teamId']),
hubName = nativeFromJson<String>(json['hubName']), hubName = nativeFromJson<String>(json['hubName']),
address = nativeFromJson<String>(json['address']), address = nativeFromJson<String>(json['address']),
city = nativeFromJson<String>(json['city']), city = nativeFromJson<String>(json['city']) {
state = nativeFromJson<String>(json['state']),
zipCode = nativeFromJson<String>(json['zipCode']),
managerName = nativeFromJson<String>(json['managerName']) {
state = Optional.optional(nativeFromJson, nativeToJson);
state.value = json['state'] == null ? null : nativeFromJson<String>(json['state']);
zipCode = Optional.optional(nativeFromJson, nativeToJson);
zipCode.value = json['zipCode'] == null ? null : nativeFromJson<String>(json['zipCode']);
managerName = Optional.optional(nativeFromJson, nativeToJson);
managerName.value = json['managerName'] == null ? null : nativeFromJson<String>(json['managerName']);
isActive = Optional.optional(nativeFromJson, nativeToJson); isActive = Optional.optional(nativeFromJson, nativeToJson);
isActive.value = json['isActive'] == null ? null : nativeFromJson<bool>(json['isActive']); isActive.value = json['isActive'] == null ? null : nativeFromJson<bool>(json['isActive']);
@@ -170,9 +188,15 @@ class CreateTeamHubVariables {
json['hubName'] = nativeToJson<String>(hubName); json['hubName'] = nativeToJson<String>(hubName);
json['address'] = nativeToJson<String>(address); json['address'] = nativeToJson<String>(address);
json['city'] = nativeToJson<String>(city); json['city'] = nativeToJson<String>(city);
json['state'] = nativeToJson<String>(state); if(state.state == OptionalState.set) {
json['zipCode'] = nativeToJson<String>(zipCode); json['state'] = state.toJson();
json['managerName'] = nativeToJson<String>(managerName); }
if(zipCode.state == OptionalState.set) {
json['zipCode'] = zipCode.toJson();
}
if(managerName.state == OptionalState.set) {
json['managerName'] = managerName.toJson();
}
if(isActive.state == OptionalState.set) { if(isActive.state == OptionalState.set) {
json['isActive'] = isActive.toJson(); json['isActive'] = isActive.toJson();
} }

View File

@@ -24,9 +24,9 @@ class GetTeamHubByIdTeamHub {
final String hubName; final String hubName;
final String address; final String address;
final String city; final String city;
final String state; final String? state;
final String zipCode; final String? zipCode;
final String managerName; final String? managerName;
final bool isActive; final bool isActive;
final AnyValue? departments; final AnyValue? departments;
final Timestamp? createdAt; final Timestamp? createdAt;
@@ -39,9 +39,9 @@ class GetTeamHubByIdTeamHub {
hubName = nativeFromJson<String>(json['hubName']), hubName = nativeFromJson<String>(json['hubName']),
address = nativeFromJson<String>(json['address']), address = nativeFromJson<String>(json['address']),
city = nativeFromJson<String>(json['city']), city = nativeFromJson<String>(json['city']),
state = nativeFromJson<String>(json['state']), state = json['state'] == null ? null : nativeFromJson<String>(json['state']),
zipCode = nativeFromJson<String>(json['zipCode']), zipCode = json['zipCode'] == null ? null : nativeFromJson<String>(json['zipCode']),
managerName = nativeFromJson<String>(json['managerName']), managerName = json['managerName'] == null ? null : nativeFromJson<String>(json['managerName']),
isActive = nativeFromJson<bool>(json['isActive']), isActive = nativeFromJson<bool>(json['isActive']),
departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']), departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']),
createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']), createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']),
@@ -83,9 +83,15 @@ class GetTeamHubByIdTeamHub {
json['hubName'] = nativeToJson<String>(hubName); json['hubName'] = nativeToJson<String>(hubName);
json['address'] = nativeToJson<String>(address); json['address'] = nativeToJson<String>(address);
json['city'] = nativeToJson<String>(city); json['city'] = nativeToJson<String>(city);
json['state'] = nativeToJson<String>(state); if (state != null) {
json['zipCode'] = nativeToJson<String>(zipCode); json['state'] = nativeToJson<String?>(state);
json['managerName'] = nativeToJson<String>(managerName); }
if (zipCode != null) {
json['zipCode'] = nativeToJson<String?>(zipCode);
}
if (managerName != null) {
json['managerName'] = nativeToJson<String?>(managerName);
}
json['isActive'] = nativeToJson<bool>(isActive); json['isActive'] = nativeToJson<bool>(isActive);
if (departments != null) { if (departments != null) {
json['departments'] = departments!.toJson(); json['departments'] = departments!.toJson();
@@ -108,9 +114,9 @@ class GetTeamHubByIdTeamHub {
required this.hubName, required this.hubName,
required this.address, required this.address,
required this.city, required this.city,
required this.state, this.state,
required this.zipCode, this.zipCode,
required this.managerName, this.managerName,
required this.isActive, required this.isActive,
this.departments, this.departments,
this.createdAt, this.createdAt,

View File

@@ -24,9 +24,9 @@ class GetTeamHubsByTeamIdTeamHubs {
final String hubName; final String hubName;
final String address; final String address;
final String city; final String city;
final String state; final String? state;
final String zipCode; final String? zipCode;
final String managerName; final String? managerName;
final bool isActive; final bool isActive;
final AnyValue? departments; final AnyValue? departments;
final Timestamp? createdAt; final Timestamp? createdAt;
@@ -39,9 +39,9 @@ class GetTeamHubsByTeamIdTeamHubs {
hubName = nativeFromJson<String>(json['hubName']), hubName = nativeFromJson<String>(json['hubName']),
address = nativeFromJson<String>(json['address']), address = nativeFromJson<String>(json['address']),
city = nativeFromJson<String>(json['city']), city = nativeFromJson<String>(json['city']),
state = nativeFromJson<String>(json['state']), state = json['state'] == null ? null : nativeFromJson<String>(json['state']),
zipCode = nativeFromJson<String>(json['zipCode']), zipCode = json['zipCode'] == null ? null : nativeFromJson<String>(json['zipCode']),
managerName = nativeFromJson<String>(json['managerName']), managerName = json['managerName'] == null ? null : nativeFromJson<String>(json['managerName']),
isActive = nativeFromJson<bool>(json['isActive']), isActive = nativeFromJson<bool>(json['isActive']),
departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']), departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']),
createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']), createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']),
@@ -83,9 +83,15 @@ class GetTeamHubsByTeamIdTeamHubs {
json['hubName'] = nativeToJson<String>(hubName); json['hubName'] = nativeToJson<String>(hubName);
json['address'] = nativeToJson<String>(address); json['address'] = nativeToJson<String>(address);
json['city'] = nativeToJson<String>(city); json['city'] = nativeToJson<String>(city);
json['state'] = nativeToJson<String>(state); if (state != null) {
json['zipCode'] = nativeToJson<String>(zipCode); json['state'] = nativeToJson<String?>(state);
json['managerName'] = nativeToJson<String>(managerName); }
if (zipCode != null) {
json['zipCode'] = nativeToJson<String?>(zipCode);
}
if (managerName != null) {
json['managerName'] = nativeToJson<String?>(managerName);
}
json['isActive'] = nativeToJson<bool>(isActive); json['isActive'] = nativeToJson<bool>(isActive);
if (departments != null) { if (departments != null) {
json['departments'] = departments!.toJson(); json['departments'] = departments!.toJson();
@@ -108,9 +114,9 @@ class GetTeamHubsByTeamIdTeamHubs {
required this.hubName, required this.hubName,
required this.address, required this.address,
required this.city, required this.city,
required this.state, this.state,
required this.zipCode, this.zipCode,
required this.managerName, this.managerName,
required this.isActive, required this.isActive,
this.departments, this.departments,
this.createdAt, this.createdAt,

View File

@@ -23,9 +23,9 @@ class ListTeamHubsTeamHubs {
final String hubName; final String hubName;
final String address; final String address;
final String city; final String city;
final String state; final String? state;
final String zipCode; final String? zipCode;
final String managerName; final String? managerName;
final bool isActive; final bool isActive;
final AnyValue? departments; final AnyValue? departments;
final Timestamp? createdAt; final Timestamp? createdAt;
@@ -38,9 +38,9 @@ class ListTeamHubsTeamHubs {
hubName = nativeFromJson<String>(json['hubName']), hubName = nativeFromJson<String>(json['hubName']),
address = nativeFromJson<String>(json['address']), address = nativeFromJson<String>(json['address']),
city = nativeFromJson<String>(json['city']), city = nativeFromJson<String>(json['city']),
state = nativeFromJson<String>(json['state']), state = json['state'] == null ? null : nativeFromJson<String>(json['state']),
zipCode = nativeFromJson<String>(json['zipCode']), zipCode = json['zipCode'] == null ? null : nativeFromJson<String>(json['zipCode']),
managerName = nativeFromJson<String>(json['managerName']), managerName = json['managerName'] == null ? null : nativeFromJson<String>(json['managerName']),
isActive = nativeFromJson<bool>(json['isActive']), isActive = nativeFromJson<bool>(json['isActive']),
departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']), departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']),
createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']), createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']),
@@ -82,9 +82,15 @@ class ListTeamHubsTeamHubs {
json['hubName'] = nativeToJson<String>(hubName); json['hubName'] = nativeToJson<String>(hubName);
json['address'] = nativeToJson<String>(address); json['address'] = nativeToJson<String>(address);
json['city'] = nativeToJson<String>(city); json['city'] = nativeToJson<String>(city);
json['state'] = nativeToJson<String>(state); if (state != null) {
json['zipCode'] = nativeToJson<String>(zipCode); json['state'] = nativeToJson<String?>(state);
json['managerName'] = nativeToJson<String>(managerName); }
if (zipCode != null) {
json['zipCode'] = nativeToJson<String?>(zipCode);
}
if (managerName != null) {
json['managerName'] = nativeToJson<String?>(managerName);
}
json['isActive'] = nativeToJson<bool>(isActive); json['isActive'] = nativeToJson<bool>(isActive);
if (departments != null) { if (departments != null) {
json['departments'] = departments!.toJson(); json['departments'] = departments!.toJson();
@@ -107,9 +113,9 @@ class ListTeamHubsTeamHubs {
required this.hubName, required this.hubName,
required this.address, required this.address,
required this.city, required this.city,
required this.state, this.state,
required this.zipCode, this.zipCode,
required this.managerName, this.managerName,
required this.isActive, required this.isActive,
this.departments, this.departments,
this.createdAt, this.createdAt,

View File

@@ -24,9 +24,9 @@ class ListTeamHubsByOwnerIdTeamHubs {
final String hubName; final String hubName;
final String address; final String address;
final String city; final String city;
final String state; final String? state;
final String zipCode; final String? zipCode;
final String managerName; final String? managerName;
final bool isActive; final bool isActive;
final AnyValue? departments; final AnyValue? departments;
final Timestamp? createdAt; final Timestamp? createdAt;
@@ -37,9 +37,9 @@ class ListTeamHubsByOwnerIdTeamHubs {
hubName = nativeFromJson<String>(json['hubName']), hubName = nativeFromJson<String>(json['hubName']),
address = nativeFromJson<String>(json['address']), address = nativeFromJson<String>(json['address']),
city = nativeFromJson<String>(json['city']), city = nativeFromJson<String>(json['city']),
state = nativeFromJson<String>(json['state']), state = json['state'] == null ? null : nativeFromJson<String>(json['state']),
zipCode = nativeFromJson<String>(json['zipCode']), zipCode = json['zipCode'] == null ? null : nativeFromJson<String>(json['zipCode']),
managerName = nativeFromJson<String>(json['managerName']), managerName = json['managerName'] == null ? null : nativeFromJson<String>(json['managerName']),
isActive = nativeFromJson<bool>(json['isActive']), isActive = nativeFromJson<bool>(json['isActive']),
departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']), departments = json['departments'] == null ? null : AnyValue.fromJson(json['departments']),
createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']); createdAt = json['createdAt'] == null ? null : Timestamp.fromJson(json['createdAt']);
@@ -77,9 +77,15 @@ class ListTeamHubsByOwnerIdTeamHubs {
json['hubName'] = nativeToJson<String>(hubName); json['hubName'] = nativeToJson<String>(hubName);
json['address'] = nativeToJson<String>(address); json['address'] = nativeToJson<String>(address);
json['city'] = nativeToJson<String>(city); json['city'] = nativeToJson<String>(city);
json['state'] = nativeToJson<String>(state); if (state != null) {
json['zipCode'] = nativeToJson<String>(zipCode); json['state'] = nativeToJson<String?>(state);
json['managerName'] = nativeToJson<String>(managerName); }
if (zipCode != null) {
json['zipCode'] = nativeToJson<String?>(zipCode);
}
if (managerName != null) {
json['managerName'] = nativeToJson<String?>(managerName);
}
json['isActive'] = nativeToJson<bool>(isActive); json['isActive'] = nativeToJson<bool>(isActive);
if (departments != null) { if (departments != null) {
json['departments'] = departments!.toJson(); json['departments'] = departments!.toJson();
@@ -96,9 +102,9 @@ class ListTeamHubsByOwnerIdTeamHubs {
required this.hubName, required this.hubName,
required this.address, required this.address,
required this.city, required this.city,
required this.state, this.state,
required this.zipCode, this.zipCode,
required this.managerName, this.managerName,
required this.isActive, required this.isActive,
this.departments, this.departments,
this.createdAt, this.createdAt,

View File

@@ -2,6 +2,7 @@ library client_hubs;
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_data_connect/krow_data_connect.dart'; import 'package:krow_data_connect/krow_data_connect.dart';
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'src/data/repositories_impl/hub_repository_impl.dart'; import 'src/data/repositories_impl/hub_repository_impl.dart';
import 'src/domain/repositories/hub_repository_interface.dart'; import 'src/domain/repositories/hub_repository_interface.dart';
import 'src/domain/usecases/assign_nfc_tag_usecase.dart'; import 'src/domain/usecases/assign_nfc_tag_usecase.dart';
@@ -22,7 +23,10 @@ class ClientHubsModule extends Module {
void binds(Injector i) { void binds(Injector i) {
// Repositories // Repositories
i.addLazySingleton<HubRepositoryInterface>( i.addLazySingleton<HubRepositoryInterface>(
() => HubRepositoryImpl(mock: i.get<BusinessRepositoryMock>()), () => HubRepositoryImpl(
firebaseAuth: firebase.FirebaseAuth.instance,
dataConnect: ExampleConnector.instance,
),
); );
// UseCases // UseCases

View File

@@ -1,45 +1,154 @@
import 'package:krow_data_connect/krow_data_connect.dart'; import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:krow_domain/krow_domain.dart'; import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'package:krow_domain/krow_domain.dart' as domain;
import '../../domain/repositories/hub_repository_interface.dart'; import '../../domain/repositories/hub_repository_interface.dart';
/// Implementation of [HubRepositoryInterface] that uses [BusinessRepositoryMock]. /// Implementation of [HubRepositoryInterface] backed by Data Connect.
///
/// This class serves as a data adapter that bridges the domain repository interface
/// with the backend data source provided by the `data_connect` package. It strictly
/// delegates all operations to the [BusinessRepositoryMock], ensuring no business
/// logic resides in the data layer.
class HubRepositoryImpl implements HubRepositoryInterface { class HubRepositoryImpl implements HubRepositoryInterface {
/// The business repository mock from data connect. final firebase.FirebaseAuth _firebaseAuth;
final BusinessRepositoryMock mock; final dc.ExampleConnector _dataConnect;
/// Creates a [HubRepositoryImpl] instance. HubRepositoryImpl({
/// required firebase.FirebaseAuth firebaseAuth,
/// Takes a [BusinessRepositoryMock] as a dependency to perform data operations. required dc.ExampleConnector dataConnect,
HubRepositoryImpl({required this.mock}); }) : _firebaseAuth = firebaseAuth,
_dataConnect = dataConnect;
@override @override
Future<List<Hub>> getHubs() { Future<List<domain.Hub>> getHubs() async {
// In a production environment, the business ID would be retrieved from final business = await _getBusinessForCurrentUser();
// a session manager or authentication state. For the current mock strategy, final teamId = await _getOrCreateTeamId(business);
// we use a hardcoded value 'biz_1' to represent the active client. return _fetchHubsForTeam(teamId: teamId, businessId: business.id);
return mock.getHubs('biz_1');
} }
@override @override
Future<Hub> createHub({required String name, required String address}) { Future<domain.Hub> createHub({
// Delegates hub creation to the mock repository. required String name,
return mock.createHub(businessId: 'biz_1', name: name, address: address); required String address,
}) async {
final business = await _getBusinessForCurrentUser();
final teamId = await _getOrCreateTeamId(business);
final city = business.city;
if (city == null || city.isEmpty) {
throw Exception('Business city is missing.');
}
final result = await _dataConnect
.createTeamHub(
teamId: teamId,
hubName: name,
address: address,
city: city,
)
.execute();
final createdId = result.data?.teamHub_insert.id;
if (createdId == null) {
throw Exception('Hub creation failed.');
}
final hubs = await _fetchHubsForTeam(
teamId: teamId,
businessId: business.id,
);
domain.Hub? createdHub;
for (final hub in hubs) {
if (hub.id == createdId) {
createdHub = hub;
break;
}
}
return createdHub ??
domain.Hub(
id: createdId,
businessId: business.id,
name: name,
address: address,
nfcTagId: null,
status: domain.HubStatus.active,
);
} }
@override @override
Future<void> deleteHub(String id) { Future<void> deleteHub(String id) async {
// Delegates hub deletion to the mock repository. await _dataConnect.deleteTeamHub(id: id).execute();
return mock.deleteHub(id);
} }
@override @override
Future<void> assignNfcTag({required String hubId, required String nfcTagId}) { Future<void> assignNfcTag({
// Delegates NFC tag assignment to the mock repository. required String hubId,
return mock.assignNfcTag(hubId: hubId, nfcTagId: nfcTagId); required String nfcTagId,
}) {
throw UnimplementedError('NFC tag assignment is not supported for team hubs.');
}
Future<dc.GetBusinessesByUserIdBusinesses> _getBusinessForCurrentUser() async {
final user = _firebaseAuth.currentUser;
if (user == null) {
throw Exception('User is not authenticated.');
}
final result = await _dataConnect.getBusinessesByUserId(
userId: user.uid,
).execute();
if (result.data.businesses.isEmpty) {
await _firebaseAuth.signOut();
throw Exception('No business found for this user. Please sign in again.');
}
return result.data.businesses.first;
}
Future<String> _getOrCreateTeamId(
dc.GetBusinessesByUserIdBusinesses business,
) async {
final teamsResult = await _dataConnect.getTeamsByOwnerId(
ownerId: business.id,
).execute();
if (teamsResult.data.teams.isNotEmpty) {
return teamsResult.data.teams.first.id;
}
final createTeamBuilder = _dataConnect.createTeam(
teamName: '${business.businessName} Team',
ownerId: business.id,
ownerName: business.contactName ?? '',
ownerRole: 'OWNER',
);
if (business.email != null) {
createTeamBuilder.email(business.email);
}
final createTeamResult = await createTeamBuilder.execute();
final teamId = createTeamResult.data?.team_insert.id;
if (teamId == null) {
throw Exception('Team creation failed.');
}
return teamId;
}
Future<List<domain.Hub>> _fetchHubsForTeam({
required String teamId,
required String businessId,
}) async {
final hubsResult = await _dataConnect.getTeamHubsByTeamId(
teamId: teamId,
).execute();
return hubsResult.data.teamHubs
.map(
(hub) => domain.Hub(
id: hub.id,
businessId: businessId,
name: hub.hubName,
address: hub.address,
nfcTagId: null,
status:
hub.isActive
? domain.HubStatus.active
: domain.HubStatus.inactive,
),
)
.toList();
} }
} }