мы создаем систему, в которой изменения в Firestore производят PubSub-сообщение, на которое могут воздействовать другие компоненты.
События Firestore используются для реализации этого.Система хранит историю изменений для каждого документа как вложенную коллекцию документа.Чтобы уменьшить размер PubSub-сообщений, мы отправляем только ссылки на документы в этом подколлекции.Один до и один после изменения.Чтобы наша функция не тратила время на запросы, чтобы выяснить, каким было последнее состояние, мы используем метки времени для событий изменения в качестве идентификаторов.
env.ts:
import * as functions from 'firebase-functions';
import {handler} from '@handlers/rootCollection';
//noinspection JSUnusedGlobalSymbols
export const handlerFunction = functions.firestore
.document('rootcollection/{documentID}')
.onWrite(handler.process.bind(handler));
rootCollection.ts:
import {DocumentSnapshot} from 'firebase-functions/lib/providers/firestore';
import {Change, EventContext} from 'firebase-functions';
interface MessageI extends Object {
eventID: string;
ref: string;
beforeID: string | null;
afterID: string | null;
fcfReceived: number | null;
}
class WriteHandler {
public name: string;
public constructor(name: string) {
this.name = name;
}
public async process(change: Change<DocumentSnapshot>, context: EventContext): MessageI {
const afterExists = change.after.exists;
const beforeExists = change.before.exists;
const afterID = afterExists ? change.after.updateTime.toMillis().toString() : null;
const beforeID = beforeExists ? change.before.updateTime.toMillis().toString() : null;
return {
'eventID': context.eventId,
'ref': change.before.ref.path,
'beforeID': beforeID,
'afterID': afterID,
'fcfReceived': Date.now()
};
}
}
export const itinerariesHandler = new WriteHandler(
'rootCollectionHandler'
);
Теперь мы очень удивлены, что данные правильно отражают состояния до и после, но метка времени выглядит как метка after.timestamp.
Опубликованное сообщение 429345402459000 к теме,Сообщение:
{
"eventID": "389fe158-115a-43ca-9fdd-ec9737af066f-0",
"ref": "collection/VMDcsHirbB2coyaXF5wZ",
"beforeID": "1552298315479",
"afterID": "1552298315479",
"fcfReceived": 1552298315575,
}
Кажется нелогичным, что change.before.updateTime
содержит время, когда изменение было сделано.Но я не могу найти явного упоминания в документации.
Предназначено ли это поведение?Есть ли другой способ найти уникальный идентификатор для состояния "до"?
С уважением, Карстен