diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2019-04-15 12:23:20 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2019-04-15 12:23:20 +0900 |
| commit | d040dc19bce8635dc9a0646a83c44ad78e2855d7 (patch) | |
| tree | 6071ab5d3893f3e4453c887764d646aa6483df33 /src/server | |
| parent | Merge branch 'develop' (diff) | |
| parent | 11.0.2 (diff) | |
| download | misskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.tar.gz misskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.tar.bz2 misskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.zip | |
Merge branch 'develop'
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/api/endpoints/app/create.ts | 6 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/favorites.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/history.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/messages.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/messages/create.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/messages/delete.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/messages/read.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/favorites/create.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/favorites/delete.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/featured.ts | 1 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/polls/vote.ts | 2 | ||||
| -rw-r--r-- | src/server/api/kinds.ts | 22 | ||||
| -rw-r--r-- | src/server/api/openapi/description.ts | 55 | ||||
| -rw-r--r-- | src/server/api/openapi/gen-spec.ts | 9 |
14 files changed, 96 insertions, 15 deletions
diff --git a/src/server/api/endpoints/app/create.ts b/src/server/api/endpoints/app/create.ts index 71f21fdf47..ba366cdeb8 100644 --- a/src/server/api/endpoints/app/create.ts +++ b/src/server/api/endpoints/app/create.ts @@ -3,6 +3,7 @@ import $ from 'cafy'; import define from '../../define'; import { Apps } from '../../../../models'; import { genId } from '../../../../misc/gen-id'; +import { unique } from '../../../../prelude/array'; export const meta = { tags: ['app'], @@ -34,6 +35,9 @@ export default define(meta, async (ps, user) => { // Generate secret const secret = rndstr('a-zA-Z0-9', 32); + // for backward compatibility + const permission = unique(ps.permission.map(v => v.replace(/^(.+)(\/|-)(read|write)$/, '$3:$1'))); + // Create account const app = await Apps.save({ id: genId(), @@ -41,7 +45,7 @@ export default define(meta, async (ps, user) => { userId: user ? user.id : null, name: ps.name, description: ps.description, - permission: ps.permission, + permission, callbackUrl: ps.callbackUrl, secret: secret }); diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts index 2c25250bea..aad706545a 100644 --- a/src/server/api/endpoints/i/favorites.ts +++ b/src/server/api/endpoints/i/favorites.ts @@ -14,7 +14,7 @@ export const meta = { requireCredential: true, - kind: 'favorites-read', + kind: 'read:favorites', params: { limit: { diff --git a/src/server/api/endpoints/messaging/history.ts b/src/server/api/endpoints/messaging/history.ts index c12378eb7e..c2d746e481 100644 --- a/src/server/api/endpoints/messaging/history.ts +++ b/src/server/api/endpoints/messaging/history.ts @@ -14,7 +14,7 @@ export const meta = { requireCredential: true, - kind: 'messaging-read', + kind: 'read:messaging', params: { limit: { diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts index 02c57b8d03..add21e5f19 100644 --- a/src/server/api/endpoints/messaging/messages.ts +++ b/src/server/api/endpoints/messaging/messages.ts @@ -17,7 +17,7 @@ export const meta = { requireCredential: true, - kind: 'messaging-read', + kind: 'read:messaging', params: { userId: { diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index 2c7e5ad2d9..30ac0849a3 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -20,7 +20,7 @@ export const meta = { requireCredential: true, - kind: 'messaging-write', + kind: 'write:messaging', params: { userId: { diff --git a/src/server/api/endpoints/messaging/messages/delete.ts b/src/server/api/endpoints/messaging/messages/delete.ts index 9f55caba62..6a896cd8d1 100644 --- a/src/server/api/endpoints/messaging/messages/delete.ts +++ b/src/server/api/endpoints/messaging/messages/delete.ts @@ -18,7 +18,7 @@ export const meta = { requireCredential: true, - kind: 'messaging-write', + kind: 'write:messaging', limit: { duration: ms('1hour'), diff --git a/src/server/api/endpoints/messaging/messages/read.ts b/src/server/api/endpoints/messaging/messages/read.ts index 24a28285bf..50b7f39870 100644 --- a/src/server/api/endpoints/messaging/messages/read.ts +++ b/src/server/api/endpoints/messaging/messages/read.ts @@ -15,7 +15,7 @@ export const meta = { requireCredential: true, - kind: 'messaging-write', + kind: 'write:messaging', params: { messageId: { diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts index 7e04637758..bb0c9594bb 100644 --- a/src/server/api/endpoints/notes/favorites/create.ts +++ b/src/server/api/endpoints/notes/favorites/create.ts @@ -18,7 +18,7 @@ export const meta = { requireCredential: true, - kind: 'favorite-write', + kind: 'write:favorites', params: { noteId: { diff --git a/src/server/api/endpoints/notes/favorites/delete.ts b/src/server/api/endpoints/notes/favorites/delete.ts index a889c84d4d..49f7631773 100644 --- a/src/server/api/endpoints/notes/favorites/delete.ts +++ b/src/server/api/endpoints/notes/favorites/delete.ts @@ -17,7 +17,7 @@ export const meta = { requireCredential: true, - kind: 'favorite-write', + kind: 'write:favorites', params: { noteId: { diff --git a/src/server/api/endpoints/notes/featured.ts b/src/server/api/endpoints/notes/featured.ts index 6a76fb8bc6..fa9ae39e3a 100644 --- a/src/server/api/endpoints/notes/featured.ts +++ b/src/server/api/endpoints/notes/featured.ts @@ -35,6 +35,7 @@ export default define(meta, async (ps, user) => { const day = 1000 * 60 * 60 * 24 * 3; // 3日前まで const query = Notes.createQueryBuilder('note') + .addSelect('note.score') .where('note.userHost IS NULL') .andWhere(`note.createdAt > :date`, { date: new Date(Date.now() - day) }) .andWhere(`note.visibility = 'public'`) diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index e8b8b66da5..d13405597d 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -26,7 +26,7 @@ export const meta = { requireCredential: true, - kind: 'vote-write', + kind: 'write:votes', params: { noteId: { diff --git a/src/server/api/kinds.ts b/src/server/api/kinds.ts new file mode 100644 index 0000000000..03ed3e7cd8 --- /dev/null +++ b/src/server/api/kinds.ts @@ -0,0 +1,22 @@ +export const kinds = [ + 'read:account', + 'write:account', + 'read:blocks', + 'write:blocks', + 'read:drive', + 'write:drive', + 'read:favorites', + 'write:favorites', + 'read:following', + 'write:following', + 'read:messaging', + 'write:messaging', + 'read:mutes', + 'write:mutes', + 'write:notes', + 'read:notifications', + 'write:notifications', + 'read:reactions', + 'write:reactions', + 'write:votes' +]; diff --git a/src/server/api/openapi/description.ts b/src/server/api/openapi/description.ts index 04a0b4c719..0a4c8699d1 100644 --- a/src/server/api/openapi/description.ts +++ b/src/server/api/openapi/description.ts @@ -1,6 +1,49 @@ import config from '../../../config'; +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.** -export const description = ` ## Usage **APIはすべてPOSTでリクエスト/レスポンスともにJSON形式です。** 一部のAPIはリクエストに認証情報(APIキー)が必要です。リクエストの際に\`i\`というパラメータでAPIキーを添付してください。 @@ -44,4 +87,12 @@ APIキーの生成方法を擬似コードで表すと次のようになりま \`\`\` 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']; +} diff --git a/src/server/api/openapi/gen-spec.ts b/src/server/api/openapi/gen-spec.ts index 915fb5a6a3..d194c6c8a8 100644 --- a/src/server/api/openapi/gen-spec.ts +++ b/src/server/api/openapi/gen-spec.ts @@ -3,7 +3,7 @@ import { Context } from 'cafy'; import config from '../../../config'; import { errors as basicErrors } from './errors'; import { schemas } from './schemas'; -import { description } from './description'; +import { getDescription } from './description'; import { convertOpenApiSchema } from '../../../misc/schema'; export function genOpenapiSpec(lang = 'ja-JP') { @@ -13,7 +13,7 @@ export function genOpenapiSpec(lang = 'ja-JP') { info: { version: 'v1', title: 'Misskey API', - description: '**Misskey is a decentralized microblogging platform.**\n\n' + description, + description: getDescription(lang), 'x-logo': { url: '/assets/api-doc.png' } }, @@ -110,7 +110,10 @@ export function genOpenapiSpec(lang = 'ja-JP') { let desc = (endpoint.meta.desc ? endpoint.meta.desc[lang] : 'No description provided.') + '\n\n'; desc += `**Credential required**: *${endpoint.meta.requireCredential ? 'Yes' : 'No'}*`; - if (endpoint.meta.kind) desc += ` / **Permission**: *${endpoint.meta.kind}*`; + if (endpoint.meta.kind) { + const kind = endpoint.meta.kind; + desc += ` / **Permission**: *${kind}*`; + } const info = { operationId: endpoint.name, |