This commit is contained in:
Benjamin Toby
2025-07-10 11:48:20 +01:00
parent a131764e1e
commit 5ab079f687
71 changed files with 1186 additions and 1727 deletions
@@ -1,25 +1,5 @@
import { APICreateUserFunctionParams } from "../../../types";
import { APICreateUserFunctionParams, APIResponseObject } from "../../../types";
/**
* # API Create User
*/
export default function apiCreateUser({ encryptionKey, payload, database, userId, verify, }: APICreateUserFunctionParams): Promise<{
success: boolean;
msg: string;
payload?: undefined;
sqlResult?: undefined;
} | {
success: boolean;
msg: string | undefined;
payload: null;
sqlResult?: undefined;
} | {
success: boolean;
payload: any;
msg?: undefined;
sqlResult?: undefined;
} | {
success: boolean;
msg: string;
sqlResult: import("../../../types").APIResponseObject<import("../../../types").PostInsertReturn>;
payload: null;
}>;
export default function apiCreateUser({ encryptionKey, payload, database, dsqlUserID, verify, }: APICreateUserFunctionParams): Promise<APIResponseObject>;
+14 -25
View File
@@ -24,7 +24,7 @@ const validate_email_1 = __importDefault(require("../../email/fns/validate-email
* # API Create User
*/
function apiCreateUser(_a) {
return __awaiter(this, arguments, void 0, function* ({ encryptionKey, payload, database, userId, verify, }) {
return __awaiter(this, arguments, void 0, function* ({ encryptionKey, payload, database, dsqlUserID, verify, }) {
var _b;
const finalEncryptionKey = encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD;
if (!finalEncryptionKey) {
@@ -43,8 +43,8 @@ function apiCreateUser(_a) {
}
const targetDbSchema = (0, grab_required_database_schemas_1.grabPrimaryRequiredDbSchema)({
dbSlug: database,
userId,
dbId: userId ? undefined : 1,
userId: dsqlUserID,
dbId: dsqlUserID ? undefined : 1,
});
if (!(targetDbSchema === null || targetDbSchema === void 0 ? void 0 : targetDbSchema.id)) {
return {
@@ -73,21 +73,18 @@ function apiCreateUser(_a) {
}));
if (!(fields === null || fields === void 0 ? void 0 : fields[0])) {
const newTable = yield (0, addUsersTableToDb_1.default)({
userId,
userId: dsqlUserID,
database: dbFullName,
payload: payload,
dbId: targetDbSchema.id,
});
fields = (yield (0, dbHandler_1.default)({
query: fieldsQuery,
database: dbFullName,
}));
}
if (!(fields === null || fields === void 0 ? void 0 : fields[0])) {
return {
success: false,
msg: "Could not create users table",
};
if (!newTable) {
return {
success: false,
msg: "Could not create users table",
payload: null,
};
}
}
const fieldsTitles = fields.map((fieldObject) => fieldObject.Field);
let invalidField = null;
@@ -95,7 +92,7 @@ function apiCreateUser(_a) {
const key = Object.keys(payload)[i];
if (!fieldsTitles.includes(key)) {
yield (0, updateUsersTableSchema_1.default)({
userId,
userId: dsqlUserID,
database: dbFullName,
newPayload: {
[key]: payload[key],
@@ -148,18 +145,10 @@ function apiCreateUser(_a) {
values: [],
database: dbFullName,
}));
return {
success: true,
payload: newlyAddedUser[0],
};
return Object.assign(Object.assign({}, addUser), { payload: newlyAddedUser[0] });
}
else {
return {
success: false,
msg: "Could not create user",
sqlResult: addUser,
payload: null,
};
return Object.assign(Object.assign({}, addUser), { msg: "Could not create user" });
}
});
}
+1 -1
View File
@@ -2,4 +2,4 @@ import { APIGetUserFunctionParams, GetUserFunctionReturn } from "../../../types"
/**
* # API Get User
*/
export default function apiGetUser({ fields, dbFullName, userId, }: APIGetUserFunctionParams): Promise<GetUserFunctionReturn>;
export default function apiGetUser({ fields, database, userId, dbUserId, selectAll, }: APIGetUserFunctionParams): Promise<GetUserFunctionReturn>;
+6 -6
View File
@@ -13,18 +13,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = apiGetUser;
const grab_db_full_name_1 = __importDefault(require("../../../utils/grab-db-full-name"));
const dbHandler_1 = __importDefault(require("../../backend/dbHandler"));
/**
* # API Get User
*/
function apiGetUser(_a) {
return __awaiter(this, arguments, void 0, function* ({ fields, dbFullName, userId, }) {
const finalDbName = dbFullName.replace(/[^a-z0-9_]/g, "");
const query = `SELECT ${fields.join(",")} FROM ${finalDbName}.users WHERE id=?`;
const API_USER_ID = userId || process.env.DSQL_API_USER_ID;
return __awaiter(this, arguments, void 0, function* ({ fields, database, userId, dbUserId, selectAll, }) {
const finalDbName = (0, grab_db_full_name_1.default)({ dbName: database, userId: dbUserId });
const selectFields = selectAll ? "*" : (fields === null || fields === void 0 ? void 0 : fields[0]) ? fields.join(",") : "*";
let foundUser = (yield (0, dbHandler_1.default)({
query,
values: [API_USER_ID],
query: `SELECT ${selectFields} FROM users WHERE id=?`,
values: [userId],
database: finalDbName,
}));
if (!foundUser || !foundUser[0]) {
+2 -2
View File
@@ -1,5 +1,5 @@
import { APILoginFunctionParams, APILoginFunctionReturn } from "../../../types";
import { APILoginFunctionParams, APIResponseObject } from "../../../types";
/**
* # API Login
*/
export default function apiLoginUser({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, skipPassword, social, dbUserId, debug, }: APILoginFunctionParams): Promise<APILoginFunctionReturn>;
export default function apiLoginUser({ encryptionKey, email, username, password, database, additionalFields, email_login, email_login_code, email_login_field, skipPassword, social, dbUserId, debug, }: APILoginFunctionParams): Promise<APIResponseObject>;
@@ -0,0 +1,5 @@
import { APIResponseObject, ResetPasswordParams } from "../../../types";
/**
* # Update API User Function
*/
export default function apiResetUserPassword({ updatedUserId, database, dbUserId, newPassword, encryptionKey, }: ResetPasswordParams): Promise<APIResponseObject>;
@@ -0,0 +1,55 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = apiResetUserPassword;
const updateDbEntry_1 = __importDefault(require("../../backend/db/updateDbEntry"));
const hashPassword_1 = __importDefault(require("../../dsql/hashPassword"));
const dbHandler_1 = __importDefault(require("../../backend/dbHandler"));
const grab_db_full_name_1 = __importDefault(require("../../../utils/grab-db-full-name"));
/**
* # Update API User Function
*/
function apiResetUserPassword(_a) {
return __awaiter(this, arguments, void 0, function* ({ updatedUserId, database, dbUserId, newPassword, encryptionKey, }) {
const dbFullName = (0, grab_db_full_name_1.default)({ dbName: database, userId: dbUserId });
const existingUserQuery = `SELECT * FROM users WHERE id = ?`;
const existingUserValues = [updatedUserId];
const existingUser = (yield (0, dbHandler_1.default)({
query: existingUserQuery,
values: existingUserValues,
database: dbFullName,
}));
if (!(existingUser === null || existingUser === void 0 ? void 0 : existingUser[0])) {
return {
success: false,
msg: "User not found",
};
}
const newPasswordHashed = (0, hashPassword_1.default)({
password: newPassword,
encryptionKey,
});
const updateUser = yield (0, updateDbEntry_1.default)({
dbFullName,
tableName: "users",
identifierColumnName: "id",
identifierValue: updatedUserId,
data: { password: newPasswordHashed },
});
return {
success: true,
payload: updateUser,
};
});
}
@@ -1,22 +1,5 @@
import http from "http";
import { CookieObject, SendOneTimeCodeEmailResponse } from "../../../types";
type Param = {
email: string;
database: string;
email_login_field?: string;
mail_domain?: string;
mail_port?: number;
sender?: string;
mail_username?: string;
mail_password?: string;
html: string;
response?: http.ServerResponse & {
[s: string]: any;
};
extraCookies?: CookieObject[];
};
import { APIResponseObject, APISendEmailCodeFunctionParams } from "../../../types";
/**
* # Send Email Login Code
*/
export default function apiSendEmailCode({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, response, extraCookies, }: Param): Promise<SendOneTimeCodeEmailResponse>;
export {};
export default function apiSendEmailCode({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, response, extraCookies, dbUserId, }: APISendEmailCodeFunctionParams): Promise<APIResponseObject>;
@@ -18,24 +18,26 @@ const nodemailer_1 = __importDefault(require("nodemailer"));
const get_auth_cookie_names_1 = __importDefault(require("../../backend/cookies/get-auth-cookie-names"));
const encrypt_1 = __importDefault(require("../../dsql/encrypt"));
const serialize_cookies_1 = __importDefault(require("../../../utils/serialize-cookies"));
const grab_db_full_name_1 = __importDefault(require("../../../utils/grab-db-full-name"));
/**
* # Send Email Login Code
*/
function apiSendEmailCode(_a) {
return __awaiter(this, arguments, void 0, function* ({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, response, extraCookies, }) {
return __awaiter(this, arguments, void 0, function* ({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, response, extraCookies, dbUserId, }) {
if (email === null || email === void 0 ? void 0 : email.match(/ /)) {
return {
success: false,
msg: "Invalid Email/Password format",
};
}
const dbFullName = (0, grab_db_full_name_1.default)({ dbName: database, userId: dbUserId });
const createdAt = Date.now();
const foundUserQuery = `SELECT * FROM ${database}.users WHERE email = ?`;
const foundUserQuery = `SELECT * FROM users WHERE email = ?`;
const foundUserValues = [email];
let foundUser = (yield (0, dbHandler_1.default)({
query: foundUserQuery,
values: foundUserValues,
database,
database: dbFullName,
}));
if (!foundUser || !foundUser[0]) {
return {
@@ -67,20 +69,21 @@ function apiSendEmailCode(_a) {
},
});
let mailObject = {};
mailObject["from"] = `"Datasquirel SSO" <${sender || "support@datasquirel.com"}>`;
mailObject["sender"] = sender || "support@datasquirel.com";
const finalSender = sender || process.env.DSQL_MAIL_EMAIL || "support@datasquirel.com";
mailObject["from"] = `"Datasquirel SSO" <${finalSender}>`;
mailObject["sender"] = finalSender;
mailObject["to"] = email;
mailObject["subject"] = "One Time Login Code";
mailObject["html"] = html.replace(/{{code}}/, tempCode);
const info = yield transporter.sendMail(mailObject);
if (!(info === null || info === void 0 ? void 0 : info.accepted))
throw new Error("Mail not Sent!");
const setTempCodeQuery = `UPDATE ${database}.users SET ${email_login_field} = ? WHERE email = ?`;
const setTempCodeQuery = `UPDATE users SET ${email_login_field} = ? WHERE email = ?`;
const setTempCodeValues = [tempCode + `-${createdAt}`, email];
yield (0, dbHandler_1.default)({
query: setTempCodeQuery,
values: setTempCodeValues,
database,
database: dbFullName,
});
const resObject = {
success: true,
@@ -1,18 +1,5 @@
type Param = {
payload: {
[s: string]: any;
};
dbFullName: string;
updatedUserId: string | number;
dbSchema?: import("../../../types").DSQL_DatabaseSchemaType;
};
type Return = {
success: boolean;
payload?: any;
msg?: string;
};
import { APIResponseObject, ApiUpdateUserParams } from "../../../types";
/**
* # Update API User Function
*/
export default function apiUpdateUser({ payload, dbFullName, updatedUserId, dbSchema, }: Param): Promise<Return>;
export {};
export default function apiUpdateUser({ payload, updatedUserId, dbSchema, database, dbUserId, }: ApiUpdateUserParams): Promise<APIResponseObject>;
+3 -3
View File
@@ -1,5 +1,4 @@
"use strict";
// @ts-check
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
@@ -18,11 +17,13 @@ const updateDbEntry_1 = __importDefault(require("../../backend/db/updateDbEntry"
const encrypt_1 = __importDefault(require("../../dsql/encrypt"));
const hashPassword_1 = __importDefault(require("../../dsql/hashPassword"));
const dbHandler_1 = __importDefault(require("../../backend/dbHandler"));
const grab_db_full_name_1 = __importDefault(require("../../../utils/grab-db-full-name"));
/**
* # Update API User Function
*/
function apiUpdateUser(_a) {
return __awaiter(this, arguments, void 0, function* ({ payload, dbFullName, updatedUserId, dbSchema, }) {
return __awaiter(this, arguments, void 0, function* ({ payload, updatedUserId, dbSchema, database, dbUserId, }) {
const dbFullName = (0, grab_db_full_name_1.default)({ dbName: database, userId: dbUserId });
const existingUserQuery = `SELECT * FROM ${dbFullName}.users WHERE id = ?`;
const existingUserValues = [updatedUserId];
const existingUser = (yield (0, dbHandler_1.default)({
@@ -48,7 +49,6 @@ function apiUpdateUser(_a) {
return undefined;
}
})();
/** @type {any} */
const finalData = {};
reqBodyKeys.forEach((key) => {
var _a;
@@ -9,5 +9,5 @@ type Param = {
/**
* # Add User Table to Database
*/
export default function addUsersTableToDb({ userId, database, payload, dbId, }: Param): Promise<any>;
export default function addUsersTableToDb({ userId, database, payload, dbId, }: Param): Promise<boolean>;
export {};
+4 -24
View File
@@ -14,18 +14,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = addUsersTableToDb;
const serverError_1 = __importDefault(require("./serverError"));
const addDbEntry_1 = __importDefault(require("./db/addDbEntry"));
const createDbFromSchema_1 = __importDefault(require("../../shell/createDbFromSchema"));
const grabNewUsersTableSchema_1 = __importDefault(require("./grabNewUsersTableSchema"));
const grab_required_database_schemas_1 = require("../../shell/createDbFromSchema/grab-required-database-schemas");
const dbHandler_1 = __importDefault(require("./dbHandler"));
/**
* # Add User Table to Database
*/
function addUsersTableToDb(_a) {
return __awaiter(this, arguments, void 0, function* ({ userId, database, payload, dbId, }) {
try {
const dbFullName = database;
const userPreset = (0, grabNewUsersTableSchema_1.default)({ payload });
if (!userPreset)
throw new Error("Couldn't Get User Preset!");
@@ -44,37 +41,20 @@ function addUsersTableToDb(_a) {
targetDatabase.tables.push(userPreset);
}
(0, grab_required_database_schemas_1.writeUpdatedDbSchema)({ dbSchema: targetDatabase, userId });
const targetDb = (yield (0, dbHandler_1.default)({
query: `SELECT id FROM user_databases WHERE user_id=? AND db_slug=?`,
values: [userId, database],
}));
if (targetDb === null || targetDb === void 0 ? void 0 : targetDb[0]) {
const newTableEntry = yield (0, addDbEntry_1.default)({
dbFullName: "datasquirel",
tableName: "user_database_tables",
data: {
user_id: userId,
db_id: targetDb[0].id,
db_slug: targetDatabase.dbSlug,
table_name: "Users",
table_slug: "users",
},
});
}
const dbShellUpdate = yield (0, createDbFromSchema_1.default)({
userId,
targetDatabase: dbFullName,
dbId,
});
return `Done!`;
return dbShellUpdate;
}
catch ( /** @type {any} */error) {
catch (error) {
console.log(`addUsersTableToDb.ts ERROR: ${error.message}`);
(0, serverError_1.default)({
component: "addUsersTableToDb",
message: error.message,
user: { id: userId },
});
return error.message;
return false;
}
});
}
@@ -20,9 +20,7 @@ function grabNewUsersTableSchema(params) {
excludeFields: userPreset.fields,
})
: [];
console.log("supplementalFields", supplementalFields);
const allFields = [...userPreset.fields, ...supplementalFields];
console.log("allFields", allFields);
const finalFields = [
...defaultFields.slice(0, 2),
...allFields,
@@ -31,7 +29,7 @@ function grabNewUsersTableSchema(params) {
userPreset.fields = [...finalFields];
return userPreset;
}
catch ( /** @type {any} */error) {
catch (error) {
console.log(`grabNewUsersTableSchema.ts ERROR: ${error.message}`);
(0, serverError_1.default)({
component: "grabNewUsersTableSchema",
+1 -1
View File
@@ -17,7 +17,7 @@ function decrypt({ encryptedString, encryptionKey, encryptionSalt, debug, }) {
console.log("Encrypted string is invalid");
return encryptedString;
}
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey });
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey, encryptionSalt });
if (!(encrptKey === null || encrptKey === void 0 ? void 0 : encrptKey.match(/.{8,}/))) {
if (debug)
console.log("Decrption key is invalid");
+1 -1
View File
@@ -16,7 +16,7 @@ function encrypt({ data, encryptionKey, encryptionSalt, }) {
console.log("Encryption string is invalid");
return data;
}
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey });
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey, encryptionSalt });
if (!(encrptKey === null || encrptKey === void 0 ? void 0 : encrptKey.match(/.{8,}/))) {
console.log("Encryption key is invalid");
return data;