"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); require("dotenv").config({ path: "../../../.env" }); const fs_1 = __importDefault(require("fs")); const child_process_1 = require("child_process"); const ejson_1 = __importDefault(require("../../../utils/ejson")); const DB_HANDLER_1 = __importDefault(require("../../../utils/backend/global-db/DB_HANDLER")); const addDbEntry_1 = __importDefault(require("../../../functions/backend/db/addDbEntry")); const addMariadbUser_1 = __importDefault(require("../../../functions/backend/addMariadbUser")); const updateDbEntry_1 = __importDefault(require("../../../functions/backend/db/updateDbEntry")); const hashPassword_1 = __importDefault(require("../../../functions/dsql/hashPassword")); const tmpDir = process.argv[process.argv.length - 1]; /** * # Create New User */ function createUser() { return __awaiter(this, void 0, void 0, function* () { var _a; /** * 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_1.default.resolve(process.cwd(), tmpDir) : path_1.default.resolve(__dirname, "./new-user.json"); const userObj = ejson_1.default.parse(fs_1.default.readFileSync(targetPath, "utf-8")); if (typeof userObj !== "object" || Array.isArray(userObj)) throw new Error("User Object Invalid!"); const ROOT_DIR = path_1.default.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 = (0, hashPassword_1.default)({ encryptionKey: process.env.DSQL_ENCRYPTION_PASSWORD || "", password: password, }); let existingUser = yield (0, DB_HANDLER_1.default)(`SELECT * FROM users WHERE email='${email}'`); if (existingUser === null || existingUser === void 0 ? void 0 : existingUser[0]) { console.log("User Exists"); return false; } const newUser = yield (0, addDbEntry_1.default)({ dbFullName: "datasquirel", tableName: "users", data: Object.assign(Object.assign({}, userObj), { password: hashedPassword }), }); if (!(newUser === null || newUser === void 0 ? void 0 : newUser.insertId)) return false; /** * Add a Mariadb User for this User */ yield (0, addMariadbUser_1.default)({ userId: newUser.insertId }); const STATIC_ROOT = process.env.DSQL_STATIC_SERVER_DIR; 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.insertId}`; let newUserMediaFolderPath = path_1.default.join(STATIC_ROOT, `images/user-images/user-${newUser.insertId}`); fs_1.default.mkdirSync(newUserSchemaFolderPath, { recursive: true }); fs_1.default.mkdirSync(newUserMediaFolderPath, { recursive: true }); fs_1.default.writeFileSync(`${newUserSchemaFolderPath}/main.json`, JSON.stringify([]), "utf8"); const imageBasePath = path_1.default.join(STATIC_ROOT, `images/user-images/user-${newUser.insertId}`); if (!fs_1.default.existsSync(imageBasePath)) { fs_1.default.mkdirSync(imageBasePath, { recursive: true }); } let imagePath = path_1.default.join(STATIC_ROOT, `images/user-images/user-${newUser.insertId}/user-${newUser.insertId}-profile.jpg`); let imageThumbnailPath = path_1.default.join(STATIC_ROOT, `images/user-images/user-${newUser.insertId}/user-${newUser.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_1.default.copyFileSync(path_1.default.join(ROOT_DIR, "/public/images/user-preset.png"), imagePath); fs_1.default.copyFileSync(path_1.default.join(ROOT_DIR, "/public/images/user-preset-thumbnail.png"), imageThumbnailPath); (0, child_process_1.execSync)(`chmod 644 ${imagePath} ${imageThumbnailPath}`); const updateImages = yield (0, updateDbEntry_1.default)({ dbFullName: "datasquirel", tableName: "users", identifierColumnName: "id", identifierValue: newUser.insertId, data: { image: prodImageUrl, image_thumbnail: prodImageThumbnailUrl, }, }); if (isTmpDir) { try { fs_1.default.unlinkSync(path_1.default.resolve(process.cwd(), tmpDir)); } catch (error) { } } return true; } catch (error) { (_a = global.ERROR_CALLBACK) === null || _a === void 0 ? void 0 : _a.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(); });