Skip to content

Commit 83c9b8a

Browse files
authored
Merge pull request #44 from velog-io/development
discord 에러 메시지 캐싱
2 parents 014ca8c + 8a774d2 commit 83c9b8a

File tree

4 files changed

+71
-49
lines changed

4 files changed

+71
-49
lines changed

packages/velog-server/src/common/plugins/global/errorHandlerPlugin.ts

+16-21
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,14 @@ const errorHandlerPlugin: FastifyPluginCallback = (fastify, _, done) => {
1515
request.log.error(error, 'fastify onError')
1616
const discord = container.resolve(DiscordService)
1717
discord
18-
.sendMessage(
19-
'error',
20-
JSON.stringify({
21-
type: 'fastify OnError',
22-
requestbody: request?.body || 'none',
23-
query: request?.query || 'none',
24-
error,
25-
user: request?.user,
26-
ip: request?.ip,
27-
}),
28-
)
18+
.sendMessage('error', {
19+
type: 'fastify OnError',
20+
body: request?.body,
21+
query: request?.query,
22+
error,
23+
user: request?.user,
24+
ip: request?.ip,
25+
})
2926
.catch(console.error)
3027

3128
done()
@@ -50,16 +47,14 @@ const errorHandlerPlugin: FastifyPluginCallback = (fastify, _, done) => {
5047
} else {
5148
const discord = container.resolve(DiscordService)
5249
discord
53-
.sendMessage(
54-
'error',
55-
JSON.stringify({
56-
type: 'fastify handleError',
57-
requestbody: request?.body,
58-
error,
59-
user: request?.user,
60-
ip: request?.ip,
61-
}),
62-
)
50+
.sendMessage('error', {
51+
type: 'fastify handleError',
52+
body: request?.body,
53+
query: request?.query,
54+
error,
55+
user: request?.user,
56+
ip: request?.ip,
57+
})
6358
.catch(console.error)
6459
}
6560
})

packages/velog-server/src/common/plugins/global/mercuriusPlugin.ts

+21-26
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const mercuriusPlugin: FastifyPluginAsync = async (fastify) => {
2323
},
2424
errorHandler: (error, request) => {
2525
const { name, message, code, stack, errors, statusCode } = error
26-
const result = {
26+
const errorData = {
2727
name,
2828
message,
2929
code,
@@ -38,43 +38,38 @@ const mercuriusPlugin: FastifyPluginAsync = async (fastify) => {
3838
const discord = container.resolve(DiscordService)
3939

4040
discord
41-
.sendMessage(
42-
'error',
43-
JSON.stringify({
44-
type: 'errorHandler',
45-
requestbody: request?.body,
46-
result,
47-
user: request?.user,
48-
ip: request?.ip,
49-
}),
50-
)
41+
.sendMessage('error', {
42+
type: 'errorHandler',
43+
body: request?.body,
44+
user: request?.user,
45+
ip: request?.ip,
46+
originError: error,
47+
error: errorData,
48+
})
5149
.catch(console.error)
5250
}
5351
},
54-
errorFormatter: (execution, ctx) => {
55-
const e = execution.errors?.[0]?.originalError
52+
errorFormatter: (error, ctx) => {
53+
const e = error.errors?.[0]?.originalError
5654

5755
if (!isHttpError(e)) {
5856
console.log('mecurius errorFormatter')
59-
;(ctx as any).request?.log?.error(execution, 'errorFormatter')
57+
;(ctx as any).request?.log?.error(error, 'errorFormatter')
6058
const discord = container.resolve(DiscordService)
6159
discord
62-
.sendMessage(
63-
'error',
64-
JSON.stringify({
65-
type: 'errorFormat',
66-
requestbody: (ctx as any).request?.body,
67-
execution,
68-
user: (ctx as any).request?.user,
69-
ip: (ctx as any).request?.ip,
70-
}),
71-
)
60+
.sendMessage('error', {
61+
type: 'errorFormat',
62+
body: (ctx as any).request?.body,
63+
error,
64+
user: (ctx as any).request?.user,
65+
ip: (ctx as any).request?.ip,
66+
})
7267
.catch(console.error)
7368

74-
return { statusCode: 500, response: execution }
69+
return { statusCode: 500, response: error }
7570
}
7671

77-
const errors = execution.errors?.map((error) =>
72+
const errors = error.errors?.map((error) =>
7873
Object.assign(error, {
7974
extensions: {
8075
name: e.name,

packages/velog-server/src/lib/discord/DiscordService.ts

+32-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { injectable, singleton } from 'tsyringe'
1+
import { container, injectable, singleton } from 'tsyringe'
22
import { Client, GatewayIntentBits } from 'discord.js'
33
import { ENV } from '@env'
4+
import { RedisService } from '@lib/redis/RedisService'
5+
import { Time } from '@constants/TimeConstants'
46

57
@injectable()
68
@singleton()
@@ -22,9 +24,20 @@ export class DiscordService {
2224
this.client.login(ENV.discordBotToken)
2325
})
2426
}
25-
public async sendMessage(type: MessageType, message: string) {
27+
public async sendMessage(type: MessageType, payload: MessagePayload | string) {
2628
this.isSending = true
2729

30+
let message = ''
31+
if (typeof payload === 'string') {
32+
message = payload
33+
} else {
34+
const metaData = Object.assign(payload, {
35+
body: payload.body ?? 'none',
36+
query: payload.query ?? 'none',
37+
})
38+
message = JSON.stringify(metaData)
39+
}
40+
2841
const frequentWord = [
2942
'connection pool',
3043
'canceling statement',
@@ -44,6 +57,14 @@ export class DiscordService {
4457
return
4558
}
4659

60+
if (typeof payload === 'object' && payload.body?.include('WritePost') && payload?.user?.id) {
61+
const redisService = container.resolve(RedisService)
62+
const key = redisService.generateKey.errorMessageCache(payload.type, payload?.user?.id)
63+
const exists = await redisService.exists(key)
64+
if (exists === 1) return
65+
await redisService.setex(key, Time.ONE_MINUTE_IN_S * 10, 'true')
66+
}
67+
4768
try {
4869
const isReady = this.client.isReady()
4970

@@ -82,3 +103,12 @@ export class DiscordService {
82103
}
83104

84105
type MessageType = 'error' | 'spam'
106+
type MessagePayload = {
107+
type: string
108+
body?: any
109+
query?: any
110+
user?: { id: string }
111+
ip?: string
112+
error?: any
113+
originError?: any
114+
}

packages/velog-server/src/lib/redis/RedisService.ts

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class RedisService extends Redis implements Service {
3434
changeEmail: (code: string) => `changeEmailCode:${code}`,
3535
trendingWriters: () => `trending:writers`,
3636
existsUser: (userId: string) => `exists:user:${userId}`,
37+
errorMessageCache: (type: string, userId: string) => `error:${type}:${userId}`,
3738
}
3839
}
3940

@@ -63,6 +64,7 @@ type GenerateRedisKey = {
6364
changeEmail: (code: string) => string
6465
trendingWriters: () => string
6566
existsUser: (userId: string) => string
67+
errorMessageCache: (type: string, userId: string) => string
6668
}
6769

6870
type QueueName = 'createFeed' | 'checkPostSpam'

0 commit comments

Comments
 (0)