From 8152c172a9a57e0a3d1be8931b18861ab6621c75 Mon Sep 17 00:00:00 2001 From: buzzcode2007 <73412182+buzz-lightsnack-2007@users.noreply.github.com> Date: Fri, 11 Apr 2025 01:14:31 +0000 Subject: [PATCH] feat: Create activity log --- scripts/API.JS | 49 ++++++++++++++++++- scripts/database/entry/log.JS | 21 ++++---- .../management/management_activity.JS | 19 +++++++ 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/scripts/API.JS b/scripts/API.JS index c3ad29f..ab0d981 100644 --- a/scripts/API.JS +++ b/scripts/API.JS @@ -16,7 +16,7 @@ class ExerciseTrackerAPI { #paths = { "users": ["users"], "exercises": ["users/:ID/exercises"], - "logs": ["users/:_id/logs"] + "logs": ["users/:ID/logs"] } constructor(INSTANCE) { @@ -53,7 +53,9 @@ class ExerciseTrackerAPI { }; let RESULT = await this.management[`Activities`].create(Object.assign({}, REQUEST.body, {"username": CORRESPONDING_USERS[0].name})); - let FORMATTED = await (new ResponseGenerator.Activities(Object.assign({},RESULT, {"ID": REQUEST.params[`ID`]}))).format(); + let FORMATTED = new ResponseGenerator.Activities(Object.assign({},RESULT, {"ID": REQUEST.params[`ID`]})); + FORMATTED[`data`][`date`] = FORMATTED.convert_date(); + FORMATTED = FORMATTED.format(); RESPONSE.send(FORMATTED); } else { throw new CustomErrors.Data.Missing(REQUEST.body); @@ -63,10 +65,53 @@ class ExerciseTrackerAPI { } } + /* + Display a log of activities. + */ + const activity_log = async (REQUEST, RESPONSE) => { + const find_users = async () => { + let USERS = await this.management[`Users`].search({"ID": REQUEST.params[`ID`]}); + if (!USERS.length || !USERS) { + throw new CustomErrors.Data.Incorrect(REQUEST.params); + }; + return (USERS) + } + + const find_activities = async (USERNAME, CRITERIA) => { + let FILTER = {}; + if (CRITERIA[`from`] || CRITERIA[`to`]) { + [`from`, `to`].forEach((KEY) => { + if (CRITERIA[KEY]) {CRITERIA[KEY] = (new Date(CRITERIA[KEY])).getTime();}; + }) + + FILTER[`date`] = {}; + if (CRITERIA[`from`]) {FILTER[`date`][`$gte`] = CRITERIA[`from`]}; + if (CRITERIA[`to`]) {FILTER[`date`][`$lte`] = CRITERIA[`to`]}; + } + + let RESULT = await this.management[`Activities`].search_User(USERNAME, FILTER, (CRITERIA[`limit`] ? CRITERIA[`limit`] : 0)); + return (RESULT); + } + + try { + let USERS = await find_users(); + let LOG = Object.assign({}, await find_activities(USERS[0].name, (((REQUEST.query) ? Object.keys(REQUEST.query).length : false) || ((REQUEST.body) ? Object.keys(REQUEST.body).length : false)) ? (((REQUEST.body) ? Object.keys(REQUEST.body).length : false) ? REQUEST.body : REQUEST.query) : {}), {"ID": REQUEST.params[`ID`]}); + let FORMATTED = (new ResponseGenerator.Log(LOG)).format(); + RESPONSE.send(FORMATTED); + } catch(ERR) { + Messaging.exception(RESPONSE, ERR); + } + } + this.#paths[`exercises`].forEach((PATH) => { this[`instance`].post(`/api/${PATH}`, activity_creation) console.log(`Activity creation is ready on ${PATH}.`); }); + + this.#paths[`logs`].forEach((PATH) => { + this[`instance`].get(`/api/${PATH}`, activity_log); + console.log(`Activity log generation is ready on ${PATH}.`); + }); } /* diff --git a/scripts/database/entry/log.JS b/scripts/database/entry/log.JS index 5d8d409..0587950 100644 --- a/scripts/database/entry/log.JS +++ b/scripts/database/entry/log.JS @@ -1,11 +1,12 @@ const Entry = require(`./object.JS`); class Log extends Entry { - // Default properties - name; - ID; - count; - activities; + /* Default properties + name; + ID; + count; + activities; + */ constructor(PROPERTIES) { super(PROPERTIES); @@ -23,11 +24,13 @@ class Log extends Entry { const clean_activities = () => { if ((this.activities instanceof Array) ? this.activities.length : false) { for (let INDEX = 0; INDEX < this.activities.length ; INDEX++) { - [`username`].forEach((TBD) => { - if (Object.keys(this.activities[INDEX].includes(TBD))) { - delete this.activities[INDEX][TBD] - } + [`username`, `_id`, `__v`].forEach((TBD) => { + delete this.activities[INDEX][`_doc`][TBD]; }) + + if (this.activities[INDEX][`_doc`][`date`]) { + this.activities[INDEX][`_doc`][`date`] = (new Date(this.activities[INDEX][`_doc`][`date`])).toDateString(); + } } } } diff --git a/scripts/database/management/management_activity.JS b/scripts/database/management/management_activity.JS index c79b99c..84e00c6 100644 --- a/scripts/database/management/management_activity.JS +++ b/scripts/database/management/management_activity.JS @@ -1,6 +1,7 @@ const DBManagement = require(`./management.JS`); const Activity = require(`../entry/activity.JS`); +const Log = require(`../entry/log.JS`); class ActivityManagement extends DBManagement { constructor() { @@ -37,6 +38,24 @@ class ActivityManagement extends DBManagement { let CURRENT = await createActivity(); return (CURRENT); }; + + /* Search for all activities for a given user. + + @param {String} USERNAME the username + @param {Object} CRITERIA the search criteria + @param {Number} SIZE the size + @return {Object} the log + */ + async search_User (USERNAME, CRITERIA, SIZE) { + let RESULT = await this.search(Object.assign({}, CRITERIA, {"username": USERNAME}), SIZE); + + const convertData = () => { + let LOG = new Log({"name": USERNAME, "activities": (RESULT instanceof Array ? RESULT.length : false) ? RESULT : []}); + return (LOG); + } + + return(convertData()); + } } module.exports = ActivityManagement; \ No newline at end of file