Skip to content

Commit ba38536

Browse files
committed
refactor: add new queue for post spam check
1 parent 085a958 commit ba38536

File tree

4 files changed

+49
-24
lines changed

4 files changed

+49
-24
lines changed

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

Lines changed: 0 additions & 4 deletions
This file was deleted.

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ export class RedisService extends Redis implements Service {
4747
const queueName = this.queueName.createFeed
4848
return await this.lpush(queueName, JSON.stringify(data))
4949
}
50+
51+
public async addToSpamCheckQueue(data: SpamCheckArgs): Promise<number> {
52+
const queueName = this.queueName.spamCheck
53+
return await this.lpush(queueName, JSON.stringify(data))
54+
}
5055
}
5156

5257
type GenerateRedisKey = {
@@ -60,7 +65,18 @@ type GenerateRedisKey = {
6065

6166
type QueueName = 'createFeed' | 'spamCheck'
6267

63-
type CreateFeedArgs = {
68+
export type ChangeEmailArgs = {
69+
email: string
70+
userId: string
71+
}
72+
73+
export type CreateFeedArgs = {
6474
fk_following_id: string
6575
fk_post_id: string
6676
}
77+
78+
export type SpamCheckArgs = {
79+
post_id: string
80+
user_id: string
81+
ip: string
82+
}

packages/velog-server/src/services/PostApiService/index.ts

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { SeriesService } from '@services/SeriesService/index.js'
1818
import { SearchService } from '@services/SearchService/index.js'
1919
import { ExternalIntegrationService } from '@services/ExternalIntegrationService/index.js'
2020
import { PostService } from '@services/PostService/index.js'
21-
import { RedisService } from '@lib/redis/RedisService.js'
21+
import { CreateFeedArgs, RedisService, SpamCheckArgs } from '@lib/redis/RedisService.js'
2222
import { GraphcdnService } from '@lib/graphcdn/GraphcdnService.js'
2323
import { ImageService } from '@services/ImageService/index.js'
2424
import { UserService } from '@services/UserService/index.js'
@@ -121,15 +121,15 @@ export class PostApiService implements Service {
121121
}
122122

123123
if (!post.is_private && data.is_private) {
124-
setImmediate(async () => {
124+
setTimeout(async () => {
125125
if (!signedUserId) return
126126
const isIntegrated = await this.externalInterationService.checkIntegrated(signedUserId)
127127
if (!isIntegrated) return
128128
this.externalInterationService.notifyWebhook({
129129
type: 'deleted',
130130
post_id: post.id,
131131
})
132-
})
132+
}, 0)
133133
}
134134

135135
return { ...post, url_slug: data.url_slug }
@@ -168,12 +168,10 @@ export class PostApiService implements Service {
168168
const isPublish = !data.is_temp && !data.is_private
169169

170170
const country = geoip.lookup(ip)?.country ?? ''
171-
const isSpam = this.isIncludeSpamKeyword({ input, user, country })
172171
const isLimit = await this.isPostLimitReached(signedUserId)
173172
const isBlock = await this.dynamicConfigService.isBlockedUser(user.username)
174173

175174
const checks = [
176-
{ type: 'spam', value: isSpam },
177175
{ type: 'limit', value: isLimit },
178176
{ type: 'block', value: isBlock },
179177
]
@@ -249,7 +247,7 @@ export class PostApiService implements Service {
249247
await this.handleTags(tags, post.id)
250248

251249
if (isPublish) {
252-
setImmediate(async () => {
250+
setTimeout(async () => {
253251
if (!post) return
254252
if (!signedUserId) return
255253

@@ -269,20 +267,34 @@ export class PostApiService implements Service {
269267
user: true,
270268
},
271269
})
270+
272271
if (!targetPost) return
273272

274273
const serializedPost = this.postService.serialize(targetPost)
275274
this.externalInterationService.notifyWebhook({
276275
type: type === 'write' ? 'created' : 'updated',
277276
post: serializedPost,
278277
})
279-
})
280-
281-
const queueData = {
282-
fk_following_id: signedUserId,
283-
fk_post_id: post.id,
284-
}
285-
this.redis.createFeedQueue(queueData)
278+
}, 0)
279+
280+
// create feed
281+
setTimeout(() => {
282+
const queueData: CreateFeedArgs = {
283+
fk_following_id: signedUserId,
284+
fk_post_id: post.id,
285+
}
286+
this.redis.createFeedQueue(queueData)
287+
}, 0)
288+
289+
// check spam
290+
setTimeout(() => {
291+
const queueData: SpamCheckArgs = {
292+
post_id: post.id,
293+
user_id: signedUserId,
294+
ip,
295+
}
296+
this.redis.addToSpamCheckQueue(queueData)
297+
}, 0)
286298
}
287299

288300
setTimeout(async () => {
@@ -322,16 +334,17 @@ export class PostApiService implements Service {
322334

323335
const generate = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 8)
324336
const isEditArgs = this.isEditArgs(input)
337+
const isWriteArgs = !isEditArgs
325338

326339
if (isEditArgs && urlSlugDuplicate && urlSlugDuplicate.id !== input.id) {
327340
const randomString = generate(8)
328-
processedUrlSlug = processedUrlSlug.slice(0, 245)
341+
processedUrlSlug = processedUrlSlug.slice(0, 240)
329342
processedUrlSlug += `-${randomString}`
330343
}
331344

332-
if (!isEditArgs && urlSlugDuplicate) {
345+
if (isWriteArgs && urlSlugDuplicate) {
333346
const randomString = generate(8)
334-
processedUrlSlug = processedUrlSlug.slice(0, 245)
347+
processedUrlSlug = processedUrlSlug.slice(0, 240)
335348
processedUrlSlug += `-${randomString}`
336349
}
337350

packages/velog-server/src/services/UserService/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { RedisService } from '@lib/redis/RedisService.js'
2323
import { changeEmailTemplate } from '@template/changeEmailTemplate.js'
2424
import { ENV } from '@env'
2525
import { MailService } from '@lib/mail/MailService.js'
26-
import { ChangeEmailDataType } from '@lib/redis/RedisInterface.js'
26+
import { ChangeEmailArgs } from '@lib/redis/RedisService.js'
2727
import { differenceInDays } from 'date-fns'
2828

2929
interface Service {
@@ -246,7 +246,7 @@ export class UserService implements Service {
246246
const data = JSON.stringify({
247247
userId: user.id,
248248
email: email.toLowerCase(),
249-
} as ChangeEmailDataType)
249+
} as ChangeEmailArgs)
250250

251251
const template = changeEmailTemplate(user.username, email, code)
252252

@@ -279,7 +279,7 @@ export class UserService implements Service {
279279
throw new NotFoundError('Not found data')
280280
}
281281

282-
const { userId, email }: ChangeEmailDataType = JSON.parse(metadata)
282+
const { userId, email }: ChangeEmailArgs = JSON.parse(metadata)
283283

284284
if (userId !== signedUserId) {
285285
throw new UnauthorizedError('No permission to change the email')

0 commit comments

Comments
 (0)