logFeedback static method

Future<String> logFeedback(
  1. String id,
  2. int feedbackNumber,
  3. String feedbackText
)

Implementation

static Future<String> logFeedback(
    String id,
    int feedbackNumber,
    String feedbackText) async {
  try {
    FirebaseApp app = Instadiv.getInstance().firebaseApp;
    FirebaseFirestore firestore = FirebaseFirestore.instanceFor(app: app);

    CollectionReference<Map<String, dynamic>> feedbackCollection = firestore
        .collection(instaCollection)
        .doc(Instadiv.getInstance().project)
        .collection(feedback);

    DocumentReference<Map<String, dynamic>> feedbackDocument = feedbackCollection.doc(id);

    bool documentExists = await feedbackDocument.get().then((doc) => doc.exists);

    if (documentExists) {
      DocumentSnapshot<Map<String, dynamic>> snapshot = await feedbackDocument.get();
      Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
      Map<String, dynamic> score = data['score'] ?? {};

      if (score.isEmpty) {
        Map<String, dynamic> newScore = {
          'score': {
            feedbackNumber.toString(): {feedback : feedbackText, 'count' : 1}
          }
        };
        feedbackDocument.update(newScore);
      } else {
        Map<String, dynamic> feedbackJson = score[feedbackNumber.toString()]??{};
        if (feedbackJson.isEmpty) {
          score[feedbackNumber.toString()] = {feedback : feedbackText, 'count' : 1};
        } else {
          int count = feedbackJson['count']??0;
          feedbackJson['count'] = count+1;
          score[feedbackNumber.toString()] = feedbackJson;
        }
        Map<String, dynamic> updatedScore = {
          'score': score
        };

        feedbackDocument.update(updatedScore);
      }

    } else {
      // Document doesn't exist, create it
      Map<String, dynamic> newScore = {
        'score': {
          feedbackNumber.toString(): {feedback : feedbackText, 'count' : 1}
        }
      };
      await feedbackDocument.set(newScore);
    }

    // Specify the subcollection path
    CollectionReference<Map<String, dynamic>> dataCollection =
    feedbackDocument.collection('data');

    // Create data to be stored in the subcollection
    Map<String, dynamic> data = {
      'feedbackIndex': feedbackNumber,
      feedback: feedbackText
    };

    // Add the document to the collection
    DocumentReference documentReference = await dataCollection.add(data);

    // Get the document ID
    return documentReference.id;

  } catch (e) {
    print('Error $e');
    return '';
  }
}