tools/scheduled-deployments/functions/datastore.js (80 lines of code) (raw):
/**
* @fileoverview Utilities to perform Datastore operations.
*/
'use strict';
const Datastore = require('@google-cloud/datastore');
const logging = require('./logging');
// instantiate a Datastore client
const datastore = Datastore();
/**
* @param {!Object<string>} key - Entity key.
* @param {!Array<Object>} data - Entity data.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.insertEntity = (key, data) => {
const entity = {key: key, data: data};
return datastore.save(entity);
};
/**
* @param {string} kind - Name of the Datastore kind.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.getEntities = (kind) => {
const query = datastore.createQuery(kind);
return datastore.runQuery(query);
};
/**
* @param {string} kind - Name of the Datastore kind.
* @param {string} field - Field to filter by.
* @param {!*} value - Value to filter by.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.getEntitiesWithFilter = (kind, field, value) => {
const query = datastore.createQuery(kind).filter(field, value);
return datastore.runQuery(query);
};
/**
* Retrieve all child entities of a given kind of a parent entity.
*
* @param {!Array<string|number>} parentPath - Path to parent entity.
* @param {string} kind - Name of kind of children entities.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.getChildrenOfEntity = (parentPath, kind) => {
const parentKey = datastore.key(parentPath);
const query = datastore.createQuery(kind).hasAncestor(parentKey);
return datastore.runQuery(query);
};
/**
* Create and return a new Datastore key from a given path.
*
* @param {!(string|Array<string|number>)} path - Path to new entity.
* @returns {!Object} Newly created entity key.
*/
exports.createEntityKey = (path) => {
return datastore.key(path);
};
/**
* Obtain key of an existing Datastore entity.
*
* @param {!Object} entity - Entity obtained from Datastore query.
* @returns {!Object} - Corresponding key for entity.
*/
exports.getEntityKey = (entity) => {
return entity[datastore.KEY];
};
/**
* Update a single field in a Datastore entity or add that field if it
* does not yet exist.
*
* @param {!Array<string|number>} entityPath - Ancestor path to entity.
* @param {string} field - Field to update or add.
* @param {!*} value - New value for field.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.updateEntityField = (entityPath, field, value) => {
const entityKey = datastore.key(entityPath);
return datastore.get(entityKey)
.then((results) => {
const entity = results[0];
if (!entity) {
return Promise.reject(
new Error(`No results found for the key ${entityKey}.`));
}
entity[field] = value;
const updatedEntity = {key: entityKey, data: entity};
return datastore.update(updatedEntity);
})
.catch((err) => {
return Promise.reject(err);
});
};
/**
* @param {!Object} key - Key of entity to update.
* @param {!Object} data - New entity data.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.updateEntity = (key, data) => {
const entity = {key: key, data: data};
return datastore.update(entity);
};
/**
* @param {!Object} key - Key of entity to delete.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.deleteEntity = (key) => {
return datastore.delete(key);
};
/**
* Delete children of an entity of a specified Datastore kind.
*
* @param {!Array<string|number>} parentPath - Path to parent entity.
* @param {string} kind - Name of kind of children entities.
* @returns {Promise<!Object>} - Promise resolves with API response.
*/
exports.deleteChildrenOfEntity = (parentPath, kind) => {
return new Promise(function(resolve, reject) {
exports.getChildrenOfEntity(parentPath, kind)
.then((results) => {
const children = results[0];
const childrenKeys = [];
for (let child of children) {
let childKey = exports.getEntityKey(child);
childrenKeys.push(childKey);
}
return exports.deleteEntity(childrenKeys);
})
.then((response) => {
resolve(response);
})
.catch((err) => {
reject(err);
});
});
};
/**
* Verify JSON entity has all required fields.
*
* @param {!Array<*>} requiredFields
* @param {!Object<*,*>} object
* @returns {!Array<*>} Missing fields in object.
*/
exports.findMissingFields = (requiredFields, object) => {
const missingFields = [];
for (let field of requiredFields) {
if (!(field in object)) {
missingFields.push(field);
}
}
return missingFields;
};