From 48ea805999c6cb8e900aeaec6edaf68788bd51e0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 23 Mar 2021 11:53:25 +0900 Subject: perf(server): Redis接続をストリーミング接続ごとに作らず、プロセス全体で共有するように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/streaming.ts | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) (limited to 'src/server/api') diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 10f2a70bad..4ec0c51374 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -1,12 +1,11 @@ import * as http from 'http'; import * as websocket from 'websocket'; -import * as redis from 'redis'; import MainStreamConnection from './stream'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; import { EventEmitter } from 'events'; -import config from '../../config'; +import redisClient from '../../db/redis'; module.exports = (server: http.Server) => { // Init websocket server @@ -24,37 +23,21 @@ module.exports = (server: http.Server) => { const connection = request.accept(); - let ev: EventEmitter; + const ev = new EventEmitter(); - // Connect to Redis - const subscriber = redis.createClient( - config.redis.port, - config.redis.host, - { - password: config.redis.pass - } - ); - - subscriber.subscribe(config.host); - - ev = new EventEmitter(); - - subscriber.on('message', async (_, data) => { - const obj = JSON.parse(data); + async function onRedisMessage(_: string, data: string) { + const parsed = JSON.parse(data); + ev.emit(parsed.channel, parsed.message); + } - ev.emit(obj.channel, obj.message); - }); - - connection.once('close', () => { - subscriber.unsubscribe(); - subscriber.quit(); - }); + redisClient.on('message', onRedisMessage); const main = new MainStreamConnection(connection, ev, user, app); connection.once('close', () => { ev.removeAllListeners(); main.dispose(); + redisClient.off('message', onRedisMessage); }); connection.on('message', async (data) => { -- cgit v1.2.3-freya From 5c3a56b2832ac625552a7d261cd38fb118d813f4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 23 Mar 2021 14:54:09 +0900 Subject: fix bug https://github.com/syuilo/misskey/commit/48ea805999c6cb8e900aeaec6edaf68788bd51e0#commitcomment-48584326 --- src/db/redis.ts | 25 ++++++++++++---------- src/misc/app-lock.ts | 6 +++--- src/server/api/endpoints/admin/server-info.ts | 4 ++-- src/server/api/endpoints/get-online-users-count.ts | 4 ++-- src/server/api/limiter.ts | 6 +++--- src/server/api/service/discord.ts | 10 ++++----- src/server/api/service/github.ts | 10 ++++----- src/server/api/service/twitter.ts | 10 ++++----- src/server/api/streaming.ts | 2 +- src/server/web/index.ts | 4 ++-- 10 files changed, 42 insertions(+), 39 deletions(-) (limited to 'src/server/api') diff --git a/src/db/redis.ts b/src/db/redis.ts index 7570aa59bf..5b6fc05df9 100644 --- a/src/db/redis.ts +++ b/src/db/redis.ts @@ -1,16 +1,19 @@ import * as redis from 'redis'; import config from '../config'; -const client = redis.createClient( - config.redis.port, - config.redis.host, - { - password: config.redis.pass, - prefix: config.redis.prefix, - db: config.redis.db || 0 - } -); +export function createConnection() { + return redis.createClient( + config.redis.port, + config.redis.host, + { + password: config.redis.pass, + prefix: config.redis.prefix, + db: config.redis.db || 0 + } + ); +} -client.subscribe(config.host); +export const subsdcriber = createConnection(); +subsdcriber.subscribe(config.host); -export default client; +export const redisClient = createConnection(); diff --git a/src/misc/app-lock.ts b/src/misc/app-lock.ts index 847299b46d..9ae2cba478 100644 --- a/src/misc/app-lock.ts +++ b/src/misc/app-lock.ts @@ -1,4 +1,4 @@ -import redis from '../db/redis'; +import { redisClient } from '../db/redis'; import { promisify } from 'util'; /** @@ -7,8 +7,8 @@ import { promisify } from 'util'; const retryDelay = 100; const lock: (key: string, timeout?: number) => Promise<() => void> - = redis - ? promisify(require('redis-lock')(redis, retryDelay)) + = redisClient + ? promisify(require('redis-lock')(redisClient, retryDelay)) : async () => () => { }; /** diff --git a/src/server/api/endpoints/admin/server-info.ts b/src/server/api/endpoints/admin/server-info.ts index 3b48a811e5..33e6190974 100644 --- a/src/server/api/endpoints/admin/server-info.ts +++ b/src/server/api/endpoints/admin/server-info.ts @@ -2,7 +2,7 @@ import * as os from 'os'; import * as si from 'systeminformation'; import { getConnection } from 'typeorm'; import define from '../../define'; -import redis from '../../../../db/redis'; +import { redisClient } from '../../../../db/redis'; export const meta = { requireCredential: true as const, @@ -115,7 +115,7 @@ export default define(meta, async () => { os: os.platform(), node: process.version, psql: await getConnection().query('SHOW server_version').then(x => x[0].server_version), - redis: redis.server_info.redis_version, + redis: redisClient.server_info.redis_version, cpu: { model: os.cpus()[0].model, cores: os.cpus().length diff --git a/src/server/api/endpoints/get-online-users-count.ts b/src/server/api/endpoints/get-online-users-count.ts index 7521104886..520948ac6b 100644 --- a/src/server/api/endpoints/get-online-users-count.ts +++ b/src/server/api/endpoints/get-online-users-count.ts @@ -1,5 +1,5 @@ import define from '../define'; -import redis from '../../../db/redis'; +import { redisClient } from '../../../db/redis'; import config from '../../../config'; export const meta = { @@ -13,7 +13,7 @@ export const meta = { export default define(meta, (ps, user) => { return new Promise((res, rej) => { - redis.pubsub('numsub', config.host, (_, x) => { + redisClient.pubsub('numsub', config.host, (_, x) => { res({ count: x[1] }); diff --git a/src/server/api/limiter.ts b/src/server/api/limiter.ts index 48d12d3cc6..de41158586 100644 --- a/src/server/api/limiter.ts +++ b/src/server/api/limiter.ts @@ -1,5 +1,5 @@ import * as Limiter from 'ratelimiter'; -import limiterDB from '../../db/redis'; +import { redisClient } from '../../db/redis'; import { IEndpoint } from './endpoints'; import getAcct from '../../misc/acct/render'; import { User } from '../../models/entities/user'; @@ -35,7 +35,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => id: `${user.id}:${key}:min`, duration: limitation.minInterval, max: 1, - db: limiterDB! + db: redisClient }); minIntervalLimiter.get((err, info) => { @@ -63,7 +63,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => id: `${user.id}:${key}`, duration: limitation.duration, max: limitation.max, - db: limiterDB! + db: redisClient }); limiter.get((err, info) => { diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts index fce840cde5..0ee268e772 100644 --- a/src/server/api/service/discord.ts +++ b/src/server/api/service/discord.ts @@ -4,7 +4,7 @@ import { getJson } from '../../../misc/fetch'; import { OAuth2 } from 'oauth'; import config from '../../../config'; import { publishMainStream } from '../../../services/stream'; -import redis from '../../../db/redis'; +import { redisClient } from '../../../db/redis'; import { v4 as uuid } from 'uuid'; import signin from '../common/signin'; import { fetchMeta } from '../../../misc/fetch-meta'; @@ -96,7 +96,7 @@ router.get('/connect/discord', async ctx => { response_type: 'code' }; - redis.set(userToken, JSON.stringify(params)); + redisClient.set(userToken, JSON.stringify(params)); const oauth2 = await getOAuth2(); ctx.redirect(oauth2!.getAuthorizeUrl(params)); @@ -118,7 +118,7 @@ router.get('/signin/discord', async ctx => { httpOnly: true }); - redis.set(sessid, JSON.stringify(params)); + redisClient.set(sessid, JSON.stringify(params)); const oauth2 = await getOAuth2(); ctx.redirect(oauth2!.getAuthorizeUrl(params)); @@ -145,7 +145,7 @@ router.get('/dc/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis.get(sessid, async (_, state) => { + redisClient.get(sessid, async (_, state) => { res(JSON.parse(state)); }); }); @@ -216,7 +216,7 @@ router.get('/dc/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis.get(userToken, async (_, state) => { + redisClient.get(userToken, async (_, state) => { res(JSON.parse(state)); }); }); diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts index 2b10fa02a0..7ca95fc112 100644 --- a/src/server/api/service/github.ts +++ b/src/server/api/service/github.ts @@ -4,7 +4,7 @@ import { getJson } from '../../../misc/fetch'; import { OAuth2 } from 'oauth'; import config from '../../../config'; import { publishMainStream } from '../../../services/stream'; -import redis from '../../../db/redis'; +import { redisClient } from '../../../db/redis'; import { v4 as uuid } from 'uuid'; import signin from '../common/signin'; import { fetchMeta } from '../../../misc/fetch-meta'; @@ -95,7 +95,7 @@ router.get('/connect/github', async ctx => { state: uuid() }; - redis.set(userToken, JSON.stringify(params)); + redisClient.set(userToken, JSON.stringify(params)); const oauth2 = await getOath2(); ctx.redirect(oauth2!.getAuthorizeUrl(params)); @@ -116,7 +116,7 @@ router.get('/signin/github', async ctx => { httpOnly: true }); - redis.set(sessid, JSON.stringify(params)); + redisClient.set(sessid, JSON.stringify(params)); const oauth2 = await getOath2(); ctx.redirect(oauth2!.getAuthorizeUrl(params)); @@ -143,7 +143,7 @@ router.get('/gh/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis.get(sessid, async (_, state) => { + redisClient.get(sessid, async (_, state) => { res(JSON.parse(state)); }); }); @@ -194,7 +194,7 @@ router.get('/gh/cb', async ctx => { } const { redirect_uri, state } = await new Promise((res, rej) => { - redis.get(userToken, async (_, state) => { + redisClient.get(userToken, async (_, state) => { res(JSON.parse(state)); }); }); diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index 97e9d3a7fc..7985042d27 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -2,7 +2,7 @@ import * as Koa from 'koa'; import * as Router from '@koa/router'; import { v4 as uuid } from 'uuid'; import autwh from 'autwh'; -import redis from '../../../db/redis'; +import { redisClient } from '../../../db/redis'; import { publishMainStream } from '../../../services/stream'; import config from '../../../config'; import signin from '../common/signin'; @@ -89,7 +89,7 @@ router.get('/connect/twitter', async ctx => { const twAuth = await getTwAuth(); const twCtx = await twAuth!.begin(); - redis.set(userToken, JSON.stringify(twCtx)); + redisClient.set(userToken, JSON.stringify(twCtx)); ctx.redirect(twCtx.url); }); @@ -99,7 +99,7 @@ router.get('/signin/twitter', async ctx => { const sessid = uuid(); - redis.set(sessid, JSON.stringify(twCtx)); + redisClient.set(sessid, JSON.stringify(twCtx)); ctx.cookies.set('signin_with_twitter_sid', sessid, { path: '/', @@ -124,7 +124,7 @@ router.get('/tw/cb', async ctx => { } const get = new Promise((res, rej) => { - redis.get(sessid, async (_, twCtx) => { + redisClient.get(sessid, async (_, twCtx) => { res(twCtx); }); }); @@ -153,7 +153,7 @@ router.get('/tw/cb', async ctx => { } const get = new Promise((res, rej) => { - redis.get(userToken, async (_, twCtx) => { + redisClient.get(userToken, async (_, twCtx) => { res(twCtx); }); }); diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 4ec0c51374..81b83edcf5 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -5,7 +5,7 @@ import MainStreamConnection from './stream'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; import { EventEmitter } from 'events'; -import redisClient from '../../db/redis'; +import { subsdcriber as redisClient } from '../../db/redis'; module.exports = (server: http.Server) => { // Init websocket server diff --git a/src/server/web/index.ts b/src/server/web/index.ts index ea356206ff..6558627437 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -21,7 +21,7 @@ import { Users, Notes, Emojis, UserProfiles, Pages, Channels, Clips } from '../. import parseAcct from '../../misc/acct/parse'; import { getNoteSummary } from '../../misc/get-note-summary'; import { getConnection } from 'typeorm'; -import redis from '../../db/redis'; +import { redisClient } from '../../db/redis'; import locales = require('../../../locales'); const markdown = MarkdownIt({ @@ -379,7 +379,7 @@ router.get('/info', async ctx => { os: os.platform(), node: process.version, psql: await getConnection().query('SHOW server_version').then(x => x[0].server_version), - redis: redis.server_info.redis_version, + redis: redisClient.server_info.redis_version, cpu: { model: os.cpus()[0].model, cores: os.cpus().length -- cgit v1.2.3-freya From 7e4a800352dd1de91a7a6c457b39f297d76fd9bf Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 23 Mar 2021 15:06:56 +0900 Subject: noteのread処理 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/misc/antenna-cache.ts | 36 +++++++++++++ src/misc/check-hit-antenna.ts | 14 +++-- src/models/repositories/user.ts | 7 +-- src/server/api/endpoints/antennas/create.ts | 7 ++- src/server/api/endpoints/antennas/delete.ts | 3 ++ src/server/api/endpoints/antennas/update.ts | 3 ++ src/server/api/stream/index.ts | 15 ++---- src/services/note/create.ts | 20 ++++---- src/services/note/read.ts | 79 +++++++++++++++++++---------- src/services/stream.ts | 5 ++ 10 files changed, 132 insertions(+), 57 deletions(-) create mode 100644 src/misc/antenna-cache.ts (limited to 'src/server/api') diff --git a/src/misc/antenna-cache.ts b/src/misc/antenna-cache.ts new file mode 100644 index 0000000000..6be1c18db5 --- /dev/null +++ b/src/misc/antenna-cache.ts @@ -0,0 +1,36 @@ +import { Antennas } from '../models'; +import { Antenna } from '../models/entities/antenna'; +import { subsdcriber } from '../db/redis'; + +let antennasFetched = false; +let antennas: Antenna[] = []; + +export async function getAntennas() { + if (!antennasFetched) { + antennas = await Antennas.find(); + antennasFetched = true; + } + + return antennas; +} + +subsdcriber.on('message', async (_, data) => { + const obj = JSON.parse(data); + + if (obj.channel === 'internal') { + const { type, body } = obj.message; + switch (type) { + case 'antennaCreated': + antennas.push(body); + break; + case 'antennaUpdated': + antennas[antennas.findIndex(a => a.id === body.id)] = body; + break; + case 'antennaDeleted': + antennas = antennas.filter(a => a.id !== body.id); + break; + default: + break; + } + } +}); diff --git a/src/misc/check-hit-antenna.ts b/src/misc/check-hit-antenna.ts index 0464f14131..9897dd414e 100644 --- a/src/misc/check-hit-antenna.ts +++ b/src/misc/check-hit-antenna.ts @@ -4,18 +4,24 @@ import { User } from '../models/entities/user'; import { UserListJoinings, UserGroupJoinings } from '../models'; import parseAcct from './acct/parse'; import { getFullApAccount } from './convert-host'; +import { PackedNote } from '../models/repositories/note'; -export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise { +/** + * noteUserFollowers / antennaUserFollowing はどちらか一方が指定されていればよい + */ +export async function checkHitAntenna(antenna: Antenna, note: (Note | PackedNote), noteUser: { username: string; host: string | null; }, noteUserFollowers?: User['id'][], antennaUserFollowing?: User['id'][]): Promise { if (note.visibility === 'specified') return false; if (note.visibility === 'followers') { - if (!followers.includes(antenna.userId)) return false; + if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false; + if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false; } if (!antenna.withReplies && note.replyId != null) return false; if (antenna.src === 'home') { - if (!followers.includes(antenna.userId)) return false; + if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false; + if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false; } else if (antenna.src === 'list') { const listUsers = (await UserListJoinings.find({ userListId: antenna.userListId! @@ -75,7 +81,7 @@ export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: Us } if (antenna.withFile) { - if (note.fileIds.length === 0) return false; + if (note.fileIds && note.fileIds.length === 0) return false; } // TODO: eval expression diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index 53c06f3f16..3d897e1663 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -6,6 +6,7 @@ import config from '../../config'; import { SchemaType } from '../../misc/schema'; import { awaitAll } from '../../prelude/await-all'; import { populateEmojis } from '../../misc/populate-emojis'; +import { getAntennas } from '../../misc/antenna-cache'; export type PackedUser = SchemaType; @@ -97,10 +98,10 @@ export class UserRepository extends Repository { } public async getHasUnreadAntenna(userId: User['id']): Promise { - const antennas = await Antennas.find({ userId }); + const myAntennas = (await getAntennas()).filter(a => a.userId === userId); - const unread = antennas.length > 0 ? await AntennaNotes.findOne({ - antennaId: In(antennas.map(x => x.id)), + const unread = myAntennas.length > 0 ? await AntennaNotes.findOne({ + antennaId: In(myAntennas.map(x => x.id)), read: false }) : null; diff --git a/src/server/api/endpoints/antennas/create.ts b/src/server/api/endpoints/antennas/create.ts index b5f0eead2a..7210c992cd 100644 --- a/src/server/api/endpoints/antennas/create.ts +++ b/src/server/api/endpoints/antennas/create.ts @@ -4,6 +4,7 @@ import { genId } from '../../../../misc/gen-id'; import { Antennas, UserLists, UserGroupJoinings } from '../../../../models'; import { ID } from '../../../../misc/cafy-id'; import { ApiError } from '../../error'; +import { publishInternalEvent } from '../../../../services/stream'; export const meta = { desc: { @@ -108,7 +109,7 @@ export default define(meta, async (ps, user) => { } } - const antenna = await Antennas.save({ + const antenna = await Antennas.insert({ id: genId(), createdAt: new Date(), userId: user.id, @@ -123,7 +124,9 @@ export default define(meta, async (ps, user) => { withReplies: ps.withReplies, withFile: ps.withFile, notify: ps.notify, - }); + }).then(x => Antennas.findOneOrFail(x.identifiers[0])); + + publishInternalEvent('antennaCreated', antenna); return await Antennas.pack(antenna); }); diff --git a/src/server/api/endpoints/antennas/delete.ts b/src/server/api/endpoints/antennas/delete.ts index 9008c37c8e..adaf2d0d85 100644 --- a/src/server/api/endpoints/antennas/delete.ts +++ b/src/server/api/endpoints/antennas/delete.ts @@ -3,6 +3,7 @@ import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { ApiError } from '../../error'; import { Antennas } from '../../../../models'; +import { publishInternalEvent } from '../../../../services/stream'; export const meta = { desc: { @@ -42,4 +43,6 @@ export default define(meta, async (ps, user) => { } await Antennas.delete(antenna.id); + + publishInternalEvent('antennaDeleted', antenna); }); diff --git a/src/server/api/endpoints/antennas/update.ts b/src/server/api/endpoints/antennas/update.ts index 58f4e68c89..22764b7411 100644 --- a/src/server/api/endpoints/antennas/update.ts +++ b/src/server/api/endpoints/antennas/update.ts @@ -3,6 +3,7 @@ import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { ApiError } from '../../error'; import { Antennas, UserLists, UserGroupJoinings } from '../../../../models'; +import { publishInternalEvent } from '../../../../services/stream'; export const meta = { desc: { @@ -141,5 +142,7 @@ export default define(meta, async (ps, user) => { notify: ps.notify, }); + publishInternalEvent('antennaUpdated', Antennas.findOneOrFail(antenna.id)); + return await Antennas.pack(antenna.id); }); diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts index 99ae558696..1dcc31d32f 100644 --- a/src/server/api/stream/index.ts +++ b/src/server/api/stream/index.ts @@ -168,17 +168,10 @@ export default class Connection { if (note == null) return; if (this.user && (note.userId !== this.user.id)) { - if (note.mentions && note.mentions.includes(this.user.id)) { - readNote(this.user.id, [note]); - } else if (note.visibleUserIds && note.visibleUserIds.includes(this.user.id)) { - readNote(this.user.id, [note]); - } - - if (this.followingChannels.has(note.channelId)) { - // TODO - } - - // TODO: アンテナの既読処理 + readNote(this.user.id, [note], { + following: this.following, + followingChannels: this.followingChannels, + }); } } diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 4a737e8516..b9c1676c58 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -33,6 +33,7 @@ import { countSameRenotes } from '../../misc/count-same-renotes'; import { deliverToRelays } from '../relay'; import { Channel } from '../../models/entities/channel'; import { normalizeForSearch } from '../../misc/normalize-for-search'; +import { getAntennas } from '../../misc/antenna-cache'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -241,6 +242,7 @@ export default async (user: User, data: Option, silent = false) => new Promise { @@ -262,17 +264,15 @@ export default async (user: User, data: Option, silent = false) => new Promise { + .then(async followings => { const followers = followings.map(f => f.followerId); - Antennas.find().then(async antennas => { - for (const antenna of antennas) { - checkHitAntenna(antenna, note, user, followers).then(hit => { - if (hit) { - addNoteToAntenna(antenna, note, user); - } - }); - } - }); + for (const antenna of (await getAntennas())) { + checkHitAntenna(antenna, note, user, followers).then(hit => { + if (hit) { + addNoteToAntenna(antenna, note, user); + } + }); + } }); // Channel diff --git a/src/services/note/read.ts b/src/services/note/read.ts index 35279db411..91b523bd1d 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -1,23 +1,59 @@ import { publishMainStream } from '../stream'; import { Note } from '../../models/entities/note'; import { User } from '../../models/entities/user'; -import { NoteUnreads, Antennas, AntennaNotes, Users } from '../../models'; +import { NoteUnreads, AntennaNotes, Users } from '../../models'; import { Not, IsNull, In } from 'typeorm'; +import { Channel } from '../../models/entities/channel'; +import { checkHitAntenna } from '../../misc/check-hit-antenna'; +import { getAntennas } from '../../misc/antenna-cache'; +import { PackedNote } from '../../models/repositories/note'; /** * Mark notes as read */ export default async function( userId: User['id'], - noteIds: Note['id'][] + notes: (Note | PackedNote)[], + info: { + following: Set; + followingChannels: Set; + } ) { - async function careNoteUnreads() { + const myAntennas = (await getAntennas()).filter(a => a.userId === userId); + const readMentions: (Note | PackedNote)[] = []; + const readSpecifiedNotes: (Note | PackedNote)[] = []; + const readChannelNotes: (Note | PackedNote)[] = []; + const readAntennaNotes: (Note | PackedNote)[] = []; + + for (const note of notes) { + if (note.mentions && note.mentions.includes(userId)) { + readMentions.push(note); + } else if (note.visibleUserIds && note.visibleUserIds.includes(userId)) { + readSpecifiedNotes.push(note); + } + + if (note.channelId && info.followingChannels.has(note.channelId)) { + readChannelNotes.push(note); + } + + if (note.user != null) { // たぶんnullになることは無いはずだけど一応 + for (const antenna of myAntennas) { + if (checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(info.following))) { + readAntennaNotes.push(note); + } + } + } + } + + if ((readMentions.length > 0) || (readSpecifiedNotes.length > 0) || (readChannelNotes.length > 0)) { // Remove the record await NoteUnreads.delete({ userId: userId, - noteId: In(noteIds), + noteId: In([...readMentions.map(n => n.id), ...readSpecifiedNotes.map(n => n.id), ...readChannelNotes.map(n => n.id)]), }); + // TODO: ↓まとめてクエリしたい + NoteUnreads.count({ userId: userId, isMentioned: true @@ -49,33 +85,25 @@ export default async function( }); } - async function careAntenna() { - const antennas = await Antennas.find({ userId }); - - await Promise.all(antennas.map(async antenna => { - const countBefore = await AntennaNotes.count({ - antennaId: antenna.id, - read: false - }); - - if (countBefore === 0) return; - - await AntennaNotes.update({ - antennaId: antenna.id, - noteId: In(noteIds) - }, { - read: true - }); + if (readAntennaNotes.length > 0) { + await AntennaNotes.update({ + antennaId: In(myAntennas.map(a => a.id)), + noteId: In(readAntennaNotes.map(n => n.id)) + }, { + read: true + }); - const countAfter = await AntennaNotes.count({ + // TODO: まとめてクエリしたい + for (const antenna of myAntennas) { + const count = await AntennaNotes.count({ antennaId: antenna.id, read: false }); - if (countAfter === 0) { + if (count === 0) { publishMainStream(userId, 'readAntenna', antenna); } - })); + } Users.getHasUnreadAntenna(userId).then(unread => { if (!unread) { @@ -83,7 +111,4 @@ export default async function( } }); } - - careNoteUnreads(); - careAntenna(); } diff --git a/src/services/stream.ts b/src/services/stream.ts index a8855b62e6..6d7c2c4922 100644 --- a/src/services/stream.ts +++ b/src/services/stream.ts @@ -20,6 +20,10 @@ class Publisher { })); } + public publishInternalEvent = (type: string, value?: any): void => { + this.publish('internal', type, typeof value === 'undefined' ? null : value); + } + public publishUserEvent = (userId: User['id'], type: string, value?: any): void => { this.publish(`user:${userId}`, type, typeof value === 'undefined' ? null : value); } @@ -88,6 +92,7 @@ const publisher = new Publisher(); export default publisher; +export const publishInternalEvent = publisher.publishInternalEvent; export const publishUserEvent = publisher.publishUserEvent; export const publishBroadcastStream = publisher.publishBroadcastStream; export const publishMainStream = publisher.publishMainStream; -- cgit v1.2.3-freya From cd4680b422f1740ce212ff50925632b0d55db398 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 23 Mar 2021 15:12:47 +0900 Subject: fix --- src/server/api/endpoints/notes/mentions.ts | 2 +- src/services/note/read.ts | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'src/server/api') diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 30368ea578..32e71acc05 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -83,7 +83,7 @@ export default define(meta, async (ps, user) => { const mentions = await query.take(ps.limit!).getMany(); - read(user.id, mentions.map(note => note.id)); + read(user.id, mentions); return await Notes.packMany(mentions, user); }); diff --git a/src/services/note/read.ts b/src/services/note/read.ts index 91b523bd1d..4e8c76cbee 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -1,7 +1,7 @@ import { publishMainStream } from '../stream'; import { Note } from '../../models/entities/note'; import { User } from '../../models/entities/user'; -import { NoteUnreads, AntennaNotes, Users } from '../../models'; +import { NoteUnreads, AntennaNotes, Users, Followings, ChannelFollowings } from '../../models'; import { Not, IsNull, In } from 'typeorm'; import { Channel } from '../../models/entities/channel'; import { checkHitAntenna } from '../../misc/check-hit-antenna'; @@ -14,11 +14,24 @@ import { PackedNote } from '../../models/repositories/note'; export default async function( userId: User['id'], notes: (Note | PackedNote)[], - info: { - following: Set; + info?: { + following: Set; followingChannels: Set; } ) { + const following = info?.following ? info.following : new Set((await Followings.find({ + where: { + followerId: userId + }, + select: ['followeeId'] + })).map(x => x.followeeId)); + const followingChannels = info?.followingChannels ? info.followingChannels : new Set((await ChannelFollowings.find({ + where: { + followerId: userId + }, + select: ['followeeId'] + })).map(x => x.followeeId)); + const myAntennas = (await getAntennas()).filter(a => a.userId === userId); const readMentions: (Note | PackedNote)[] = []; const readSpecifiedNotes: (Note | PackedNote)[] = []; @@ -32,13 +45,13 @@ export default async function( readSpecifiedNotes.push(note); } - if (note.channelId && info.followingChannels.has(note.channelId)) { + if (note.channelId && followingChannels.has(note.channelId)) { readChannelNotes.push(note); } if (note.user != null) { // たぶんnullになることは無いはずだけど一応 for (const antenna of myAntennas) { - if (checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(info.following))) { + if (checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) { readAntennaNotes.push(note); } } -- cgit v1.2.3-freya From 94fd5485b6cc5d69bfbb706d5d65e48ccfa45ea8 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 23 Mar 2021 15:22:31 +0900 Subject: Use TRUNCATE (#7385) --- src/server/api/endpoints/admin/delete-logs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/api') diff --git a/src/server/api/endpoints/admin/delete-logs.ts b/src/server/api/endpoints/admin/delete-logs.ts index 3719387312..1caea46ea0 100644 --- a/src/server/api/endpoints/admin/delete-logs.ts +++ b/src/server/api/endpoints/admin/delete-logs.ts @@ -14,5 +14,5 @@ export const meta = { }; export default define(meta, async (ps) => { - await Logs.delete({}); + await Logs.clear(); // TRUNCATE }); -- cgit v1.2.3-freya From c74fe3c6e2aae3df4624b9b3a55b45293223ebf5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 23 Mar 2021 17:43:07 +0900 Subject: refactor: Use path alias --- src/argv.ts | 2 +- src/boot/master.ts | 6 +++--- src/client/components/autocomplete.vue | 4 ++-- src/client/components/emoji-picker.vue | 2 +- src/client/components/notification.vue | 2 +- src/client/components/poll-editor.vue | 2 +- src/client/components/post-form.vue | 6 +++--- src/client/components/token-generate-window.vue | 2 +- src/client/components/user-info.vue | 2 +- src/client/components/user-preview.vue | 2 +- src/client/filters/user.ts | 4 ++-- src/client/i18n.ts | 2 +- src/client/pages/follow.vue | 2 +- src/client/pages/instance/abuses.vue | 2 +- src/client/pages/instance/settings.vue | 2 +- src/client/pages/instance/users.vue | 2 +- src/client/pages/messaging/index.vue | 2 +- src/client/pages/messaging/messaging-room.form.vue | 2 +- src/client/pages/messaging/messaging-room.vue | 2 +- src/client/pages/my-antennas/index.antenna.vue | 2 +- src/client/pages/room/room.vue | 2 +- src/client/pages/user/index.vue | 2 +- src/client/scripts/gen-search-query.ts | 2 +- src/client/scripts/get-user-menu.ts | 2 +- src/client/sw/compose-notification.ts | 4 ++-- src/client/sw/sw.ts | 2 +- src/client/ui/chat/post-form.vue | 6 +++--- src/db/elasticsearch.ts | 2 +- src/db/postgre.ts | 2 +- src/db/redis.ts | 2 +- src/mfm/language.ts | 4 ++-- src/mfm/to-html.ts | 2 +- src/mfm/to-string.ts | 2 +- src/misc/captcha.ts | 2 +- src/misc/convert-host.ts | 2 +- src/misc/download-url.ts | 2 +- src/misc/fetch.ts | 2 +- src/misc/gen-id.ts | 2 +- src/models/repositories/antenna.ts | 2 +- src/models/repositories/app.ts | 2 +- src/models/repositories/blocking.ts | 2 +- src/models/repositories/channel.ts | 2 +- src/models/repositories/clip.ts | 2 +- src/models/repositories/drive-file.ts | 8 ++++---- src/models/repositories/drive-folder.ts | 2 +- src/models/repositories/federation-instance.ts | 2 +- src/models/repositories/following.ts | 2 +- src/models/repositories/hashtag.ts | 2 +- src/models/repositories/messaging-message.ts | 2 +- src/models/repositories/muting.ts | 2 +- src/models/repositories/note-reaction.ts | 4 ++-- src/models/repositories/note.ts | 6 +++--- src/models/repositories/notification.ts | 4 ++-- src/models/repositories/page.ts | 2 +- src/models/repositories/user-group.ts | 2 +- src/models/repositories/user-list.ts | 2 +- src/models/repositories/user.ts | 8 ++++---- src/queue/index.ts | 2 +- src/queue/initialize.ts | 2 +- src/queue/processors/db/export-blocking.ts | 2 +- src/queue/processors/db/export-following.ts | 2 +- src/queue/processors/db/export-mute.ts | 2 +- src/queue/processors/db/export-user-lists.ts | 2 +- src/queue/processors/db/import-following.ts | 6 +++--- src/queue/processors/db/import-user-lists.ts | 8 ++++---- src/queue/processors/deliver.ts | 6 +++--- src/queue/processors/inbox.ts | 4 ++-- src/queue/queues.ts | 2 +- src/remote/activitypub/db-resolver.ts | 2 +- src/remote/activitypub/kernel/announce/note.ts | 6 +++--- src/remote/activitypub/kernel/create/note.ts | 4 ++-- src/remote/activitypub/kernel/delete/note.ts | 2 +- src/remote/activitypub/kernel/flag/index.ts | 4 ++-- src/remote/activitypub/kernel/read.ts | 2 +- src/remote/activitypub/misc/ld-signature.ts | 2 +- src/remote/activitypub/models/image.ts | 2 +- src/remote/activitypub/models/note.ts | 10 +++++----- src/remote/activitypub/models/person.ts | 10 +++++----- src/remote/activitypub/models/question.ts | 2 +- src/remote/activitypub/renderer/accept.ts | 2 +- src/remote/activitypub/renderer/add.ts | 2 +- src/remote/activitypub/renderer/announce.ts | 2 +- src/remote/activitypub/renderer/block.ts | 2 +- src/remote/activitypub/renderer/create.ts | 2 +- src/remote/activitypub/renderer/delete.ts | 2 +- src/remote/activitypub/renderer/emoji.ts | 2 +- src/remote/activitypub/renderer/follow-relay.ts | 2 +- src/remote/activitypub/renderer/follow-user.ts | 2 +- src/remote/activitypub/renderer/follow.ts | 2 +- src/remote/activitypub/renderer/hashtag.ts | 2 +- src/remote/activitypub/renderer/index.ts | 4 ++-- src/remote/activitypub/renderer/key.ts | 2 +- src/remote/activitypub/renderer/like.ts | 2 +- src/remote/activitypub/renderer/mention.ts | 2 +- src/remote/activitypub/renderer/note.ts | 2 +- src/remote/activitypub/renderer/person.ts | 4 ++-- src/remote/activitypub/renderer/question.ts | 2 +- src/remote/activitypub/renderer/read.ts | 2 +- src/remote/activitypub/renderer/reject.ts | 2 +- src/remote/activitypub/renderer/remove.ts | 2 +- src/remote/activitypub/renderer/undo.ts | 2 +- src/remote/activitypub/renderer/update.ts | 2 +- src/remote/activitypub/renderer/vote.ts | 2 +- src/remote/activitypub/request.ts | 6 +++--- src/remote/activitypub/resolver.ts | 4 ++-- src/remote/resolve-user.ts | 4 ++-- src/remote/webfinger.ts | 2 +- src/server/activitypub.ts | 4 ++-- src/server/activitypub/featured.ts | 2 +- src/server/activitypub/followers.ts | 4 ++-- src/server/activitypub/following.ts | 4 ++-- src/server/activitypub/outbox.ts | 4 ++-- src/server/api/2fa.ts | 2 +- src/server/api/authenticate.ts | 2 +- .../api/common/generate-native-user-token.ts | 2 +- src/server/api/common/getters.ts | 2 +- src/server/api/common/read-messaging-message.ts | 2 +- src/server/api/common/signin.ts | 4 ++-- src/server/api/common/signup.ts | 4 ++-- src/server/api/define.ts | 2 +- src/server/api/endpoints.ts | 2 +- .../api/endpoints/admin/abuse-user-reports.ts | 2 +- .../api/endpoints/admin/announcements/create.ts | 2 +- .../api/endpoints/admin/announcements/delete.ts | 2 +- .../api/endpoints/admin/announcements/list.ts | 2 +- .../api/endpoints/admin/announcements/update.ts | 2 +- .../endpoints/admin/delete-all-files-of-a-user.ts | 2 +- src/server/api/endpoints/admin/drive/files.ts | 2 +- src/server/api/endpoints/admin/drive/show-file.ts | 2 +- src/server/api/endpoints/admin/emoji/add.ts | 4 ++-- src/server/api/endpoints/admin/emoji/copy.ts | 4 ++-- .../api/endpoints/admin/emoji/list-remote.ts | 4 ++-- src/server/api/endpoints/admin/emoji/list.ts | 2 +- src/server/api/endpoints/admin/emoji/remove.ts | 2 +- src/server/api/endpoints/admin/emoji/update.ts | 2 +- .../federation/refresh-remote-instance-metadata.ts | 2 +- .../endpoints/admin/federation/update-instance.ts | 2 +- src/server/api/endpoints/admin/invite.ts | 2 +- src/server/api/endpoints/admin/moderators/add.ts | 2 +- .../api/endpoints/admin/moderators/remove.ts | 2 +- src/server/api/endpoints/admin/promo/create.ts | 2 +- src/server/api/endpoints/admin/reset-password.ts | 2 +- .../endpoints/admin/resolve-abuse-user-report.ts | 2 +- .../api/endpoints/admin/show-moderation-logs.ts | 2 +- src/server/api/endpoints/admin/show-user.ts | 2 +- src/server/api/endpoints/admin/silence-user.ts | 2 +- src/server/api/endpoints/admin/suspend-user.ts | 2 +- src/server/api/endpoints/admin/unsilence-user.ts | 2 +- src/server/api/endpoints/admin/unsuspend-user.ts | 2 +- src/server/api/endpoints/admin/update-meta.ts | 4 ++-- .../api/endpoints/admin/update-remote-user.ts | 2 +- src/server/api/endpoints/announcements.ts | 2 +- src/server/api/endpoints/antennas/create.ts | 4 ++-- src/server/api/endpoints/antennas/delete.ts | 2 +- src/server/api/endpoints/antennas/notes.ts | 2 +- src/server/api/endpoints/antennas/show.ts | 2 +- src/server/api/endpoints/antennas/update.ts | 2 +- src/server/api/endpoints/ap/show.ts | 6 +++--- src/server/api/endpoints/app/create.ts | 4 ++-- src/server/api/endpoints/app/show.ts | 2 +- src/server/api/endpoints/auth/accept.ts | 4 ++-- src/server/api/endpoints/auth/session/generate.ts | 4 ++-- src/server/api/endpoints/blocking/create.ts | 2 +- src/server/api/endpoints/blocking/delete.ts | 2 +- src/server/api/endpoints/blocking/list.ts | 2 +- src/server/api/endpoints/channels/create.ts | 4 ++-- src/server/api/endpoints/channels/follow.ts | 4 ++-- src/server/api/endpoints/channels/followed.ts | 2 +- src/server/api/endpoints/channels/owned.ts | 2 +- src/server/api/endpoints/channels/show.ts | 2 +- src/server/api/endpoints/channels/timeline.ts | 2 +- src/server/api/endpoints/channels/unfollow.ts | 2 +- src/server/api/endpoints/channels/update.ts | 2 +- src/server/api/endpoints/charts/user/drive.ts | 2 +- src/server/api/endpoints/charts/user/following.ts | 2 +- src/server/api/endpoints/charts/user/notes.ts | 2 +- src/server/api/endpoints/charts/user/reactions.ts | 2 +- src/server/api/endpoints/clips/add-note.ts | 4 ++-- src/server/api/endpoints/clips/create.ts | 2 +- src/server/api/endpoints/clips/delete.ts | 2 +- src/server/api/endpoints/clips/notes.ts | 2 +- src/server/api/endpoints/clips/show.ts | 2 +- src/server/api/endpoints/clips/update.ts | 2 +- src/server/api/endpoints/drive.ts | 2 +- src/server/api/endpoints/drive/files.ts | 2 +- .../api/endpoints/drive/files/attached-notes.ts | 2 +- src/server/api/endpoints/drive/files/create.ts | 2 +- src/server/api/endpoints/drive/files/delete.ts | 2 +- src/server/api/endpoints/drive/files/find.ts | 2 +- src/server/api/endpoints/drive/files/show.ts | 2 +- src/server/api/endpoints/drive/files/update.ts | 2 +- .../api/endpoints/drive/files/upload-from-url.ts | 2 +- src/server/api/endpoints/drive/folders.ts | 2 +- src/server/api/endpoints/drive/folders/create.ts | 4 ++-- src/server/api/endpoints/drive/folders/delete.ts | 2 +- src/server/api/endpoints/drive/folders/find.ts | 2 +- src/server/api/endpoints/drive/folders/show.ts | 2 +- src/server/api/endpoints/drive/folders/update.ts | 2 +- src/server/api/endpoints/drive/stream.ts | 2 +- src/server/api/endpoints/federation/followers.ts | 2 +- src/server/api/endpoints/federation/following.ts | 2 +- src/server/api/endpoints/federation/instances.ts | 4 ++-- .../api/endpoints/federation/show-instance.ts | 4 ++-- src/server/api/endpoints/federation/users.ts | 2 +- src/server/api/endpoints/following/create.ts | 2 +- src/server/api/endpoints/following/delete.ts | 2 +- .../api/endpoints/following/requests/accept.ts | 2 +- .../api/endpoints/following/requests/cancel.ts | 2 +- .../api/endpoints/following/requests/reject.ts | 2 +- src/server/api/endpoints/games/reversi/games.ts | 2 +- .../api/endpoints/games/reversi/games/show.ts | 2 +- .../api/endpoints/games/reversi/games/surrender.ts | 2 +- src/server/api/endpoints/games/reversi/match.ts | 4 ++-- src/server/api/endpoints/get-online-users-count.ts | 2 +- src/server/api/endpoints/hashtags/show.ts | 2 +- src/server/api/endpoints/hashtags/trend.ts | 6 +++--- src/server/api/endpoints/hashtags/users.ts | 2 +- src/server/api/endpoints/i/2fa/key-done.ts | 2 +- src/server/api/endpoints/i/2fa/register-key.ts | 2 +- src/server/api/endpoints/i/2fa/register.ts | 2 +- src/server/api/endpoints/i/favorites.ts | 2 +- src/server/api/endpoints/i/import-following.ts | 2 +- src/server/api/endpoints/i/import-user-lists.ts | 2 +- src/server/api/endpoints/i/notifications.ts | 2 +- src/server/api/endpoints/i/page-likes.ts | 2 +- src/server/api/endpoints/i/pages.ts | 2 +- src/server/api/endpoints/i/pin.ts | 2 +- src/server/api/endpoints/i/read-announcement.ts | 4 ++-- src/server/api/endpoints/i/registry/set.ts | 2 +- src/server/api/endpoints/i/revoke-token.ts | 2 +- src/server/api/endpoints/i/signin-history.ts | 2 +- src/server/api/endpoints/i/unpin.ts | 2 +- src/server/api/endpoints/i/update-email.ts | 2 +- src/server/api/endpoints/i/update.ts | 8 ++++---- src/server/api/endpoints/i/user-group-invites.ts | 2 +- src/server/api/endpoints/messaging/messages.ts | 2 +- .../api/endpoints/messaging/messages/create.ts | 2 +- .../api/endpoints/messaging/messages/delete.ts | 2 +- .../api/endpoints/messaging/messages/read.ts | 2 +- src/server/api/endpoints/meta.ts | 6 +++--- src/server/api/endpoints/miauth/gen-token.ts | 4 ++-- src/server/api/endpoints/mute/create.ts | 4 ++-- src/server/api/endpoints/mute/delete.ts | 2 +- src/server/api/endpoints/mute/list.ts | 2 +- src/server/api/endpoints/notes.ts | 2 +- src/server/api/endpoints/notes/children.ts | 2 +- src/server/api/endpoints/notes/clips.ts | 2 +- src/server/api/endpoints/notes/conversation.ts | 2 +- src/server/api/endpoints/notes/create.ts | 6 +++--- src/server/api/endpoints/notes/delete.ts | 2 +- src/server/api/endpoints/notes/favorites/create.ts | 4 ++-- src/server/api/endpoints/notes/favorites/delete.ts | 2 +- src/server/api/endpoints/notes/global-timeline.ts | 4 ++-- src/server/api/endpoints/notes/hybrid-timeline.ts | 4 ++-- src/server/api/endpoints/notes/local-timeline.ts | 4 ++-- src/server/api/endpoints/notes/mentions.ts | 2 +- src/server/api/endpoints/notes/polls/vote.ts | 4 ++-- src/server/api/endpoints/notes/reactions.ts | 2 +- src/server/api/endpoints/notes/reactions/create.ts | 2 +- src/server/api/endpoints/notes/reactions/delete.ts | 2 +- src/server/api/endpoints/notes/renotes.ts | 2 +- src/server/api/endpoints/notes/replies.ts | 2 +- src/server/api/endpoints/notes/search-by-tag.ts | 6 +++--- src/server/api/endpoints/notes/search.ts | 4 ++-- src/server/api/endpoints/notes/show.ts | 2 +- src/server/api/endpoints/notes/state.ts | 2 +- src/server/api/endpoints/notes/timeline.ts | 2 +- src/server/api/endpoints/notes/unrenote.ts | 2 +- .../api/endpoints/notes/user-list-timeline.ts | 2 +- src/server/api/endpoints/notes/watching/create.ts | 2 +- src/server/api/endpoints/notes/watching/delete.ts | 2 +- src/server/api/endpoints/page-push.ts | 2 +- src/server/api/endpoints/pages/create.ts | 4 ++-- src/server/api/endpoints/pages/delete.ts | 2 +- src/server/api/endpoints/pages/like.ts | 4 ++-- src/server/api/endpoints/pages/show.ts | 2 +- src/server/api/endpoints/pages/unlike.ts | 2 +- src/server/api/endpoints/pages/update.ts | 2 +- src/server/api/endpoints/pinned-users.ts | 4 ++-- src/server/api/endpoints/promo/read.ts | 4 ++-- src/server/api/endpoints/room/show.ts | 4 ++-- src/server/api/endpoints/sw/register.ts | 4 ++-- src/server/api/endpoints/users/clips.ts | 2 +- src/server/api/endpoints/users/followers.ts | 4 ++-- src/server/api/endpoints/users/following.ts | 4 ++-- .../users/get-frequently-replied-users.ts | 2 +- src/server/api/endpoints/users/groups/create.ts | 2 +- src/server/api/endpoints/users/groups/delete.ts | 2 +- .../endpoints/users/groups/invitations/accept.ts | 4 ++-- .../endpoints/users/groups/invitations/reject.ts | 2 +- src/server/api/endpoints/users/groups/invite.ts | 4 ++-- src/server/api/endpoints/users/groups/pull.ts | 2 +- src/server/api/endpoints/users/groups/show.ts | 2 +- src/server/api/endpoints/users/groups/transfer.ts | 2 +- src/server/api/endpoints/users/groups/update.ts | 2 +- src/server/api/endpoints/users/lists/create.ts | 2 +- src/server/api/endpoints/users/lists/delete.ts | 2 +- src/server/api/endpoints/users/lists/pull.ts | 2 +- src/server/api/endpoints/users/lists/push.ts | 2 +- src/server/api/endpoints/users/lists/show.ts | 2 +- src/server/api/endpoints/users/lists/update.ts | 2 +- src/server/api/endpoints/users/notes.ts | 2 +- src/server/api/endpoints/users/pages.ts | 2 +- src/server/api/endpoints/users/relation.ts | 2 +- src/server/api/endpoints/users/report-abuse.ts | 4 ++-- src/server/api/endpoints/users/show.ts | 2 +- src/server/api/endpoints/users/stats.ts | 2 +- src/server/api/limiter.ts | 2 +- src/server/api/openapi/description.ts | 2 +- src/server/api/openapi/gen-spec.ts | 2 +- src/server/api/openapi/schemas.ts | 2 +- src/server/api/private/signin.ts | 4 ++-- src/server/api/private/signup.ts | 4 ++-- src/server/api/service/discord.ts | 6 +++--- src/server/api/service/github.ts | 6 +++--- src/server/api/service/twitter.ts | 4 ++-- src/server/api/stream/channels/antenna.ts | 2 +- src/server/api/stream/channels/channel.ts | 2 +- src/server/api/stream/channels/global-timeline.ts | 6 +++--- src/server/api/stream/channels/hashtag.ts | 4 ++-- src/server/api/stream/channels/home-timeline.ts | 4 ++-- src/server/api/stream/channels/hybrid-timeline.ts | 6 +++--- src/server/api/stream/channels/local-timeline.ts | 6 +++--- src/server/api/stream/channels/user-list.ts | 2 +- src/server/file/send-drive-file.ts | 6 +++--- src/server/index.ts | 6 +++--- src/server/nodeinfo.ts | 4 ++-- src/server/proxy/proxy-media.ts | 6 +++--- src/server/web/feed.ts | 2 +- src/server/web/index.ts | 8 ++++---- src/server/web/manifest.ts | 2 +- src/server/web/url-preview.ts | 6 +++--- src/server/well-known.ts | 6 +++--- src/services/add-note-to-antenna.ts | 4 ++-- src/services/blocking/create.ts | 2 +- src/services/chart/charts/classes/active-users.ts | 2 +- src/services/chart/charts/classes/drive.ts | 2 +- src/services/chart/charts/classes/federation.ts | 2 +- src/services/chart/charts/classes/hashtag.ts | 2 +- src/services/chart/charts/classes/instance.ts | 4 ++-- src/services/chart/charts/classes/network.ts | 2 +- src/services/chart/charts/classes/notes.ts | 2 +- .../chart/charts/classes/per-user-drive.ts | 2 +- .../chart/charts/classes/per-user-following.ts | 2 +- .../chart/charts/classes/per-user-notes.ts | 2 +- .../chart/charts/classes/per-user-reactions.ts | 2 +- src/services/chart/charts/classes/test-grouped.ts | 2 +- src/services/chart/charts/classes/test-unique.ts | 2 +- src/services/chart/charts/classes/test.ts | 2 +- src/services/chart/charts/classes/users.ts | 2 +- src/services/chart/core.ts | 4 ++-- src/services/chart/index.ts | 2 +- src/services/create-notification.ts | 2 +- src/services/create-system-user.ts | 4 ++-- src/services/drive/add-file.ts | 10 +++++----- src/services/drive/delete-file.ts | 4 ++-- src/services/drive/internal-storage.ts | 2 +- src/services/drive/s3.ts | 2 +- src/services/drive/upload-from-url.ts | 4 ++-- src/services/fetch-instance-metadata.ts | 4 ++-- src/services/following/create.ts | 6 +++--- src/services/following/requests/accept.ts | 2 +- src/services/following/requests/cancel.ts | 2 +- src/services/following/requests/create.ts | 2 +- src/services/i/pin.ts | 6 +++--- src/services/insert-moderation-log.ts | 2 +- src/services/instance-actor.ts | 2 +- src/services/logger.ts | 4 ++-- src/services/messages/create.ts | 2 +- src/services/messages/delete.ts | 2 +- src/services/note/create.ts | 22 +++++++++++----------- src/services/note/delete.ts | 4 ++-- src/services/note/polls/vote.ts | 2 +- src/services/note/reaction/create.ts | 6 +++--- src/services/note/reaction/delete.ts | 4 ++-- src/services/note/read.ts | 4 ++-- src/services/note/unread.ts | 2 +- src/services/note/watch.ts | 2 +- src/services/push-notification.ts | 4 ++-- src/services/register-or-fetch-instance-doc.ts | 6 +++--- src/services/relay.ts | 2 +- src/services/send-email-notification.ts | 2 +- src/services/send-email.ts | 4 ++-- src/services/stream.ts | 2 +- src/services/suspend-user.ts | 2 +- src/services/unsuspend-user.ts | 2 +- src/services/update-hashtag.ts | 4 ++-- src/services/user-list/push.ts | 4 ++-- src/tools/accept-migration.ts | 2 +- src/tools/add-emoji.ts | 2 +- src/tools/resync-remote-user.ts | 2 +- 391 files changed, 557 insertions(+), 557 deletions(-) (limited to 'src/server/api') diff --git a/src/argv.ts b/src/argv.ts index a92338f867..9c69a450db 100644 --- a/src/argv.ts +++ b/src/argv.ts @@ -1,5 +1,5 @@ import * as program from 'commander'; -import config from './config'; +import config from '@/config'; program .version(config.version) diff --git a/src/boot/master.ts b/src/boot/master.ts index 33ccec55d0..ef8692b308 100644 --- a/src/boot/master.ts +++ b/src/boot/master.ts @@ -6,11 +6,11 @@ import * as isRoot from 'is-root'; import { getConnection } from 'typeorm'; import Logger from '../services/logger'; -import loadConfig from '../config/load'; -import { Config } from '../config/types'; +import loadConfig from '@/config/load'; +import { Config } from '@/config/types'; import { lessThan } from '../prelude/array'; import { program } from '../argv'; -import { showMachineInfo } from '../misc/show-machine-info'; +import { showMachineInfo } from '@/misc/show-machine-info'; import { initDb } from '../db/postgre'; const meta = require('../meta.json'); diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue index 2014c710a5..35cfb77301 100644 --- a/src/client/components/autocomplete.vue +++ b/src/client/components/autocomplete.vue @@ -29,9 +29,9 @@