2024-12-06 10:31:24 +00:00
// @ts-check
2024-12-06 11:55:03 +00:00
const LOCAL _DB _HANDLER = require ( "../../../utils/backend/global-db/LOCAL_DB_HANDLER" ) ;
2024-12-06 10:31:24 +00:00
const addUsersTableToDb = require ( "../../backend/addUsersTableToDb" ) ;
const addDbEntry = require ( "../../backend/db/addDbEntry" ) ;
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-06 11:55:03 +00:00
let fields = useLocal
? await LOCAL _DB _HANDLER ( ` SHOW COLUMNS FROM users ` )
: await varDatabaseDbHandler ( {
queryString : ` SHOW COLUMNS FROM users ` ,
database : dbFullName ,
} ) ;
2024-12-06 10:31:24 +00:00
if ( ! fields ) {
const newTable = await addUsersTableToDb ( {
userId : Number ( userId ) ,
database : database ,
2024-12-06 11:55:03 +00:00
useLocal ,
2024-12-06 10:31:24 +00:00
} ) ;
fields = await varDatabaseDbHandler ( {
queryString : ` SHOW COLUMNS FROM users ` ,
database : dbFullName ,
} ) ;
}
if ( ! fields ) {
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 ) ) {
invalidField = key ;
break ;
}
}
if ( invalidField ) {
return {
success : false ,
msg : ` ${ invalidField } is not a valid field! ` ,
} ;
}
const existingUser = await varDatabaseDbHandler ( {
queryString : ` SELECT * FROM users WHERE email = ? ${
payload . username ? " OR username = ?" : ""
} ` ,
queryValuesArray : payload . username
? [ payload . email , payload . username ]
: [ payload . email ] ,
database : dbFullName ,
} ) ;
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 ) {
const newlyAddedUser = await varDatabaseDbHandler ( {
queryString : ` 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 } ' ` ,
database : dbFullName ,
} ) ;
return {
success : true ,
payload : newlyAddedUser [ 0 ] ,
} ;
} else {
return {
success : false ,
msg : "Could not create user" ,
sqlResult : addUser ,
payload : null ,
} ;
}
} ;