Skip to content

Instantly share code, notes, and snippets.

@mfurlend
Created February 6, 2018 02:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mfurlend/1bafa4ebf020e20f3e0c687687948128 to your computer and use it in GitHub Desktop.
Save mfurlend/1bafa4ebf020e20f3e0c687687948128 to your computer and use it in GitHub Desktop.
#cloud functions #datastore #google
'use strict';
const Datastore = require('@google-cloud/datastore');
// Instantiates a client
const datastore = Datastore();
/**
* Gets a Datastore key from the kind/key pair in the request.
*
* @param {object} requestData Cloud Function request data.
* @param {string} requestData.key Datastore key string.
* @param {string} requestData.kind Datastore kind.
* @returns {object} Datastore key object.
*/
function getKeyFromRequestData (requestData) {
if (!requestData.key) {
throw new Error('Key not provided. Make sure you have a "key" property in your request');
}
if (!requestData.kind) {
throw new Error('Kind not provided. Make sure you have a "kind" property in your request');
}
return datastore.key([requestData.kind, requestData.key]);
}
/**
* Creates and/or updates a record.
*
* @example
* gcloud beta functions call set --data '{"kind":"Task","key":"sampletask1","value":{"description": "Buy milk"}}'
*
* @param {object} req Cloud Function request context.
* @param {object} req.body The request body.
* @param {string} req.body.kind The Datastore kind of the data to save, e.g. "Task".
* @param {string} req.body.key Key at which to save the data, e.g. "sampletask1".
* @param {object} req.body.value Value to save to Cloud Datastore, e.g. {"description":"Buy milk"}
* @param {object} res Cloud Function response context.
*/
exports.set = (req, res) => {
// The value contains a JSON document representing the entity we want to save
if (!req.body.value) {
throw new Error('Value not provided. Make sure you have a "value" property in your request');
}
const key = getKeyFromRequestData(req.body);
const entity = {
key: key,
data: req.body.value
};
return datastore.save(entity)
.then(() => res.status(200).send(`Entity ${key.path.join('/')} saved.`))
.catch((err) => {
console.error(err);
res.status(500).send(err.message);
return Promise.reject(err);
});
};
/**
* Retrieves a record.
*
* @example
* gcloud beta functions call get --data '{"kind":"Task","key":"sampletask1"}'
*
* @param {object} req Cloud Function request context.
* @param {object} req.body The request body.
* @param {string} req.body.kind The Datastore kind of the data to retrieve, e.g. "Task".
* @param {string} req.body.key Key at which to retrieve the data, e.g. "sampletask1".
* @param {object} res Cloud Function response context.
*/
exports.get = (req, res) => {
const key = getKeyFromRequestData(req.body);
return datastore.get(key)
.then(([entity]) => {
// The get operation will not fail for a non-existent entity, it just
// returns an empty dictionary.
if (!entity) {
throw new Error(`No entity found for key ${key.path.join('/')}.`);
}
res.status(200).send(entity);
})
.catch((err) => {
console.error(err);
res.status(500).send(err.message);
return Promise.reject(err);
});
};
/**
* Deletes a record.
*
* @example
* gcloud beta functions call del --data '{"kind":"Task","key":"sampletask1"}'
*
* @param {object} req Cloud Function request context.
* @param {object} req.body The request body.
* @param {string} req.body.kind The Datastore kind of the data to delete, e.g. "Task".
* @param {string} req.body.key Key at which to delete data, e.g. "sampletask1".
* @param {object} res Cloud Function response context.
*/
exports.del = (req, res) => {
const key = getKeyFromRequestData(req.body);
// Deletes the entity
// The delete operation will not fail for a non-existent entity, it just
// doesn't delete anything
return datastore.delete(key)
.then(() => res.status(200).send(`Entity ${key.path.join('/')} deleted.`))
.catch((err) => {
console.error(err);
res.status(500).send(err);
return Promise.reject(err.message);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment