import { Not } from "typeorm"; import { Pages, DriveFiles } from "@/models/index.js"; import define from "../../define.js"; import { ApiError } from "../../error.js"; import { HOUR } from "@/const.js"; export const meta = { tags: ["pages"], requireCredential: true, kind: "write:pages", limit: { duration: HOUR, max: 300, }, errors: { noSuchPage: { message: "No such page.", code: "NO_SUCH_PAGE", id: "21149b9e-3616-4778-9592-c4ce89f5a864", }, accessDenied: { message: "Access denied.", code: "ACCESS_DENIED", id: "3c15cd52-3b4b-4274-967d-6456fc4f792b", }, noSuchFile: { message: "No such file.", code: "NO_SUCH_FILE", id: "cfc23c7c-3887-490e-af30-0ed576703c82", }, nameAlreadyExists: { message: "Specified name already exists.", code: "NAME_ALREADY_EXISTS", id: "2298a392-d4a1-44c5-9ebb-ac1aeaa5a9ab", }, }, } as const; export const paramDef = { type: "object", properties: { pageId: { type: "string", format: "misskey:id" }, title: { type: "string" }, name: { type: "string", minLength: 1 }, summary: { type: "string", nullable: true }, content: { type: "array", items: { type: "object", additionalProperties: true, }, }, variables: { type: "array", items: { type: "object", additionalProperties: true, }, }, script: { type: "string" }, eyeCatchingImageId: { type: "string", format: "misskey:id", nullable: true, }, font: { type: "string", enum: ["serif", "sans-serif"] }, alignCenter: { type: "boolean" }, hideTitleWhenPinned: { type: "boolean" }, isPublic: { type: "boolean" }, }, required: ["pageId", "title", "name", "content", "variables", "script"], } as const; export default define(meta, paramDef, async (ps, user) => { const page = await Pages.findOneBy({ id: ps.pageId }); if (page == null) { throw new ApiError(meta.errors.noSuchPage); } if (page.userId !== user.id) { throw new ApiError(meta.errors.accessDenied); } let eyeCatchingImage = null; if (ps.eyeCatchingImageId != null) { eyeCatchingImage = await DriveFiles.findOneBy({ id: ps.eyeCatchingImageId, userId: user.id, }); if (eyeCatchingImage == null) { throw new ApiError(meta.errors.noSuchFile); } } await Pages.findBy({ id: Not(ps.pageId), userId: user.id, name: ps.name, }).then((result) => { if (result.length > 0) { throw new ApiError(meta.errors.nameAlreadyExists); } }); await Pages.update(page.id, { updatedAt: new Date(), title: ps.title, name: ps.name === undefined ? page.name : ps.name, summary: ps.name === undefined ? page.summary : ps.summary, content: ps.content, variables: ps.variables, script: ps.script, isPublic: ps.isPublic, alignCenter: ps.alignCenter === undefined ? page.alignCenter : ps.alignCenter, hideTitleWhenPinned: ps.hideTitleWhenPinned === undefined ? page.hideTitleWhenPinned : ps.hideTitleWhenPinned, font: ps.font === undefined ? page.font : ps.font, eyeCatchingImageId: ps.eyeCatchingImageId === null ? null : ps.eyeCatchingImageId === undefined ? page.eyeCatchingImageId : eyeCatchingImage!.id, }); });