User search and creation

This commit is contained in:
buzz-lightsnack-2007 2025-04-07 22:24:00 +08:00
parent 5fa9e6efd6
commit 0458e11267
7 changed files with 109 additions and 42 deletions

View file

@ -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}.`);
});
}
}

View file

@ -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);
}
}

View file

@ -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;
};

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);

View file

@ -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;