@rnaga/wp-node
Version:
👉 **[View Full Documentation at rnaga.github.io/wp-node →](https://rnaga.github.io/wp-node/)**
247 lines (246 loc) • 10.8 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
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 __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
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.MetaCrud = void 0;
const common_1 = require("../common");
const diff_1 = require("../common/diff");
const config_1 = require("../config");
const components_1 = require("../core/components");
const logger_1 = require("../core/logger");
const meta_util_1 = require("../core/utils/meta.util");
const query_util_1 = require("../core/utils/query.util");
const component_1 = require("../decorators/component");
const transactions_1 = require("../transactions");
const val = __importStar(require("../validators"));
const crud_1 = require("./crud");
const error_1 = require("./error");
let MetaCrud = class MetaCrud extends crud_1.Crud {
config;
logger;
constructor(components, config, logger) {
super(components);
this.config = config;
this.logger = logger;
}
async hasObject(table, objectId) {
const queryUtil = this.components.get(query_util_1.QueryUtil);
switch (table) {
case "blog":
return (typeof (await queryUtil.blogs((query) => {
query.where("blog_id", objectId);
})) !== "undefined");
case "comment":
return (typeof (await queryUtil.comments((query) => {
query.where("ID", objectId);
})) !== "undefined");
case "post":
return (typeof (await queryUtil.posts((query) => {
query.where("ID", objectId);
})) !== "undefined");
case "site":
return (typeof (await queryUtil.sites((query) => {
query.where("id", objectId);
})) !== "undefined");
case "term":
return (typeof (await queryUtil.terms((query) => {
query.where("term_id", objectId);
})) !== "undefined");
case "user":
return (typeof (await queryUtil.users((query) => {
query.where("ID", objectId);
})) !== "undefined");
default:
return false;
}
}
async sync(table, objectId, data, mode) {
if (!(await this.hasObject(table, objectId))) {
throw new error_1.CrudError(error_1.StatusMessage.NOT_FOUND, `object not found - ${objectId}`);
}
if (typeof data === "undefined") {
return;
}
const { user } = await this.getUser();
const currentMetas = (await this.get(table, objectId)).data ?? {};
const diffFormData = (0, diff_1.diffObject)(data, currentMetas);
if (!diffFormData) {
return;
}
const metaTrx = this.components.get(transactions_1.MetaTrx);
const metaUtil = this.components.get(meta_util_1.MetaUtil);
const metaKeys = Object.keys(common_1.formatting.primitive(diffFormData));
for (const metaKey of metaKeys) {
if (metaUtil.isProtected(metaKey, table)) {
this.logger.info(`Protected meta key ${metaKey}`, { metaKey });
continue;
}
// Update
if ((mode == "sync" && data[metaKey]) ||
(mode == "update" &&
currentMetas &&
currentMetas[metaKey] &&
data[metaKey] &&
currentMetas[metaKey] !== data[metaKey])) {
if (!(await user.can(`edit_${table}_meta`, objectId, metaKey))) {
throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, `Sorry, you are not allowed to edit the ${table} custom field - ${metaKey}`);
}
await metaTrx.upsert(table, objectId, metaKey, data[metaKey]);
// Create
}
else if (mode == "create" &&
(!currentMetas || !currentMetas[metaKey])) {
if (!(await user.can(`add_${table}_meta`, objectId, metaKey))) {
throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, `Sorry, you are not allowed to create the ${table} custom field`);
}
await metaTrx.upsert(table, objectId, metaKey, data[metaKey]);
// Delete
}
else if (mode == "sync" && !data[metaKey]) {
if (!(await user.can(`delete_${table}_meta`, objectId, metaKey))) {
throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, `Sorry, you are not allowed to delete the ${table} custom field`);
}
await metaTrx.remove(table, {
key: metaKey,
objectId,
});
}
}
}
async get(table, objectId, keys) {
const queryUtil = this.components.get(query_util_1.QueryUtil);
const metas = await queryUtil.meta(table, (query) => {
query.withIds([objectId]);
if (keys) {
query.withKeys(keys);
}
});
if (!metas) {
return this.returnValue({});
}
return this.returnValue(metas.reduce((a, v) => ({
...a,
[`${v.meta_key}`]: common_1.formatting.primitive(v.meta_value),
}), {}));
}
async create(table, objectId, data) {
await this.sync(table, objectId, data, "create");
return this.returnValue(objectId);
}
async update(table, objectId, data, mode = "update") {
await this.sync(table, objectId, data, mode);
return this.returnValue(true, objectId);
}
async delete(table, objectId, metaKeys) {
if (!(await this.hasObject(table, objectId))) {
throw new error_1.CrudError(error_1.StatusMessage.NOT_FOUND, `object not found - ${objectId}`);
}
const { user } = await this.getUser();
const metaTrx = this.components.get(transactions_1.MetaTrx);
for (const metaKey of metaKeys) {
if (!(await user.can(`delete_${table}_meta`, objectId, metaKey))) {
throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, `Sorry, you are not allowed to delete the ${table} custom field`);
}
await metaTrx.remove(table, {
key: metaKey,
objectId,
});
}
return this.returnValue(objectId);
}
async list(table, args, options) {
const { user } = await this.getUser();
const role = await user.role();
// Only admin or superadmin is permitted to list all metas
if ((this.config.isMultiSite() && !role.isSuperAdmin()) ||
!role.isAdmin()) {
throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Not permitted");
}
const queryUtil = this.components.get(query_util_1.QueryUtil);
const parsedArgs = val.crud.metaListParams.parse(args ?? {});
const buildQuery = (table, query) => {
const { column } = query.alias;
const offset = (parsedArgs.page - 1) * parsedArgs.per_page;
const limit = parsedArgs.per_page;
query.builder.offset(offset).limit(limit);
if (parsedArgs.orderby) {
query.builder.orderBy(column(`${table}meta`, parsedArgs.orderby === "meta_id" && table === "user"
? "umeta_id"
: parsedArgs.orderby), parsedArgs.order);
}
if (Array.isArray(parsedArgs.include)) {
query.withIds(parsedArgs.include);
}
if (Array.isArray(parsedArgs.exclude)) {
query.withIds(parsedArgs.exclude, {
not: true,
});
}
if (parsedArgs.search) {
query.whereKeyLike(parsedArgs.search);
}
};
const metas = await queryUtil.meta(table, (query) => {
query.setPrimaryTable(table).joinPrimary();
buildQuery(table, query);
});
if (!metas) {
return this.returnValue([]);
}
return this.returnValue(!options?.unserialize
? metas
: metas.map((meta) => {
return {
...meta,
meta_value: common_1.formatting.primitive(meta.meta_value),
};
}));
}
};
exports.MetaCrud = MetaCrud;
exports.MetaCrud = MetaCrud = __decorate([
(0, component_1.component)(),
__metadata("design:paramtypes", [components_1.Components,
config_1.Config,
logger_1.Logger])
], MetaCrud);