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