Public
Edited
Jul 2, 2023
1 fork
9 stars
Insert cell
Insert cell
Insert cell
Insert cell
encrypted_service_account_credentials = ({
name: "AES-GCM",
salt: "x4gEPgJOp9brBg==",
iv: "Hwoo2XyMFSJT5FLq",
ciphertext:
"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"
})
Insert cell
Insert cell
Insert cell
viewof service_account_credentials = decrypt(
encrypted_service_account_credentials
)
Insert cell
Insert cell
service_account_credentials
Insert cell
Insert cell
Insert cell
gapi_config = ({
apiKey: "AIzaSyC-Uh-7CtBwhlZrXvAr1gmnUaZzixeVG84",
discoveryDocs: [
"https://bigquery.googleapis.com/discovery/v1/apis/bigquery/v2/rest"
],
service_account_key: JSON.parse(service_account_credentials)
})
Insert cell
Insert cell
bqClient = await createGapi(gapi_config)
Insert cell
Insert cell
bqResponse = bqClient.bigquery.jobs.query({
projectId: "larkworthy-dfb11",
resource: {
// See https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query#QueryRequest
query:
"SELECT title FROM [bigquery-public-data:hacker_news.stories] WHERE title != 'Placeholder' LIMIT 20",
useLegacySql: true
}
})
Insert cell
Insert cell
Insert cell
data = bqResponse.result.rows.map(col => col.f[0])
Insert cell
Table(data)
Insert cell
Insert cell
Insert cell
Insert cell
firebaseConfig = ({
// I don't configure everything, we jsut want Auth and storage for this notebook
apiKey: "AIzaSyBN4bxw6d0cM0CGPNzRrkRlBqwFQnPLdN4",
authDomain: "larkworthy-dfb11.firebaseapp.com",
projectId: "larkworthy-dfb11",
appId: "1:786910701676:web:8d7dd002acf3b78c74d049",
storageBucket: "larkworthy-dfb11.appspot.com"
})
Insert cell
Insert cell
import { firebase } with { firebaseConfig } from '@tomlarkworthy/firebase'
Insert cell
import {
getAccessTokenFromServiceAccount,
signinWithAccessToken
} from '@tomlarkworthy/firebase-admin'
Insert cell
Insert cell
service_account_user = {
const token = await getAccessTokenFromServiceAccount(
service_account_credentials
);
await signinWithAccessToken(firebase, token);
return firebase.auth().currentUser;
}
Insert cell
Insert cell
service_account_user.uid
Insert cell
Insert cell
Insert cell
{
service_account_user; // Make sure this cell depends on the service_account_user logging in

// See https://medium.com/@dorathedev/uploading-json-objects-as-json-files-to-firebase-storage-without-having-or-creating-a-json-file-38ad323af3c4
// convert your object into a JSON-string
const string = JSON.stringify(data);
// create a Blob from the JSON-string
const blob = new Blob([string], { type: "application/json" });

// create a reference to the storage
var ref = firebase.storage().ref("/examples/cache-bigquery/data.json");
// upload you blob into the storage
return ref.put(blob);
}
Insert cell
Insert cell
// Use the "authenticated url" as the REST API
uploadToBucket = {
return (await fetch(`https://www.googleapis.com/upload/storage/v1/b/larkworthy-dfb11.appspot.com/o?name=examples/cache-bigquery/dataalt.json`, {
headers: {
'Authorization': `Bearer ${await getAccessTokenFromServiceAccount(service_account_credentials)}`
},
method: "POST",
body: JSON.stringify(data)
})).text()

}
Insert cell
import {fetchp} from '@tomlarkworthy/fetchp'
Insert cell
Insert cell
cached_data_ref = firebase
.storage()
.ref()
.child("/examples/cache-bigquery/data.json")
Insert cell
cached_data = (await fetch(await cached_data_ref.getDownloadURL())).json()
Insert cell
Insert cell
Table(cached_data)
Insert cell
Insert cell
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more