@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
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 __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;