From 0458e112672ac5cf71e2b29b9107e43983bb04a6 Mon Sep 17 00:00:00 2001 From: buzz-lightsnack-2007 <73412182+buzz-lightsnack-2007@users.noreply.github.com> Date: Mon, 7 Apr 2025 22:24:00 +0800 Subject: [PATCH] User search and creation --- scripts/API.JS | 81 ++++++++++++++++++- scripts/database/entry/activity.JS | 22 +++-- scripts/database/entry/object.JS | 2 +- scripts/database/entry/user.JS | 23 +++--- scripts/database/management/management.JS | 1 + .../database/management/management_user.JS | 4 +- scripts/response/parser.JS | 18 ++--- 7 files changed, 109 insertions(+), 42 deletions(-) diff --git a/scripts/API.JS b/scripts/API.JS index da1c798..498a757 100644 --- a/scripts/API.JS +++ b/scripts/API.JS @@ -1,9 +1,88 @@ +const bodyParser = require(`body-parser`); + +const CustomErrors = require(`./utilities/errors.JS`); +const Messaging = require(`./utilities/messaging.JS`); + class DBManagement {}; DBManagement.Activities = require(`./database/management/management_activity.JS`); DBManagement.Users = require(`./database/management/management_user.JS`); +class ResponseGenerator {}; +ResponseGenerator.Activities = require(`./response/activity.JS`); +ResponseGenerator.Users = require(`./response/user.JS`); +ResponseGenerator.Log = require(`./response/log.JS`); + class ExerciseTrackerAPI { - constructor() { + #paths = { + "users": ["users"], + "exercises": ["users/:_id/exercises"], + "logs": ["users/:_id/logs"] + } + + constructor(INSTANCE) { + this[`instance`] = INSTANCE; + this[`instance`].use(bodyParser.json()); + this[`instance`].use(bodyParser.urlencoded({extended: true})); + + const init_management = () => { + this[`management`] = {}; + + Object.keys(DBManagement).forEach((DATABASE) => { + this.management[DATABASE] = new DBManagement[DATABASE](); + }); + this.manageUsers(); + }; + + init_management(); + } + + /* + Manage the users. + */ + manageUsers () { + /* + Create new users. + */ + const users_creation = async (REQUEST, RESPONSE) => { + try { + if (((REQUEST.body) ? Object.keys(REQUEST.body).length : false) ? Object.keys(REQUEST.body).includes(`username`) : false) { + this.management[`Users`].create(REQUEST.body[`username`]).then((RESULT) => { + let FORMATTED = (new ResponseGenerator.Users(RESULT)).format(); + RESPONSE.send(FORMATTED); + }) + } else { + throw new CustomErrors.Data.Missing(REQUEST.body); + } + } catch(ERR) { + Messaging.exception(RESPONSE, ERR); + } + } + + /* + Search for all users. + */ + const users_display = (REQUEST, RESPONSE) => { + try { + let CRITERIA = (((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) : {}; + + this.management[`Users`].search(CRITERIA).then((RESULT) => { + let FORMATTED = (new ResponseGenerator.Users(RESULT)).format(); + RESPONSE.send(FORMATTED); + }) + } catch(ERR) { + Messaging.exception(RESPONSE, ERR); + } + } + + this.#paths[`users`].forEach((PATH) => { + this[`instance`].get(`/api/${PATH}`, users_display) + console.log(`User search is ready on ${PATH}.`); + }); + + this.#paths[`users`].forEach((PATH) => { + this[`instance`].post(`/api/${PATH}`, users_creation) + console.log(`User creation is ready on ${PATH}.`); + }); } } diff --git a/scripts/database/entry/activity.JS b/scripts/database/entry/activity.JS index dd48a02..1071f81 100644 --- a/scripts/database/entry/activity.JS +++ b/scripts/database/entry/activity.JS @@ -1,10 +1,13 @@ const Entry = require(`./object.JS`); class Activity extends Entry { - username; - description; - duration; - date; + /* + Default properties: + username + description + duration + date + */ constructor(PROPERTIES) { super(PROPERTIES); @@ -21,15 +24,8 @@ class Activity extends Entry { "description": {"type": String}, "date": {"type": Number}, "duration": {"type": Number} - } - let TEST = new Activity(); - - // Verify that the schema is valid. - Object.keys(SCHEMA).forEach((KEY) => { - if (!Object.keys(TEST).includes(KEY)) {delete SCHEMA[KEY];}; - }); - - return (SCHEMA) + }; + return (SCHEMA); } } diff --git a/scripts/database/entry/object.JS b/scripts/database/entry/object.JS index 6b2169b..286ad09 100644 --- a/scripts/database/entry/object.JS +++ b/scripts/database/entry/object.JS @@ -1,7 +1,7 @@ /* An object to represent an entry in the database. */ class Entry { constructor(PROPERTIES) { - (PROPERTIES) ? Object.entries(PROPERTIES).forEach(([property, value]) => { + (PROPERTIES && (Object.keys(PROPERTIES).length)) ? Object.entries(PROPERTIES).forEach(([property, value]) => { this[property] = value; }) : false; }; diff --git a/scripts/database/entry/user.JS b/scripts/database/entry/user.JS index fe24d35..c7ca5f0 100644 --- a/scripts/database/entry/user.JS +++ b/scripts/database/entry/user.JS @@ -2,11 +2,13 @@ const Entry = require(`./object.JS`); const Hash = require(`../../utilities/hash.JS`); class User extends Entry { - // Default properties - name; - ID; - activated = false; - passcode; + /* + Default properties: + name + ID + activated = false + passcode + */ #login = false; constructor(PROPERTIES) { @@ -40,15 +42,8 @@ class User extends Entry { "ID": {"type": String, "required": true, "unique": true, "dropDups": true}, "activated": {"type": Boolean}, "passcode": {"type": String} - } - let TEST = new User(); - - // Verify that the schema is valid. - Object.keys(SCHEMA).forEach((KEY) => { - if (!Object.keys(TEST).includes(KEY)) {delete SCHEMA[KEY];}; - }); - - return (SCHEMA) + }; + return (SCHEMA); } } diff --git a/scripts/database/management/management.JS b/scripts/database/management/management.JS index ed83c29..eb692d8 100644 --- a/scripts/database/management/management.JS +++ b/scripts/database/management/management.JS @@ -43,6 +43,7 @@ class DBManagement { let RESULT = []; if ((CRITERIA && CRITERIA instanceof Object) ? !(Object.keys(CRITERIA).length) : true) { + console.log(`Searching all...`); RESULT = await this.model.find(); } else if (CRITERIA instanceof Object) { RESULT = await this.model.find(CRITERIA); diff --git a/scripts/database/management/management_user.JS b/scripts/database/management/management_user.JS index 3a6360d..91b7844 100644 --- a/scripts/database/management/management_user.JS +++ b/scripts/database/management/management_user.JS @@ -19,7 +19,7 @@ class UsersManagement extends DBManagement { @param {object} OPTIONS the account options @return {object} the user data */ - async create(USERNAME, OPTIONS, done) { + async create(USERNAME, OPTIONS) { await this.state; /* @@ -47,7 +47,7 @@ class UsersManagement extends DBManagement { } if ((USERNAME) ? USERNAME.trim() : false) { - let CURRENT = !(await checkMatch()) + let CURRENT = (await checkMatch()) CURRENT = (!CURRENT) ? await createUser() : CURRENT; return (CURRENT); diff --git a/scripts/response/parser.JS b/scripts/response/parser.JS index 26d6962..78e8b7e 100644 --- a/scripts/response/parser.JS +++ b/scripts/response/parser.JS @@ -2,9 +2,6 @@ Modify data returned by the database connector scripts. s */ class DBParser { - mappings; - data; - constructor(DATA = {}, MAPPINGS = {}) { this.data = DATA; this.mappings = MAPPINGS; @@ -20,28 +17,27 @@ class DBParser { /* Map certain new keys to their orignal counterparts. */ - const map = (ROW) => { + function mapKeys (ORIGINAL = {}, MAPPINGS) { let RESULT = {}; - Object.entries(this.mappings).forEach(([NEW, OLD]) => { - if (Object.keys(ROW).includes(OLD)) { - RESULT[NEW] = (typeof ROW[OLD]).includes(`str`) ? ROW[OLD].trim() : ROW[OLD]; - } + + Object.entries(MAPPINGS).forEach(([NEW, OLD]) => { + RESULT[NEW] = (ORIGINAL[OLD] != null ? (typeof ORIGINAL[OLD]).includes(`str`) : false) ? ORIGINAL[OLD].trim() : ORIGINAL[OLD]; }); return RESULT; - }; + } if (this.data instanceof Array) { ENTRIES = []; (this.data.length) ? this.data.forEach((SELECTED) => { if (SELECTED) { - let CLEANED = map(SELECTED); + let CLEANED = mapKeys(SELECTED, this.mappings); (Object.keys(CLEANED).length) ? ENTRIES.push(CLEANED) : false; }; }) : false; } else if (this.data && this.data instanceof Object) { - ENTRIES = map(this.data); + ENTRIES = mapKeys(this.data, this.mappings); }; this.cleaned = ENTRIES;