From 8cd2a473984a3ee0f3b5052044050a483736439e Mon Sep 17 00:00:00 2001 From: Nsupyq <93358967+Nsupyq@users.noreply.github.com> Date: Sun, 31 Oct 2021 15:08:07 +0800 Subject: [PATCH 1/2] add idempotence check in index.js --- src/index.js | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/index.js b/src/index.js index 443d735..9f598c1 100644 --- a/src/index.js +++ b/src/index.js @@ -14,20 +14,44 @@ exports.handler = async event => { return processResponse(IS_CORS, 'invalid', 400); } const item = JSON.parse(event.body); - item[PRIMARY_KEY] = uuidv4(); - const params = { - TableName: TABLE_NAME, - Item: item - } + + //require user to provide an unique primary key + if(!item[PRIMARY_KEY]) + return processResponse(IS_CORS, 'please provide unique primary key', 400); + + // idempotence check try { - await dynamoDb.put(params).promise() - return processResponse(IS_CORS); - } catch (error) { - let errorResponse = `Error: Execution update, caused a Dynamodb error, please look at your logs.`; - if (error.code === 'ValidationException') { - if (error.message.includes('reserved keyword')) errorResponse = `Error: You're using AWS reserved keywords as attributes`; + var params1 = { + TableName: TABLE_NAME, + Key:{ + 'savetableId': item[PRIMARY_KEY] + } + }; + var data = await dynamoDb.get(params1).promise(); + + if(data.Item) { + // data have been saved, this is a duplicate write + return processResponse(IS_CORS); + } + // data have not been saved + const params = { + TableName: TABLE_NAME, + Item: item } - console.log(error); - return processResponse(IS_CORS, errorResponse, 500); + try { + await dynamoDb.put(params).promise() + return processResponse(IS_CORS); + } catch (error) { + let errorResponse = `Error: Execution update, caused a Dynamodb error, please look at your logs.`; + if (error.code === 'ValidationException') { + if (error.message.includes('reserved keyword')) errorResponse = `Error: You're using AWS reserved keywords as attributes`; + } + console.log(error); + return processResponse(IS_CORS, errorResponse, 500); + } + + } catch (error) { + return processResponse(IS_CORS, 'error', 500); } + }; From c5cd1ed24828ae7f5cc017ed7e8be18e0ec48790 Mon Sep 17 00:00:00 2001 From: Nsupyq <93358967+Nsupyq@users.noreply.github.com> Date: Wed, 3 Nov 2021 22:42:24 +0800 Subject: [PATCH 2/2] Remove unnecessary check in index.js It is not necessary to check whether the data have been saved. We just need to ensure that the function will create only one record even under retry. --- src/index.js | 43 ++++++++++++------------------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/src/index.js b/src/index.js index 9f598c1..3938503 100644 --- a/src/index.js +++ b/src/index.js @@ -19,39 +19,20 @@ exports.handler = async event => { if(!item[PRIMARY_KEY]) return processResponse(IS_CORS, 'please provide unique primary key', 400); - // idempotence check + const params = { + TableName: TABLE_NAME, + Item: item + } try { - var params1 = { - TableName: TABLE_NAME, - Key:{ - 'savetableId': item[PRIMARY_KEY] - } - }; - var data = await dynamoDb.get(params1).promise(); - - if(data.Item) { - // data have been saved, this is a duplicate write - return processResponse(IS_CORS); - } - // data have not been saved - const params = { - TableName: TABLE_NAME, - Item: item - } - try { - await dynamoDb.put(params).promise() - return processResponse(IS_CORS); - } catch (error) { - let errorResponse = `Error: Execution update, caused a Dynamodb error, please look at your logs.`; - if (error.code === 'ValidationException') { - if (error.message.includes('reserved keyword')) errorResponse = `Error: You're using AWS reserved keywords as attributes`; - } - console.log(error); - return processResponse(IS_CORS, errorResponse, 500); - } - + await dynamoDb.put(params).promise() + return processResponse(IS_CORS); } catch (error) { - return processResponse(IS_CORS, 'error', 500); + let errorResponse = `Error: Execution update, caused a Dynamodb error, please look at your logs.`; + if (error.code === 'ValidationException') { + if (error.message.includes('reserved keyword')) errorResponse = `Error: You're using AWS reserved keywords as attributes`; + } + console.log(error); + return processResponse(IS_CORS, errorResponse, 500); } };