-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: remove DynamodbWrapper client dependency #32
base: master
Are you sure you want to change the base?
Conversation
src/with-paginator-helper.js
Outdated
} | ||
} | ||
|
||
result.Items = items; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You may want to update the other fields that refer to the amount of items read (like count or consumed capacity)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch, I forgot about the Count, ScannedCount and ConsumedCapacity
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for this! Left some comments here and there. The only bits and blobs I see missing are the batchWrite
operations which would now behave differently after the removal on dynamodb-wrapper
. Not really sold on keeping current functionality, though - so opening the discussion. We might as well cut a new major release and make flynamo
be on par with the official AWS.DynamoDB
client.
src/get-all.js
Outdated
|
||
const DEFAULT_OPTIONS = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd freeze this object and add docs to the props.
const DEFAULT_OPTIONS = Object.freeze({ ... });
src/get-all.js
Outdated
autopagination: true, | ||
raw: false | ||
}; | ||
const mergeWithDefaults = mergeRight(DEFAULT_OPTIONS); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This kinda works, but won't default to values in DEFAULT_OPTIONS
for null
, undefined
or empty properties. Maybe remove those before merging?
const mergeWithDefaults = compose(mergeRight(DEFAULT_OPTIONS), rejectNilOrEmpty);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- If the user put a nil value, why this should change it?
- I can add the _ rejectNilOrEmpty_ but we don't have ramda-land here, do see that is necessary to add another dependency just for this?
src/get-all.test.js
Outdated
const { getAll } = createAllGetter({ scan: mockScan }); | ||
await getAll(); | ||
expect(mockScan).toHaveBeenCalled(); | ||
}); | ||
|
||
test('should return `undefined` if no items are returned', async () => { | ||
const mockScan = jest.fn().mockResolvedValue({}); | ||
test('should return `[]` if no items are returned', async () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While I agree []
makes more sense, this would be a breaking change.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I revert this change to return undefined
instead
src/count.js
Outdated
|
||
/** | ||
* @private | ||
*/ | ||
const createCount = scan => pipeP(scan, prop('Count')); | ||
const createCount = scan => params => withPaginatorHelper(scan, params, true).then(prop('Count')); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like the simplicity of what we had before. Maybe we could make the withPaginatorHelper
return an async
function that expects params
? (see comment further below)
const createCount = scan => params => withPaginatorHelper(scan, params, true).then(prop('Count')); | |
const createCount = scan => compose(andThen(prop('Count')), withPaginator(scan)); |
/** | ||
* @private | ||
*/ | ||
const createGetAll = scan => pipeP(scan, unwrapAll('Items')); | ||
const createGetAll = scan => (params, options = {}) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Following the idea of having the paginator helper return a function accepting params
, this could be turned into something like:
const createGetAll = scan => (params, options = {}) => {
const { raw, autopagination } = mergeWithDefaults(options);
const scanFn = autopagination ? withPaginator(scan) : scan;
return scanFn(params).then(
raw ? unwrapOverAll('Items') : unwrapAll('Items')
);
};
src/get.js
Outdated
@@ -13,7 +13,8 @@ const addTableName = require('./table-name'); | |||
/** | |||
* @private | |||
*/ | |||
const getUnwrappedItem = getItem => pipeP(apply(getItem), unwrapProp('Item')); | |||
const getUnwrappedItem = getItem => | |||
compose(andThen(unwrapProp('Item')), request => request.promise(), apply(getItem)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this is now used everywhere, what about adding some helpers including a swap in replacement for andThen
that automatically invokes request.promise()
first?
'use strict';
const R = require('ramda');
/**
* Invokes `promise` on the given object passing
* in no arguments.
*
* @param {object} obj The obj to invoke `promise` on.
* @returns {Promise.<*>} A `Promise` as returned by a call to `promise`.
*/
const toPromise = R.invoker(0, 'promise')
/**
* Returns the result of applying an `fn` function to the value inside a fulfilled promise,
* after having invoked `promise()` on the target object.
*
* @private
* @see https://ramdajs.com/docs/#andThen
* @param {Function} fn The function to apply. Can return a value or a promise of a value.
*/
const andThen = fn => compose(
R.andThen(fn),
toPromise
);
module.exports = { toPromise, andThen };
src/query.js
Outdated
const { unwrapAll, unwrapOverAll } = require('./wrapper'); | ||
const addTableName = require('./table-name'); | ||
const withPaginatorHelper = require('./with-paginator-helper'); | ||
|
||
const DEFAULT_OPTIONS = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as the scan
comments above.
src/with-paginator-helper.js
Outdated
if (autopagination) { | ||
while (result.LastEvaluatedKey) { | ||
result = await methodFn({ ...params, ExclusiveStartKey: result.LastEvaluatedKey }).promise(); | ||
result.Items && result.Items.length >= 0 && items.push(...result.Items); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
result.Items && result.Items.length >= 0 && items.push(...result.Items); | |
isNotNilOrEmpty(result.Items) && items.push(...result.Items); |
src/with-paginator-helper.js
Outdated
* @param {boolean} autopagination Whether to return all the records from DynamoDB or just the first batch of records. | ||
* @returns {Promise} A promise that resolves to the response from DynamoDB. | ||
*/ | ||
async function withPaginatorHelper(methodFn, params, autopagination) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd turn this into a factory function expecting an operationFn
and returning another function that takes in only input
as argument ("operation" and "input" as that's what the AWS.DynamoDB
typings typically calls them). The autopagination
bit seems redundant to me.
function withPaginator(operationFn) {
async function autopaginate(input) { /* ... */ }
return autopaginate;
}
What the wrapper is doing for those cases is to be able to do an unlimited amount of request to the database taking care of the 25 request limit that the aws-sdk client has. Thoughts? |
➿ Code coverage
|
@lfantone we may need to drop the dependency because it's blocking the upgrade to aws-sdk v3. Maybe we can bring the implementation for the batch methods to flynamo itself? |
Yes, feel free to remove it |
No description provided.