summaryrefslogtreecommitdiff
path: root/src/server/api
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-04-15 12:23:20 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-04-15 12:23:20 +0900
commitd040dc19bce8635dc9a0646a83c44ad78e2855d7 (patch)
tree6071ab5d3893f3e4453c887764d646aa6483df33 /src/server/api
parentMerge branch 'develop' (diff)
parent11.0.2 (diff)
downloadmisskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.tar.gz
misskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.tar.bz2
misskey-d040dc19bce8635dc9a0646a83c44ad78e2855d7.zip
Merge branch 'develop'
Diffstat (limited to 'src/server/api')
-rw-r--r--src/server/api/endpoints/app/create.ts6
-rw-r--r--src/server/api/endpoints/i/favorites.ts2
-rw-r--r--src/server/api/endpoints/messaging/history.ts2
-rw-r--r--src/server/api/endpoints/messaging/messages.ts2
-rw-r--r--src/server/api/endpoints/messaging/messages/create.ts2
-rw-r--r--src/server/api/endpoints/messaging/messages/delete.ts2
-rw-r--r--src/server/api/endpoints/messaging/messages/read.ts2
-rw-r--r--src/server/api/endpoints/notes/favorites/create.ts2
-rw-r--r--src/server/api/endpoints/notes/favorites/delete.ts2
-rw-r--r--src/server/api/endpoints/notes/featured.ts1
-rw-r--r--src/server/api/endpoints/notes/polls/vote.ts2
-rw-r--r--src/server/api/kinds.ts22
-rw-r--r--src/server/api/openapi/description.ts55
-rw-r--r--src/server/api/openapi/gen-spec.ts9
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,