summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-05-25 09:22:25 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-05-25 09:22:25 +0900
commitfad84203c02136a1ee28b55830d57df3c22dc312 (patch)
tree93f12bdf716b3e4d0a1f5f2e552a711c291e4db3 /src/server/api/endpoints
parentMerge branch 'develop' (diff)
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadmisskey-fad84203c02136a1ee28b55830d57df3c22dc312.tar.gz
misskey-fad84203c02136a1ee28b55830d57df3c22dc312.tar.bz2
misskey-fad84203c02136a1ee28b55830d57df3c22dc312.zip
Merge branch 'develop'
Diffstat (limited to 'src/server/api/endpoints')
-rw-r--r--src/server/api/endpoints/admin/delete-logs.ts13
-rw-r--r--src/server/api/endpoints/hashtags/trend.ts3
-rw-r--r--src/server/api/endpoints/i/update-email.ts33
-rw-r--r--src/server/api/endpoints/meta.ts2
-rw-r--r--src/server/api/endpoints/stats.ts8
-rw-r--r--src/server/api/endpoints/users/groups/transfer.ts93
-rw-r--r--src/server/api/endpoints/users/groups/update.ts69
7 files changed, 185 insertions, 36 deletions
diff --git a/src/server/api/endpoints/admin/delete-logs.ts b/src/server/api/endpoints/admin/delete-logs.ts
new file mode 100644
index 0000000000..26cf13c1f6
--- /dev/null
+++ b/src/server/api/endpoints/admin/delete-logs.ts
@@ -0,0 +1,13 @@
+import define from '../../define';
+import { Logs } from '../../../../models';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+};
+
+export default define(meta, async (ps) => {
+ await Logs.delete({});
+});
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 05d571851e..53a3514718 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -59,6 +59,7 @@ export default define(meta, async () => {
.where(`note.createdAt > :date`, { date: new Date(Date.now() - rangeA) })
.andWhere(`note.tags != '{}'`)
.select(['note.tags', 'note.userId'])
+ .cache(60000) // 1 min
.getMany();
if (tagNotes.length === 0) {
@@ -108,6 +109,7 @@ export default define(meta, async () => {
.where(':tag = ANY(note.tags)', { tag: tag })
.andWhere('note.createdAt < :lt', { lt: new Date(Date.now() - (interval * i)) })
.andWhere('note.createdAt > :gt', { gt: new Date(Date.now() - (interval * (i + 1))) })
+ .cache(60000) // 1 min
.getRawOne()
.then(x => parseInt(x.count, 10))
)));
@@ -119,6 +121,7 @@ export default define(meta, async () => {
.select('count(distinct note.userId)')
.where(':tag = ANY(note.tags)', { tag: tag })
.andWhere('note.createdAt > :gt', { gt: new Date(Date.now() - (interval * range)) })
+ .cache(60000) // 1 min
.getRawOne()
.then(x => parseInt(x.count, 10))
));
diff --git a/src/server/api/endpoints/i/update-email.ts b/src/server/api/endpoints/i/update-email.ts
index d4b9721d82..56284499d3 100644
--- a/src/server/api/endpoints/i/update-email.ts
+++ b/src/server/api/endpoints/i/update-email.ts
@@ -1,15 +1,13 @@
import $ from 'cafy';
import { publishMainStream } from '../../../../services/stream';
import define from '../../define';
-import * as nodemailer from 'nodemailer';
-import { fetchMeta } from '../../../../misc/fetch-meta';
import rndstr from 'rndstr';
import config from '../../../../config';
import * as ms from 'ms';
import * as bcrypt from 'bcryptjs';
-import { apiLogger } from '../../logger';
import { Users, UserProfiles } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
+import { sendEmail } from '../../../../services/send-email';
export const meta = {
requireCredential: true,
@@ -63,36 +61,9 @@ export default define(meta, async (ps, user) => {
emailVerifyCode: code
});
- const meta = await fetchMeta(true);
-
- const enableAuth = meta.smtpUser != null && meta.smtpUser !== '';
-
- const transporter = nodemailer.createTransport({
- host: meta.smtpHost,
- port: meta.smtpPort,
- secure: meta.smtpSecure,
- ignoreTLS: !enableAuth,
- auth: enableAuth ? {
- user: meta.smtpUser,
- pass: meta.smtpPass
- } : undefined
- } as any);
-
const link = `${config.url}/verify-email/${code}`;
- transporter.sendMail({
- from: meta.email!,
- to: ps.email,
- subject: meta.name || 'Misskey',
- text: `To verify email, please click this link: ${link}`
- }, (error, info) => {
- if (error) {
- apiLogger.error(error);
- return;
- }
-
- apiLogger.info('Message sent: %s', info.messageId);
- });
+ sendEmail(ps.email, 'Email verification', `To verify email, please click this link: ${link}`);
}
return iObj;
diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts
index 4f418c63c1..d18543f56a 100644
--- a/src/server/api/endpoints/meta.ts
+++ b/src/server/api/endpoints/meta.ts
@@ -94,7 +94,7 @@ export const meta = {
export default define(meta, async (ps, me) => {
const instance = await fetchMeta(true);
- const emojis = await Emojis.find({ host: null });
+ const emojis = await Emojis.find({ where: { host: null }, cache: 3600000 }); // 1 hour
const response: any = {
maintainerName: instance.maintainerName,
diff --git a/src/server/api/endpoints/stats.ts b/src/server/api/endpoints/stats.ts
index f85109b4b4..4dca62445f 100644
--- a/src/server/api/endpoints/stats.ts
+++ b/src/server/api/endpoints/stats.ts
@@ -57,10 +57,10 @@ export default define(meta, async () => {
driveUsageLocal,
driveUsageRemote
] = await Promise.all([
- Notes.count(),
- Notes.count({ userHost: null }),
- Users.count(),
- Users.count({ host: null }),
+ Notes.count({ cache: 3600000 }), // 1 hour
+ Notes.count({ where: { userHost: null }, cache: 3600000 }),
+ Users.count({ cache: 3600000 }),
+ Users.count({ where: { host: null }, cache: 3600000 }),
federationChart.getChart('hour', 1).then(chart => chart.instance.total[0]),
driveChart.getChart('hour', 1).then(chart => chart.local.totalSize[0]),
driveChart.getChart('hour', 1).then(chart => chart.remote.totalSize[0]),
diff --git a/src/server/api/endpoints/users/groups/transfer.ts b/src/server/api/endpoints/users/groups/transfer.ts
new file mode 100644
index 0000000000..b4284ab484
--- /dev/null
+++ b/src/server/api/endpoints/users/groups/transfer.ts
@@ -0,0 +1,93 @@
+import $ from 'cafy';
+import { ID } from '../../../../../misc/cafy-id';
+import define from '../../../define';
+import { ApiError } from '../../../error';
+import { getUser } from '../../../common/getters';
+import { UserGroups, UserGroupJoinings } from '../../../../../models';
+import { types, bool } from '../../../../../misc/schema';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '指定したユーザーグループを指定したユーザーグループ内のユーザーに譲渡します。',
+ 'en-US': 'Transfer user group ownership to another user in group.'
+ },
+
+ tags: ['groups', 'users'],
+
+ requireCredential: true,
+
+ kind: 'write:user-groups',
+
+ params: {
+ groupId: {
+ validator: $.type(ID),
+ },
+
+ userId: {
+ validator: $.type(ID),
+ desc: {
+ 'ja-JP': '対象のユーザーのID',
+ 'en-US': 'Target user ID'
+ }
+ },
+ },
+
+ res: {
+ type: types.object,
+ optional: bool.false, nullable: bool.false,
+ ref: 'UserGroup',
+ },
+
+ errors: {
+ noSuchGroup: {
+ message: 'No such group.',
+ code: 'NO_SUCH_GROUP',
+ id: '8e31d36b-2f88-4ccd-a438-e2d78a9162db'
+ },
+
+ noSuchUser: {
+ message: 'No such user.',
+ code: 'NO_SUCH_USER',
+ id: '711f7ebb-bbb9-4dfa-b540-b27809fed5e9'
+ },
+
+ noSuchGroupMember: {
+ message: 'No such group member.',
+ code: 'NO_SUCH_GROUP_MEMBER',
+ id: 'd31bebee-196d-42c2-9a3e-9474d4be6cc4'
+ },
+ }
+};
+
+export default define(meta, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await UserGroups.findOne({
+ id: ps.groupId,
+ userId: me.id,
+ });
+
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
+
+ // Fetch the user
+ const user = await getUser(ps.userId).catch(e => {
+ if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
+ throw e;
+ });
+
+ const joining = await UserGroupJoinings.findOne({
+ userGroupId: userGroup.id,
+ userId: user.id
+ });
+
+ if (joining == null) {
+ throw new ApiError(meta.errors.noSuchGroupMember);
+ }
+
+ await UserGroups.update(userGroup.id, {
+ userId: ps.userId
+ });
+
+ return await UserGroups.pack(userGroup.id);
+});
diff --git a/src/server/api/endpoints/users/groups/update.ts b/src/server/api/endpoints/users/groups/update.ts
new file mode 100644
index 0000000000..bc974621a3
--- /dev/null
+++ b/src/server/api/endpoints/users/groups/update.ts
@@ -0,0 +1,69 @@
+import $ from 'cafy';
+import { ID } from '../../../../../misc/cafy-id';
+import define from '../../../define';
+import { ApiError } from '../../../error';
+import { UserGroups } from '../../../../../models';
+import { types, bool } from '../../../../../misc/schema';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '指定したユーザーグループを更新します。',
+ 'en-US': 'Update a user group'
+ },
+
+ tags: ['groups'],
+
+ requireCredential: true,
+
+ kind: 'write:user-groups',
+
+ params: {
+ groupId: {
+ validator: $.type(ID),
+ desc: {
+ 'ja-JP': '対象となるユーザーグループのID',
+ 'en-US': 'ID of target user group'
+ }
+ },
+
+ name: {
+ validator: $.str.range(1, 100),
+ desc: {
+ 'ja-JP': 'このユーザーグループの名前',
+ 'en-US': 'name of this user group'
+ }
+ }
+ },
+
+ res: {
+ type: types.object,
+ optional: bool.false, nullable: bool.false,
+ ref: 'UserGroup',
+ },
+
+ errors: {
+ noSuchGroup: {
+ message: 'No such group.',
+ code: 'NO_SUCH_GROUP',
+ id: '9081cda3-7a9e-4fac-a6ce-908d70f282f6'
+ },
+ }
+};
+
+export default define(meta, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await UserGroups.findOne({
+ id: ps.groupId,
+ userId: me.id
+ });
+
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
+
+ await UserGroups.update(userGroup.id, {
+ name: ps.name
+ });
+
+ return await UserGroups.pack(userGroup.id);
+});