getUserData method

Future<void> getUserData()

Fetches user data and dashboard statistics from Appwrite.

Updates the state with user email and counts for organizations, devices, mothers, and tests.

Implementation

Future<void> getUserData() async {
  final userData = prefs.getUser();

  if (userData == null) return;

  final databases = Databases(client);
  final user = await _authService.getCurrentUser();
  final isRestricted = userData.role != UserRoles.admin;

  List<String> buildQueries(String type) {
    final queries = <String>[];
    if (type.isNotEmpty) queries.add(Query.equal('type', type));
    if (isRestricted) {
      queries.add(Query.equal('organizationId', userData.organizationId));
    }
    return queries;
  }

  final orgCount = await databases.listDocuments(
    databaseId: AppConstants.appwriteDatabaseId,
    collectionId: AppConstants.userCollectionId,
    queries: buildQueries('organization'),
  );

  final deviceCount = await databases.listDocuments(
    databaseId: AppConstants.appwriteDatabaseId,
    collectionId: AppConstants.deviceCollectionId,
  );

  final motherCount = await databases.listDocuments(
    databaseId: AppConstants.appwriteDatabaseId,
    collectionId: AppConstants.userCollectionId,
    queries: buildQueries('mother'),
  );

  final testCount = await databases.listDocuments(
    databaseId: AppConstants.appwriteDatabaseId,
    collectionId: AppConstants.testsCollectionId,
    queries:
        isRestricted
            ? [Query.equal('organizationId', userData.organizationId)]
            : [],
  );

  emit(
    state.copyWith(
      userEmail: user.email,
      organizationCount: orgCount.total,
      deviceCount: deviceCount.total,
      motherCount: motherCount.total,
      testCount: testCount.total,
    ),
  );
}