UNPKG

@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
"use strict"; 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);