import { Pages, DriveFiles } from "../../../../models/index.js"; import { genId } from "../../../../misc/gen-id.js"; import { Page } from "../../../../models/entities/page.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 }, res: { type: "object", optional: false, nullable: false, ref: "Page" }, errors: { noSuchFile: { message: "No such file.", code: "NO_SUCH_FILE", id: "b7b97489-0f66-4b12-a5ff-b21bd63f6e1c" }, nameAlreadyExists: { message: "Specified name already exists.", code: "NAME_ALREADY_EXISTS", id: "4650348e-301c-499a-83c9-6aa988c66bc1" } } }; export const paramDef = { type: "object", properties: { 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" ], default: "sans-serif" }, alignCenter: { type: "boolean", default: false }, isPublic: { type: "boolean", default: true }, hideTitleWhenPinned: { type: "boolean", default: false } }, required: [ "title", "name", "content", "variables", "script" ] }; export default define(meta, paramDef, async (ps, user)=>{ 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({ userId: user.id, name: ps.name }).then((result)=>{ if (result.length > 0) { throw new ApiError(meta.errors.nameAlreadyExists); } }); const page = await Pages.insert(new Page({ id: genId(), createdAt: new Date(), updatedAt: new Date(), title: ps.title, name: ps.name, summary: ps.summary, content: ps.content, variables: ps.variables, script: ps.script, eyeCatchingImageId: eyeCatchingImage ? eyeCatchingImage.id : null, userId: user.id, visibility: "public", alignCenter: ps.alignCenter, hideTitleWhenPinned: ps.hideTitleWhenPinned, font: ps.font, isPublic: ps.isPublic })).then((x)=>Pages.findOneByOrFail(x.identifiers[0])); return await Pages.pack(page); });