sharkey/src/server/api/openapi/description.ts

99 lines
5.0 KiB
TypeScript
Raw Normal View History

2019-02-24 12:40:17 +09:00
import config from '../../../config';
2019-04-15 12:20:48 +09:00
import endpoints from '../endpoints';
import * as locale from '../../../../locales/';
import { fromEntries } from '../../../prelude/array';
import { kinds as kindsList } from '../kinds';
export interface IKindInfo {
endpoints: string[];
descs: { [x: string]: string; };
}
export function kinds() {
const kinds = fromEntries(
kindsList
.map(k => [k, {
endpoints: [],
descs: fromEntries(
Object.keys(locale)
.map(l => [l, locale[l].common.permissions[k] as string] as [string, string])
) as { [x: string]: string; }
}] as [ string, IKindInfo ])
) as { [x: string]: IKindInfo; };
const errors = [] as string[][];
for (const endpoint of endpoints.filter(ep => !ep.meta.secure)) {
if (endpoint.meta.kind) {
const kind = endpoint.meta.kind;
if (kind in kinds) kinds[kind].endpoints.push(endpoint.name);
else errors.push([kind, endpoint.name]);
}
}
if (errors.length > 0) throw Error('\n ' + errors.map((e) => `Unknown kind (permission) "${e[0]}" found at ${e[1]}.`).join('\n '));
return kinds;
}
export function getDescription(lang = 'ja-JP'): string {
const permissionTable = (Object.entries(kinds()) as [string, IKindInfo][])
.map(e => `|${e[0]}|${e[1].descs[lang]}|${e[1].endpoints.map(f => `[${f}](#operation/${f})`).join(', ')}|`)
.join('\n');
const descriptions = {
'ja-JP': `**Misskey is a decentralized microblogging platform.**
2019-02-24 12:40:17 +09:00
# Usage
2019-02-24 04:11:54 +09:00
**APIはすべてPOSTでリクエスト/JSON形式です**
2019-02-25 04:18:09 +09:00
APIはリクエストに認証情報(APIキー)\`i\`というパラメータでAPIキーを添付してください。
2019-02-24 04:08:08 +09:00
## APIキーを取得する
2019-02-25 04:18:09 +09:00
> APIAPIキーを取得できます
2019-02-24 04:08:08 +09:00
> ()
## APIキーを取得する
2019-02-25 04:18:09 +09:00
APIキーをアプリケーションが扱うのはセキュリティ上のリスクがあるので
APIを利用する際にはAPIキーを発行します
2019-02-24 04:08:08 +09:00
### 1.
2019-02-24 04:08:08 +09:00
Webサービス()Misskeyに登録します
[](/dev) >
使
> </p>
### 2.
2019-02-24 04:08:08 +09:00
使
2019-02-25 04:18:09 +09:00
[${config.apiUrl}/auth/session/generate](#operation/auth/session/generate) \`appSecret\`としてシークレットキーを含めたリクエストを送信します。
2019-02-24 04:08:08 +09:00
URLが取得できるのでURLをブラウザで表示し
URLを設定している場合
2019-02-24 12:40:17 +09:00
URLに\`token\`という名前でセッションのトークンが含まれたクエリを付けてリダイレクトします。
2019-02-24 04:08:08 +09:00
URLを設定していない場合(())
### 3.
2019-02-24 12:53:22 +09:00
[${config.apiUrl}/auth/session/userkey](#operation/auth/session/userkey)
2019-02-24 04:08:08 +09:00
2019-02-25 04:18:09 +09:00
2019-02-24 04:08:08 +09:00
2019-02-25 04:18:09 +09:00
*+sha256したもの*APIキーとしてAPIにリクエストできます
2019-02-24 04:08:08 +09:00
2019-02-25 04:18:09 +09:00
APIキーの生成方法を擬似コードで表すと次のようになります:
2019-02-24 12:40:17 +09:00
\`\`\` js
const i = sha256(userToken + secretKey);
\`\`\`
# Permissions
|Permisson (kind)|Description|Endpoints|
|:--|:--|:--|
${permissionTable}
`
} as { [x: string]: string };
return lang in descriptions ? descriptions[lang] : descriptions['ja-JP'];
}