datasquirel/package-shared/functions/api/users/api-create-user.js

157 lines
4.1 KiB
JavaScript
Raw Normal View History

2024-12-06 10:31:24 +00:00
// @ts-check
const addUsersTableToDb = require("../../backend/addUsersTableToDb");
const addDbEntry = require("../../backend/db/addDbEntry");
2024-12-08 08:58:57 +00:00
const updateUsersTableSchema = require("../../backend/updateUsersTableSchema");
2024-12-06 10:31:24 +00:00
const varDatabaseDbHandler = require("../../backend/varDatabaseDbHandler");
const hashPassword = require("../../dsql/hashPassword");
/** @type {import("../../../types").APICreateUserFunction} */
module.exports = async function apiCreateUser({
encryptionKey,
payload,
database,
userId,
2024-12-06 11:55:03 +00:00
useLocal,
2024-12-06 10:31:24 +00:00
}) {
const dbFullName = database;
2024-12-06 11:55:03 +00:00
const finalEncryptionKey =
encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD;
if (!finalEncryptionKey) {
return {
success: false,
msg: "No encryption key provided",
payload: null,
};
}
if (!finalEncryptionKey?.match(/.{8,}/)) {
return {
success: false,
msg: "Encryption key must be at least 8 characters long",
payload: null,
};
}
2024-12-06 10:31:24 +00:00
const hashedPassword = hashPassword({
2024-12-06 11:55:03 +00:00
encryptionKey: finalEncryptionKey,
2024-12-06 10:31:24 +00:00
password: String(payload.password),
});
payload.password = hashedPassword;
2024-12-08 08:58:57 +00:00
const fieldsQuery = `SHOW COLUMNS FROM users`;
2024-12-06 10:31:24 +00:00
2024-12-08 08:58:57 +00:00
let fields = await varDatabaseDbHandler({
queryString: fieldsQuery,
database: dbFullName,
useLocal,
});
if (!fields?.[0]) {
2024-12-06 10:31:24 +00:00
const newTable = await addUsersTableToDb({
userId: Number(userId),
2024-12-08 08:58:57 +00:00
database: dbFullName,
2024-12-06 11:55:03 +00:00
useLocal,
2024-12-08 08:58:57 +00:00
payload: payload,
2024-12-06 10:31:24 +00:00
});
fields = await varDatabaseDbHandler({
2024-12-08 08:58:57 +00:00
queryString: fieldsQuery,
2024-12-06 10:31:24 +00:00
database: dbFullName,
2024-12-08 08:58:57 +00:00
useLocal,
2024-12-06 10:31:24 +00:00
});
}
2024-12-08 08:58:57 +00:00
if (!fields?.[0]) {
2024-12-06 10:31:24 +00:00
return {
success: false,
msg: "Could not create users table",
};
}
const fieldsTitles = fields.map(
(/** @type {any} */ fieldObject) => fieldObject.Field
);
let invalidField = null;
for (let i = 0; i < Object.keys(payload).length; i++) {
const key = Object.keys(payload)[i];
if (!fieldsTitles.includes(key)) {
2024-12-08 08:58:57 +00:00
await updateUsersTableSchema({
userId: Number(userId),
database: dbFullName,
newPayload: {
[key]: payload[key],
},
});
2024-12-06 10:31:24 +00:00
}
}
if (invalidField) {
return {
success: false,
msg: `${invalidField} is not a valid field!`,
};
}
2024-12-08 08:58:57 +00:00
const existingUserQuery = `SELECT * FROM users WHERE email = ?${
payload.username ? " OR username = ?" : ""
}`;
const existingUserValues = payload.username
? [payload.email, payload.username]
: [payload.email];
2024-12-06 10:31:24 +00:00
const existingUser = await varDatabaseDbHandler({
2024-12-08 08:58:57 +00:00
queryString: existingUserQuery,
queryValuesArray: existingUserValues,
2024-12-06 10:31:24 +00:00
database: dbFullName,
2024-12-08 08:58:57 +00:00
useLocal,
2024-12-06 10:31:24 +00:00
});
if (existingUser?.[0]) {
return {
success: false,
msg: "User Already Exists",
payload: null,
};
}
const addUser = await addDbEntry({
dbContext: "Dsql User",
paradigm: "Full Access",
dbFullName: dbFullName,
tableName: "users",
data: {
...payload,
image: "/images/user-preset.png",
image_thumbnail: "/images/user-preset-thumbnail.png",
},
});
if (addUser?.insertId) {
2024-12-08 08:58:57 +00:00
const newlyAddedUserQuery = `SELECT id,first_name,last_name,email,username,phone,image,image_thumbnail,city,state,country,zip_code,address,verification_status,more_user_data FROM users WHERE id='${addUser.insertId}'`;
2024-12-06 10:31:24 +00:00
const newlyAddedUser = await varDatabaseDbHandler({
2024-12-08 08:58:57 +00:00
queryString: newlyAddedUserQuery,
2024-12-06 10:31:24 +00:00
database: dbFullName,
2024-12-08 08:58:57 +00:00
useLocal,
2024-12-06 10:31:24 +00:00
});
return {
success: true,
payload: newlyAddedUser[0],
};
} else {
return {
success: false,
msg: "Could not create user",
sqlResult: addUser,
payload: null,
};
}
};