summaryrefslogtreecommitdiff
path: root/src/web/docs/api/endpoints
diff options
context:
space:
mode:
Diffstat (limited to 'src/web/docs/api/endpoints')
-rw-r--r--src/web/docs/api/endpoints/gulpfile.ts75
-rw-r--r--src/web/docs/api/endpoints/posts/create.yaml54
-rw-r--r--src/web/docs/api/endpoints/style.styl16
-rw-r--r--src/web/docs/api/endpoints/view.pug60
4 files changed, 205 insertions, 0 deletions
diff --git a/src/web/docs/api/endpoints/gulpfile.ts b/src/web/docs/api/endpoints/gulpfile.ts
new file mode 100644
index 0000000000..a2c3944709
--- /dev/null
+++ b/src/web/docs/api/endpoints/gulpfile.ts
@@ -0,0 +1,75 @@
+/**
+ * Gulp tasks
+ */
+
+import * as fs from 'fs';
+import * as path from 'path';
+import * as glob from 'glob';
+import * as gulp from 'gulp';
+import * as pug from 'pug';
+import * as yaml from 'js-yaml';
+import * as mkdirp from 'mkdirp';
+
+import config from './../../../../conf';
+
+const parseParam = param => {
+ const id = param.type.match(/^id\((.+?)\)/);
+ const object = param.type.match(/^object\((.+?)\)/);
+ const isArray = /\[\]$/.test(param.type);
+ if (id) {
+ param.kind = 'id';
+ param.type = 'string';
+ param.entity = id[1];
+ if (isArray) {
+ param.type += '[]';
+ }
+ }
+ if (object) {
+ param.kind = 'object';
+ param.type = 'object';
+ param.def = object[1];
+ if (isArray) {
+ param.type += '[]';
+ }
+ }
+
+ return param;
+};
+
+gulp.task('doc:endpoints', () => {
+ glob('./src/web/docs/api/endpoints/**/*.yaml', (globErr, files) => {
+ if (globErr) {
+ console.error(globErr);
+ return;
+ }
+ //console.log(files);
+ files.forEach(file => {
+ const ep = yaml.safeLoad(fs.readFileSync(file, 'utf-8'));
+ const vars = {
+ endpoint: ep.endpoint,
+ url: `${config.api_url}/${ep.endpoint}`,
+ desc: ep.desc,
+ params: ep.params.map(p => parseParam(p)),
+ paramDefs: Object.keys(ep.paramDefs).map(key => ({
+ name: key,
+ params: ep.paramDefs[key].map(p => parseParam(p))
+ })),
+ res: ep.res.map(p => parseParam(p))
+ };
+ pug.renderFile('./src/web/docs/api/endpoints/view.pug', vars, (renderErr, html) => {
+ if (renderErr) {
+ console.error(renderErr);
+ return;
+ }
+ const htmlPath = `./built/web/docs/api/endpoints/${ep.endpoint}.html`;
+ mkdirp(path.dirname(htmlPath), (mkdirErr) => {
+ if (mkdirErr) {
+ console.error(mkdirErr);
+ return;
+ }
+ fs.writeFileSync(htmlPath, html, 'utf-8');
+ });
+ });
+ });
+ });
+});
diff --git a/src/web/docs/api/endpoints/posts/create.yaml b/src/web/docs/api/endpoints/posts/create.yaml
new file mode 100644
index 0000000000..b6613038a7
--- /dev/null
+++ b/src/web/docs/api/endpoints/posts/create.yaml
@@ -0,0 +1,54 @@
+endpoint: "posts/create"
+
+desc:
+ ja: "投稿します。"
+ en: "Compose new post."
+
+params:
+ - name: "text"
+ type: "string"
+ optional: false
+ desc:
+ ja: "投稿の本文"
+ en: "Text of a post"
+ - name: "media_ids"
+ type: "id(DriveFile)[]"
+ optional: true
+ desc:
+ ja: "添付するメディア"
+ en: "Media you want to attach"
+ - name: "reply_id"
+ type: "id(Post)"
+ optional: true
+ desc:
+ ja: "返信する投稿"
+ en: "A post you want to reply"
+ - name: "repost_id"
+ type: "id(Post)"
+ optional: true
+ desc:
+ ja: "引用する投稿"
+ en: "A post you want to quote"
+ - name: "poll"
+ type: "object(poll)"
+ optional: true
+ desc:
+ ja: "投票"
+ en: "A poll"
+
+paramDefs:
+ poll:
+ - name: "choices"
+ type: "string[]"
+ optional: false
+ desc:
+ ja: "投票の選択肢"
+ en: "Choices of a poll"
+
+res:
+ - name: "created_post"
+ type: "entity(Post)"
+ optional: false
+ desc:
+ ja: "作成した投稿"
+ en: "A post that created"
diff --git a/src/web/docs/api/endpoints/style.styl b/src/web/docs/api/endpoints/style.styl
new file mode 100644
index 0000000000..12c06fe3af
--- /dev/null
+++ b/src/web/docs/api/endpoints/style.styl
@@ -0,0 +1,16 @@
+@import "../../style"
+
+#url
+ padding 8px 12px
+ font-family Consolas, 'Courier New', Courier, Monaco, monospace
+ color #fff
+ background #222e40
+ border-radius 4px
+
+table
+ .name
+ font-weight bold
+
+ .type
+ font-family Consolas, 'Courier New', Courier, Monaco, monospace
+
diff --git a/src/web/docs/api/endpoints/view.pug b/src/web/docs/api/endpoints/view.pug
new file mode 100644
index 0000000000..d9de9cb74a
--- /dev/null
+++ b/src/web/docs/api/endpoints/view.pug
@@ -0,0 +1,60 @@
+doctype html
+
+mixin i18n(xs)
+ each text, lang in xs
+ span(class=`i18n ${lang}`)= text
+
+mixin table(params)
+ table
+ thead: tr
+ th Name
+ th Type
+ th Optional
+ th Description
+ tbody
+ each param in params
+ tr
+ td.name= param.name
+ td.type
+ if param.kind == 'id'
+ | #{param.type} (ID of
+ = ' '
+ a(href=`/docs/api/entities/${param.entity}`)= param.entity
+ | )
+ else if param.kind == 'object'
+ | #{param.type} (
+ a(href=`#${param.def}`)= param.def
+ | )
+ else
+ = param.type
+ td.optional= param.optional.toString()
+ td.desc: +i18n(param.desc)
+
+html
+ head
+ meta(charset="UTF-8")
+ title #{endpoint} | Misskey API
+ link(rel="stylesheet" href="/assets/docs/api/endpoints/style.css")
+
+ body
+ main
+ h1= endpoint
+
+ p#url= url
+
+ p#desc: +i18n(desc)
+
+ section
+ h2 Params
+ +table(params)
+
+ if paramDefs
+ each paramDef in paramDefs
+ section(id= paramDef.name)
+ h3= paramDef.name
+ +table(paramDef.params)
+
+ section
+ h2 Response
+ +table(res)
+