Introduce OpenAPI specs (#4351)
* wip * wip * wip * Update index.ts * Update gen-openapi-spec.ts * Update api.ja-JP.md * Fix * Improve doc * Update gen-openapi-spec.ts * Update redoc.html * Improve doc * Update gen-openapi-spec.ts * Improve doc * Update CHANGELOG.md
This commit is contained in:
parent
68a6758302
commit
52774bbe64
|
@ -3,6 +3,7 @@ ChangeLog
|
|||
|
||||
unreleasded
|
||||
----------
|
||||
* APIドキュメント刷新
|
||||
* /api/v1/instance/peers 復活
|
||||
* 「返信が遷移後も残り続ける問題を修正」([9beddc9](https://github.com/syuilo/misskey/commit/9beddc941a716f1322ae0b7d71d159edd642a399)) によって遷移前に返信が表示されなくなった問題を修正
|
||||
* デッキモードにてユーザーのプロフィールを連続で見たとき、アクティビティや画像が前のユーザーのもののまま表示される問題を修正
|
||||
|
|
BIN
assets/api-doc.png
Normal file
BIN
assets/api-doc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
|
@ -102,7 +102,7 @@
|
|||
"bcryptjs": "2.4.3",
|
||||
"bee-queue": "1.2.2",
|
||||
"bootstrap-vue": "2.0.0-rc.11",
|
||||
"cafy": "14.0.1",
|
||||
"cafy": "15.1.0",
|
||||
"chai": "4.2.0",
|
||||
"chai-http": "4.2.1",
|
||||
"chalk": "2.4.2",
|
||||
|
|
24
src/client/assets/redoc.html
Normal file
24
src/client/assets/redoc.html
Normal file
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Misskey API</title>
|
||||
<!-- needed for adaptive design -->
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
|
||||
|
||||
<!--
|
||||
ReDoc doesn't change outer page styles
|
||||
-->
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<redoc spec-url='/api.json'></redoc>
|
||||
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
|
||||
</body>
|
||||
</html>
|
|
@ -74,7 +74,7 @@ APIはすべてリクエストのパラメータ・レスポンスともにJSON
|
|||
|
||||
ストリーミングAPIも提供しています。
|
||||
|
||||
APIリファレンスもご確認ください。
|
||||
[APIリファレンス](/api-doc)もご確認ください。
|
||||
|
||||
### レートリミット
|
||||
Misskey APIにはレートリミットがあり、短時間のうちに多数のリクエストを送信すると、一定時間APIを利用することができなくなることがあります。
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
@import "../style"
|
||||
|
||||
#url
|
||||
padding 8px 12px 8px 8px
|
||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||
color #fff
|
||||
background #222e40
|
||||
border-radius 4px
|
||||
overflow auto
|
||||
white-space nowrap
|
||||
|
||||
> .method
|
||||
display inline-block
|
||||
margin 0 8px 0 0
|
||||
padding 0 6px
|
||||
color #fff
|
||||
background #17afc7
|
||||
border-radius 4px
|
||||
user-select none
|
||||
pointer-events none
|
||||
|
||||
> .host
|
||||
opacity 0.7
|
||||
|
||||
#stability
|
||||
padding 8px 12px
|
||||
color #fff
|
||||
border-radius 4px
|
||||
|
||||
&.deprecated
|
||||
background #f42443
|
||||
|
||||
&.experimental
|
||||
background #f2781a
|
||||
|
||||
&.stable
|
||||
background #3dcc90
|
||||
|
||||
> b
|
||||
margin-left 4px
|
|
@ -1,81 +0,0 @@
|
|||
extends ../../base
|
||||
include ../mixins
|
||||
|
||||
block meta
|
||||
link(rel="stylesheet" href="/docs/assets/api/endpoints/style.css")
|
||||
|
||||
block main
|
||||
h1= title
|
||||
|
||||
p#url
|
||||
span.method POST
|
||||
span.host
|
||||
= endpointUrl.host
|
||||
| /
|
||||
span.path= endpointUrl.path
|
||||
|
||||
- var stability = endpoint.stability || 'experimental';
|
||||
p#stability(class=stability)
|
||||
| Stability:
|
||||
b= stability
|
||||
|
||||
if endpoint.desc
|
||||
p#desc= endpoint.desc[lang] || endpoint.desc['ja-JP']
|
||||
|
||||
if endpoint.requireCredential
|
||||
div.ui.info: p
|
||||
i.fas.fa-id-card-alt(style="margin-right: 4px")
|
||||
= i18n('docs.api.endpoints.require-credential')
|
||||
|
||||
if endpoint.kind
|
||||
div.ui.info: p
|
||||
i.fas.fa-unlock-alt(style="margin-right: 4px")
|
||||
!= i18n('docs.api.endpoints.require-permission').replace('{permission}', `<code>${endpoint.kind}</code>`)
|
||||
|
||||
if endpoint.limit
|
||||
div.ui.info.warn: p
|
||||
i.far.fa-clock(style="margin-right: 4px")
|
||||
b!= i18n('docs.api.endpoints.has-limit')
|
||||
if endpoint.limit.duration
|
||||
!= i18n('docs.api.endpoints.duration-limit').replace('{duration}', endpoint.limit.duration).replace('{max}', endpoint.limit.max)
|
||||
if endpoint.limit.minInterval
|
||||
!= i18n('docs.api.endpoints.min-interval-limit').replace('{interval}', endpoint.limit.minInterval)
|
||||
|
||||
if params && Object.keys(params).length > 0
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.params')
|
||||
+propTable(params)
|
||||
|
||||
if paramDefs
|
||||
each paramDef in paramDefs
|
||||
section(id= paramDef.name)
|
||||
h3= paramDef.name
|
||||
+propTable(paramDef.params)
|
||||
if params && Object.keys(params).length == 0
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.params')
|
||||
p= i18n('docs.api.endpoints.no-params')
|
||||
|
||||
if res
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.res')
|
||||
|
||||
if resProps
|
||||
+propTable(resProps)
|
||||
|
||||
if resDefs
|
||||
each resDef in resDefs
|
||||
section(id= resDef.name)
|
||||
h3= resDef.name
|
||||
+propTable(resDef.props)
|
||||
else
|
||||
if res.type.startsWith('entity')
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(res.entity)}`)= res.entity
|
||||
|
||||
block footer
|
||||
div.ui.info: p
|
||||
i.fas.fa-info-circle(style="margin-right: 4px")
|
||||
= i18n('docs.api.endpoints.generated')
|
||||
p
|
||||
= i18n('docs.api.endpoints.show-src')
|
||||
a(href=src target="_blank")= i18n('docs.api.endpoints.show-src-link')
|
|
@ -1,90 +0,0 @@
|
|||
name: "DriveFile"
|
||||
|
||||
desc:
|
||||
ja-JP: "ドライブのファイル。"
|
||||
en-US: "A file of Drive."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルID"
|
||||
en-US: "The ID of this file"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アップロード日時"
|
||||
en-US: "The upload date of this file"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "所有者ID"
|
||||
en-US: "The ID of the owner of this file"
|
||||
|
||||
user:
|
||||
type: "entity(User)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "所有者"
|
||||
en-US: "The owner of this file"
|
||||
|
||||
name:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイル名"
|
||||
en-US: "The name of this file"
|
||||
|
||||
md5:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルのMD5ハッシュ値"
|
||||
en-US: "The md5 hash value of this file"
|
||||
|
||||
type:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルの種類"
|
||||
en-US: "The type of this file"
|
||||
|
||||
datasize:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルサイズ(bytes)"
|
||||
en-US: "The size of this file (bytes)"
|
||||
|
||||
url:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルのURL"
|
||||
en-US: "The URL of this file"
|
||||
|
||||
folderId:
|
||||
type: "id(DriveFolder)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "フォルダID"
|
||||
en-US: "The ID of the folder of this file"
|
||||
|
||||
folder:
|
||||
type: "entity(DriveFolder)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "フォルダ"
|
||||
en-US: "The folder of this file"
|
||||
|
||||
isSensitive:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "このメディアが「閲覧注意」(NSFW)かどうか"
|
||||
en-US: "Whether this media is NSFW"
|
|
@ -1,41 +0,0 @@
|
|||
name: "DriveFolder"
|
||||
|
||||
desc:
|
||||
ja-JP: "ドライブのフォルダを表します。"
|
||||
en-US: "A folder of Drive."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォルダID"
|
||||
en-US: "The ID of this folder"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "作成日時"
|
||||
en-US: "The created date of this folder"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "所有者ID"
|
||||
en-US: "The ID of the owner of this folder"
|
||||
|
||||
parentId:
|
||||
type: "entity(DriveFolder)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "親フォルダのID (ルートなら null)"
|
||||
en-US: "The ID of parent folder"
|
||||
|
||||
name:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォルダ名"
|
||||
en-US: "The name of this folder"
|
|
@ -1,211 +0,0 @@
|
|||
name: "Note"
|
||||
|
||||
desc:
|
||||
ja-JP: "投稿。"
|
||||
en-US: "A note."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿ID"
|
||||
en-US: "The ID of this note"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿日時"
|
||||
en-US: "The posted date of this note"
|
||||
|
||||
viaMobile:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "モバイル端末から投稿したか否か(自己申告であることに留意)"
|
||||
en-US: "Whether this note sent via a mobile device"
|
||||
|
||||
localOnly:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ローカルのみに公開する投稿か否か"
|
||||
en-US: "Whether this note is no federation"
|
||||
|
||||
text:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投稿の本文"
|
||||
en-US: "The text of this note"
|
||||
|
||||
fileIds:
|
||||
type: "id(DriveFile)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "添付されているファイルのID (なければレスポンスでは空配列)"
|
||||
en-US: "The IDs of the attached files (empty array for response if no files is attached)"
|
||||
|
||||
files:
|
||||
type: "entity(DriveFile)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "添付されているファイル"
|
||||
en-US: "The attached files"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿者ID"
|
||||
en-US: "The ID of author of this note"
|
||||
|
||||
user:
|
||||
type: "entity(User)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投稿者"
|
||||
en-US: "The author of this note"
|
||||
|
||||
myReaction:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>"
|
||||
en-US: "The your <a href='/docs/api/reactions'>reaction</a> of this note"
|
||||
|
||||
renoteCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この投稿がRenoteされた数"
|
||||
en-US: "The number of renotes for this post"
|
||||
|
||||
repliesCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この投稿に返信された数"
|
||||
en-US: "The number of replies to this post"
|
||||
|
||||
reactionCounts:
|
||||
type: "object"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト"
|
||||
|
||||
replyId:
|
||||
type: "id(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "返信した投稿のID"
|
||||
en-US: "The ID of the replyed note"
|
||||
|
||||
reply:
|
||||
type: "entity(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "返信した投稿"
|
||||
en-US: "The replyed note"
|
||||
|
||||
renoteId:
|
||||
type: "id(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "引用した投稿のID"
|
||||
en-US: "The ID of the quoted note"
|
||||
|
||||
renote:
|
||||
type: "entity(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "引用した投稿"
|
||||
en-US: "The quoted note"
|
||||
|
||||
poll:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投票"
|
||||
en-US: "The poll"
|
||||
|
||||
props:
|
||||
choices:
|
||||
type: "object[]"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投票の選択肢"
|
||||
en-US: "The choices of this poll"
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "選択肢ID"
|
||||
en-US: "The ID of this choice"
|
||||
|
||||
isVoted:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこの選択肢に投票したかどうか"
|
||||
en-US: "Whether you voted to this choice"
|
||||
|
||||
text:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "選択肢本文"
|
||||
en-US: "The text of this choice"
|
||||
|
||||
votes:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この選択肢に投票された数"
|
||||
en-US: "The number voted for this choice"
|
||||
geo:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "位置情報"
|
||||
en-US: "Geo location"
|
||||
|
||||
props:
|
||||
coordinates:
|
||||
type: "number[]"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。"
|
||||
|
||||
altitude:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "高度。メートル単位で表す。"
|
||||
|
||||
accuracy:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "緯度、経度の精度。メートル単位で表す。"
|
||||
|
||||
altitudeAccuracy:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "高度の精度。メートル単位で表す。"
|
||||
|
||||
heading:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。"
|
||||
|
||||
speed:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "速度。メートル / 秒数で表す。"
|
|
@ -1 +0,0 @@
|
|||
@import "../style"
|
|
@ -1,174 +0,0 @@
|
|||
name: "User"
|
||||
|
||||
desc:
|
||||
ja-JP: "ユーザー。"
|
||||
en-US: "A user."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザーID"
|
||||
en-US: "The ID of this user"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アカウント作成日時"
|
||||
en-US: "The registered date of this user"
|
||||
|
||||
username:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザー名"
|
||||
en-US: "The username of this user"
|
||||
|
||||
description:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アカウントの説明(自己紹介)"
|
||||
en-US: "The description of this user"
|
||||
|
||||
avatarId:
|
||||
type: "id(DriveFile)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "アバターのID"
|
||||
en-US: "The ID of the avatar of this user"
|
||||
|
||||
avatarUrl:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アバターのURL"
|
||||
en-US: "The URL of the avatar of this user"
|
||||
|
||||
bannerId:
|
||||
type: "id(DriveFile)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "バナーのID"
|
||||
en-US: "The ID of the banner of this user"
|
||||
|
||||
bannerUrl:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "バナーのURL"
|
||||
en-US: "The URL of the banner of this user"
|
||||
|
||||
followersCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォロワーの数"
|
||||
en-US: "The number of the followers for this user"
|
||||
|
||||
followingCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォローしているユーザーの数"
|
||||
en-US: "The number of the following users for this user"
|
||||
|
||||
isFollowing:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーをフォローしているか"
|
||||
|
||||
isFollowed:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーにフォローされているか"
|
||||
|
||||
isMuted:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーをミュートしているか"
|
||||
en-US: "Whether you muted this user"
|
||||
|
||||
notesCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿の数"
|
||||
en-US: "The number of the notes of this user"
|
||||
|
||||
pinnedNotes:
|
||||
type: "entity(Note)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ピン留めされた投稿"
|
||||
en-US: "The pinned note of this user"
|
||||
|
||||
pinnedNoteIds:
|
||||
type: "id(Note)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ピン留めされた投稿のID"
|
||||
en-US: "The ID of the pinned note of this user"
|
||||
|
||||
host:
|
||||
type: "string | null"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ホスト (例: example.com:3000)"
|
||||
en-US: "Host (e.g. example.com:3000)"
|
||||
|
||||
twitter:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "連携されているTwitterアカウント情報"
|
||||
en-US: "The info of the connected twitter account of this user"
|
||||
|
||||
props:
|
||||
userId:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザーID"
|
||||
en-US: "The user ID"
|
||||
|
||||
screenName:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザー名"
|
||||
en-US: "The screen name of this user"
|
||||
|
||||
isBot:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "botか否か(自己申告であることに留意)"
|
||||
en-US: "Whether is bot or not"
|
||||
|
||||
profile:
|
||||
type: "object"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "プロフィール"
|
||||
en-US: "The profile of this user"
|
||||
|
||||
props:
|
||||
location:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "場所"
|
||||
en-US: "The location of this user"
|
||||
|
||||
birthday:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "誕生日 (YYYY-MM-DD)"
|
||||
en-US: "The birthday of this user (YYYY-MM-DD)"
|
|
@ -1,20 +0,0 @@
|
|||
extends ../../base
|
||||
include ../mixins
|
||||
|
||||
block meta
|
||||
link(rel="stylesheet" href="/docs/assets/api/entities/style.css")
|
||||
|
||||
block main
|
||||
h1= name
|
||||
|
||||
p#desc= desc[lang] || desc['ja-JP']
|
||||
|
||||
section
|
||||
h2= i18n('docs.api.entities.properties')
|
||||
+propTable(props)
|
||||
|
||||
if propDefs
|
||||
each propDef in propDefs
|
||||
section(id= propDef.name)
|
||||
h3= propDef.name
|
||||
+propTable(propDef.props)
|
|
@ -1,34 +0,0 @@
|
|||
mixin type(prop)
|
||||
i= prop.type
|
||||
if prop.kind == 'id'
|
||||
if prop.entity
|
||||
| (
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
|
||||
| ID)
|
||||
else
|
||||
| (ID)
|
||||
else if prop.kind == 'entity'
|
||||
| (
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
|
||||
| )
|
||||
else if prop.kind == 'object'
|
||||
if prop.hasDef
|
||||
| (
|
||||
a(href=`#${prop.name}`)= prop.name
|
||||
| )
|
||||
else if prop.kind == 'date'
|
||||
| (Date)
|
||||
|
||||
mixin propTable(props)
|
||||
table.props
|
||||
thead: tr
|
||||
th= i18n('docs.api.props.name')
|
||||
th= i18n('docs.api.props.type')
|
||||
th= i18n('docs.api.props.description')
|
||||
tbody
|
||||
each prop in props
|
||||
tr
|
||||
td.name= prop.name
|
||||
td.type
|
||||
+type(prop)
|
||||
td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja-JP'] : null
|
|
@ -1,11 +0,0 @@
|
|||
@import "../style"
|
||||
|
||||
table.props
|
||||
.name
|
||||
font-weight bold
|
||||
|
||||
.name
|
||||
.type
|
||||
.optional
|
||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||
|
|
@ -17,17 +17,6 @@ html(lang= lang)
|
|||
ul
|
||||
each doc in docs
|
||||
li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja-JP']
|
||||
section
|
||||
h2 API
|
||||
ul
|
||||
li Entities
|
||||
ul
|
||||
each entity in entities
|
||||
li: a(href=`/docs/${lang}/api/entities/${kebab(entity)}`)= entity
|
||||
li Endpoints
|
||||
ul
|
||||
each endpoint in endpoints
|
||||
li: a(href=`/docs/${lang}/api/endpoints/${kebab(endpoint.name)}`)= endpoint.name
|
||||
main
|
||||
article
|
||||
block main
|
||||
|
|
|
@ -26,6 +26,8 @@ export type ObjectId = mongo.ObjectID;
|
|||
* ID
|
||||
*/
|
||||
export default class ID<Maybe = string> extends Context<string | Maybe> {
|
||||
public readonly name = 'ID';
|
||||
|
||||
constructor(optional = false, nullable = false) {
|
||||
super(optional, nullable);
|
||||
|
||||
|
@ -38,7 +40,7 @@ export default class ID<Maybe = string> extends Context<string | Maybe> {
|
|||
}
|
||||
|
||||
public getType() {
|
||||
return super.getType('string');
|
||||
return super.getType('String');
|
||||
}
|
||||
|
||||
public makeOptional(): ID<undefined> {
|
||||
|
|
|
@ -26,7 +26,7 @@ export default (endpoint: IEndpoint, ctx: Koa.BaseContext) => new Promise((res)
|
|||
call(endpoint.name, user, app, body, (ctx.req as any).file).then(res => {
|
||||
reply(res);
|
||||
}).catch(e => {
|
||||
reply(e.kind == 'client' ? 400 : 500, e);
|
||||
reply(e.httpStatusCode ? e.httpStatusCode : e.kind == 'client' ? 400 : 500, e);
|
||||
});
|
||||
}).catch(() => {
|
||||
reply(403, new ApiError({
|
||||
|
|
|
@ -21,6 +21,7 @@ export default async (endpoint: string, user: IUser, app: IApp, data: any, file?
|
|||
message: 'No such endpoint.',
|
||||
code: 'NO_SUCH_ENDPOINT',
|
||||
id: 'f8080b67-5f9c-4eb7-8c18-7f1eeae8f709',
|
||||
httpStatusCode: 404
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -33,6 +34,7 @@ export default async (endpoint: string, user: IUser, app: IApp, data: any, file?
|
|||
message: 'Credential required.',
|
||||
code: 'CREDENTIAL_REQUIRED',
|
||||
id: '1384574d-a912-4b81-8601-c7b1c4085df1',
|
||||
httpStatusCode: 401
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -63,6 +65,7 @@ export default async (endpoint: string, user: IUser, app: IApp, data: any, file?
|
|||
message: 'Rate limit exceeded. Please try again later.',
|
||||
code: 'RATE_LIMIT_EXCEEDED',
|
||||
id: 'd5826d14-3982-4d2e-8011-b9e9f02499ef',
|
||||
httpStatusCode: 429
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -2,18 +2,30 @@ import { Context } from 'cafy';
|
|||
import * as path from 'path';
|
||||
import * as glob from 'glob';
|
||||
|
||||
export type Param = {
|
||||
validator: Context<any>;
|
||||
transform?: any;
|
||||
default?: any;
|
||||
desc?: { [key: string]: string };
|
||||
ref?: string;
|
||||
};
|
||||
|
||||
export interface IEndpointMeta {
|
||||
stability?: string; //'deprecated' | 'experimental' | 'stable';
|
||||
|
||||
desc?: { [key: string]: string };
|
||||
|
||||
tags?: string[];
|
||||
|
||||
params?: {
|
||||
[key: string]: Param;
|
||||
};
|
||||
|
||||
errors?: {
|
||||
[key: string]: {
|
||||
validator: Context<any>;
|
||||
transform?: any;
|
||||
default?: any;
|
||||
desc?: { [key: string]: string };
|
||||
ref?: string;
|
||||
message: string;
|
||||
code: string;
|
||||
id: string;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ import Report, { packMany } from '../../../../models/abuse-user-report';
|
|||
import define from '../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ import define from '../../../define';
|
|||
import { fallback } from '../../../../../prelude/symbol';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: false,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ import DriveFile from '../../../../../models/drive-file';
|
|||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ export const meta = {
|
|||
'ja-JP': 'カスタム絵文字を追加します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ export const meta = {
|
|||
'ja-JP': 'カスタム絵文字を取得します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
|||
'ja-JP': 'カスタム絵文字を削除します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
|||
'ja-JP': 'カスタム絵文字を更新します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ import User from '../../../../../models/user';
|
|||
import deleteFollowing from '../../../../../services/following/delete';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ import define from '../../../define';
|
|||
import Instance from '../../../../../models/instance';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ export const meta = {
|
|||
'ja-JP': '招待コードを発行します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Mark a user as moderator.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireAdmin: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Unmark a user as moderator.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireAdmin: true,
|
||||
|
||||
|
|
|
@ -2,6 +2,8 @@ import define from '../../../define';
|
|||
import { destroy } from '../../../../../queue';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ import define from '../../define';
|
|||
import AbuseUserReport from '../../../../models/abuse-user-report';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': '指定したユーザーのパスワードをリセットします。',
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
|||
'ja-JP': '指定したユーザーの情報を取得します。',
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ import define from '../../define';
|
|||
import { fallback } from '../../../../prelude/symbol';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Make silence a user.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Suspend a user.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Unsilence a user.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Unsuspend a user.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Mark a user as unverified.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ export const meta = {
|
|||
'ja-JP': 'インスタンスの設定を更新します。'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@ export const meta = {
|
|||
'en-US': 'Update specified remote user information.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Mark a user as verified.'
|
||||
},
|
||||
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ import define from '../../define';
|
|||
import fetchMeta from '../../../../misc/fetch-meta';
|
||||
|
||||
export const meta = {
|
||||
tags: ['hashtags'],
|
||||
|
||||
requireCredential: false,
|
||||
};
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ import Resolver from '../../../../remote/activitypub/resolver';
|
|||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['federation'],
|
||||
|
||||
desc: {
|
||||
'ja-JP': 'URIを指定してActivityPubオブジェクトを参照します。'
|
||||
},
|
||||
|
|
|
@ -4,6 +4,8 @@ import App, { pack } from '../../../../models/app';
|
|||
import define from '../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['app'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -5,6 +5,8 @@ import define from '../../define';
|
|||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['app'],
|
||||
|
||||
params: {
|
||||
appId: {
|
||||
validator: $.type(ID),
|
||||
|
|
|
@ -8,6 +8,8 @@ import define from '../../define';
|
|||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['auth'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
secure: true,
|
||||
|
|
|
@ -7,6 +7,8 @@ import define from '../../../define';
|
|||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['auth'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -4,6 +4,8 @@ import define from '../../../define';
|
|||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['auth'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -7,6 +7,8 @@ import define from '../../../define';
|
|||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['auth'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -16,6 +16,8 @@ export const meta = {
|
|||
'en-US': 'Block a user.'
|
||||
},
|
||||
|
||||
tags: ['blocking', 'users'],
|
||||
|
||||
limit: {
|
||||
duration: ms('1hour'),
|
||||
max: 100
|
||||
|
|
|
@ -16,6 +16,8 @@ export const meta = {
|
|||
'en-US': 'Unblock a user.'
|
||||
},
|
||||
|
||||
tags: ['blocking', 'users'],
|
||||
|
||||
limit: {
|
||||
duration: ms('1hour'),
|
||||
max: 100
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Get blocking users.'
|
||||
},
|
||||
|
||||
tags: ['blocking', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'following-read',
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'アクティブユーザーのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'users'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'ドライブのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'drive'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'フェデレーションのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'ハッシュタグごとのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'hashtags'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -31,7 +33,14 @@ export const meta = {
|
|||
'ja-JP': '対象のハッシュタグ'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'インスタンスごとのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -32,7 +34,14 @@ export const meta = {
|
|||
'en-US': 'Target instance host'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'ネットワークのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': '投稿のチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'notes'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': 'ユーザーごとのドライブのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'drive', 'users'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -34,7 +36,14 @@ export const meta = {
|
|||
'en-US': 'Target user ID'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': 'ユーザーごとのフォロー/フォロワーのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'users', 'following'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -34,7 +36,14 @@ export const meta = {
|
|||
'en-US': 'Target user ID'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': 'ユーザーごとの投稿のチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'users', 'notes'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -34,7 +36,14 @@ export const meta = {
|
|||
'en-US': 'Target user ID'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': 'ユーザーごとの被リアクション数のチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'users', 'reactions'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -34,7 +36,14 @@ export const meta = {
|
|||
'en-US': 'Target user ID'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'ja-JP': 'ユーザーのチャートを取得します。'
|
||||
},
|
||||
|
||||
tags: ['charts', 'users'],
|
||||
|
||||
params: {
|
||||
span: {
|
||||
validator: $.str.or(['day', 'hour']),
|
||||
|
@ -24,7 +26,14 @@ export const meta = {
|
|||
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
|||
'en-US': 'Get drive information.'
|
||||
},
|
||||
|
||||
tags: ['drive', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read'
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Get files of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
@ -38,7 +40,14 @@ export const meta = {
|
|||
type: {
|
||||
validator: $.optional.str.match(/^[a-zA-Z\/\-\*]+$/)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'DriveFile',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, user) => {
|
||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
|||
'en-US': 'Get the notes that specified file of drive attached.'
|
||||
},
|
||||
|
||||
tags: ['drive', 'notes'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
|||
'en-US': 'Returns whether the file with the given MD5 hash exists in the user\'s drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
|||
'en-US': 'Upload a file to drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
limit: {
|
||||
|
@ -35,7 +37,7 @@ export const meta = {
|
|||
},
|
||||
|
||||
isSensitive: {
|
||||
validator: $.optional.or($.bool, $.str),
|
||||
validator: $.optional.either($.bool, $.str),
|
||||
default: false,
|
||||
transform: (v: any): boolean => v === true || v === 'true',
|
||||
desc: {
|
||||
|
@ -45,7 +47,7 @@ export const meta = {
|
|||
},
|
||||
|
||||
force: {
|
||||
validator: $.optional.or($.bool, $.str),
|
||||
validator: $.optional.either($.bool, $.str),
|
||||
default: false,
|
||||
transform: (v: any): boolean => v === true || v === 'true',
|
||||
desc: {
|
||||
|
@ -54,6 +56,10 @@ export const meta = {
|
|||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'DriveFile',
|
||||
},
|
||||
|
||||
errors: {
|
||||
invalidFileName: {
|
||||
message: 'Invalid file name.',
|
||||
|
|
|
@ -14,6 +14,8 @@ export const meta = {
|
|||
'en-US': 'Delete a file of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-write',
|
||||
|
|
|
@ -6,6 +6,8 @@ import define from '../../../define';
|
|||
export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
kind: 'drive-read',
|
||||
|
||||
params: {
|
||||
|
|
|
@ -14,6 +14,8 @@ export const meta = {
|
|||
'en-US': 'Get specified file of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
@ -37,6 +39,10 @@ export const meta = {
|
|||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'DriveFile',
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchFile: {
|
||||
message: 'No such file.',
|
||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
|||
'en-US': 'Update specified file of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-write',
|
||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
|||
'ja-JP': 'ドライブに指定されたURLに存在するファイルをアップロードします。'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
limit: {
|
||||
duration: ms('1hour'),
|
||||
max: 60
|
||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
|||
'en-US': 'Get folders of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
|||
'en-US': 'Create a folder of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-write',
|
||||
|
|
|
@ -14,6 +14,8 @@ export const meta = {
|
|||
'en-US': 'Delete specified folder of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-write',
|
||||
|
|
|
@ -4,6 +4,8 @@ import DriveFolder, { pack } from '../../../../../models/drive-folder';
|
|||
import define from '../../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -12,6 +12,8 @@ export const meta = {
|
|||
'en-US': 'Get specified folder of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
|||
'en-US': 'Update specified folder of drive.'
|
||||
},
|
||||
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-write',
|
||||
|
|
|
@ -4,6 +4,8 @@ import DriveFile, { packMany } from '../../../../models/drive-file';
|
|||
import define from '../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['drive'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read',
|
||||
|
|
|
@ -3,6 +3,8 @@ import define from '../../define';
|
|||
import Instance from '../../../../models/instance';
|
||||
|
||||
export const meta = {
|
||||
tags: ['federation'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -3,6 +3,8 @@ import define from '../../define';
|
|||
import Instance from '../../../../models/instance';
|
||||
|
||||
export const meta = {
|
||||
tags: ['federation'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -16,6 +16,8 @@ export const meta = {
|
|||
'en-US': 'Follow a user.'
|
||||
},
|
||||
|
||||
tags: ['following', 'users'],
|
||||
|
||||
limit: {
|
||||
duration: ms('1hour'),
|
||||
max: 100
|
||||
|
|
|
@ -16,6 +16,8 @@ export const meta = {
|
|||
'en-US': 'Unfollow a user.'
|
||||
},
|
||||
|
||||
tags: ['following', 'users'],
|
||||
|
||||
limit: {
|
||||
duration: ms('1hour'),
|
||||
max: 100
|
||||
|
|
|
@ -11,6 +11,8 @@ export const meta = {
|
|||
'en-US': 'Accept a follow request.'
|
||||
},
|
||||
|
||||
tags: ['following', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'following-write',
|
||||
|
|
|
@ -12,6 +12,8 @@ export const meta = {
|
|||
'en-US': 'Cancel a follow request.'
|
||||
},
|
||||
|
||||
tags: ['following', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'following-write',
|
||||
|
|
|
@ -7,6 +7,8 @@ export const meta = {
|
|||
'en-US': 'Get all pending received follow requests.'
|
||||
},
|
||||
|
||||
tags: ['following', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'following-read'
|
||||
|
|
|
@ -11,6 +11,8 @@ export const meta = {
|
|||
'en-US': 'Reject a follow request.'
|
||||
},
|
||||
|
||||
tags: ['following', 'account'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'following-write',
|
||||
|
|
|
@ -4,6 +4,8 @@ import ReversiGame, { pack } from '../../../../../models/games/reversi/game';
|
|||
import define from '../../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
params: {
|
||||
limit: {
|
||||
validator: $.optional.num.range(1, 100),
|
||||
|
|
|
@ -6,6 +6,8 @@ import define from '../../../../define';
|
|||
import { ApiError } from '../../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
params: {
|
||||
gameId: {
|
||||
validator: $.type(ID),
|
||||
|
|
|
@ -6,6 +6,8 @@ import define from '../../../../define';
|
|||
import { ApiError } from '../../../../error';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
desc: {
|
||||
'ja-JP': '指定したリバーシの対局で投了します。'
|
||||
},
|
||||
|
|
|
@ -2,6 +2,8 @@ import Matching, { pack as packMatching } from '../../../../../models/games/reve
|
|||
import define from '../../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
requireCredential: true
|
||||
};
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ import { ApiError } from '../../../error';
|
|||
import { getUser } from '../../../common/getters';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
params: {
|
||||
|
|
|
@ -2,6 +2,8 @@ import Matching from '../../../../../../models/games/reversi/matching';
|
|||
import define from '../../../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['games'],
|
||||
|
||||
requireCredential: true
|
||||
};
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ import define from '../../define';
|
|||
import Hashtag from '../../../../models/hashtag';
|
||||
|
||||
export const meta = {
|
||||
tags: ['hashtags'],
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue