@rnaga/wp-node
Version:
👉 **[View Full Documentation at rnaga.github.io/wp-node →](https://rnaga.github.io/wp-node/)**
174 lines (173 loc) • 7.05 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserSelfRegistrationUtil = void 0;
const config_1 = require("../../config");
const constants_1 = require("../../constants");
const component_1 = require("../../decorators/component");
const options_trx_1 = require("../../transactions/options.trx");
const signup_trx_1 = require("../../transactions/signup.trx");
const user_trx_1 = require("../../transactions/user.trx");
const components_1 = require("../components");
const logger_1 = require("../logger");
const options_1 = require("../options");
const vars_1 = require("../vars");
const query_util_1 = require("./query.util");
const signup_util_1 = require("./signup.util");
const user_util_1 = require("./user.util");
let UserSelfRegistrationUtil = class UserSelfRegistrationUtil {
config;
components;
signupUtil;
signupTrx;
options;
optionsTrx;
userTrx;
userUtil;
vars;
logger;
constructor(config, components, signupUtil, signupTrx, options, optionsTrx, userTrx, userUtil, vars, logger) {
this.config = config;
this.components = components;
this.signupUtil = signupUtil;
this.signupTrx = signupTrx;
this.options = options;
this.optionsTrx = optionsTrx;
this.userTrx = userTrx;
this.userUtil = userUtil;
this.vars = vars;
this.logger = logger;
}
async canSignup() {
if (this.config.isMultiSite()) {
// If the site is multisite, check if the registration type is 'all' or 'user' in signup table
return await this.signupUtil.canUserSignup();
}
// For single site, check 'users_can_register' option in options table
// See get_option( 'users_can_register' ) in wp-login.php
return (parseInt((await this.options.get("users_can_register")) ?? "0") === 1);
}
async changeEligibility(enable) {
if (this.config.isMultiSite()) {
// If the site is multisite, update the registration type in signup table
return await this.signupTrx.changeUserSignupEligibility(enable);
}
// For single site, update 'users_can_register' option in options table
return await this.optionsTrx.update("users_can_register", enable ? 1 : 0);
}
/**
* Register a new user
*
* Multisite: create a new record in the signup table along with activation key
* Single site: create a new user in the users table along with activation key
*
* After this gets called, "activate" should be called to validate activation key and activate the user.
*
* @param userLogin - Username
* @param email - Email
* @returns number - New user ID
*/
async registerNew(userLogin, email) {
if (!(await this.canSignup())) {
throw new Error("User registration is not allowed.");
}
let id;
// Multi-site
if (this.config.isMultiSite()) {
const [success, error] = await this.signupUtil.validateUser(userLogin, email);
if (!success) {
throw new Error(error);
}
id = await this.signupTrx.insert({
type: "user",
user: userLogin,
user_email: email,
});
}
else {
// Single site
id = await this.userTrx.registerNew(userLogin, email);
}
if (!id) {
throw new Error("Could not create user");
}
const activationKey = await this.getActivationKey(userLogin, email);
if (!activationKey) {
throw new Error("Could not create activation key");
}
const context = this.vars.CONTEXT;
context.hooks.action.do("core_register_new_user", activationKey, userLogin, email, context);
return {
id,
userLogin,
email,
activationKey,
};
}
// This works only after registerNew is called
async getActivationKey(userLogin, email) {
const queryUtil = this.components.get(query_util_1.QueryUtil);
if (this.config.isMultiSite()) {
const signups = await queryUtil.common("signups", (query) => {
query
.where("user_login", userLogin)
.where("user_email", email)
.builder.limit(1);
});
return signups?.[0].activation_key;
}
return await this.userUtil.getPasswordResetKey(userLogin);
}
async activate(activationKey, userRef) {
let userId = 0;
let success = false;
if (this.config.isMultiSite()) {
const result = await this.signupTrx.activate(activationKey, {
userRef,
});
userId = result.user_id;
success = result.user_id > 0;
}
else {
const userIdOrFalse = await this.userUtil.checkPasswordResetKey(activationKey, userRef);
success = false !== userIdOrFalse && userIdOrFalse > 0;
if (success) {
userId = userIdOrFalse;
}
}
if (!success) {
this.logger.error("Could not activate user", { userRef });
return [false, "Could not activate user"];
}
// Attach default role
const defaultRole = await this.options.get("default_role");
await this.userTrx.upsertRole(userId, defaultRole);
// Account activated. Generate reset key for user to set password
const resetKey = await this.userUtil.getPasswordResetKey(userRef, {
registration: true,
});
return [true, resetKey];
}
};
exports.UserSelfRegistrationUtil = UserSelfRegistrationUtil;
exports.UserSelfRegistrationUtil = UserSelfRegistrationUtil = __decorate([
(0, component_1.component)({ scope: constants_1.Scope.Transient }),
__metadata("design:paramtypes", [config_1.Config,
components_1.Components,
signup_util_1.SignupUtil,
signup_trx_1.SignupTrx,
options_1.Options,
options_trx_1.OptionsTrx,
user_trx_1.UserTrx,
user_util_1.UserUtil,
vars_1.Vars,
logger_1.Logger])
], UserSelfRegistrationUtil);