diff options
Diffstat (limited to 'src/server/api/endpoints')
| -rw-r--r-- | src/server/api/endpoints/app/show.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/drive/files/create.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/i.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/apps.ts | 41 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/revoke-token.ts | 24 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/update.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/miauth/gen-token.ts | 55 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/create.ts | 3 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/polls/vote.ts | 6 | ||||
| -rw-r--r-- | src/server/api/endpoints/notifications/create.ts | 37 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/groups/invite.ts | 3 |
11 files changed, 171 insertions, 12 deletions
diff --git a/src/server/api/endpoints/app/show.ts b/src/server/api/endpoints/app/show.ts index 2c8cdbe396..e3f3a1eaa4 100644 --- a/src/server/api/endpoints/app/show.ts +++ b/src/server/api/endpoints/app/show.ts @@ -28,8 +28,8 @@ export const meta = { } }; -export default define(meta, async (ps, user, app) => { - const isSecure = user != null && app == null; +export default define(meta, async (ps, user, token) => { + const isSecure = token == null; // Lookup app const ap = await Apps.findOne(ps.appId); diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts index 3c5c982534..c0bb6bcc6e 100644 --- a/src/server/api/endpoints/drive/files/create.ts +++ b/src/server/api/endpoints/drive/files/create.ts @@ -78,7 +78,7 @@ export const meta = { } }; -export default define(meta, async (ps, user, app, file, cleanup) => { +export default define(meta, async (ps, user, _, file, cleanup) => { // Get 'name' parameter let name = ps.name || file.originalname; if (name !== undefined && name !== null) { diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts index d22de40c69..02d59682b8 100644 --- a/src/server/api/endpoints/i.ts +++ b/src/server/api/endpoints/i.ts @@ -19,8 +19,8 @@ export const meta = { }, }; -export default define(meta, async (ps, user, app) => { - const isSecure = user != null && app == null; +export default define(meta, async (ps, user, token) => { + const isSecure = token == null; return await Users.pack(user, user, { detail: true, diff --git a/src/server/api/endpoints/i/apps.ts b/src/server/api/endpoints/i/apps.ts new file mode 100644 index 0000000000..38299cd0dc --- /dev/null +++ b/src/server/api/endpoints/i/apps.ts @@ -0,0 +1,41 @@ +import $ from 'cafy'; +import define from '../../define'; +import { AccessTokens } from '../../../../models'; + +export const meta = { + requireCredential: true as const, + + secure: true, + + params: { + sort: { + validator: $.optional.str.or([ + '+createdAt', + '-createdAt', + '+lastUsedAt', + '-lastUsedAt', + ]), + }, + } +}; + +export default define(meta, async (ps, user) => { + const query = AccessTokens.createQueryBuilder('token'); + + switch (ps.sort) { + case '+createdAt': query.orderBy('token.createdAt', 'DESC'); break; + case '-createdAt': query.orderBy('token.createdAt', 'ASC'); break; + case '+lastUsedAt': query.andWhere('token.lastUsedAt IS NOT NULL').orderBy('token.lastUsedAt', 'DESC'); break; + case '-lastUsedAt': query.andWhere('token.lastUsedAt IS NOT NULL').orderBy('token.lastUsedAt', 'ASC'); break; + default: query.orderBy('token.id', 'ASC'); break; + } + + const tokens = await query.getMany(); + + return await Promise.all(tokens.map(token => ({ + id: token.id, + name: token.name, + createdAt: token.createdAt, + lastUsedAt: token.lastUsedAt, + }))); +}); diff --git a/src/server/api/endpoints/i/revoke-token.ts b/src/server/api/endpoints/i/revoke-token.ts new file mode 100644 index 0000000000..ce688c5755 --- /dev/null +++ b/src/server/api/endpoints/i/revoke-token.ts @@ -0,0 +1,24 @@ +import $ from 'cafy'; +import define from '../../define'; +import { AccessTokens } from '../../../../models'; +import { ID } from '../../../../misc/cafy-id'; + +export const meta = { + requireCredential: true as const, + + secure: true, + + params: { + tokenId: { + validator: $.type(ID) + } + } +}; + +export default define(meta, async (ps, user) => { + const token = await AccessTokens.findOne(ps.tokenId); + + if (token) { + AccessTokens.delete(token.id); + } +}); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 5c4a9576e1..c90f050251 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -178,8 +178,8 @@ export const meta = { } }; -export default define(meta, async (ps, user, app) => { - const isSecure = user != null && app == null; +export default define(meta, async (ps, user, token) => { + const isSecure = token == null; const updates = {} as Partial<User>; const profileUpdates = {} as Partial<UserProfile>; diff --git a/src/server/api/endpoints/miauth/gen-token.ts b/src/server/api/endpoints/miauth/gen-token.ts new file mode 100644 index 0000000000..efa8680805 --- /dev/null +++ b/src/server/api/endpoints/miauth/gen-token.ts @@ -0,0 +1,55 @@ +import rndstr from 'rndstr'; +import $ from 'cafy'; +import define from '../../define'; +import { AccessTokens } from '../../../../models'; +import { genId } from '../../../../misc/gen-id'; + +export const meta = { + tags: ['auth'], + + requireCredential: true as const, + + secure: true, + + params: { + session: { + validator: $.str + }, + + name: { + validator: $.nullable.optional.str + }, + + description: { + validator: $.nullable.optional.str, + }, + + iconUrl: { + validator: $.nullable.optional.str, + }, + + permission: { + validator: $.arr($.str).unique(), + }, + }, +}; + +export default define(meta, async (ps, user) => { + // Generate access token + const accessToken = rndstr('a-zA-Z0-9', 32); + + // Insert access token doc + await AccessTokens.save({ + id: genId(), + createdAt: new Date(), + lastUsedAt: new Date(), + session: ps.session, + userId: user.id, + token: accessToken, + hash: accessToken, + name: ps.name, + description: ps.description, + iconUrl: ps.iconUrl, + permission: ps.permission, + }); +}); diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index e983ad6fd6..cccf138add 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -209,7 +209,7 @@ export const meta = { } }; -export default define(meta, async (ps, user, app) => { +export default define(meta, async (ps, user) => { let visibleUsers: User[] = []; if (ps.visibleUserIds) { visibleUsers = (await Promise.all(ps.visibleUserIds.map(id => Users.findOne(id)))) @@ -281,7 +281,6 @@ export default define(meta, async (ps, user, app) => { reply, renote, cw: ps.cw, - app, viaMobile: ps.viaMobile, localOnly: ps.localOnly, visibility: ps.visibility, diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index 3c5492f8ee..45210b5a6e 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -132,7 +132,8 @@ export default define(meta, async (ps, user) => { }); // Notify - createNotification(note.userId, user.id, 'pollVote', { + createNotification(note.userId, 'pollVote', { + notifierId: user.id, noteId: note.id, choice: ps.choice }); @@ -143,7 +144,8 @@ export default define(meta, async (ps, user) => { userId: Not(user.id), }).then(watchers => { for (const watcher of watchers) { - createNotification(watcher.userId, user.id, 'pollVote', { + createNotification(watcher.userId, 'pollVote', { + notifierId: user.id, noteId: note.id, choice: ps.choice }); diff --git a/src/server/api/endpoints/notifications/create.ts b/src/server/api/endpoints/notifications/create.ts new file mode 100644 index 0000000000..fed422b645 --- /dev/null +++ b/src/server/api/endpoints/notifications/create.ts @@ -0,0 +1,37 @@ +import $ from 'cafy'; +import define from '../../define'; +import { createNotification } from '../../../../services/create-notification'; + +export const meta = { + tags: ['notifications'], + + requireCredential: true as const, + + kind: 'write:notifications', + + params: { + body: { + validator: $.str + }, + + header: { + validator: $.optional.nullable.str + }, + + icon: { + validator: $.optional.nullable.str + }, + }, + + errors: { + } +}; + +export default define(meta, async (ps, user, token) => { + createNotification(user.id, 'app', { + appAccessTokenId: token.id, + customBody: ps.body, + customHeader: ps.header, + customIcon: ps.icon, + }); +}); diff --git a/src/server/api/endpoints/users/groups/invite.ts b/src/server/api/endpoints/users/groups/invite.ts index da0fd1c2ca..a0f5091b07 100644 --- a/src/server/api/endpoints/users/groups/invite.ts +++ b/src/server/api/endpoints/users/groups/invite.ts @@ -104,7 +104,8 @@ export default define(meta, async (ps, me) => { } as UserGroupInvitation); // 通知を作成 - createNotification(user.id, me.id, 'groupInvited', { + createNotification(user.id, 'groupInvited', { + notifierId: me.id, userGroupInvitationId: invitation.id }); }); |