This commit is contained in:
Benjamin Toby
2025-01-28 19:43:16 +01:00
parent 81cf010cb5
commit 35fec57590
856 changed files with 5362 additions and 2266 deletions
@@ -2,29 +2,44 @@
import _ from "lodash";
import serverError from "../../backend/serverError";
import runQuery from "../../backend/db/runQuery";
import { DSQL_TableSchemaType, GetReturn } from "../../../types";
import runQuery, { DbContextsArray } from "../../backend/db/runQuery";
import {
ApiGetQueryObject,
DSQL_TableSchemaType,
GetReturn,
ServerQueryParam,
} from "../../../types";
import apiGetGrabQueryAndValues from "../../../utils/grab-query-and-values";
type Param = {
query: string;
type Param<T extends { [key: string]: any } = { [key: string]: any }> = {
query: string | ApiGetQueryObject<T>;
queryValues?: (string | number)[];
dbFullName: string;
tableName?: string;
dbSchema?: import("../../../types").DSQL_DatabaseSchemaType;
useLocal?: boolean;
debug?: boolean;
dbContext?: (typeof DbContextsArray)[number];
};
/**
* # Get Function FOr API
*/
export default async function apiGet({
export default async function apiGet<
T extends { [key: string]: any } = { [key: string]: any }
>({
query,
dbFullName,
queryValues,
tableName,
dbSchema,
useLocal,
}: Param): Promise<import("../../../types").GetReturn> {
debug,
dbContext,
}: Param<T>): Promise<import("../../../types").GetReturn> {
const queryAndValues = apiGetGrabQueryAndValues({
query,
values: queryValues,
});
if (
typeof query == "string" &&
query.match(/^alter|^delete|information_schema|databases|^create/i)
@@ -37,14 +52,20 @@ export default async function apiGet({
try {
let { result, error } = await runQuery({
dbFullName: dbFullName,
query: query,
queryValuesArray: queryValues,
query: queryAndValues.query,
queryValuesArray: queryAndValues.values,
readOnly: true,
dbSchema,
tableName,
local: useLocal,
dbContext,
debug,
});
if (debug && global.DSQL_USE_LOCAL) {
console.log("apiGet:result", result);
console.log("apiGet:error", error);
}
let tableSchema: DSQL_TableSchemaType | undefined;
if (dbSchema) {
@@ -83,6 +104,10 @@ export default async function apiGet({
message: error.message,
});
if (debug && global.DSQL_USE_LOCAL) {
console.log("apiGet:error", error.message);
}
return {
success: false,
payload: null,
@@ -1,6 +1,6 @@
import _ from "lodash";
import serverError from "../../backend/serverError";
import runQuery from "../../backend/db/runQuery";
import runQuery, { DbContextsArray } from "../../backend/db/runQuery";
import { DSQL_DatabaseSchemaType, PostReturn } from "../../../types";
type Param = {
@@ -9,7 +9,7 @@ type Param = {
dbFullName: string;
tableName?: string;
dbSchema?: DSQL_DatabaseSchemaType;
useLocal?: boolean;
dbContext?: (typeof DbContextsArray)[number];
};
/**
@@ -21,7 +21,7 @@ export default async function apiPost({
queryValues,
tableName,
dbSchema,
useLocal,
dbContext,
}: Param): Promise<PostReturn> {
if (typeof query === "string" && query?.match(/^create |^alter |^drop /i)) {
return { success: false, msg: "Wrong Input" };
@@ -34,7 +34,6 @@ export default async function apiPost({
return { success: false, msg: "Wrong Input" };
}
/** @type {any} */
let results: any;
/**
@@ -49,14 +48,13 @@ export default async function apiPost({
dbSchema: dbSchema,
queryValuesArray: queryValues,
tableName,
local: useLocal,
dbContext,
});
results = result;
if (error) throw error;
/** @type {import("../../../types").DSQL_TableSchemaType | undefined} */
let tableSchema:
| import("../../../types").DSQL_TableSchemaType
| undefined;
View File
View File
View File
+61 -27
View File
@@ -1,4 +1,4 @@
import fs from "fs";
import fs, { glob } from "fs";
import handleNodemailer from "../../backend/handleNodemailer";
import path from "path";
import addMariadbUser from "../../backend/addMariadbUser";
@@ -23,30 +23,55 @@ export default async function handleSocialDb({
invitation,
supEmail,
additionalFields,
useLocal,
debug,
}: HandleSocialDbFunctionParams): Promise<APILoginFunctionReturn> {
try {
const existingSocialIdUserQuery = `SELECT * FROM datasquirel.users WHERE social_id = ? AND social_login='1' AND social_platform = ? `;
const finalDbName = global.DSQL_USE_LOCAL
? undefined
: database
? database
: "datasquirel";
const dbAppend = global.DSQL_USE_LOCAL ? "" : `${finalDbName}.`;
const existingSocialIdUserQuery = `SELECT * FROM ${dbAppend}users WHERE social_id = ? AND social_login='1' AND social_platform = ? `;
const existingSocialIdUserValues = [
social_id.toString(),
social_platform,
];
if (debug) {
console.log(
"handleSocialDb:existingSocialIdUserQuery",
existingSocialIdUserQuery
);
console.log(
"handleSocialDb:existingSocialIdUserValues",
existingSocialIdUserValues
);
}
let existingSocialIdUser = await varDatabaseDbHandler({
database: database ? database : "datasquirel",
database: finalDbName,
queryString: existingSocialIdUserQuery,
queryValuesArray: existingSocialIdUserValues,
useLocal,
debug,
});
if (existingSocialIdUser && existingSocialIdUser[0]) {
if (debug) {
console.log(
"handleSocialDb:existingSocialIdUser",
existingSocialIdUser
);
}
if (existingSocialIdUser?.[0]) {
return await loginSocialUser({
user: existingSocialIdUser[0],
social_platform,
invitation,
database,
database: finalDbName,
additionalFields,
useLocal,
debug,
});
}
@@ -60,14 +85,25 @@ export default async function handleSocialDb({
};
}
const existingEmailOnlyQuery = `SELECT * FROM datasquirel.users WHERE email='${finalEmail}'`;
const existingEmailOnlyQuery = `SELECT * FROM ${dbAppend}users WHERE email='${finalEmail}'`;
if (debug) {
console.log(
"handleSocialDb:existingEmailOnlyQuery",
existingEmailOnlyQuery
);
}
let existingEmailOnly = await varDatabaseDbHandler({
database: database ? database : "datasquirel",
database: finalDbName,
queryString: existingEmailOnlyQuery,
useLocal,
debug,
});
if (debug) {
console.log("handleSocialDb:existingEmailOnly", existingEmailOnly);
}
if (existingEmailOnly && existingEmailOnly[0]) {
return {
success: false,
@@ -76,14 +112,14 @@ export default async function handleSocialDb({
};
}
const foundUserQuery = `SELECT * FROM datasquirel.users WHERE email=? AND social_login='1' AND social_platform=? AND social_id=?`;
const foundUserQuery = `SELECT * FROM ${dbAppend}users WHERE email=? AND social_login='1' AND social_platform=? AND social_id=?`;
const foundUserQueryValues = [finalEmail, social_platform, social_id];
const foundUser = await varDatabaseDbHandler({
database: database ? database : "datasquirel",
database: finalDbName,
queryString: foundUserQuery,
queryValuesArray: foundUserQueryValues,
useLocal,
debug,
});
if (foundUser && foundUser[0]) {
@@ -91,9 +127,9 @@ export default async function handleSocialDb({
user: payload,
social_platform,
invitation,
database,
database: finalDbName,
additionalFields,
useLocal,
debug,
});
}
@@ -111,11 +147,10 @@ export default async function handleSocialDb({
data[key] = payload[key];
});
/** @type {any} */
const newUser = await addDbEntry({
dbContext: database ? "Dsql User" : undefined,
paradigm: database ? "Full Access" : undefined,
dbFullName: database ? database : "datasquirel",
dbContext: finalDbName ? "Dsql User" : undefined,
paradigm: finalDbName ? "Full Access" : undefined,
dbFullName: finalDbName,
tableName: "users",
duplicateColumnName: "email",
duplicateColumnValue: finalEmail,
@@ -123,7 +158,6 @@ export default async function handleSocialDb({
...data,
email: finalEmail,
},
useLocal,
});
if (newUser?.insertId) {
@@ -131,15 +165,15 @@ export default async function handleSocialDb({
/**
* Add a Mariadb User for this User
*/
await addMariadbUser({ userId: newUser.insertId, useLocal });
await addMariadbUser({ userId: newUser.insertId });
}
const newUserQueriedQuery = `SELECT * FROM datasquirel.users WHERE id='${newUser.insertId}'`;
const newUserQueriedQuery = `SELECT * FROM ${dbAppend}users WHERE id='${newUser.insertId}'`;
const newUserQueried = await varDatabaseDbHandler({
database: database ? database : "datasquirel",
database: finalDbName,
queryString: newUserQueriedQuery,
useLocal,
debug,
});
if (!newUserQueried || !newUserQueried[0])
@@ -215,9 +249,9 @@ export default async function handleSocialDb({
user: newUserQueried[0],
social_platform,
invitation,
database,
database: finalDbName,
additionalFields,
useLocal,
debug,
});
} else {
console.log(
+11 -10
View File
@@ -1,6 +1,9 @@
import addAdminUserOnLogin from "../../backend/addAdminUserOnLogin";
import varDatabaseDbHandler from "../../backend/varDatabaseDbHandler";
import { APILoginFunctionReturn } from "../../../types";
import {
APILoginFunctionReturn,
DATASQUIREL_LoggedInUser,
} from "../../../types";
type Param = {
user: {
@@ -13,7 +16,7 @@ type Param = {
invitation?: any;
database?: string;
additionalFields?: string[];
useLocal?: boolean;
debug?: boolean;
};
/**
@@ -28,18 +31,19 @@ export default async function loginSocialUser({
invitation,
database,
additionalFields,
useLocal,
debug,
}: Param): Promise<APILoginFunctionReturn> {
const finalDbName = database ? database : "datasquirel";
const dbAppend = database ? `\`${finalDbName}\`.` : "";
const foundUserQuery = `SELECT * FROM \`${finalDbName}\`.\`users\` WHERE email=? AND social_id=? AND social_platform=?`;
const foundUserQuery = `SELECT * FROM ${dbAppend}\`users\` WHERE email=? AND social_id=? AND social_platform=?`;
const foundUserValues = [user.email, user.social_id, social_platform];
const foundUser = await varDatabaseDbHandler({
database: finalDbName,
queryString: foundUserQuery,
queryValuesArray: foundUserValues,
useLocal,
debug,
});
if (!foundUser?.[0])
@@ -53,8 +57,7 @@ export default async function loginSocialUser({
"-" +
Math.random().toString(36).substring(2);
/** @type {import("../../../types").DATASQUIREL_LoggedInUser} */
let userPayload: import("../../../types").DATASQUIREL_LoggedInUser = {
let userPayload: DATASQUIREL_LoggedInUser = {
id: foundUser[0].id,
first_name: foundUser[0].first_name,
last_name: foundUser[0].last_name,
@@ -82,12 +85,10 @@ export default async function loginSocialUser({
addAdminUserOnLogin({
query: invitation,
user: userPayload,
useLocal,
});
}
/** @type {import("../../../types").APILoginFunctionReturn} */
let result: import("../../../types").APILoginFunctionReturn = {
let result: APILoginFunctionReturn = {
success: true,
payload: userPayload,
csrf: csrfKey,
@@ -15,7 +15,6 @@ export default async function apiCreateUser({
payload,
database,
userId,
useLocal,
}: APICreateUserFunctionParams) {
const dbFullName = database;
const API_USER_ID = userId || process.env.DSQL_API_USER_ID;
@@ -51,21 +50,19 @@ export default async function apiCreateUser({
let fields = await varDatabaseDbHandler({
queryString: fieldsQuery,
database: dbFullName,
useLocal,
});
if (!fields?.[0]) {
const newTable = await addUsersTableToDb({
userId: Number(API_USER_ID),
database: dbFullName,
useLocal,
payload: payload,
});
fields = await varDatabaseDbHandler({
queryString: fieldsQuery,
database: dbFullName,
useLocal,
});
}
@@ -111,7 +108,6 @@ export default async function apiCreateUser({
queryString: existingUserQuery,
queryValuesArray: existingUserValues,
database: dbFullName,
useLocal,
});
if (existingUser?.[0]) {
@@ -136,7 +132,6 @@ export default async function apiCreateUser({
process.env.DSQL_DEFAULT_USER_IMAGE ||
"/images/user-preset-thumbnail.png",
},
useLocal,
});
if (addUser?.insertId) {
@@ -145,7 +140,6 @@ export default async function apiCreateUser({
const newlyAddedUser = await varDatabaseDbHandler({
queryString: newlyAddedUserQuery,
database: dbFullName,
useLocal,
});
return {
@@ -4,7 +4,6 @@ import varDatabaseDbHandler from "../../backend/varDatabaseDbHandler";
type Param = {
dbFullName: string;
deletedUserId: string | number;
useLocal?: boolean;
};
type Return = { success: boolean; result?: any; msg?: string };
@@ -14,7 +13,6 @@ type Return = { success: boolean; result?: any; msg?: string };
export default async function apiDeleteUser({
dbFullName,
deletedUserId,
useLocal,
}: Param): Promise<Return> {
const existingUserQuery = `SELECT * FROM ${dbFullName}.users WHERE id = ?`;
const existingUserValues = [deletedUserId];
@@ -23,7 +21,6 @@ export default async function apiDeleteUser({
queryString: existingUserQuery,
queryValuesArray: existingUserValues,
database: dbFullName,
useLocal,
});
if (!existingUser?.[0]) {
@@ -35,12 +32,10 @@ export default async function apiDeleteUser({
const deleteUser = await deleteDbEntry({
dbContext: "Dsql User",
paradigm: "Full Access",
dbFullName,
tableName: "users",
identifierColumnName: "id",
identifierValue: deletedUserId,
useLocal,
});
return {
@@ -11,7 +11,6 @@ export default async function apiGetUser({
fields,
dbFullName,
userId,
useLocal,
}: APIGetUserFunctionParams): Promise<GetUserFunctionReturn> {
const finalDbName = dbFullName.replace(/[^a-z0-9_]/g, "");
@@ -24,7 +23,6 @@ export default async function apiGetUser({
queryString: query,
queryValuesArray: [API_USER_ID],
database: finalDbName,
useLocal,
});
if (!foundUser || !foundUser[0]) {
@@ -20,14 +20,13 @@ export default async function apiLoginUser({
email_login,
email_login_code,
email_login_field,
token,
skipPassword,
social,
useLocal,
dbUserId,
debug,
}: APILoginFunctionParams): Promise<APILoginFunctionReturn> {
const dbFullName = grabDbFullName({ dbName: database, userId: dbUserId });
const dbAppend = global.DSQL_USE_LOCAL ? "" : `${dbFullName}.`;
/**
* Check input validity
@@ -63,10 +62,10 @@ export default async function apiLoginUser({
}
let foundUser = await varDatabaseDbHandler({
queryString: `SELECT * FROM ${dbFullName}.users WHERE email = ? OR username = ?`,
queryString: `SELECT * FROM ${dbAppend}users WHERE email = ? OR username = ?`,
queryValuesArray: [email, username],
database: dbFullName,
useLocal,
debug,
});
@@ -140,10 +139,9 @@ export default async function apiLoginUser({
if (isPasswordCorrect && email_login) {
const resetTempCode = await varDatabaseDbHandler({
queryString: `UPDATE ${dbFullName}.users SET ${email_login_field} = '' WHERE email = ? OR username = ?`,
queryString: `UPDATE ${dbAppend}users SET ${email_login_field} = '' WHERE email = ? OR username = ?`,
queryValuesArray: [email, username],
database: dbFullName,
useLocal,
});
}
@@ -5,7 +5,6 @@ type Param = {
existingUser: { [s: string]: any };
database?: string;
additionalFields?: string[];
useLocal?: boolean;
};
/**
@@ -15,15 +14,19 @@ export default async function apiReauthUser({
existingUser,
database,
additionalFields,
useLocal,
}: Param): Promise<APILoginFunctionReturn> {
const dbAppend = global.DSQL_USE_LOCAL
? ""
: database
? `${database}.`
: "";
let foundUser =
existingUser?.id && existingUser.id.toString().match(/./)
? await varDatabaseDbHandler({
queryString: `SELECT * FROM ${database}.users WHERE id=?`,
queryString: `SELECT * FROM ${dbAppend}users WHERE id=?`,
queryValuesArray: [existingUser.id.toString()],
database,
useLocal,
})
: null;
@@ -39,7 +42,6 @@ export default async function apiReauthUser({
"-" +
Math.random().toString(36).substring(2);
/** @type {import("../../../types").DATASQUIREL_LoggedInUser} */
let userPayload: import("../../../types").DATASQUIREL_LoggedInUser = {
id: foundUser[0].id,
first_name: foundUser[0].first_name,
@@ -16,7 +16,6 @@ type Param = {
mail_username?: string;
mail_password?: string;
html: string;
useLocal?: boolean;
response?: http.ServerResponse & { [s: string]: any };
extraCookies?: import("../../../../package-shared/types").CookieObject[];
};
@@ -34,7 +33,6 @@ export default async function apiSendEmailCode({
mail_username,
mail_password,
html,
useLocal,
response,
extraCookies,
}: Param): Promise<SendOneTimeCodeEmailResponse> {
@@ -53,7 +51,6 @@ export default async function apiSendEmailCode({
queryString: foundUserQuery,
queryValuesArray: foundUserValues,
database,
useLocal,
});
////////////////////////////////////////
@@ -114,7 +111,6 @@ export default async function apiSendEmailCode({
queryString: setTempCodeQuery,
queryValuesArray: setTempCodeValues,
database,
useLocal,
});
/** @type {import("../../../types").SendOneTimeCodeEmailResponse} */
@@ -9,7 +9,6 @@ type Param = {
payload: { [s: string]: any };
dbFullName: string;
updatedUserId: string | number;
useLocal?: boolean;
dbSchema?: import("../../../types").DSQL_DatabaseSchemaType;
};
@@ -22,7 +21,7 @@ export default async function apiUpdateUser({
payload,
dbFullName,
updatedUserId,
useLocal,
dbSchema,
}: Param): Promise<Return> {
const existingUserQuery = `SELECT * FROM ${dbFullName}.users WHERE id = ?`;
@@ -32,7 +31,6 @@ export default async function apiUpdateUser({
queryString: existingUserQuery,
queryValuesArray: existingUserValues,
database: dbFullName,
useLocal,
});
if (!existingUser?.[0]) {
@@ -83,13 +81,11 @@ export default async function apiUpdateUser({
const updateUser = await updateDbEntry({
dbContext: "Dsql User",
paradigm: "Full Access",
dbFullName,
tableName: "users",
identifierColumnName: "id",
identifierValue: updatedUserId,
data: data,
useLocal,
});
return {
@@ -14,7 +14,6 @@ type Param = {
email: string;
encryptionKey?: string;
encryptionSalt?: string;
useLocal?: boolean;
debug?: boolean;
apiUserID?: string | number;
dbUserId?: string | number;
@@ -26,13 +25,8 @@ type Param = {
export default async function apiSendResetPasswordLink({
database,
email,
apiUserID,
dbUserId,
debug,
encryptionKey,
encryptionSalt,
key,
useLocal,
}: Param): Promise<Return> {
const dbFullName = grabDbFullName({ dbName: database, userId: dbUserId });
@@ -52,7 +46,6 @@ export default async function apiSendResetPasswordLink({
queryString: `SELECT * FROM ${dbFullName}.users WHERE email = ? OR username = ?`,
queryValuesArray: [email, email],
database: dbFullName,
useLocal,
debug,
});
@@ -15,6 +15,7 @@ export default async function apiGoogleLogin({
database,
additionalFields,
additionalData,
debug,
}: APIGoogleLoginFunctionParams): Promise<APILoginFunctionReturn> {
try {
const gUser: GoogleOauth2User | undefined = await new Promise(
@@ -45,18 +46,6 @@ export default async function apiGoogleLogin({
if (!gUser?.email_verified) throw new Error("No Google User.");
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
if (!database || typeof database != "string" || database?.match(/ /)) {
return {
success: false,
payload: undefined,
msg: "Please provide a database slug(database name in lowercase with no spaces)",
};
}
/**
* Create new user folder and file
*
@@ -65,7 +54,6 @@ export default async function apiGoogleLogin({
const { given_name, family_name, email, sub, picture } = gUser;
/** @type {Object<string, any>} */
let payloadObject: { [s: string]: any } = {
email: email,
first_name: given_name,
@@ -88,6 +76,7 @@ export default async function apiGoogleLogin({
social_platform: "google",
social_id: sub,
additionalFields,
debug,
});
////////////////////////////////////////