Use PostgreSQL instead of MongoDB (#4572)
* wip * Update note.ts * Update timeline.ts * Update core.ts * wip * Update generate-visibility-query.ts * wip * wip * wip * wip * wip * Update global-timeline.ts * wip * wip * wip * Update vote.ts * wip * wip * Update create.ts * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update files.ts * wip * wip * Update CONTRIBUTING.md * wip * wip * wip * wip * wip * wip * wip * wip * Update read-notification.ts * wip * wip * wip * wip * wip * wip * wip * Update cancel.ts * wip * wip * wip * Update show.ts * wip * wip * Update gen-id.ts * Update create.ts * Update id.ts * wip * wip * wip * wip * wip * wip * wip * Docker: Update files about Docker (#4599) * Docker: Use cache if files used by `yarn install` was not updated This patch reduces the number of times to installing node_modules. For example, `yarn install` step will be skipped when only ".config/default.yml" is updated. * Docker: Migrate MongoDB to Postgresql Misskey uses Postgresql as a database instead of Mongodb since version 11. * Docker: Uncomment about data persistence This patch will save a lot of databases. * wip * wip * wip * Update activitypub.ts * wip * wip * wip * Update logs.ts * wip * Update drive-file.ts * Update register.ts * wip * wip * Update mentions.ts * wip * wip * wip * Update recommendation.ts * wip * Update index.ts * wip * Update recommendation.ts * Doc: Update docker.ja.md and docker.en.md (#1) (#4608) Update how to set up misskey. * wip * ✌️ * wip * Update note.ts * Update postgre.ts * wip * wip * wip * wip * Update add-file.ts * wip * wip * wip * Clean up * Update logs.ts * wip * 🍕 * wip * Ad notes * wip * Update api-visibility.ts * Update note.ts * Update add-file.ts * tests * tests * Update postgre.ts * Update utils.ts * wip * wip * Refactor * wip * Refactor * wip * wip * Update show-users.ts * Update update-instance.ts * wip * Update feed.ts * Update outbox.ts * Update outbox.ts * Update user.ts * wip * Update list.ts * Update update-hashtag.ts * wip * Update update-hashtag.ts * Refactor * Update update.ts * wip * wip * ✌️ * clean up * docs * Update push.ts * wip * Update api.ts * wip * ✌️ * Update make-pagination-query.ts * ✌️ * Delete hashtags.ts * Update instances.ts * Update instances.ts * Update create.ts * Update search.ts * Update reversi-game.ts * Update signup.ts * Update user.ts * id * Update example.yml * 🎨 * objectid * fix * reversi * reversi * Fix bug of chart engine * Add test of chart engine * Improve test * Better testing * Improve chart engine * Refactor * Add test of chart engine * Refactor * Add chart test * Fix bug * コミットし忘れ * Refactoring * ✌️ * Add tests * Add test * Extarct note tests * Refactor * 存在しないユーザーにメンションできなくなっていた問題を修正 * Fix bug * Update update-meta.ts * Fix bug * Update mention.vue * Fix bug * Update meta.ts * Update CONTRIBUTING.md * Fix bug * Fix bug * Fix bug * Clean up * Clean up * Update notification.ts * Clean up * Add mute tests * Add test * Refactor * Add test * Fix test * Refactor * Refactor * Add tests * Update utils.ts * Update utils.ts * Fix test * Update package.json * Update update.ts * Update manifest.ts * Fix bug * Fix bug * Add test * 🎨 * Update endpoint permissions * Updaye permisison * Update person.ts #4299 * データベースと同期しないように * Fix bug * Fix bug * Update reversi-game.ts * Use a feature of Node v11.7.0 to extract a public key (#4644) * wip * wip * ✌️ * Refactoring #1540 * test * test * test * test * test * test * test * Fix bug * Fix test * 🍣 * wip * #4471 * Add test for #4335 * Refactor * Fix test * Add tests * 🕓 * Fix bug * Add test * Add test * rename * Fix bug
This commit is contained in:
@ -1,7 +1,8 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import Report, { packMany } from '../../../../models/abuse-user-report';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import { AbuseUserReports } from '../../../../models';
|
||||
import { makePaginationQuery } from '../../common/make-pagination-query';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -17,37 +18,18 @@ export const meta = {
|
||||
|
||||
sinceId: {
|
||||
validator: $.optional.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
untilId: {
|
||||
validator: $.optional.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const sort = {
|
||||
_id: -1
|
||||
};
|
||||
const query = {} as any;
|
||||
if (ps.sinceId) {
|
||||
sort._id = 1;
|
||||
query._id = {
|
||||
$gt: ps.sinceId
|
||||
};
|
||||
} else if (ps.untilId) {
|
||||
query._id = {
|
||||
$lt: ps.untilId
|
||||
};
|
||||
}
|
||||
const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId);
|
||||
|
||||
const reports = await Report
|
||||
.find(query, {
|
||||
limit: ps.limit,
|
||||
sort: sort
|
||||
});
|
||||
const reports = await query.take(ps.limit).getMany();
|
||||
|
||||
return await packMany(reports);
|
||||
return await AbuseUserReports.packMany(reports);
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import File, { packMany } from '../../../../../models/drive-file';
|
||||
import define from '../../../define';
|
||||
import { fallback } from '../../../../../prelude/symbol';
|
||||
import { DriveFiles } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -41,27 +41,25 @@ export const meta = {
|
||||
};
|
||||
|
||||
const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
|
||||
'+createdAt': { uploadDate: -1 },
|
||||
'-createdAt': { uploadDate: 1 },
|
||||
'+size': { length: -1 },
|
||||
'-size': { length: 1 },
|
||||
[fallback]: { _id: -1 }
|
||||
'+createdAt': { createdAt: -1 },
|
||||
'-createdAt': { createdAt: 1 },
|
||||
'+size': { size: -1 },
|
||||
'-size': { size: 1 },
|
||||
[fallback]: { id: -1 }
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const q = {
|
||||
'metadata.deletedAt': { $exists: false },
|
||||
} as any;
|
||||
const q = {} as any;
|
||||
|
||||
if (ps.origin == 'local') q['metadata._user.host'] = null;
|
||||
if (ps.origin == 'remote') q['metadata._user.host'] = { $ne: null };
|
||||
if (ps.origin == 'local') q['userHost'] = null;
|
||||
if (ps.origin == 'remote') q['userHost'] = { $ne: null };
|
||||
|
||||
const files = await File
|
||||
.find(q, {
|
||||
limit: ps.limit,
|
||||
sort: sort[ps.sort] || sort[fallback],
|
||||
skip: ps.offset
|
||||
});
|
||||
const files = await DriveFiles.find({
|
||||
where: q,
|
||||
take: ps.limit,
|
||||
order: sort[ps.sort] || sort[fallback],
|
||||
skip: ps.offset
|
||||
});
|
||||
|
||||
return await packMany(files, { detail: true, withUser: true, self: true });
|
||||
return await DriveFiles.packMany(files, { detail: true, withUser: true, self: true });
|
||||
});
|
||||
|
@ -1,8 +1,8 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../../misc/cafy-id';
|
||||
import define from '../../../define';
|
||||
import DriveFile from '../../../../../models/drive-file';
|
||||
import { ApiError } from '../../../error';
|
||||
import { DriveFiles } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -13,7 +13,6 @@ export const meta = {
|
||||
params: {
|
||||
fileId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
},
|
||||
|
||||
@ -27,9 +26,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const file = await DriveFile.findOne({
|
||||
_id: ps.fileId
|
||||
});
|
||||
const file = await DriveFiles.findOne(ps.fileId);
|
||||
|
||||
if (file == null) {
|
||||
throw new ApiError(meta.errors.noSuchFile);
|
||||
|
@ -1,7 +1,8 @@
|
||||
import $ from 'cafy';
|
||||
import Emoji from '../../../../../models/emoji';
|
||||
import define from '../../../define';
|
||||
import { detectUrlMine } from '../../../../../misc/detect-url-mine';
|
||||
import { Emojis } from '../../../../../models';
|
||||
import { genId } from '../../../../../misc/gen-id';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -32,7 +33,8 @@ export const meta = {
|
||||
export default define(meta, async (ps) => {
|
||||
const type = await detectUrlMine(ps.url);
|
||||
|
||||
const emoji = await Emoji.insert({
|
||||
const emoji = await Emojis.save({
|
||||
id: genId(),
|
||||
updatedAt: new Date(),
|
||||
name: ps.name,
|
||||
host: null,
|
||||
@ -42,6 +44,6 @@ export default define(meta, async (ps) => {
|
||||
});
|
||||
|
||||
return {
|
||||
id: emoji._id
|
||||
id: emoji.id
|
||||
};
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import $ from 'cafy';
|
||||
import Emoji from '../../../../../models/emoji';
|
||||
import define from '../../../define';
|
||||
import { Emojis } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -21,12 +21,12 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const emojis = await Emoji.find({
|
||||
const emojis = await Emojis.find({
|
||||
host: ps.host
|
||||
});
|
||||
|
||||
return emojis.map(e => ({
|
||||
id: e._id,
|
||||
id: e.id,
|
||||
name: e.name,
|
||||
aliases: e.aliases,
|
||||
host: e.host,
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import Emoji from '../../../../../models/emoji';
|
||||
import define from '../../../define';
|
||||
import ID from '../../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../../misc/cafy-id';
|
||||
import { Emojis } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -21,13 +21,9 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const emoji = await Emoji.findOne({
|
||||
_id: ps.id
|
||||
});
|
||||
const emoji = await Emojis.findOne(ps.id);
|
||||
|
||||
if (emoji == null) throw new Error('emoji not found');
|
||||
|
||||
await Emoji.remove({ _id: emoji._id });
|
||||
|
||||
return;
|
||||
await Emojis.delete(emoji.id);
|
||||
});
|
||||
|
@ -1,8 +1,8 @@
|
||||
import $ from 'cafy';
|
||||
import Emoji from '../../../../../models/emoji';
|
||||
import define from '../../../define';
|
||||
import ID from '../../../../../misc/cafy-id';
|
||||
import { detectUrlMine } from '../../../../../misc/detect-url-mine';
|
||||
import { ID } from '../../../../../misc/cafy-id';
|
||||
import { Emojis } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -34,23 +34,17 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const emoji = await Emoji.findOne({
|
||||
_id: ps.id
|
||||
});
|
||||
const emoji = await Emojis.findOne(ps.id);
|
||||
|
||||
if (emoji == null) throw new Error('emoji not found');
|
||||
|
||||
const type = await detectUrlMine(ps.url);
|
||||
|
||||
await Emoji.update({ _id: emoji._id }, {
|
||||
$set: {
|
||||
updatedAt: new Date(),
|
||||
name: ps.name,
|
||||
aliases: ps.aliases,
|
||||
url: ps.url,
|
||||
type,
|
||||
}
|
||||
await Emojis.update(emoji.id, {
|
||||
updatedAt: new Date(),
|
||||
name: ps.name,
|
||||
aliases: ps.aliases,
|
||||
url: ps.url,
|
||||
type,
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,8 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import define from '../../../define';
|
||||
import Following from '../../../../../models/following';
|
||||
import User from '../../../../../models/user';
|
||||
import deleteFollowing from '../../../../../services/following/delete';
|
||||
import { Followings, Users } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -18,13 +17,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const followings = await Following.find({
|
||||
'_follower.host': ps.host
|
||||
const followings = await Followings.find({
|
||||
followerHost: ps.host
|
||||
});
|
||||
|
||||
const pairs = await Promise.all(followings.map(f => Promise.all([
|
||||
User.findOne({ _id: f.followerId }),
|
||||
User.findOne({ _id: f.followeeId })
|
||||
Users.findOne(f.followerId),
|
||||
Users.findOne(f.followeeId)
|
||||
])));
|
||||
|
||||
for (const pair of pairs) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import $ from 'cafy';
|
||||
import define from '../../../define';
|
||||
import Instance from '../../../../../models/instance';
|
||||
import { Instances } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -13,10 +13,6 @@ export const meta = {
|
||||
validator: $.str
|
||||
},
|
||||
|
||||
isBlocked: {
|
||||
validator: $.bool
|
||||
},
|
||||
|
||||
isClosed: {
|
||||
validator: $.bool
|
||||
},
|
||||
@ -24,18 +20,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const instance = await Instance.findOne({ host: ps.host });
|
||||
const instance = await Instances.findOne({ host: ps.host });
|
||||
|
||||
if (instance == null) {
|
||||
throw new Error('instance not found');
|
||||
}
|
||||
|
||||
Instance.update({ host: ps.host }, {
|
||||
$set: {
|
||||
isBlocked: ps.isBlocked,
|
||||
isMarkedAsClosed: ps.isClosed
|
||||
}
|
||||
Instances.update({ host: ps.host }, {
|
||||
isMarkedAsClosed: ps.isClosed
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,6 +1,7 @@
|
||||
import rndstr from 'rndstr';
|
||||
import RegistrationTicket from '../../../../models/registration-tickets';
|
||||
import define from '../../define';
|
||||
import { RegistrationTickets } from '../../../../models';
|
||||
import { genId } from '../../../../misc/gen-id';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -18,7 +19,8 @@ export const meta = {
|
||||
export default define(meta, async (ps) => {
|
||||
const code = rndstr({ length: 5, chars: '0-9' });
|
||||
|
||||
await RegistrationTicket.insert({
|
||||
await RegistrationTickets.save({
|
||||
id: genId(),
|
||||
createdAt: new Date(),
|
||||
code: code
|
||||
});
|
||||
|
@ -1,6 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import define from '../../define';
|
||||
import Log from '../../../../models/log';
|
||||
import { Logs } from '../../../../models';
|
||||
import { Brackets } from 'typeorm';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -27,41 +28,44 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const sort = {
|
||||
_id: -1
|
||||
};
|
||||
const query = {} as any;
|
||||
const query = Logs.createQueryBuilder('log');
|
||||
|
||||
if (ps.level) query.andWhere('log.level = :level', { level: ps.level });
|
||||
|
||||
if (ps.level) query.level = ps.level;
|
||||
if (ps.domain) {
|
||||
for (const d of ps.domain.split(' ')) {
|
||||
const qs: any[] = [];
|
||||
let i = 0;
|
||||
for (const sd of (d.startsWith('-') ? d.substr(1) : d).split('.')) {
|
||||
qs.push({
|
||||
[`domain.${i}`]: d.startsWith('-') ? { $ne: sd } : sd
|
||||
});
|
||||
i++;
|
||||
}
|
||||
if (d.startsWith('-')) {
|
||||
if (query['$and'] == null) query['$and'] = [];
|
||||
query['$and'].push({
|
||||
$and: qs
|
||||
});
|
||||
} else {
|
||||
if (query['$or'] == null) query['$or'] = [];
|
||||
query['$or'].push({
|
||||
$and: qs
|
||||
});
|
||||
}
|
||||
const whiteDomains = ps.domain.split(' ').filter(x => !x.startsWith('-'));
|
||||
const blackDomains = ps.domain.split(' ').filter(x => x.startsWith('-'));
|
||||
|
||||
if (whiteDomains.length > 0) {
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const whiteDomain of whiteDomains) {
|
||||
let i = 0;
|
||||
for (const subDomain of whiteDomain.split('.')) {
|
||||
const p = `whiteSubDomain_${subDomain}_${i}`;
|
||||
// SQL is 1 based, so we need '+ 1'
|
||||
qb.orWhere(`log.domain[${i + 1}] = :${p}`, { [p]: subDomain });
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
if (blackDomains.length > 0) {
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const blackDomain of blackDomains) {
|
||||
let i = 0;
|
||||
for (const subDomain of blackDomain.split('.')) {
|
||||
const p = `blackSubDomain_${subDomain}_${i}`;
|
||||
// SQL is 1 based, so we need '+ 1'
|
||||
qb.andWhere(`log.domain[${i + 1}] != :${p}`, { [p]: subDomain });
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
const logs = await Log
|
||||
.find(query, {
|
||||
limit: ps.limit,
|
||||
sort: sort
|
||||
});
|
||||
const logs = await query.take(ps.limit).getMany();
|
||||
|
||||
return logs;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../../misc/cafy-id';
|
||||
import define from '../../../define';
|
||||
import User from '../../../../../models/user';
|
||||
import { Users } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.update({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isModerator: true
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isModerator: true
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../../misc/cafy-id';
|
||||
import define from '../../../define';
|
||||
import User from '../../../../../models/user';
|
||||
import { Users } from '../../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.update({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isModerator: false
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isModerator: false
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import AbuseUserReport from '../../../../models/abuse-user-report';
|
||||
import { AbuseUserReports } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -12,23 +12,16 @@ export const meta = {
|
||||
params: {
|
||||
reportId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const report = await AbuseUserReport.findOne({
|
||||
_id: ps.reportId
|
||||
});
|
||||
const report = await AbuseUserReports.findOne(ps.reportId);
|
||||
|
||||
if (report == null) {
|
||||
throw new Error('report not found');
|
||||
}
|
||||
|
||||
await AbuseUserReport.remove({
|
||||
_id: report._id
|
||||
});
|
||||
|
||||
return;
|
||||
await AbuseUserReports.delete(report.id);
|
||||
});
|
||||
|
@ -1,9 +1,9 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import * as bcrypt from 'bcryptjs';
|
||||
import rndstr from 'rndstr';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -18,7 +18,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to suspend'
|
||||
@ -28,9 +27,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
@ -45,12 +42,8 @@ export default define(meta, async (ps) => {
|
||||
// Generate hash of password
|
||||
const hash = bcrypt.hashSync(passwd);
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
password: hash
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
password: hash
|
||||
});
|
||||
|
||||
return {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -16,7 +16,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to suspend'
|
||||
@ -26,9 +25,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
|
@ -1,7 +1,6 @@
|
||||
import $ from 'cafy';
|
||||
import User, { pack } from '../../../../models/user';
|
||||
import define from '../../define';
|
||||
import { fallback } from '../../../../prelude/symbol';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
@ -55,51 +54,38 @@ export const meta = {
|
||||
}
|
||||
};
|
||||
|
||||
const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
|
||||
'+follower': { followersCount: -1 },
|
||||
'-follower': { followersCount: 1 },
|
||||
'+createdAt': { createdAt: -1 },
|
||||
'-createdAt': { createdAt: 1 },
|
||||
'+updatedAt': { updatedAt: -1 },
|
||||
'-updatedAt': { updatedAt: 1 },
|
||||
[fallback]: { _id: -1 }
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
const q = {
|
||||
$and: []
|
||||
} as any;
|
||||
const query = Users.createQueryBuilder('user');
|
||||
|
||||
// state
|
||||
q.$and.push(
|
||||
ps.state == 'admin' ? { isAdmin: true } :
|
||||
ps.state == 'moderator' ? { isModerator: true } :
|
||||
ps.state == 'adminOrModerator' ? {
|
||||
$or: [{
|
||||
isAdmin: true
|
||||
}, {
|
||||
isModerator: true
|
||||
}]
|
||||
} :
|
||||
ps.state == 'verified' ? { isVerified: true } :
|
||||
ps.state == 'silenced' ? { isSilenced: true } :
|
||||
ps.state == 'suspended' ? { isSuspended: true } :
|
||||
{}
|
||||
);
|
||||
switch (ps.state) {
|
||||
case 'admin': query.where('user.isAdmin = TRUE'); break;
|
||||
case 'moderator': query.where('user.isModerator = TRUE'); break;
|
||||
case 'adminOrModerator': query.where('user.isAdmin = TRUE OR isModerator = TRUE'); break;
|
||||
case 'verified': query.where('user.isVerified = TRUE'); break;
|
||||
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
||||
case 'silenced': query.where('user.isSilenced = TRUE'); break;
|
||||
case 'suspended': query.where('user.isSuspended = TRUE'); break;
|
||||
}
|
||||
|
||||
// origin
|
||||
q.$and.push(
|
||||
ps.origin == 'local' ? { host: null } :
|
||||
ps.origin == 'remote' ? { host: { $ne: null } } :
|
||||
{}
|
||||
);
|
||||
switch (ps.origin) {
|
||||
case 'local': query.andWhere('user.host IS NULL'); break;
|
||||
case 'remote': query.andWhere('user.host IS NOT NULL'); break;
|
||||
}
|
||||
|
||||
const users = await User
|
||||
.find(q, {
|
||||
limit: ps.limit,
|
||||
sort: sort[ps.sort] || sort[fallback],
|
||||
skip: ps.offset
|
||||
});
|
||||
switch (ps.sort) {
|
||||
case '+follower': query.orderBy('user.followersCount', 'DESC'); break;
|
||||
case '-follower': query.orderBy('user.followersCount', 'ASC'); break;
|
||||
case '+createdAt': query.orderBy('user.createdAt', 'DESC'); break;
|
||||
case '-createdAt': query.orderBy('user.createdAt', 'ASC'); break;
|
||||
case '+updatedAt': query.orderBy('user.updatedAt', 'DESC'); break;
|
||||
case '-updatedAt': query.orderBy('user.updatedAt', 'ASC'); break;
|
||||
default: query.orderBy('user.id', 'ASC'); break;
|
||||
}
|
||||
|
||||
return await Promise.all(users.map(user => pack(user, me, { detail: true })));
|
||||
query.take(ps.limit);
|
||||
query.skip(ps.offset);
|
||||
|
||||
const users = await query.getMany();
|
||||
|
||||
return await Users.packMany(users, me, { detail: true });
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to make silence'
|
||||
@ -27,9 +26,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
@ -39,13 +36,7 @@ export default define(meta, async (ps) => {
|
||||
throw new Error('cannot silence admin');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isSilenced: true
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isSilenced: true
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,9 +1,9 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User, { IUser } from '../../../../models/user';
|
||||
import Following from '../../../../models/following';
|
||||
import deleteFollowing from '../../../../services/following/delete';
|
||||
import { Users, Followings } from '../../../../models';
|
||||
import { User } from '../../../../models/entities/user';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -19,7 +19,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to suspend'
|
||||
@ -29,9 +28,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
@ -45,27 +42,21 @@ export default define(meta, async (ps) => {
|
||||
throw new Error('cannot suspend moderator');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isSuspended: true
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isSuspended: true
|
||||
});
|
||||
|
||||
unFollowAll(user);
|
||||
|
||||
return;
|
||||
});
|
||||
|
||||
async function unFollowAll(follower: IUser) {
|
||||
const followings = await Following.find({
|
||||
followerId: follower._id
|
||||
async function unFollowAll(follower: User) {
|
||||
const followings = await Followings.find({
|
||||
followerId: follower.id
|
||||
});
|
||||
|
||||
for (const following of followings) {
|
||||
const followee = await User.findOne({
|
||||
_id: following.followeeId
|
||||
const followee = await Users.findOne({
|
||||
id: following.followeeId
|
||||
});
|
||||
|
||||
if (followee == null) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to unsilence'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isSilenced: false
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isSilenced: false
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to unsuspend'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isSuspended: false
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isSuspended: false
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to unverify'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isVerified: false
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isVerified: false
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -1,6 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import Meta from '../../../../models/meta';
|
||||
import define from '../../define';
|
||||
import { Metas } from '../../../../models';
|
||||
import { Meta } from '../../../../models/entities/meta';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -55,7 +56,7 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
hidedTags: {
|
||||
hiddenTags: {
|
||||
validator: $.optional.nullable.arr($.str),
|
||||
desc: {
|
||||
'ja-JP': '統計などで無視するハッシュタグ'
|
||||
@ -253,27 +254,6 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
enableExternalUserRecommendation: {
|
||||
validator: $.optional.bool,
|
||||
desc: {
|
||||
'ja-JP': '外部ユーザーレコメンデーションを有効にする'
|
||||
}
|
||||
},
|
||||
|
||||
externalUserRecommendationEngine: {
|
||||
validator: $.optional.nullable.str,
|
||||
desc: {
|
||||
'ja-JP': '外部ユーザーレコメンデーションのサードパーティエンジン'
|
||||
}
|
||||
},
|
||||
|
||||
externalUserRecommendationTimeout: {
|
||||
validator: $.optional.nullable.num.min(0),
|
||||
desc: {
|
||||
'ja-JP': '外部ユーザーレコメンデーションのタイムアウト (ミリ秒)'
|
||||
}
|
||||
},
|
||||
|
||||
enableEmail: {
|
||||
validator: $.optional.bool,
|
||||
desc: {
|
||||
@ -347,7 +327,7 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const set = {} as any;
|
||||
const set = {} as Partial<Meta>;
|
||||
|
||||
if (ps.announcements) {
|
||||
set.announcements = ps.announcements;
|
||||
@ -373,8 +353,8 @@ export default define(meta, async (ps) => {
|
||||
set.useStarForReactionFallback = ps.useStarForReactionFallback;
|
||||
}
|
||||
|
||||
if (Array.isArray(ps.hidedTags)) {
|
||||
set.hidedTags = ps.hidedTags;
|
||||
if (Array.isArray(ps.hiddenTags)) {
|
||||
set.hiddenTags = ps.hiddenTags;
|
||||
}
|
||||
|
||||
if (ps.mascotImageUrl !== undefined) {
|
||||
@ -430,11 +410,11 @@ export default define(meta, async (ps) => {
|
||||
}
|
||||
|
||||
if (ps.maintainerName !== undefined) {
|
||||
set['maintainer.name'] = ps.maintainerName;
|
||||
set.maintainerName = ps.maintainerName;
|
||||
}
|
||||
|
||||
if (ps.maintainerEmail !== undefined) {
|
||||
set['maintainer.email'] = ps.maintainerEmail;
|
||||
set.maintainerEmail = ps.maintainerEmail;
|
||||
}
|
||||
|
||||
if (ps.langs !== undefined) {
|
||||
@ -481,18 +461,6 @@ export default define(meta, async (ps) => {
|
||||
set.discordClientSecret = ps.discordClientSecret;
|
||||
}
|
||||
|
||||
if (ps.enableExternalUserRecommendation !== undefined) {
|
||||
set.enableExternalUserRecommendation = ps.enableExternalUserRecommendation;
|
||||
}
|
||||
|
||||
if (ps.externalUserRecommendationEngine !== undefined) {
|
||||
set.externalUserRecommendationEngine = ps.externalUserRecommendationEngine;
|
||||
}
|
||||
|
||||
if (ps.externalUserRecommendationTimeout !== undefined) {
|
||||
set.externalUserRecommendationTimeout = ps.externalUserRecommendationTimeout;
|
||||
}
|
||||
|
||||
if (ps.enableEmail !== undefined) {
|
||||
set.enableEmail = ps.enableEmail;
|
||||
}
|
||||
@ -537,9 +505,11 @@ export default define(meta, async (ps) => {
|
||||
set.swPrivateKey = ps.swPrivateKey;
|
||||
}
|
||||
|
||||
await Meta.update({}, {
|
||||
$set: set
|
||||
}, { upsert: true });
|
||||
const meta = await Metas.findOne();
|
||||
|
||||
return;
|
||||
if (meta) {
|
||||
await Metas.update(meta.id, set);
|
||||
} else {
|
||||
await Metas.save(set);
|
||||
}
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import * as mongo from 'mongodb';
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import { getRemoteUser } from '../../common/getters';
|
||||
import { updatePerson } from '../../../../remote/activitypub/models/person';
|
||||
@ -19,7 +18,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to update'
|
||||
@ -29,11 +27,6 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
await updatePersonById(ps.userId);
|
||||
return;
|
||||
});
|
||||
|
||||
async function updatePersonById(userId: mongo.ObjectID) {
|
||||
const user = await getRemoteUser(userId);
|
||||
const user = await getRemoteUser(ps.userId);
|
||||
await updatePerson(user.uri);
|
||||
}
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import { ID } from '../../../../misc/cafy-id';
|
||||
import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import { Users } from '../../../../models';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -17,7 +17,6 @@ export const meta = {
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーID',
|
||||
'en-US': 'The user ID which you want to verify'
|
||||
@ -27,21 +26,13 @@ export const meta = {
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
const user = await Users.findOne(ps.userId as string);
|
||||
|
||||
if (user == null) {
|
||||
throw new Error('user not found');
|
||||
}
|
||||
|
||||
await User.findOneAndUpdate({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: {
|
||||
isVerified: true
|
||||
}
|
||||
await Users.update(user.id, {
|
||||
isVerified: true
|
||||
});
|
||||
|
||||
return;
|
||||
});
|
||||
|
Reference in New Issue
Block a user