Избегайте дублирования fieldPath при обновлении или создании документов в Firestore - PullRequest
0 голосов
/ 24 марта 2020

Есть ли способ избежать повсеместного дублирования строк при использовании TypeScript в облачных функциях в Firebase?

Я пытался сделать их перечислениями, и это долгий путь.

enum Collections {
    SUBSCRIPTIONS = 'subscriptions-dev',
    ACTIVITIES = 'activity-dev'
}

enum ActivityKey {
    SUBSCRIPTION = 'sub',
    GROUP_ACTIVITY_ID = 'groupActivityId',
    GROUP_ACTIVITY_BOOKING_ID = 'groupActivityBookingId',
    ACTIVITY_NAME = 'activityName',
    ACTIVITY_START = 'activityStart',
    BOOKABLE_EARLIEST = 'bookableEarliest',
    BOOKABLE_LATEST = 'bookableLatest',
    STATE = 'state'
};

Тогда я могу, например, сделать:

const activityRef = admin.firestore().collection(Collections.ACTIVITIES);
return await Promise.all(subscriptions.map(async (subscriptionDocument) => {
    const sub = await subscriptionDocument.get();
    const groupActivityProductId = sub.get(SubscriptionKey.GROUP_ACTIVITY_PRODUCT_ID);
    const refreshToken = sub.get(SubscriptionKey.REFRESH_TOKEN);
...

Теперь вот проблема , когда я хочу создать или обновить траектории клавиш, используя функции set() или update(), он ожидает словарь - и я не могу использовать перечисления в качестве ключей в словарях.

await activityRef.doc().set({
  sub: sub.ref,
  groupActivityId: activity.id,
  activityStart: new Date(activity.duration.start),
  bookableEarliest: new Date(activity.bookableEarliest),
  bookableLatest: new Date(activity.bookableLatest),
  instructor: activity.instructors.empty ? "-" : activity.instructors[0].name,
  lastChecked: new Date(),
  activityName: activity.name,
  state: ActivityState.NEW
})

Если я пишу ActivityKey.SUBSCRIPTION в качестве ключа, я получаю ',' expected ts(1005)

1 Ответ

1 голос
/ 25 марта 2020

Я на самом деле нашел ответ сам!

Если я заверну ключ в [], вот так:

await activityRef.doc().set({
    [ActivityKey.SUBSCRIPTION]: sub.ref,
    [ActivityKey.GROUP_ACTIVITY_ID]: activity.id,
    [ActivityKey.ACTIVITY_START]: new Date(activity.duration.start),
    [ActivityKey.BOOKABLE_EARLIEST]: new Date(activity.bookableEarliest),
    [ActivityKey.BOOKABLE_LATEST]: new Date(activity.bookableLatest),
    [ActivityKey.INSTRUCTOR]: activity.instructors.empty ? "-" : activity.instructors[0].name,
    [ActivityKey.LAST_CHECKED]: new Date(),
    [ActivityKey.ACTIVITY_NAME]: activity.name,
    [ActivityKey.STATE]: ActivityState.NEW,
    [ActivityKey.HAS_SENT_CANCEL_REMINDER]: false
})

Это работает!

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