diff --git a/package.json b/package.json index 8f1bbc6e..e47824f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "axe-api", - "version": "0.5.0", + "version": "0.6.0", "description": "AXE API is a simple tool which has been created based on Express and Knex.js to create Rest APIs quickly.", "main": "index.js", "type": "module", diff --git a/src/Constants.js b/src/Constants.js index c6b6237f..4b79ee4c 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -124,6 +124,11 @@ const DEPENDECY_TYPES = { SINGLETON: "SINGLETON", }; +const TIMESTAMP_COLUMNS = { + CREATED_AT: "createdAtColumn", + UPDATED_AT: "updatedAtColumn", +}; + export { LOG_LEVEL, HOOK_FUNCTIONS, @@ -134,4 +139,5 @@ export { LOG_COLORS, DEPENDECY_TYPES, HANDLERS, + TIMESTAMP_COLUMNS, }; diff --git a/src/Controller/helpers.js b/src/Controller/helpers.js index 23e71a68..92cf95c9 100644 --- a/src/Controller/helpers.js +++ b/src/Controller/helpers.js @@ -185,3 +185,11 @@ export const filterHiddenFields = (itemArray, hiddens) => { }); }); }; + +export const bindTimestampValues = (formData, columnTypes = [], model) => { + for (const columnType of columnTypes) { + if (model.instance[columnType]) { + formData[model.instance[columnType]] = new Date(); + } + } +}; diff --git a/src/Controller/store.js b/src/Controller/store.js index 88c9dbe2..2f86b4b3 100644 --- a/src/Controller/store.js +++ b/src/Controller/store.js @@ -4,9 +4,10 @@ import { callHooks, getParentColumn, filterHiddenFields, + bindTimestampValues, } from "./helpers.js"; import Validator from "validatorjs"; -import { HOOK_FUNCTIONS } from "./../Constants.js"; +import { HOOK_FUNCTIONS, TIMESTAMP_COLUMNS } from "./../Constants.js"; export default async (pack) => { const { request, response, model, database, relation, parentModel } = pack; @@ -30,6 +31,13 @@ export default async (pack) => { formData[relation.foreignKey] = request.params[parentColumn]; } + // We should bind the timestamp values + bindTimestampValues( + formData, + [TIMESTAMP_COLUMNS.CREATED_AT, TIMESTAMP_COLUMNS.UPDATED_AT], + model + ); + await callHooks(model, HOOK_FUNCTIONS.onBeforeInsert, { ...pack, formData, diff --git a/src/Controller/update.js b/src/Controller/update.js index 835a6e4c..0c02704e 100644 --- a/src/Controller/update.js +++ b/src/Controller/update.js @@ -4,9 +4,10 @@ import { callHooks, getParentColumn, filterHiddenFields, + bindTimestampValues, } from "./helpers.js"; import Validator from "validatorjs"; -import { HOOK_FUNCTIONS } from "./../Constants.js"; +import { HOOK_FUNCTIONS, TIMESTAMP_COLUMNS } from "./../Constants.js"; import ApiError from "./../Exceptions/ApiError.js"; export default async (pack) => { @@ -50,6 +51,9 @@ export default async (pack) => { } } + // We should bind the timestamp values + bindTimestampValues(formData, [TIMESTAMP_COLUMNS.UPDATED_AT], model); + await callHooks(model, HOOK_FUNCTIONS.onBeforeUpdate, { ...pack, item, diff --git a/src/Models/Model.js b/src/Models/Model.js index 83f41523..ec97a184 100644 --- a/src/Models/Model.js +++ b/src/Models/Model.js @@ -31,6 +31,14 @@ class Model { return []; } + get createdAtColumn() { + return "created_at"; + } + + get updatedAtColumn() { + return "updated_at"; + } + hasMany(relatedModel, primaryKey = "id", foreignKey = null) { if (!foreignKey) { const currentModelName = pluralize.singular(