From 9f4ef9cdad35161cc8982c8c0f5b3a5600b6dd0b Mon Sep 17 00:00:00 2001 From: Dominic Fitch-Jones Date: Sat, 21 Mar 2020 17:42:17 -0400 Subject: [PATCH] Add ObjectId timestamp parser operation --- src/core/config/Categories.json | 3 +- .../operations/ParseObjectIdTimestamp.mjs | 47 +++++++++++++++++++ tests/operations/index.mjs | 2 +- .../tests/ParseObjectIdTimestamp.mjs | 24 ++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 src/core/operations/ParseObjectIdTimestamp.mjs create mode 100644 tests/operations/tests/ParseObjectIdTimestamp.mjs diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index 5957c8b7..a05ca095 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -247,7 +247,8 @@ "Escape string", "Unescape string", "Pseudo-Random Number Generator", - "Sleep" + "Sleep", + "Parse ObjectId timestamp" ] }, { diff --git a/src/core/operations/ParseObjectIdTimestamp.mjs b/src/core/operations/ParseObjectIdTimestamp.mjs new file mode 100644 index 00000000..bb0f68ed --- /dev/null +++ b/src/core/operations/ParseObjectIdTimestamp.mjs @@ -0,0 +1,47 @@ +/** + * @author dmfj [dominic@dmfj.io] + * @copyright Crown Copyright 2020 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import OperationError from "../errors/OperationError.mjs"; +import BSON from "bson"; + +/** + * Parse ObjectId timestamp operation + */ +class ParseObjectIdTimestamp extends Operation { + + /** + * ParseObjectIdTimestamp constructor + */ + constructor() { + super(); + + this.name = "Parse ObjectId timestamp"; + this.module = "Default"; + this.description = "Parse timestamp from MongoDB/BSON ObjectId hex string."; + this.infoURL = "https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/"; + this.inputType = "string"; + this.outputType = "string"; + this.args = []; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + try { + const objectId = new BSON.ObjectID(input); + return objectId.getTimestamp().toISOString(); + } catch (err) { + throw new OperationError(err); + } + } + +} + +export default ParseObjectIdTimestamp; diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index 7e5ef374..a83fddc8 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -100,6 +100,7 @@ import "./tests/Lorenz.mjs"; import "./tests/LuhnChecksum.mjs"; import "./tests/CipherSaber2.mjs"; import "./tests/Colossus.mjs"; +import "./tests/ParseObjectIdTimestamp.mjs"; // Cannot test operations that use the File type yet @@ -120,4 +121,3 @@ const logOpsTestReport = logTestReport.bind(null, testStatus); const results = await TestRegister.runTests(); logOpsTestReport(results); })(); - diff --git a/tests/operations/tests/ParseObjectIdTimestamp.mjs b/tests/operations/tests/ParseObjectIdTimestamp.mjs new file mode 100644 index 00000000..f2c919a5 --- /dev/null +++ b/tests/operations/tests/ParseObjectIdTimestamp.mjs @@ -0,0 +1,24 @@ +/** + * Parse ObjectId timestamp tests + * + * @author dmfj [dominic@dmfj.io] + * + * @copyright Crown Copyright 2018 + * @license Apache-2.0 + */ +import TestRegister from "../../lib/TestRegister.mjs"; + + +TestRegister.addTests([ + { + name: "Parse ISO timestamp from ObjectId", + input: "000000000000000000000000", + expectedOutput: "1970-01-01T00:00:00.000Z", + recipeConfig: [ + { + op: "Parse ObjectId timestamp", + args: [], + } + ], + } +]);