diff --git a/README.md b/README.md index e0a59153..b59155de 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ further to fit a particular use case. - [reCAPTCHA enterprise](references/recaptcha-enterprise) - A reference for API protection against bot leveraging reCAPTCHA enterprise - [Firestore Facade](references/firestore-facade) - Reference implementation - for a storage/long term caching solution based on Firestore + for a long term caching/storage solution based on Cloud Firestore ## Tools diff --git a/references/firestore-facade/.gitignore b/references/firestore-facade/.gitignore index c323cbc6..cb615ff8 100644 --- a/references/firestore-facade/.gitignore +++ b/references/firestore-facade/.gitignore @@ -1,3 +1 @@ -.DS_Store -node_modules AM-SetFirestoreMock.xml diff --git a/references/firestore-facade/README.md b/references/firestore-facade/README.md index bc18c512..fc1997fb 100644 --- a/references/firestore-facade/README.md +++ b/references/firestore-facade/README.md @@ -6,13 +6,13 @@ from Firebase and Google Cloud. Apigee can act as a facade in front of Cloud Firestore, to implement the following use cases: -- Long term storage: using Cloud Firestore to cache data on long term +- Long term storage: using Cloud Firestore to cache documents on long term - Data as a Service (DaaS) pattern: some data of a Cloud Firestore database (db) are exposed as an API The use case that is proposed in the Firestore facade reference is the one based on long term storage. -Indeed, in situations where you need a caching mechanim for data, +Indeed, in situations where you need a caching mechanism for data, which must be cached for more than 30 days (max TTL for caching data in Apigee X) a storage solution is required. Cloud Firestore is the perfect solution to consider in case of long @@ -21,12 +21,12 @@ term storage needs. ## How it works? Two Apigee **sharedflows** are used as a facade in front of a Cloud Firestore -db. A **key cache** is used to lookup and populate data into the Cloud +db. A **cache key** is used to lookup and populate data into the Cloud Firestore db. -By default, the key cache is defined as the following: +By default, the cache key is defined as the following: -```keyCache = base64Encoding(basePath + '/' + pathSuffix)``` +```cacheKey = base64Encoding(basePath + '/' + pathSuffix)``` This can be modified depending on the use case you need to implement @@ -51,6 +51,7 @@ API endpoint (```sf-firestore-facade-lookup-v1``` and - [NodeJS](https://nodejs.org/en/) LTS version or above - An Apigee organization - [Google Cloud Platform](https://cloud.google.com/) (GCP) +- **plantuml.1.2020.23.jar** (only if you want to execute ```generate-docs.sh```) This reference leverages Apigee and Cloud Firestore. Therefore, it is important to note that: @@ -99,6 +100,10 @@ With this option, it is not possible to execute functional tests. Nevertheless, you can request the Firestore facade API using the HTTP client of your choice. +Note that this reference implementation assumes the same GCP Project +is used for Firestore. If that's not the case, please +update the `````` in the target endpoint. + ## Script outputs The pipeline script deploys on Apigee X / hybrid two diff --git a/references/firestore-facade/diagram/sequence-firestore-facade.png b/references/firestore-facade/diagram/sequence-firestore-facade.png index 1da5ef40..f88a5bd3 100644 Binary files a/references/firestore-facade/diagram/sequence-firestore-facade.png and b/references/firestore-facade/diagram/sequence-firestore-facade.png differ diff --git a/references/firestore-facade/diagram/sequence-firestore-facade.txt b/references/firestore-facade/diagram/sequence-firestore-facade.txt index 4ea01dfb..2cc24ef4 100644 --- a/references/firestore-facade/diagram/sequence-firestore-facade.txt +++ b/references/firestore-facade/diagram/sequence-firestore-facade.txt @@ -19,28 +19,28 @@ b -> fdp: Access the firestore facade api note over gfd,ffp: "Apigee API proxy and shared flows acting as a facade in front of Cloud Firestore db" fdp -> ffl: Lookup data from the Cloud Firestore db based on base path, path suffix and encoding type (base64 only) -ffl -> ffl: calculate the document key (key cache)\nkeyCache = encodingType( basePath + pathSuffix) -ffl -> gfd: Lookup shared flow acting as a facade with Cloud Firestore, using the key cache\ncall is executed using an ID token -gfd -> gfd: lookup in the Cloud Firestore db using key cache +ffl -> ffl: calculate the document key (cache key)\ncacheKey = encodingType( basePath + pathSuffix) +ffl -> gfd: Lookup shared flow acting as a facade with Cloud Firestore, using the cache key\ncall is executed using an ID token +gfd -> gfd: lookup in the Cloud Firestore db using cache key opt Data retrieved from Cloud Firestore gfd -> ffl: data is retrieved from Cloud Firestore (lookup status) - ffl -> ffl: set context variables:\nflow.lookup.iscontent.cached = true \nflow.lookup.content.cached = "" \nflow.lookup.status.code = 200 + ffl -> ffl: set context variables:\nflow.lookup.hit = true \nflow.lookup.content = "" \nflow.lookup.status.code = 200 ffl -> fdp: shared flow response end opt Data is NOT retrieved from Cloud Firestore gfd -> ffl: data is not retrieved from Cloud Firestore (lookp status) - ffl -> ffl: set context variables:\nflow.lookup.iscontent.cached = false \nflow.lookup.content.cached = "none" \nflow.lookup.status.code = 404 + ffl -> ffl: set context variables:\nflow.lookup.hit = false \nflow.lookup.content = "none" \nflow.lookup.status.code > 399 ffl -> fdp: shared flow response fdp -> backend: request is forwarded to the backend API backend -> fdp: backend response fdp -> ffp: Populate data from the Cloud Firestore db based on base path, path suffix and encoding type (base64 only) - ffp -> ffp: calculate the key cache\nkeyCache = encodingType( basePath + pathSuffix) - ffp -> gfd: Populate shared flow acting as a facade with Cloud Firestore, using the key cache\ncall is executed using an ID token - gfd -> gfd: populate backend response in the Firestore db using key cache + ffp -> ffp: calculate the cache key\ncacheKey = encodingType( basePath + pathSuffix) + ffp -> gfd: Populate shared flow acting as a facade with Cloud Firestore, using the cache key\ncall is executed using an ID token + gfd -> gfd: populate backend response in the Firestore db using cache key gfd -> ffp: firestore populate status - ffp -> ffp: set context variables:\nflow.populate.content.cached = true \nflow.populate.status.code = 200 \nflow.populate.keycache = \nflow.populate.documentid = \nflow.populate.collectionid = + ffp -> ffp: set context variables:\nflow.populate.content = true \nflow.populate.status.code = 200 \nflow.populate.cachekey = \nflow.populate.extcache.documentid = \nflow.populate.extcache.collectionid = ffp -> fdp: shared flow response end diff --git a/references/firestore-facade/diagram/sequence-firestore-kms-facade.png b/references/firestore-facade/diagram/sequence-firestore-kms-facade.png new file mode 100644 index 00000000..bb6a52aa Binary files /dev/null and b/references/firestore-facade/diagram/sequence-firestore-kms-facade.png differ diff --git a/references/firestore-facade/diagram/sequence-firestore-kms-facade.txt b/references/firestore-facade/diagram/sequence-firestore-kms-facade.txt new file mode 100644 index 00000000..2bf0649b --- /dev/null +++ b/references/firestore-facade/diagram/sequence-firestore-kms-facade.txt @@ -0,0 +1,60 @@ +@startuml + +title "Firestore Facade in Apigee X/hybrid" + +actor User as u +entity "Client App" as b +entity "Cloud\nFirestore database" as gfd +entity "Cloud\nKMS" as kms +box "Apigee API Platform" #LightBlue +entity "API Proxy\nfirestore-data-proxy-v1" as fdp +entity "SharedFlow\nsf-firestore-facade-lookup-v1" as ffl +entity "SharedFlow\nsf-firestore-facade-populate-v1" as ffp +end box +participant "Backend" as backend + +u -> b: User interaction +b -> b: App activity +b -> fdp: Access the firestore facade api + +note over gfd,ffp: "Apigee API proxy and shared flows acting as a facade in front of Cloud Firestore db" + +fdp -> ffl: Lookup data from the Cloud Firestore db based on base path, path suffix and encoding type (base64 only) +ffl -> ffl: calculate the cache key\ncacheKey = encodingType( basePath + pathSuffix) +ffl -> gfd: Lookup shared flow acting as a facade with Cloud Firestore, using the cache key\ncall is executed using an ID token +gfd -> gfd: lookup in the Cloud Firestore db using cache key + +opt Data retrieved from Cloud Firestore + gfd -> ffl: (encrypted) data is retrieved from Cloud Firestore (lookup status) + ffl -> ffl: extract the encrypted dek from the response (encDek) + ffl -> kms: call cloud kms api to decrypt the encrypted dek + kms -> ffl: return the decrypted dek + ffl -> ffl: decrypt the encrypted content using the dek (decrypted) + ffl -> ffl: set context variables:\nflow.lookup.hit = true \nflow.lookup.content = "" \nflow.lookup.status.code = 200 + ffl -> fdp: shared flow response +end + +opt Data is NOT retrieved from Cloud Firestore + gfd -> ffl: data is not retrieved from Cloud Firestore (lookp status) + ffl -> ffl: set context variables:\nflow.lookup.hit = false \nflow.lookup.content = "none" \nflow.lookup.status.code > 399 + ffl -> fdp: shared flow response + fdp -> backend: request is forwarded to the backend API + backend -> fdp: backend response + fdp -> fdp: generate a random encryption key + fdp -> fdp: encrypt the content of the response + fdp -> kms: call cloud kms api to encrypt the encrypted dek + kms -> fdp: return the encrypted dek + fdp -> fdp: prepare the content to be cached = encrypted content + encrypted dek (envelope encryption pattern) + fdp -> ffp: Populate data from the Cloud Firestore db based on base path, path suffix and encoding type (base64 only) + ffp -> ffp: calculate the cache key\ncacheKey = encodingType( basePath + pathSuffix) + ffp -> gfd: Populate shared flow acting as a facade with Cloud Firestore, using the cache key\ncall is executed using an ID token + gfd -> gfd: populate backend response in the Firestore db using cache key + gfd -> ffp: firestore populate status + ffp -> ffp: set context variables:\nflow.populate.content = true \nflow.populate.status.code = 200 \nflow.populate.cachekey = \nflow.populate.extcache.documentid = \nflow.populate.extcache.collectionid = + ffp -> fdp: shared flow response + +end + +fdp -> b: JSON response is sent back to the app (200 OK) + +@enduml \ No newline at end of file diff --git a/references/firestore-facade/firestore-data-proxy-v1/apiproxy/policies/AM-SetResponse.xml b/references/firestore-facade/firestore-data-proxy-v1/apiproxy/policies/AM-SetResponse.xml index 43db7f86..c8fa33da 100644 --- a/references/firestore-facade/firestore-data-proxy-v1/apiproxy/policies/AM-SetResponse.xml +++ b/references/firestore-facade/firestore-data-proxy-v1/apiproxy/policies/AM-SetResponse.xml @@ -14,7 +14,7 @@ message.content - flow.lookup.content.cached + flow.lookup.content message.header.content-type diff --git a/references/firestore-facade/firestore-data-proxy-v1/apiproxy/proxies/default.xml b/references/firestore-facade/firestore-data-proxy-v1/apiproxy/proxies/default.xml index e6e78366..8e2b9e6b 100644 --- a/references/firestore-facade/firestore-data-proxy-v1/apiproxy/proxies/default.xml +++ b/references/firestore-facade/firestore-data-proxy-v1/apiproxy/proxies/default.xml @@ -18,13 +18,13 @@ FC-LookupExternalCache - flow.lookup.iscontent.cached = "true" + flow.lookup.hit = "true" AM-SetResponse - (flow.lookup.iscontent.cached = "false") and (flow.lookup.status.code = 404) + (flow.lookup.hit = "false") and (flow.lookup.status.code > 399) FC-PopulateExternalCache @@ -38,7 +38,7 @@ /v1/firestore - flow.lookup.iscontent.cached = "true" + flow.lookup.hit = "true" default diff --git a/references/firestore-facade/pipeline.sh b/references/firestore-facade/pipeline.sh index 510b53d9..c7828de1 100755 --- a/references/firestore-facade/pipeline.sh +++ b/references/firestore-facade/pipeline.sh @@ -33,7 +33,6 @@ envsubst < "$SCRIPTPATH"/templates/AM-SetFirestoreMock.template.xml > "$SCRIPTPA echo "[INFO] Deploying Google Firestore reference to Google API (For X/hybrid)" -#token() { echo -n "$(gcloud config config-helper --force-auth-refresh --format json | jq -r '.credential.access_token')"; } TOKEN=$(gcloud auth print-access-token) SA_EMAIL="apigee-firestore-sa@$APIGEE_X_ORG.iam.gserviceaccount.com" diff --git a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseCacheVariables.xml b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreCacheVariables.xml similarity index 84% rename from references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseCacheVariables.xml rename to references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreCacheVariables.xml index 660e060e..23371683 100644 --- a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseCacheVariables.xml +++ b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreCacheVariables.xml @@ -11,6 +11,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - - jsc://JS-SetFirebaseCacheVariables.js + + jsc://JS-SetFirestoreCacheVariables.js \ No newline at end of file diff --git a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseMockedCacheVariables.xml b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreMockedCacheVariables.xml similarity index 82% rename from references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseMockedCacheVariables.xml rename to references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreMockedCacheVariables.xml index 0e6656f5..e95484e3 100644 --- a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirebaseMockedCacheVariables.xml +++ b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/policies/JS-SetFirestoreMockedCacheVariables.xml @@ -11,6 +11,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - - jsc://JS-SetFirebaseMockedCacheVariables.js + + jsc://JS-SetFirestoreMockedCacheVariables.js \ No newline at end of file diff --git a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseCacheVariables.js b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreCacheVariables.js similarity index 81% rename from references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseCacheVariables.js rename to references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreCacheVariables.js index ddf2b213..ae8ad7cd 100644 --- a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseCacheVariables.js +++ b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreCacheVariables.js @@ -13,16 +13,16 @@ // has a content been retrieved from firestore cache or not ? var isDataRetrievedFromCache = (context.getVariable('servicecallout.SC-Lookup-FirestoreCache.failed').toString().toLowerCase() === 'true'); -// set variable *** flow.lookup.iscontent.cached *** -context.setVariable('flow.lookup.iscontent.cached',!(isDataRetrievedFromCache)); +// set variable *** flow.lookup.hit *** +context.setVariable('flow.lookup.hit',!(isDataRetrievedFromCache)); -var content = 'none'; +var content = null; if ( !(isDataRetrievedFromCache) ) { // get content as a string as this is what we want (a JSON stringified content!) content = JSON.parse(context.getVariable('firestoreCacheResponse.content')).fields.data.stringValue; } -// set variable *** flow.lookup.content.cached *** -context.setVariable('flow.lookup.content.cached',content); +// set variable *** flow.lookup.content *** +context.setVariable('flow.lookup.content',content); // set variable *** flow.lookup.status.code *** context.setVariable('flow.lookup.status.code',context.getVariable("firestoreCacheResponse.status.code")); diff --git a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseMockedCacheVariables.js b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreMockedCacheVariables.js similarity index 77% rename from references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseMockedCacheVariables.js rename to references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreMockedCacheVariables.js index a3d0fdb3..1a4efeff 100644 --- a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirebaseMockedCacheVariables.js +++ b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/resources/jsc/JS-SetFirestoreMockedCacheVariables.js @@ -11,8 +11,8 @@ limitations under the License. */ -// set variable *** flow.lookup.iscontent.cached *** -context.setVariable('flow.lookup.iscontent.cached','true'); +// set variable *** flow.lookup.hit *** +context.setVariable('flow.lookup.hit','true'); // mock content var content = { @@ -21,8 +21,8 @@ var content = { code: "FIRESTORE-MOCK001" } -// set variable *** flow.lookup.content.cached *** -context.setVariable('flow.lookup.content.cached',JSON.stringify(content)); +// set variable *** flow.lookup.content *** +context.setVariable('flow.lookup.content',JSON.stringify(content)); // set variable *** flow.lookup.status.code *** context.setVariable('flow.lookup.status.code',200); diff --git a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/sharedflows/default.xml b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/sharedflows/default.xml index 2cb94cdf..45fd9612 100644 --- a/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/sharedflows/default.xml +++ b/references/firestore-facade/sf-firestore-facade-lookup-v1/sharedflowbundle/sharedflows/default.xml @@ -20,15 +20,15 @@ AM-Base64EncodePathInfo - flow.firestore.demo.enabled != "true" + flow.firestore.mock.enabled != "true" SC-Lookup-FirestoreCache - flow.firestore.demo.enabled != "true" - JS-SetFirebaseCacheVariables + flow.firestore.mock.enabled != "true" + JS-SetFirestoreCacheVariables - flow.firestore.demo.enabled = "true" - JS-SetFirebaseMockedCacheVariables + flow.firestore.mock.enabled = "true" + JS-SetFirestoreMockedCacheVariables \ No newline at end of file diff --git a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirebase.xml b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirestore.xml similarity index 88% rename from references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirebase.xml rename to references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirestore.xml index 0be0e943..1e7437de 100644 --- a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirebase.xml +++ b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/JS-PopulateFirestore.xml @@ -11,6 +11,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - - jsc://JS-PopulateFirebase.js + + jsc://JS-PopulateFirestore.js \ No newline at end of file diff --git a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/SC-PopulateCache.xml b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/SC-PopulateCache.xml index 45aca961..b12150b1 100644 --- a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/SC-PopulateCache.xml +++ b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/policies/SC-PopulateCache.xml @@ -17,9 +17,6 @@
application/json
- - {flow.pathSuffix} - POST {"fields": {"data": {"stringValue": "{flow.jsonContentAsString}"}}} diff --git a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirebase.js b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirestore.js similarity index 63% rename from references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirebase.js rename to references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirestore.js index b10f9758..893bc34d 100644 --- a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirebase.js +++ b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/resources/jsc/JS-PopulateFirestore.js @@ -13,25 +13,25 @@ // has a content been stored in firestore cache or not ? var isDataStoredInCache = (context.getVariable('servicecallout.SC-PopulateCache.failed').toString().toLowerCase() === 'true'); -// set variable *** flow.populate.iscontent.cached *** -context.setVariable('flow.populate.iscontent.cached',!(isDataStoredInCache)); +// set variable *** flow.populate.success *** +context.setVariable('flow.populate.success',!(isDataStoredInCache)); -var content = 'none'; +var content = null; if ( !(isDataStoredInCache) ) { // get content as a string content = JSON.parse(context.getVariable('firestoreCacheResponse.content')).fields.data.stringValue; } -// set variable *** flow.populate.content.cached *** -context.setVariable('flow.populate.content.cached',content); +// set variable *** flow.populate.content *** +context.setVariable('flow.populate.content',content); // set variable *** flow.populate.status.code *** context.setVariable('flow.populate.status.code',context.getVariable("firestoreCacheResponse.status.code")); -// set variable *** flow.populate.keycache *** -context.setVariable('flow.populate.keycache',context.getVariable("flow.basePath")+'/'+context.getVariable("flow.pathSuffix")); +// set variable *** flow.populate.cachekey *** +context.setVariable('flow.populate.cachekey',context.getVariable("flow.basePath")+'/'+context.getVariable("flow.pathSuffix")); -// set variable *** flow.populate.documentid *** -context.setVariable('flow.populate.documentid',context.getVariable("flow.pathSuffix")); +// set variable *** flow.populate.extcache.documentid *** +context.setVariable('flow.populate.extcache.documentid',context.getVariable("flow.pathSuffix")); -// set variable *** flow.populate.collectionid *** -context.setVariable('flow.populate.collectionid',context.getVariable("flow.basePath")); \ No newline at end of file +// set variable *** flow.populate.extcache.collectionid *** +context.setVariable('flow.populate.extcache.collectionid',context.getVariable("flow.basePath")); \ No newline at end of file diff --git a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/sharedflows/default.xml b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/sharedflows/default.xml index 2a938f6f..b49e6040 100644 --- a/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/sharedflows/default.xml +++ b/references/firestore-facade/sf-firestore-facade-populate-v1/sharedflowbundle/sharedflows/default.xml @@ -19,6 +19,6 @@ SC-PopulateCache - JS-PopulateFirebase + JS-PopulateFirestore \ No newline at end of file diff --git a/references/firestore-facade/templates/AM-SetFirestoreMock.template.xml b/references/firestore-facade/templates/AM-SetFirestoreMock.template.xml index 8b6bfaca..c8a93fe9 100644 --- a/references/firestore-facade/templates/AM-SetFirestoreMock.template.xml +++ b/references/firestore-facade/templates/AM-SetFirestoreMock.template.xml @@ -13,7 +13,7 @@ --> - flow.firestore.demo.enabled + flow.firestore.mock.enabled $IS_FIRESTORE_MOCK_ENABLED false