1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | Object.defineProperty(exports, "__esModule", { value: true });
|
24 | exports.createBeforeSnapshotFromJson = exports.createSnapshotFromJson = exports.createBeforeSnapshotFromProtobuf = exports.createSnapshotFromProtobuf = void 0;
|
25 | const firestore = require("firebase-admin/firestore");
|
26 | const logger = require("../../logger");
|
27 | const app_1 = require("../../common/app");
|
28 | const compiledFirestore_1 = require("../../../protos/compiledFirestore");
|
29 | const encoder_1 = require("../../common/utilities/encoder");
|
30 |
|
31 | const DocumentEventData = compiledFirestore_1.google.events.cloud.firestore.v1.DocumentEventData;
|
32 | let firestoreInstance;
|
33 |
|
34 | function _getValueProto(data, resource, valueFieldName) {
|
35 | const value = data === null || data === void 0 ? void 0 : data[valueFieldName];
|
36 | if (typeof value === "undefined" ||
|
37 | value === null ||
|
38 | (typeof value === "object" && !Object.keys(value).length)) {
|
39 |
|
40 | return resource;
|
41 | }
|
42 | const proto = {
|
43 | fields: (value === null || value === void 0 ? void 0 : value.fields) || {},
|
44 | createTime: (0, encoder_1.dateToTimestampProto)(value === null || value === void 0 ? void 0 : value.createTime),
|
45 | updateTime: (0, encoder_1.dateToTimestampProto)(value === null || value === void 0 ? void 0 : value.updateTime),
|
46 | name: (value === null || value === void 0 ? void 0 : value.name) || resource,
|
47 | };
|
48 | return proto;
|
49 | }
|
50 |
|
51 | function createSnapshotFromProtobuf(data, path, databaseId) {
|
52 | if (!firestoreInstance) {
|
53 | firestoreInstance = firestore.getFirestore((0, app_1.getApp)(), databaseId);
|
54 | }
|
55 | try {
|
56 | const dataBuffer = Buffer.from(data);
|
57 | const firestoreDecoded = DocumentEventData.decode(dataBuffer);
|
58 | return firestoreInstance.snapshot_(firestoreDecoded.value || path, null, "protobufJS");
|
59 | }
|
60 | catch (err) {
|
61 | logger.error("Failed to decode protobuf and create a snapshot.");
|
62 | throw err;
|
63 | }
|
64 | }
|
65 | exports.createSnapshotFromProtobuf = createSnapshotFromProtobuf;
|
66 |
|
67 | function createBeforeSnapshotFromProtobuf(data, path, databaseId) {
|
68 | if (!firestoreInstance) {
|
69 | firestoreInstance = firestore.getFirestore((0, app_1.getApp)(), databaseId);
|
70 | }
|
71 | try {
|
72 | const dataBuffer = Buffer.from(data);
|
73 | const firestoreDecoded = DocumentEventData.decode(dataBuffer);
|
74 | return firestoreInstance.snapshot_(firestoreDecoded.oldValue || path, null, "protobufJS");
|
75 | }
|
76 | catch (err) {
|
77 | logger.error("Failed to decode protobuf and create a before snapshot.");
|
78 | throw err;
|
79 | }
|
80 | }
|
81 | exports.createBeforeSnapshotFromProtobuf = createBeforeSnapshotFromProtobuf;
|
82 |
|
83 | function createSnapshotFromJson(data, source, createTime, updateTime, databaseId) {
|
84 | if (!firestoreInstance) {
|
85 | firestoreInstance = databaseId
|
86 | ? firestore.getFirestore((0, app_1.getApp)(), databaseId)
|
87 | : firestore.getFirestore((0, app_1.getApp)());
|
88 | }
|
89 | const valueProto = _getValueProto(data, source, "value");
|
90 | let timeString = createTime || updateTime;
|
91 | if (!timeString) {
|
92 | logger.warn("Snapshot has no readTime. Using now()");
|
93 | timeString = new Date().toISOString();
|
94 | }
|
95 | const readTime = (0, encoder_1.dateToTimestampProto)(timeString);
|
96 | return firestoreInstance.snapshot_(valueProto, readTime, "json");
|
97 | }
|
98 | exports.createSnapshotFromJson = createSnapshotFromJson;
|
99 |
|
100 | function createBeforeSnapshotFromJson(data, source, createTime, updateTime, databaseId) {
|
101 | if (!firestoreInstance) {
|
102 | firestoreInstance = databaseId
|
103 | ? firestore.getFirestore((0, app_1.getApp)(), databaseId)
|
104 | : firestore.getFirestore((0, app_1.getApp)());
|
105 | }
|
106 | const oldValueProto = _getValueProto(data, source, "oldValue");
|
107 | const oldReadTime = (0, encoder_1.dateToTimestampProto)(createTime || updateTime);
|
108 | return firestoreInstance.snapshot_(oldValueProto, oldReadTime, "json");
|
109 | }
|
110 | exports.createBeforeSnapshotFromJson = createBeforeSnapshotFromJson;
|