summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2020-03-28 19:52:41 +0900
committersyuilo <syuilotan@yahoo.co.jp>2020-03-28 19:52:41 +0900
commitf014a79f8dbb101a80d638d025a27bbb5ea02575 (patch)
treecc8af5c152e6470cddf1f34d083e2e0e222e7610 /src/server/api/endpoints
parentMerge branch 'develop' (diff)
parent12.27.0 (diff)
downloadsharkey-f014a79f8dbb101a80d638d025a27bbb5ea02575.tar.gz
sharkey-f014a79f8dbb101a80d638d025a27bbb5ea02575.tar.bz2
sharkey-f014a79f8dbb101a80d638d025a27bbb5ea02575.zip
Merge branch 'develop'
Diffstat (limited to 'src/server/api/endpoints')
-rw-r--r--src/server/api/endpoints/app/show.ts4
-rw-r--r--src/server/api/endpoints/drive/files/create.ts2
-rw-r--r--src/server/api/endpoints/i.ts4
-rw-r--r--src/server/api/endpoints/i/apps.ts41
-rw-r--r--src/server/api/endpoints/i/revoke-token.ts24
-rw-r--r--src/server/api/endpoints/i/update.ts4
-rw-r--r--src/server/api/endpoints/miauth/gen-token.ts55
-rw-r--r--src/server/api/endpoints/notes/create.ts3
-rw-r--r--src/server/api/endpoints/notes/polls/vote.ts6
-rw-r--r--src/server/api/endpoints/notifications/create.ts37
-rw-r--r--src/server/api/endpoints/users/groups/invite.ts3
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
});
});