UNPKG

@rnaga/wp-node

Version:

👉 **[View Full Documentation at rnaga.github.io/wp-node →](https://rnaga.github.io/wp-node/)**

279 lines (278 loc) • 11.2 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 __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; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Crud = void 0; const config_1 = require("../config"); const current_1 = require("../core/current"); const blog_util_1 = require("../core/utils/blog.util"); const post_util_1 = require("../core/utils/post.util"); const query_util_1 = require("../core/utils/query.util"); const roles_util_1 = require("../core/utils/roles.util"); const val = __importStar(require("../validators")); const error_1 = require("./error"); class Crud { components; constructor(components) { this.components = components; } async getUser() { const current = this.components.get(current_1.Current); const user = current.user; const role = await user?.role(); if (!user || (!user?.props?.ID && !role?.is("anonymous"))) { throw new Error("User not found"); } return { user, userId: user.props?.ID, userProps: user.props }; } async checkPostsPermission(action, postType, defaultUser) { const postUtil = this.components.get(post_util_1.PostUtil); const postTypeObject = postUtil.getTypeObject(postType); const { user: currentUser } = await this.getUser(); const user = defaultUser ?? currentUser; return postTypeObject?.capabilities && postTypeObject.capabilities[action] && (await user.can(postTypeObject.capabilities[action])) ? true : false; } originalBlogId = 0; originalSiteId = 0; async switchBlog(args) { const config = this.components.get(config_1.Config); if (!config.isMultiSite()) { return; } let { siteId = undefined } = args; const { blogId = undefined } = args; if (!siteId && !blogId) { return; } const current = this.components.get(current_1.Current); const { user: currentUser } = await this.getUser(); if (blogId) { const blogUtil = this.components.get(blog_util_1.BlogUtil); const blog = await blogUtil.get(blogId); if (!blog?.props || (siteId && siteId !== blog?.props.site_id)) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "Invalid Blog"); } if (!siteId) { siteId = blog.props.site_id; } } else if (siteId) { if (!currentUser.props?.user_login) { throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Not permitted"); } const userLogin = currentUser.props?.user_login; const rolesUtil = this.components.get(roles_util_1.RolesUtil); const superAdmins = await rolesUtil.getSuperAdmins({ siteId }); if (!superAdmins.includes(userLogin)) { // Only superadmin has access to all users in site (network) throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Not permitted"); } } if (!siteId) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "Invalid site"); } this.originalBlogId = current.blogId; this.originalSiteId = current.siteId; await current.switchSite(siteId, blogId); await current.assumeUser(currentUser.props?.ID); } async restoreBlog() { const config = this.components.get(config_1.Config); if (0 >= this.originalSiteId || 0 >= this.originalBlogId || !config.isMultiSite()) { return; } const { user: currentUser } = await this.getUser(); const current = this.components.get(current_1.Current); await current.switchSite(this.originalSiteId, this.originalBlogId); await current.assumeUser(currentUser.props?.ID); } async getAvailableBlogs(args) { const { siteIds, canArgs } = args; let { blogIds = [] } = args; const errors = []; const current = this.components.get(current_1.Current); const originalBlogId = current.blogId; const originalSiteId = current.siteId; const originalUserId = current.user?.props?.ID; try { const { user: currentUser } = await this.getUser(); if (!currentUser.props?.ID) { errors.push(new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "User not found")); return [[], errors]; } const config = this.components.get(config_1.Config); const queryUtil = this.components.get(query_util_1.QueryUtil); const userId = currentUser.props?.ID; if (!config.isMultiSite()) { blogIds = [1]; } else if (siteIds) { const blogs = (await queryUtil.blogs((query) => { query.whereIn("site_id", siteIds); })) ?? []; blogs.map((blog) => blogIds.push(blog.blog_id)); } const blogs = []; for (const blogId of blogIds) { let blog; if (!config.isMultiSite()) { blog = { blog_id: blogId, site_id: 0 }; } else { const result = await queryUtil.blogs((query) => { query.where("blog_id", blogId).builder.first(); }, val.database.wpBlogs); if (!result) { errors.push(new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "Invalid input")); continue; } blog = { blog_id: result.blog_id, site_id: result.site_id, }; } const siteId = blog.site_id; await current.switchSite(siteId, blogId); await current.assumeUser(userId); if (!current?.user) { errors.push(new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "User not found")); continue; } for (const canArg of canArgs) { if (!(await current.user.can(...canArg))) { errors.push(new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "User not found")); continue; } } blogs.push(blog); } return [blogs, errors]; } finally { await current.switchSite(originalSiteId, originalBlogId); await current.assumeUser(originalUserId); } } async checkBlogsPermission(args) { const result = await this.getAvailableBlogs(args); if (result[1].length > 0) { throw result[1][0]; } } async canEditPosts(postType, defaultUser) { return await this.checkPostsPermission("edit_posts", postType, defaultUser); } async canDeletePosts(postType, defaultUser) { return await this.checkPostsPermission("delete_posts", postType, defaultUser); } async canReadPrivatePosts(postType, defaultUser) { return await this.checkPostsPermission("read_private_posts", postType, defaultUser); } // check_read_permission async canReadPost(post) { const postUtil = this.components.get(post_util_1.PostUtil); const postTypeObject = postUtil.getTypeObject(post.post_type); if (!postTypeObject) { return false; } const { user: currentUser } = await this.getUser(); if ("publish" == post.post_status || (await currentUser.can("read_post", post.ID))) { return true; } const postStatusObject = postUtil.getStatusObject(post.post_status); if (postStatusObject && postStatusObject.public) { return true; } // Can we read the parent if we're inheriting? if ("inherit" === post.post_status && post.post_parent > 0) { const parentPost = await postUtil.get(post.post_parent); if (parentPost.props) { return await this.canReadPost(parentPost.props); } } /* * If there isn't a parent, but the status is set to inherit, assume * it's published (as per get_post_status()). */ if ("inherit" === post.post_status) { return true; } return false; } checkPasswordProtectedPost(post, password) { return post.post_password == "" || post.post_password == password; } pagination(params) { return { page: params.page, limit: params.limit, totalPage: Math.ceil(params.count / params.limit), count: params.count, }; } returnValue(data, info = undefined) { return { data, info, }; } // eslint-disable-next-line @typescript-eslint/no-unused-vars async get(...arg2) { throw new Error("Get method not defined"); } // eslint-disable-next-line @typescript-eslint/no-unused-vars async create(...arg2) { throw new Error("Create method not defined"); } // eslint-disable-next-line @typescript-eslint/no-unused-vars async update(...arg2) { throw new Error("Update method not defined"); } // eslint-disable-next-line @typescript-eslint/no-unused-vars async delete(...arg2) { throw new Error("Delete method not defined"); } // eslint-disable-next-line @typescript-eslint/no-unused-vars async list(...arg2) { throw new Error("List method not defined"); } } exports.Crud = Crud;