NPM module - izara-shared: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 36: | Line 36: | ||
Helper functions for interacting with DynamoDB resources. | Helper functions for interacting with DynamoDB resources. | ||
== dynamodbSharedLib. | == Idempotence == | ||
* DynamodbSharedLib functions that have invoke queries with conditional expression can pass in a setting that says whether to throw on conditionalExpression failure | |||
* if for idempotent conditionalExpression error not want to throw, we want to keep processing as if the query passed like normal | |||
* default is to not throw, because in most cases we will be protecting for idempotent processing | |||
* if conditionalExpression is critical, eg not for idemptent test, then we throw, calling code can set whether to throw noRetryError or normal error that will trigger retries, calling code passes in a setting to do this, default is noRetryError | |||
== Notes == | |||
* could add another setting that waits and retries on certain errors, within the one function call, could also set delay and how many retries | |||
* might not be needed as DynamoDocument library already has built in retry logic, errors might be an edge case that can be handled through normal throw/retry/dlq flow | |||
== dynamodbSharedLib.getItem == | |||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
/** | /** | ||
* Executes a | * Executes a GetItem query to DynamoDB | ||
* @param {string} tableName | * @param {string} tableName | ||
* @param {object} keyValues | * @param {object} keyValues | ||
* | * @param {[object]} queryElements // eg returned only some attributes (ProjectionExpression) | ||
* @param {[object]} settings | |||
* @param {boolean} settings.errorOnNoRecordFound | |||
* @param {boolean} settings.retryOnErrorNoRecordFound | |||
* @returns {object} single record return value from the query, or Null if none found | * @returns {object} single record return value from the query, or Null if none found | ||
*/ | */ | ||
Line 49: | Line 64: | ||
* return the .Item property | * return the .Item property | ||
* if record not found Null will be returned unless errorOnNoRecordFound set to true which will throw error | |||
=== errorOnNoRecordFound === | |||
* if set truthy create an error that includes tableName and keyValues | |||
* noRetryError error is thrown unless retryOnErrorNoRecordFound is set truthy, then a normal error is thrown which will trigger retry code | |||
=== other errors === | |||
* other unhandled DynamoDB errors might include Dynamo throttling/failure | |||
* for these we throw a normal error so the request gets retried before passing to DLQ | |||
== dynamodbSharedLib.query == | == dynamodbSharedLib.query == | ||
Line 57: | Line 84: | ||
* @param {string} tableName | * @param {string} tableName | ||
* @param {object} partitionKeyValue | * @param {object} partitionKeyValue | ||
* @param {[object]} sortKeyConditions | * @param {[object]} queryElements | ||
* @param {[object]} ExclusiveStartKey | * @param {[object]} queryElements.sortKeyConditions | ||
* @param {object} . | * @param {[object]} queryElements.ExclusiveStartKey | ||
* @param {[object]} settings | |||
* @param {numeric} settings.numPagesToRequest // not sure will use? Script will automatically request multiple pages of results | |||
* | * | ||
* @returns {object[], object} array of records from .Items in query result, and | * @returns {object[], object} array of records from .Items in query result, and queryInfo object with properties such as LastEvaluatedKey | ||
*/ | */ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== errors === | |||
* unhandled DynamoDB errors might include Dynamo throttling/failure | |||
* for these we throw a normal error so the request gets retried before passing to DLQ | |||
== dynamodbSharedLib.putItem == | == dynamodbSharedLib.putItem == | ||
Line 73: | Line 107: | ||
* @param {object} keyValues | * @param {object} keyValues | ||
* @param {object} attributes | * @param {object} attributes | ||
* @param {[object]} | * @param {[object]} queryElements | ||
* @param {object} ... | * @param {[object]} queryElements.conditionalExpressions | ||
* @param {[object]} settings | |||
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error | |||
* @param {numeric} settings.retryOnErrorConditionalExpNotPass | |||
* | * | ||
* @returns {} .. maybe nothing | * @returns {} .. maybe nothing | ||
Line 80: | Line 117: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | === errorOnConditionalExpNotPass === | ||
* if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s | |||
* noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code | |||
=== other errors === | |||
* other unhandled DynamoDB errors might include Dynamo throttling/failure | |||
* for these we throw a normal error so the request gets retried before passing to DLQ | |||
== dynamodbSharedLib.updateItem == | == dynamodbSharedLib.updateItem == | ||
Line 86: | Line 131: | ||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
/** | /** | ||
* Executes | * Executes an UpdateItem query on DynamoDB | ||
* @param {string} tableName | * @param {string} tableName | ||
* @param {object} keyValues | * @param {object} keyValues | ||
* @param {object} attributes | * @param {object} attributes | ||
* @param {[object]} conditionalExpressions | * @param {[object]} queryElements | ||
* @param {object} .. | * @param {[object]} queryElements.conditionalExpressions | ||
* @param {[object]} settings | |||
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error | |||
* @param {numeric} settings.retryOnErrorConditionalExpNotPass | |||
* | * | ||
* @returns {} .. maybe nothing | * @returns {} .. maybe nothing | ||
Line 97: | Line 145: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | === errorOnConditionalExpNotPass === | ||
* if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s | |||
* noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code | |||
=== other errors === | |||
* other unhandled DynamoDB errors might include Dynamo throttling/failure | |||
* for these we throw a normal error so the request gets retried before passing to DLQ | |||
== dynamodbSharedLib.deleteItem == | |||
<syntaxhighlight lang="JavaScript"> | |||
/** | |||
* Executes a DeleteItem query on DynamoDB | |||
* @param {string} tableName | |||
* @param {object} keyValues | |||
* @param {[object]} queryElements | |||
* @param {[object]} queryElements.conditionalExpressions | |||
* @param {[object]} settings | |||
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error | |||
* @param {numeric} settings.retryOnErrorConditionalExpNotPass | |||
* | |||
* @returns {} .. maybe nothing | |||
*/ | |||
</syntaxhighlight> | |||
=== errorOnConditionalExpNotPass === | |||
* if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s | |||
* noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code | |||
=== other errors === | |||
* other unhandled DynamoDB errors might include Dynamo throttling/failure | |||
* for these we throw a normal error so the request gets retried before passing to DLQ | |||
== dynamodbSharedLib.createStringSet == | == dynamodbSharedLib.createStringSet == |
Revision as of 03:31, 4 May 2021
Overview
Shared libraries used across multiple izara projects
Repository
https://bitbucket.org/stb_working/izara-shared/src/master/
constants
- {string} systemTextGraphTag ("systemText")
- {string} systemTextServiceNameGraphTag ("systemTextServiceName")
Helper functions for interacting with Lambda resources.
/**
* Executes a Get query to DynamoDB
* @param {string} serviceName
* @param {string} functionName
*
* @returns {string} deployed Lambda service name
*/
- concatenate with env stage setting
Helper functions for interacting with DynamoDB resources.
Idempotence
- DynamodbSharedLib functions that have invoke queries with conditional expression can pass in a setting that says whether to throw on conditionalExpression failure
- if for idempotent conditionalExpression error not want to throw, we want to keep processing as if the query passed like normal
- default is to not throw, because in most cases we will be protecting for idempotent processing
- if conditionalExpression is critical, eg not for idemptent test, then we throw, calling code can set whether to throw noRetryError or normal error that will trigger retries, calling code passes in a setting to do this, default is noRetryError
Notes
- could add another setting that waits and retries on certain errors, within the one function call, could also set delay and how many retries
- might not be needed as DynamoDocument library already has built in retry logic, errors might be an edge case that can be handled through normal throw/retry/dlq flow
/**
* Executes a GetItem query to DynamoDB
* @param {string} tableName
* @param {object} keyValues
* @param {[object]} queryElements // eg returned only some attributes (ProjectionExpression)
* @param {[object]} settings
* @param {boolean} settings.errorOnNoRecordFound
* @param {boolean} settings.retryOnErrorNoRecordFound
* @returns {object} single record return value from the query, or Null if none found
*/
- return the .Item property
- if record not found Null will be returned unless errorOnNoRecordFound set to true which will throw error
errorOnNoRecordFound
- if set truthy create an error that includes tableName and keyValues
- noRetryError error is thrown unless retryOnErrorNoRecordFound is set truthy, then a normal error is thrown which will trigger retry code
other errors
- other unhandled DynamoDB errors might include Dynamo throttling/failure
- for these we throw a normal error so the request gets retried before passing to DLQ
/**
* Executes a Query on DynamoDB
* @param {string} tableName
* @param {object} partitionKeyValue
* @param {[object]} queryElements
* @param {[object]} queryElements.sortKeyConditions
* @param {[object]} queryElements.ExclusiveStartKey
* @param {[object]} settings
* @param {numeric} settings.numPagesToRequest // not sure will use? Script will automatically request multiple pages of results
*
* @returns {object[], object} array of records from .Items in query result, and queryInfo object with properties such as LastEvaluatedKey
*/
errors
- unhandled DynamoDB errors might include Dynamo throttling/failure
- for these we throw a normal error so the request gets retried before passing to DLQ
/**
* Executes a PutItem query on DynamoDB
* @param {string} tableName
* @param {object} keyValues
* @param {object} attributes
* @param {[object]} queryElements
* @param {[object]} queryElements.conditionalExpressions
* @param {[object]} settings
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error
* @param {numeric} settings.retryOnErrorConditionalExpNotPass
*
* @returns {} .. maybe nothing
*/
errorOnConditionalExpNotPass
- if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s
- noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code
other errors
- other unhandled DynamoDB errors might include Dynamo throttling/failure
- for these we throw a normal error so the request gets retried before passing to DLQ
/**
* Executes an UpdateItem query on DynamoDB
* @param {string} tableName
* @param {object} keyValues
* @param {object} attributes
* @param {[object]} queryElements
* @param {[object]} queryElements.conditionalExpressions
* @param {[object]} settings
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error
* @param {numeric} settings.retryOnErrorConditionalExpNotPass
*
* @returns {} .. maybe nothing
*/
errorOnConditionalExpNotPass
- if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s
- noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code
other errors
- other unhandled DynamoDB errors might include Dynamo throttling/failure
- for these we throw a normal error so the request gets retried before passing to DLQ
/**
* Executes a DeleteItem query on DynamoDB
* @param {string} tableName
* @param {object} keyValues
* @param {[object]} queryElements
* @param {[object]} queryElements.conditionalExpressions
* @param {[object]} settings
* @param {numeric} settings.errorOnConditionalExpNotPass // if set then an error will be thrown, otherwise function returns with no error
* @param {numeric} settings.retryOnErrorConditionalExpNotPass
*
* @returns {} .. maybe nothing
*/
errorOnConditionalExpNotPass
- if set truthy create an error that includes tableName and keyValues, maybe conditionalExpressions or DynamoDB error if it describes not passing condition/s
- noRetryError error is thrown unless retryOnErrorConditionalExpNotPass is set truthy, then a normal error is thrown which will trigger retry code
other errors
- other unhandled DynamoDB errors might include Dynamo throttling/failure
- for these we throw a normal error so the request gets retried before passing to DLQ
/**
* Creates a string set element for use with documentClient
* @param {string[]} stringSet
*
* @returns {string} String formatted as a string set for Dynamo
*/
Helper functions for Config tables.
/**
* @param {string} configTag
* @param {string} configKey
*
* @returns {Object} returns the configValue for a single config record, or null if none found
*/
Helper functions for interacting with Neptune graph databases from any service.
constants
- {string} userGraphTag ("user")
- {string} createdByEdgeLabel ("createdBy")
- {string} hasEdgeLabelPrefix ("has_")
- {string} settingsVersionedDataTag ("Settings")
- {string} versionedDataFromPropertyName ("from")
- {string} versionedDataToPropertyName ("to")
/**
* Creates vertexId from vertexTag and unique id
* @param {string} vertexTag - is the type of object
* @param {string} vertexUniqueId
*
* @returns {string} vertexId
*/
- Concatenate vertexTag + '_' + vertexUniqueId
/**
* Creates standardized edgeId
* @param {string} subjectVertexId
* @param {string} edgeLabel
* @param {string} [objectVertexId=""]
*
* @returns {string} edgeId
*/
- let edgeid = subjectVertexId + '_' + edgeLabel
- if(objectVertexId)
- edgeid = edgeid + '_' + objectVertexId
- return edgeid
/**
* Creates standardized edgeId
* @param {string} subjectVertexTag
* @param {string} subjectVertexUniqueId
* @param {string} edgeLabel
* @param {string} [objectVertexTag=""]
* @param {string} [objectVertexUniqueId=""]
*
* @returns {string} edgeId
*/
- const subjectVertexId = graphSharedLib.createVertexId
- vertexTag = subjectVertexTag
- uniqueId = subjectVertexUniqueId
- let objectVertexId = ""
- if(objectVertexTag)
- objectVertexId = graphSharedLib.createVertexId
- vertexTag = objectVertexTag
- uniqueId = objectVertexUniqueId
- objectVertexId = graphSharedLib.createVertexId
- return = graphSharedLib.createEdgeIdFromVertexIds
- subjectVertexId: subjectVertexId'
- edgeLabel: edgeLabel
- objectVertexId: objectVertexId
/**
* Creates standardized versionedDataVertexLabel
* @param {string} subjectVertexTag
* @param {string} versionedDataTag
*
* @returns {string} versionedDataVertexLabel
*/
- let versionedDataVertexTag = subjectVertexTag + versionedDataTag
- return versionedDataVertexTag
/**
* Creates standardized versionedDataEdgeLabel
* @param {string} ''versionedDataTag''
*
* @returns {string} versionedDataEdgeLabel
*/
- return NPM module - izara-shared#graphSharedLib.hasEdgeLabelPrefix + versionedDataTag
/**
* Returns all vertices that match the vertex label for the given graph
* @param {string} graphServiceName
* @param {string} vertexLabel
*
* @returns {string} vertexId
*/
- ..
/**
* Returns vertex that matched the vertex id
* @param {string} graphServiceName
* @param {string} vertexId
*
* @returns {string} vertexId
*/
- ..
/**
* Returns vertex that matched the vertex id
* @param {string} graphServiceName
* @param {string} vertexTag
* @param {string} vertexUniqueId
*
* @returns {object} vertex
*/
- const vertexId = NPM module - izara-shared#graphSharedLib.createVertexId
- vertexTag: vertexTag
- vertexUniqueId: vertexUniqueId
- const vertex = invoke #graphSharedLib.getVertexByVertexId
- graphServiceName: graphServiceName
- vertexId: vertexId
- return vertex
/**
* Returns all edges, allowing label and property filters
* @param {string} graphServiceName
* @param {string} subjectVertexId
* @param {string} [edgeLabel=""]
* @param {object} [edgeProperties={}]
*
* @returns {string} vertexId
*/
- ..
/**
* Returns all edges, allowing label and property filters
* @param {string} graphServiceName
* @param {string} subjectVertexTag
* @param {string} subjectVertexUniqueId
* @param {string} [edgeLabel=""]
* @param {object} [edgeProperties={}]
*
* @returns {string} vertexId
*/
- const vertexId = NPM module - izara-shared#graphSharedLib.createVertexId
- vertexTag: subjectVertexTag
- vertexUniqueId: subjectVertexUniqueId
- const edges = invoke #graphSharedLib.getVertexOutEdgesByVertexId
- graphServiceName: graphServiceName
- vertexId: vertexId
- edgeLabel: edgeLabel
- edgeProperties: edgeProperties
- return edges
/**
* Find related vertices and their connecting edges, including properties, allowing label and property filters
* @param {string} graphServiceName
* @param {string} subjectVertexId
* @param {string} [edgeLabel=""] - edge label to filter edges by
* @param {object} [edgeProperties={}] - edge properties to filter by, is an array of key > value pairs
* @param {object} [vertexProperties={}] - object vertex properties to filter by, is an array of key > value pairs
*
* @returns {Object[]} array of vertices and the connecting edges
*/
- ..
/**
* Find related vertices and their connecting edges, including properties, allowing label and property filters
* @param {string} graphServiceName
* @param {string} subjectVertexTag
* @param {string} subjectVertexUniqueId
* @param {string} [edgeLabel=""] - edge label to filter edges by
* @param {object} [edgeProperties={}] - edge properties to filter by, is an array of key > value pairs
* @param {object} [vertexProperties={}] - object vertex properties to filter by, is an array of key > value pairs
*
* @returns {Object[]} array of vertices and the connecting edges
*/
- const vertexId = NPM module - izara-shared#graphSharedLib.createVertexId
- vertexTag: subjectVertexTag
- vertexUniqueId: subjectVertexUniqueId
- const vertexAndEdges = invoke #graphSharedLib.getVertexOutEdgesAndVerticesByVertexId
- graphServiceName: graphServiceName
- vertexId: vertexId
- edgeLabel: edgeLabel
- edgeProperties: edgeProperties
- return vertexAndEdges
/**
* Find related vertices and their connecting edges, including properties, allowing label and property filters
* @param {string} graphServiceName
* @param {string} objectVertexId
* @param {string} [edgeLabel=""] - edge label to filter edges by
* @param {object} [edgeProperties={}] - edge properties to filter by, is an array of key > value pairs
* @param {object} [vertexProperties={}] - object vertex properties to filter by, is an array of key > value pairs
*
* @returns {Object[]} array of vertices and the connecting edges
*/
- ..
/**
* Find related vertices and their connecting edges, including properties, allowing label and property filters
* @param {string} graphServiceName
* @param {string} objectVertexTag
* @param {string} objectVertexUniqueId
* @param {string} [edgeLabel=""] - edge label to filter edges by
* @param {object} [edgeProperties={}] - edge properties to filter by, is an array of key > value pairs
* @param {object} [vertexProperties={}] - object vertex properties to filter by, is an array of key > value pairs
*
* @returns {Object[]} array of vertices and the connecting edges
*/
- const vertexId = NPM module - izara-shared#graphSharedLib.createVertexId
- vertexTag: objectVertexTag
- vertexUniqueId: objectVertexUniqueId
- const vertexAndEdges = invoke #graphSharedLib.getVertexOutEdgesAndVerticesByVertexId
- graphServiceName: graphServiceName
- vertexId: vertexId
- edgeLabel: edgeLabel
- edgeProperties: edgeProperties
- return vertexAndEdges
/**
* Find the object/target vertex for a specific edgeId
* @param {string} graphServiceName
* @param {string} edgeId - edge label to filter edges by
*
* @returns {Object} vertex or null if not found
*/
- ..
/**
* Returns vertex that matched the vertex id
* @param {string} graphServiceName
* @param {string} edgeId
*
* @returns {object} edge/subject/object vertices
*/
- ..
/**
* @param {string} graphServiceName
* @param {string} vertexId
* @param {string} versionedDataTag
*
* @returns {Object} versionedData object
*/
- .. needs to filter edge by currently active versioned data..
- ... work through queries to get the current versioned data
- // will need versionedDataEdgeLabel to find edges that are versioned data
- const versionedDataEdgeLabel = #createVersionedDataEdgeLabel
- versionedDataTag: versionedDataTag
/**
* @param {string} graphServiceName
* @param {string} vertexTag
* @param {string} vertexUniqueId
* @param {string} versionedDataTag
*
* @returns {string} versionedData object
*/
- const vertexId = NPM module - izara-shared#graphSharedLib.createVertexId
- vertexTag: vertexTag
- vertexUniqueId: vertexUniqueId
- const versionedDataVertexTag = #graphSharedLib.getCurrentVersionedDataByVertexId
- graphServiceName: graphServiceName
- vertexId: vertexId
- versionedDataTag: versionedDataTag
MsgCfgLib
Helper functions for interacting with Message Configs
MsgCfgLib.CreateMsgConfigId
/**
*
* @param {string} serviceName
* @param {string} topicName
*
* @returns {string} msgCfgId
*/
- concatenate {serviceName} + "_" + {topicName}
MsgCfgLib.ExplodeMsgConfigId
/**
*
* @param {string} msgCfgId
*
* @returns {string[]} serviceName, topicName
*/