import path from "path"; require("dotenv").config({ path: "../../../.env" }); import fs from "fs"; import { execSync } from "child_process"; import EJSON from "../../../utils/ejson"; import DB_HANDLER from "../../../utils/backend/global-db/DB_HANDLER"; import addDbEntry from "../../../functions/backend/db/addDbEntry"; import addMariadbUser from "../../../functions/backend/addMariadbUser"; import updateDbEntry from "../../../functions/backend/db/updateDbEntry"; import hashPassword from "../../../functions/dsql/hashPassword"; import grabDirNames from "../../../utils/backend/names/grab-dir-names"; const tmpDir = process.argv[process.argv.length - 1]; /** * # Create New User */ async function createUser() { var _a, _b; /** * Validate Form * * @description Check if request body is valid */ try { const isTmpDir = Boolean(tmpDir === null || tmpDir === void 0 ? void 0 : tmpDir.match(/\.json$/)); const targetPath = isTmpDir ? path.resolve(process.cwd(), tmpDir) : path.resolve(__dirname, "./new-user.json"); const userObj = EJSON.parse(fs.readFileSync(targetPath, "utf-8")); if (typeof userObj !== "object" || Array.isArray(userObj)) throw new Error("User Object Invalid!"); const ROOT_DIR = path.resolve(__dirname, "../../../"); /** * Validate Form * * @description Check if request body is valid */ const first_name = userObj.first_name; const last_name = userObj.last_name; const email = userObj.email; const password = userObj.password; const username = userObj.username; if (!(email === null || email === void 0 ? void 0 : email.match(/.*@.*\..*/))) return false; if (!(first_name === null || first_name === void 0 ? void 0 : first_name.match(/^[a-zA-Z]+$/)) || !(last_name === null || last_name === void 0 ? void 0 : last_name.match(/^[a-zA-Z]+$/))) return false; if (password === null || password === void 0 ? void 0 : password.match(/ /)) return false; if (username === null || username === void 0 ? void 0 : username.match(/ /)) return false; let hashedPassword = hashPassword({ encryptionKey: process.env.DSQL_ENCRYPTION_PASSWORD || "", password: password, }); let existingUser = await DB_HANDLER(`SELECT * FROM users WHERE email='${email}'`); if (existingUser === null || existingUser === void 0 ? void 0 : existingUser[0]) { console.log("User Exists"); return false; } const newUser = await addDbEntry({ dbFullName: "datasquirel", tableName: "users", data: Object.assign(Object.assign({}, userObj), { password: hashedPassword }), }); if (!((_a = newUser === null || newUser === void 0 ? void 0 : newUser.payload) === null || _a === void 0 ? void 0 : _a.insertId)) return false; /** * Add a Mariadb User for this User */ await addMariadbUser({ userId: newUser.payload.insertId }); const { STATIC_ROOT } = grabDirNames(); if (!STATIC_ROOT) { console.log("Static File ENV not Found!"); throw new Error("No Static Path"); } /** * Create new user folder and file * * @description Create new user folder and file */ let newUserSchemaFolderPath = `${process.env.DSQL_USER_DB_SCHEMA_PATH}/user-${newUser.payload.insertId}`; let newUserMediaFolderPath = path.join(STATIC_ROOT, `images/user-images/user-${newUser.payload.insertId}`); fs.mkdirSync(newUserSchemaFolderPath, { recursive: true }); fs.mkdirSync(newUserMediaFolderPath, { recursive: true }); fs.writeFileSync(`${newUserSchemaFolderPath}/main.json`, JSON.stringify([]), "utf8"); const imageBasePath = path.join(STATIC_ROOT, `images/user-images/user-${newUser.payload.insertId}`); if (!fs.existsSync(imageBasePath)) { fs.mkdirSync(imageBasePath, { recursive: true }); } let imagePath = path.join(STATIC_ROOT, `images/user-images/user-${newUser.payload.insertId}/user-${newUser.payload.insertId}-profile.jpg`); let imageThumbnailPath = path.join(STATIC_ROOT, `images/user-images/user-${newUser.payload.insertId}/user-${newUser.payload.insertId}-profile-thumbnail.jpg`); let prodImageUrl = imagePath.replace(STATIC_ROOT, process.env.DSQL_STATIC_HOST || ""); let prodImageThumbnailUrl = imageThumbnailPath.replace(STATIC_ROOT, process.env.DSQL_STATIC_HOST || ""); fs.copyFileSync(path.join(ROOT_DIR, "/public/images/user-preset.png"), imagePath); fs.copyFileSync(path.join(ROOT_DIR, "/public/images/user-preset-thumbnail.png"), imageThumbnailPath); execSync(`chmod 644 ${imagePath} ${imageThumbnailPath}`); const updateImages = await updateDbEntry({ dbFullName: "datasquirel", tableName: "users", identifierColumnName: "id", identifierValue: newUser.payload.insertId, data: { image: prodImageUrl, image_thumbnail: prodImageThumbnailUrl, }, }); if (isTmpDir) { try { fs.unlinkSync(path.resolve(process.cwd(), tmpDir)); } catch (error) { } } return true; } catch (error) { (_b = global.ERROR_CALLBACK) === null || _b === void 0 ? void 0 : _b.call(global, `Error Creating User`, error); return false; } } createUser().then((res) => { if (res) { console.log("User Creation Success!!!"); } else { console.log("User Creation Failed!"); } process.exit(); });