UNPKG

@rnaga/wp-node

Version:

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

302 lines (301 loc) • 13.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 __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.BlogCrud = void 0; const config_1 = require("../config"); const components_1 = require("../core/components"); const current_1 = require("../core/current"); const blog_util_1 = require("../core/utils/blog.util"); const query_util_1 = require("../core/utils/query.util"); const user_util_1 = require("../core/utils/user.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"); const site_util_1 = require("../core/utils/site.util"); const settings_crud_1 = require("./settings.crud"); const signup_util_1 = require("../core/utils/signup.util"); let BlogCrud = class BlogCrud extends crud_1.Crud { config; blogUtil; siteUtil; constructor(components, config, blogUtil, siteUtil) { super(components); this.config = config; this.blogUtil = blogUtil; this.siteUtil = siteUtil; } async checkPermission(args) { const { user: currentUser } = await this.getUser(); const current = this.components.get(current_1.Current); const { user = currentUser, blogId = current.blogId } = args ?? {}; if (!this.config.isMultiSite() || !(await user.can("manage_sites", [blogId])) || !(await user.can("delete_sites", [blogId])) || !(await user.can("create_sites", [blogId]))) { throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Not permitted"); } } async get(blogId) { await this.checkPermission({ blogId }); const blog = await this.blogUtil.get(blogId); if (!blog.props) { throw new error_1.CrudError(error_1.StatusMessage.NOT_FOUND, "Blog not found"); } const isMainBlog = (await this.blogUtil.getMainBlogId()) == blog.props.blog_id; const settingsCrud = this.components.get(settings_crud_1.SettingsCrud); return this.returnValue({ ...blog.props, is_main_blog: isMainBlog, blogname: await blog.name(), url: await blog.siteurl(), blog_meta: await blog.meta.props(), settings: (await settingsCrud.get({ blogId })).data, }); } // src/wp-admin/network/site-info.php async update(blogId, data, options) { const { settings } = options ?? {}; await this.checkPermission({ blogId }); const blogUtil = this.components.get(blog_util_1.BlogUtil); const currentBlog = (await this.get(blogId)).data; const mainBlogId = await blogUtil.getMainBlogId(); // On the network's main site, don't allow the domain or path to change. if (mainBlogId == blogId) { data.domain = currentBlog.domain; data.path = currentBlog.path; } data.blog_id = blogId; const blogTrx = this.components.get(transactions_1.BlogTrx); const result = await blogTrx.upsert(data); // Update wp_options let settingsResult = true; if (settings) { const settingsCrud = this.components.get(settings_crud_1.SettingsCrud); settingsResult = (await settingsCrud.update(settings, { blogId, })).data; } return this.returnValue(!!result && settingsResult); } // src/wp-admin/network/site-new.php async create(input) { await this.checkPermission(); const data = val.crud.blogInsert.parse(input); const { user } = await this.getUser(); if (data.user_id) { const userUtil = this.components.get(user_util_1.UserUtil); const user = await userUtil.get(data.user_id); await this.checkPermission({ user }); } else { data.user_id = user.props?.ID; } if (!data.user_id) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "User not specified"); } const signupUtil = this.components.get(signup_util_1.SignupUtil); const [isTrue, validationError] = await signupUtil.validateBlog(data.domain, data.title, user); if (!isTrue) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, validationError ?? "Invalid input"); } const userId = data.user_id; // If not a subdomain installation, make sure the domain isn't a reserved word. const reservedNames = await this.siteUtil.getReservedNames(); if (!this.config.isSubdomainInstall() && reservedNames.includes(data.domain)) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, `The following words are reserved for use by WordPress functions and cannot be used as site names: ${data.domain}`); } const current = this.components.get(current_1.Current); if (!current.site?.props.site.domain || !current.site?.props.site.path || !current.site?.props.site.id) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "Invalid site"); } const siteDomain = current.site?.props.site.domain; const sitePath = current.site?.props.site.path; const siteId = current.site.props.site.id; if (this.config.isSubdomainInstall()) { data.domain = `${data.domain}.${siteDomain.replace(/^www\./, "")}`; data.path = sitePath; } else { data.path = `${sitePath}${data.domain}/`; data.domain = siteDomain; } const blogTrx = this.components.get(transactions_1.BlogTrx); return this.returnValue(await blogTrx.upsert({ ...data, site_id: siteId, user_id: userId, })); } async delete(blogId) { await this.checkPermission({ blogId }); const { user } = await this.getUser(); const blog = (await this.get(blogId)).data; if (!(await user.can("delete_site", blog.blog_id))) { throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Sorry, you are not allowed to delete the site"); } const blogUtil = this.components.get(blog_util_1.BlogUtil); const mainBlogId = await blogUtil.getMainBlogId(); if (mainBlogId == blogId) { throw new error_1.CrudError(error_1.StatusMessage.BAD_REQUEST, "Can't delete the main blog"); } const blogTrx = this.components.get(transactions_1.BlogTrx); const result = await blogTrx.remove(blogId); return this.returnValue(result.props); } async list(args) { if (args?.site || args?.site_id) { const siteIds = [ ...(args.site ?? []), ...(args?.site_id ? [args?.site_id] : []), ]; const { user: currentUser } = await this.getUser(); if (!(await currentUser.can("manage_network", siteIds))) { throw new error_1.CrudError(error_1.StatusMessage.UNAUTHORIZED, "Not permitted"); } } else { await this.checkPermission(); } const queryUtil = this.components.get(query_util_1.QueryUtil); const blogUtil = this.components.get(blog_util_1.BlogUtil); const parsedArgs = val.crud.blogListParams.parse(args ?? {}); const buildQuery = (query) => { const { column } = query.alias; const offset = parsedArgs.offset ?? (parsedArgs.page - 1) * parsedArgs.per_page; const limit = parsedArgs.per_page; query.builder .offset(offset) .limit(limit) .groupBy(column("blogs", "blog_id")); if (parsedArgs.orderby) { if (parsedArgs.orderby == "url") { query.builder.orderBy([ { column: column("blogs", "domain") }, { column: column("blogs", "path"), order: parsedArgs.order }, ]); } else { query.builder.orderBy(column("blogs", parsedArgs.orderby), parsedArgs.order); } } if (Array.isArray(parsedArgs.include)) { query.whereIn("blog_id", parsedArgs.include); } if (Array.isArray(parsedArgs.exclude)) { query.andWhereNot((query) => query.whereIn("blog_id", parsedArgs.exclude)); } if (parsedArgs.search) { query.andWhere((query) => { const searchColumns = ["domain", "path"]; for (const searchColumn of searchColumns) { parsedArgs.search && query.or.whereLike(searchColumn, parsedArgs.search); } }); } for (const key of Object.keys(parsedArgs)) { const value = parsedArgs[key]; if (!value) continue; switch (key) { case "public": case "archived": case "mature": case "spam": case "deleted": case "lang_id": query.where(key, value); break; case "site_id": query.where("site_id", value); break; case "site": query.whereIn("site_id", value); break; case "site_exclude": query.andWhereNot((query) => query.whereIn("site_id", value)); break; } } }; const blogs = (await queryUtil.blogs((query) => { buildQuery(query); })) ?? []; const counts = await queryUtil.blogs((query) => { buildQuery(query); query.count("blogs", "blog_id"); }, val.query.resultCount); const data = []; for (const blog of blogUtil.toBlogs(blogs)) { const props = blog.props; data.push({ ...props, blog_meta: await blog.meta.props(), blogname: await blog.name(), url: await blog.siteurl(), }); } const pagination = this.pagination({ page: parsedArgs.page, limit: parsedArgs.per_page, count: counts?.count ?? 0, }); return this.returnValue(data, { pagination, }); } }; exports.BlogCrud = BlogCrud; exports.BlogCrud = BlogCrud = __decorate([ (0, component_1.component)(), __metadata("design:paramtypes", [components_1.Components, config_1.Config, blog_util_1.BlogUtil, site_util_1.SiteUtil]) ], BlogCrud);