From 03d4fdc27085ae46197b0e4d1e03e0f55d4dedf9 Mon Sep 17 00:00:00 2001
From: Benjamin Toby <ben@tben.me>
Date: Tue, 14 Jan 2025 11:33:30 +0100
Subject: [PATCH] Updates

---
 .../functions/api/users/api-login.d.ts        |  2 +-
 .../functions/api/users/api-login.js          |  8 ++--
 dist/package-shared/types/index.d.ts          |  2 +
 .../utils/grab-db-full-name.d.ts              |  9 ++++
 .../package-shared/utils/grab-db-full-name.js | 14 +++++++
 dist/users/login-user.d.ts                    |  3 +-
 dist/users/login-user.js                      | 20 ++-------
 .../functions/api/users/api-login.ts          | 10 +++--
 package-shared/types/index.ts                 |  2 +
 package-shared/utils/grab-db-full-name.ts     | 18 ++++++++
 package.json                                  |  2 +-
 users/login-user.ts                           | 41 ++++++++-----------
 12 files changed, 79 insertions(+), 52 deletions(-)
 create mode 100644 dist/package-shared/utils/grab-db-full-name.d.ts
 create mode 100644 dist/package-shared/utils/grab-db-full-name.js
 create mode 100644 package-shared/utils/grab-db-full-name.ts

diff --git a/dist/package-shared/functions/api/users/api-login.d.ts b/dist/package-shared/functions/api/users/api-login.d.ts
index 27a7fa5..bdffdbf 100644
--- a/dist/package-shared/functions/api/users/api-login.d.ts
+++ b/dist/package-shared/functions/api/users/api-login.d.ts
@@ -2,4 +2,4 @@ import { APILoginFunctionParams, APILoginFunctionReturn } from "../../../types";
 /**
  * # API Login
  */
-export default function apiLoginUser({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, token, skipPassword, social, useLocal, }: APILoginFunctionParams): Promise<APILoginFunctionReturn>;
+export default function apiLoginUser({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, token, skipPassword, social, useLocal, dbUserId, }: APILoginFunctionParams): Promise<APILoginFunctionReturn>;
diff --git a/dist/package-shared/functions/api/users/api-login.js b/dist/package-shared/functions/api/users/api-login.js
index 2a16ea3..54bcf2b 100644
--- a/dist/package-shared/functions/api/users/api-login.js
+++ b/dist/package-shared/functions/api/users/api-login.js
@@ -13,14 +13,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = apiLoginUser;
+const grab_db_full_name_1 = __importDefault(require("../../../utils/grab-db-full-name"));
 const varDatabaseDbHandler_1 = __importDefault(require("../../backend/varDatabaseDbHandler"));
 const hashPassword_1 = __importDefault(require("../../dsql/hashPassword"));
 /**
  * # API Login
  */
 function apiLoginUser(_a) {
-    return __awaiter(this, arguments, void 0, function* ({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, token, skipPassword, social, useLocal, }) {
-        const dbFullName = database.replace(/[^a-z0-9_]/g, "");
+    return __awaiter(this, arguments, void 0, function* ({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, token, skipPassword, social, useLocal, dbUserId, }) {
+        const dbFullName = (0, grab_db_full_name_1.default)({ dbName: database, userId: dbUserId });
         /**
          * Check input validity
          *
@@ -45,14 +46,13 @@ function apiLoginUser(_a) {
                 password: password,
             })
             : null;
-        console.log("Finding DSQL User ...");
+        console.log(`Logging in: Checking for Existing user in ${dbFullName} database.`);
         let foundUser = yield (0, varDatabaseDbHandler_1.default)({
             queryString: `SELECT * FROM ${dbFullName}.users WHERE email = ? OR username = ?`,
             queryValuesArray: [email, username],
             database: dbFullName,
             useLocal,
         });
-        console.log("foundUser", foundUser);
         if ((!foundUser || !foundUser[0]) && !social)
             return {
                 success: false,
diff --git a/dist/package-shared/types/index.d.ts b/dist/package-shared/types/index.d.ts
index 684f662..d941319 100644
--- a/dist/package-shared/types/index.d.ts
+++ b/dist/package-shared/types/index.d.ts
@@ -143,6 +143,7 @@ export interface PackageUserLoginRequestBody {
     social?: boolean;
     dbSchema?: DSQL_DatabaseSchemaType;
     skipPassword?: boolean;
+    dbUserId: string | number;
 }
 export interface PackageUserLoginLocalBody {
     payload: any;
@@ -1026,6 +1027,7 @@ export type APILoginFunctionParams = {
     skipPassword?: boolean;
     social?: boolean;
     useLocal?: boolean;
+    dbUserId?: number | string;
 };
 export type APILoginFunctionReturn = {
     success: boolean;
diff --git a/dist/package-shared/utils/grab-db-full-name.d.ts b/dist/package-shared/utils/grab-db-full-name.d.ts
new file mode 100644
index 0000000..d77309c
--- /dev/null
+++ b/dist/package-shared/utils/grab-db-full-name.d.ts
@@ -0,0 +1,9 @@
+type Param = {
+    dbName: string;
+    userId?: string | number;
+};
+/**
+ * # Grab Database Full Name
+ */
+export default function grabDbFullName({ dbName, userId }: Param): string;
+export {};
diff --git a/dist/package-shared/utils/grab-db-full-name.js b/dist/package-shared/utils/grab-db-full-name.js
new file mode 100644
index 0000000..d822768
--- /dev/null
+++ b/dist/package-shared/utils/grab-db-full-name.js
@@ -0,0 +1,14 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.default = grabDbFullName;
+/**
+ * # Grab Database Full Name
+ */
+function grabDbFullName({ dbName, userId }) {
+    const sanitizedName = dbName.replace(/[^a-z0-9\_]/g, "");
+    const cleanedDbName = sanitizedName.replace(/datasquirel_user_\d+_/, "");
+    if (!userId)
+        return cleanedDbName;
+    const dbNamePrefix = `datasquirel_user_${userId}_`;
+    return dbNamePrefix + cleanedDbName;
+}
diff --git a/dist/users/login-user.d.ts b/dist/users/login-user.d.ts
index 111689d..18607da 100644
--- a/dist/users/login-user.d.ts
+++ b/dist/users/login-user.d.ts
@@ -23,9 +23,10 @@ type Param = {
     useLocal?: boolean;
     skipWriteAuthFile?: boolean;
     apiUserID?: string | number;
+    dbUserId?: string | number;
 };
 /**
  * # Login A user
  */
-export default function loginUser({ key, payload, database, additionalFields, response, encryptionKey, encryptionSalt, email_login, email_login_code, temp_code_field, token, user_id, skipPassword, useLocal, apiUserID, skipWriteAuthFile, }: Param): Promise<APILoginFunctionReturn>;
+export default function loginUser({ key, payload, database, additionalFields, response, encryptionKey, encryptionSalt, email_login, email_login_code, temp_code_field, token, user_id, skipPassword, useLocal, apiUserID, skipWriteAuthFile, dbUserId, }: Param): Promise<APILoginFunctionReturn>;
 export {};
diff --git a/dist/users/login-user.js b/dist/users/login-user.js
index 800f10a..b9dacf1 100644
--- a/dist/users/login-user.js
+++ b/dist/users/login-user.js
@@ -24,7 +24,7 @@ const write_auth_files_1 = require("../package-shared/functions/backend/auth/wri
  * # Login A user
  */
 function loginUser(_a) {
-    return __awaiter(this, arguments, void 0, function* ({ key, payload, database, additionalFields, response, encryptionKey, encryptionSalt, email_login, email_login_code, temp_code_field, token, user_id, skipPassword, useLocal, apiUserID, skipWriteAuthFile, }) {
+    return __awaiter(this, arguments, void 0, function* ({ key, payload, database, additionalFields, response, encryptionKey, encryptionSalt, email_login, email_login_code, temp_code_field, token, user_id, skipPassword, useLocal, apiUserID, skipWriteAuthFile, dbUserId, }) {
         var _b;
         const grabedHostNames = (0, grab_host_names_1.default)();
         const { host, port, scheme } = grabedHostNames;
@@ -101,18 +101,11 @@ function loginUser(_a) {
                 email_login_field: emailLoginTempCodeFieldName,
                 token,
                 useLocal,
+                dbUserId,
             });
         }
         else {
-            /**
-             * Make https request
-             *
-             * @description make a request to datasquirel.com
-             *
-             * @type {{ success: boolean, payload: import("../package-shared/types").DATASQUIREL_LoggedInUser | null, userId?: number, msg?: string }}
-             */
             httpResponse = yield new Promise((resolve, reject) => {
-                /** @type {import("../package-shared/types").PackageUserLoginRequestBody} */
                 const reqPayload = {
                     encryptionKey: finalEncryptionKey,
                     payload,
@@ -123,6 +116,7 @@ function loginUser(_a) {
                     email_login_field: emailLoginTempCodeFieldName,
                     token,
                     skipPassword: skipPassword,
+                    dbUserId: dbUserId || 0,
                 };
                 const reqPayloadJSON = JSON.stringify(reqPayload);
                 const httpsRequest = scheme.request({
@@ -137,13 +131,7 @@ function loginUser(_a) {
                     port,
                     hostname: host,
                     path: `/api/user/${user_id || grabedHostNames.user_id}/login-user`,
-                }, 
-                /**
-                 * Callback Function
-                 *
-                 * @description https request callback
-                 */
-                (res) => {
+                }, (res) => {
                     var str = "";
                     res.on("data", function (chunk) {
                         str += chunk;
diff --git a/package-shared/functions/api/users/api-login.ts b/package-shared/functions/api/users/api-login.ts
index 8f3a737..e43d050 100644
--- a/package-shared/functions/api/users/api-login.ts
+++ b/package-shared/functions/api/users/api-login.ts
@@ -3,6 +3,7 @@ import {
     APILoginFunctionReturn,
     DATASQUIREL_LoggedInUser,
 } from "../../../types";
+import grabDbFullName from "../../../utils/grab-db-full-name";
 import varDatabaseDbHandler from "../../backend/varDatabaseDbHandler";
 import hashPassword from "../../dsql/hashPassword";
 
@@ -23,8 +24,9 @@ export default async function apiLoginUser({
     skipPassword,
     social,
     useLocal,
+    dbUserId,
 }: APILoginFunctionParams): Promise<APILoginFunctionReturn> {
-    const dbFullName = database.replace(/[^a-z0-9_]/g, "");
+    const dbFullName = grabDbFullName({ dbName: database, userId: dbUserId });
 
     /**
      * Check input validity
@@ -54,7 +56,9 @@ export default async function apiLoginUser({
           })
         : null;
 
-    console.log("Finding DSQL User ...");
+    console.log(
+        `Logging in: Checking for Existing user in ${dbFullName} database.`
+    );
 
     let foundUser = await varDatabaseDbHandler({
         queryString: `SELECT * FROM ${dbFullName}.users WHERE email = ? OR username = ?`,
@@ -63,8 +67,6 @@ export default async function apiLoginUser({
         useLocal,
     });
 
-    console.log("foundUser", foundUser);
-
     if ((!foundUser || !foundUser[0]) && !social)
         return {
             success: false,
diff --git a/package-shared/types/index.ts b/package-shared/types/index.ts
index 768623d..1c33a79 100644
--- a/package-shared/types/index.ts
+++ b/package-shared/types/index.ts
@@ -158,6 +158,7 @@ export interface PackageUserLoginRequestBody {
     social?: boolean;
     dbSchema?: DSQL_DatabaseSchemaType;
     skipPassword?: boolean;
+    dbUserId: string | number;
 }
 
 export interface PackageUserLoginLocalBody {
@@ -1208,6 +1209,7 @@ export type APILoginFunctionParams = {
     skipPassword?: boolean;
     social?: boolean;
     useLocal?: boolean;
+    dbUserId?: number | string;
 };
 export type APILoginFunctionReturn = {
     success: boolean;
diff --git a/package-shared/utils/grab-db-full-name.ts b/package-shared/utils/grab-db-full-name.ts
new file mode 100644
index 0000000..d344e1c
--- /dev/null
+++ b/package-shared/utils/grab-db-full-name.ts
@@ -0,0 +1,18 @@
+type Param = {
+    dbName: string;
+    userId?: string | number;
+};
+
+/**
+ * # Grab Database Full Name
+ */
+export default function grabDbFullName({ dbName, userId }: Param): string {
+    const sanitizedName = dbName.replace(/[^a-z0-9\_]/g, "");
+    const cleanedDbName = sanitizedName.replace(/datasquirel_user_\d+_/, "");
+
+    if (!userId) return cleanedDbName;
+
+    const dbNamePrefix = `datasquirel_user_${userId}_`;
+
+    return dbNamePrefix + cleanedDbName;
+}
diff --git a/package.json b/package.json
index 1cb907e..32db4e9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@moduletrace/datasquirel",
-    "version": "3.5.0",
+    "version": "3.5.1",
     "description": "Cloud-based SQL data management tool",
     "main": "dist/index.js",
     "bin": {
diff --git a/users/login-user.ts b/users/login-user.ts
index 02c9d26..cc878f3 100644
--- a/users/login-user.ts
+++ b/users/login-user.ts
@@ -9,6 +9,7 @@ import { writeAuthFile } from "../package-shared/functions/backend/auth/write-au
 import {
     APILoginFunctionReturn,
     DSQL_DatabaseSchemaType,
+    PackageUserLoginRequestBody,
 } from "../package-shared/types";
 
 type Param = {
@@ -32,6 +33,7 @@ type Param = {
     useLocal?: boolean;
     skipWriteAuthFile?: boolean;
     apiUserID?: string | number;
+    dbUserId?: string | number;
 };
 
 /**
@@ -54,6 +56,7 @@ export default async function loginUser({
     useLocal,
     apiUserID,
     skipWriteAuthFile,
+    dbUserId,
 }: Param): Promise<APILoginFunctionReturn> {
     const grabedHostNames = grabHostNames();
     const { host, port, scheme } = grabedHostNames;
@@ -148,29 +151,22 @@ export default async function loginUser({
             email_login_field: emailLoginTempCodeFieldName,
             token,
             useLocal,
+            dbUserId,
         });
     } else {
-        /**
-         * Make https request
-         *
-         * @description make a request to datasquirel.com
-         *
-         * @type {{ success: boolean, payload: import("../package-shared/types").DATASQUIREL_LoggedInUser | null, userId?: number, msg?: string }}
-         */
         httpResponse = await new Promise((resolve, reject) => {
-            /** @type {import("../package-shared/types").PackageUserLoginRequestBody} */
-            const reqPayload: import("../package-shared/types").PackageUserLoginRequestBody =
-                {
-                    encryptionKey: finalEncryptionKey,
-                    payload,
-                    database,
-                    additionalFields,
-                    email_login,
-                    email_login_code,
-                    email_login_field: emailLoginTempCodeFieldName,
-                    token,
-                    skipPassword: skipPassword,
-                };
+            const reqPayload: PackageUserLoginRequestBody = {
+                encryptionKey: finalEncryptionKey,
+                payload,
+                database,
+                additionalFields,
+                email_login,
+                email_login_code,
+                email_login_field: emailLoginTempCodeFieldName,
+                token,
+                skipPassword: skipPassword,
+                dbUserId: dbUserId || 0,
+            };
 
             const reqPayloadJSON = JSON.stringify(reqPayload);
 
@@ -192,11 +188,6 @@ export default async function loginUser({
                     }/login-user`,
                 },
 
-                /**
-                 * Callback Function
-                 *
-                 * @description https request callback
-                 */
                 (res) => {
                     var str = "";