diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index 5957c8b7..77e3d319 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -242,6 +242,7 @@ "Convert co-ordinate format", "Show on map", "Parse UNIX file permissions", + "Parse ObjectID timestamp", "Swap endianness", "Parse colour code", "Escape string", diff --git a/src/core/operations/ParseObjectIdTimestamp.mjs b/src/core/operations/ParseObjectIdTimestamp.mjs new file mode 100644 index 00000000..f86c098e --- /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 = "Serialise"; + 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..8d3cd623 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..7a28f62e --- /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: [], + } + ], + } +]);