Как реализовать облачную функцию Firebase для Android-приложения - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь разработать приложение-игру для викторины, используя Firestore.Я хотел бы предоставить систему рейтинга для пользователей.Чтобы добиться этого, я запрашиваю пользовательские документы по категориям и создаю новый документ списка лидеров.Я проверил его с Java, и он отлично работает (см. Код ниже).Но сейчас я хотел бы создать для этого облачную функцию Firebase.Было бы здорово, если бы я мог запланировать запуск функции два раза в день (для ограничения операций чтения и записи) или путем запуска ее с помощью URL-вызова.Похоже, firebase поддерживает обе возможности.К сожалению, я не обладаю знаниями ни в JavaScript, ни в машинописи.Поэтому я хотел бы спросить здесь, может ли кто-нибудь преобразовать приведенный ниже java-код в javascript-код для облачной функции firebase с возможностью планирования запуска функции в определенное время или путем ее запуска через URL-запрос?

        final HashMap<String, Map<String, Long>> rankingsColl = new HashMap<>();
        final Map<String, Long> cat1Map = new HashMap<>();
        final Map<String, Long> cat2Map = new HashMap<>();
        final FirebaseFirestore db = FirebaseFirestore.getInstance();
        CollectionReference users = db.collection("usersColl");
        users.whereGreaterThanOrEqualTo("stats.category1", 9)
                .orderBy("stats.category1", Query.Direction.DESCENDING)
                .limit(5).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                    try {
                        String name = documentSnapshot.get("data.name").toString();
                        String code = documentSnapshot.get("data.code").toString();
                        long value = (long)documentSnapshot.get("stats.category1");
                        String fullName = name + " (" + code + ")";
                        cat1Map.put(fullName, (long)value);
                    } catch (Exception e) {
                        System.out.println("exception: " + e.getMessage());
                    }
                }
                rankingsColl.put("category1", cat1Map);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        });

        users.whereGreaterThanOrEqualTo("stats.category2", 7)
                .orderBy("stats.category2", Query.Direction.DESCENDING)
                .limit(5).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                    try {
                        String name = documentSnapshot.get("data.name").toString();
                        String code = documentSnapshot.get("data.code").toString();
                        long value = (long)documentSnapshot.get("stats.category2");
                        String fullName = name + " (" + code + ")";
                        cat2Map.put(fullName, (long)value);
                    } catch (Exception e) {
                        System.out.println("exception: " + e.getMessage());
                    }
                }
                rankingsColl.put("category2", cat2Map);

                db.collection("Leaders").document("Leaderboard").set(rankingsColl).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        System.out.println("ranking works");
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        System.out.println("error creating rankings");
                        System.out.println(e.getMessage());
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        });

Это то, чего я достиг до сих пор, читая документы по Firebase.Я думаю, что эти запросы должны работать.Но я понятия не имею, как получить нужные данные из каждого документа, добавить их на карту, создать новый документ на основе вновь созданной карты и поместить всю работу в функцию.

var users = db.collection('usersColl');
var query = users.where('stats.category1', '>', 9).orderBy('stats.category1', 'desc').limit(5).get()
  .then(snapshot => {
    if (snapshot.empty) {
      console.log('No matching documents.');
      return;
    }  

    snapshot.forEach(doc => {
      console.log(doc.id, '=>', doc.data());
      // put desired fields of each document into a map1
    });
  })
  .catch(err => {
    console.log('Error getting documents', err);
  });

var query2 = users.where('stats.category2', '>', 7).orderBy('stats.category1', 'desc').limit(5).get()
  .then(snapshot => {
    if (snapshot.empty) {
      console.log('No matching documents.');
      return;
    }  

    snapshot.forEach(doc => {
      console.log(doc.id, '=>', doc.data());
      // put desired fields of each document into a map2
    });
  })
  .catch(err => {
    console.log('Error getting documents', err);
  });

// create a new map<String, Map>, put map1 and map2 into this map and create a new document in firestore

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...