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