From ef8f3ffd6fb4caf000ee8b7f67c5b690273e970a Mon Sep 17 00:00:00 2001 From: xyzuan Date: Wed, 11 Dec 2024 20:07:01 +0700 Subject: [PATCH 1/2] opt(rate-limit): Setting rate limit --- bun.lockb | Bin 140881 -> 141268 bytes package.json | 1 + src/api/controller/blog/commentBlog.ts | 7 ++++++- src/api/controller/message/wsMessage.ts | 8 ++++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 7a655f91cbc9af082cf33b6fdf111a34d9cea1e4..4f73397219c5b5b893a228fe27b87c3046caf289 100755 GIT binary patch delta 21708 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 delta 21392 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 diff --git a/package.json b/package.json index 0a17c02..97407aa 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@prisma/client": "5.19.1", "arctic": "^2.0.0", "cloudinary": "^2.5.1", + "elysia-ip": "^1.0.7", "elysia-rate-limit": "^4.1.0", "file-type": "^19.6.0", "logestic": "^1.2.4", diff --git a/src/api/controller/blog/commentBlog.ts b/src/api/controller/blog/commentBlog.ts index 067a63b..f1afa02 100644 --- a/src/api/controller/blog/commentBlog.ts +++ b/src/api/controller/blog/commentBlog.ts @@ -8,7 +8,12 @@ import blogModel from "@models/blog.model"; export default createElysia() .use(blogModel) .use(authGuard) - .use(rateLimit()) + .use( + rateLimit({ + max: 3, + duration: 60000, + }) + ) .post( "/comment/:id", async ({ body, params: { id }, user }) => { diff --git a/src/api/controller/message/wsMessage.ts b/src/api/controller/message/wsMessage.ts index 0e02565..e92df12 100644 --- a/src/api/controller/message/wsMessage.ts +++ b/src/api/controller/message/wsMessage.ts @@ -1,3 +1,5 @@ +import { rateLimit } from "elysia-rate-limit"; + import { UnauthorizedException } from "@constants/exceptions"; import { authGuard } from "@libs/authGuard"; import { createElysia } from "@libs/elysia"; @@ -6,6 +8,12 @@ import messageModel from "@models/message.model"; export default createElysia() .use(messageModel) + .use( + rateLimit({ + max: 10, + duration: 60000, + }) + ) .use(authGuard) .ws("/", { body: "message.model", From 502428052c079cc04d3d3063d99bb603fc3db626 Mon Sep 17 00:00:00 2001 From: xyzuan Date: Wed, 11 Dec 2024 20:12:12 +0700 Subject: [PATCH 2/2] feat(blog): Delete redis key when comment / reaction --- src/api/controller/blog/commentBlog.ts | 3 +++ src/api/controller/blog/reactionBlog.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/api/controller/blog/commentBlog.ts b/src/api/controller/blog/commentBlog.ts index f1afa02..82a7a89 100644 --- a/src/api/controller/blog/commentBlog.ts +++ b/src/api/controller/blog/commentBlog.ts @@ -4,6 +4,7 @@ import { BadRequestException } from "@constants/exceptions"; import { rateLimit } from "elysia-rate-limit"; import { createElysia } from "@libs/elysia"; import blogModel from "@models/blog.model"; +import { redis } from "@libs/redisClient"; export default createElysia() .use(blogModel) @@ -26,6 +27,8 @@ export default createElysia() throw new BadRequestException("Blog not found."); } + await redis.del(`blog.${blog.slug}`); + return { status: 200, data: await prismaClient.blogComment.create({ diff --git a/src/api/controller/blog/reactionBlog.ts b/src/api/controller/blog/reactionBlog.ts index a13f36d..70e1bc2 100644 --- a/src/api/controller/blog/reactionBlog.ts +++ b/src/api/controller/blog/reactionBlog.ts @@ -3,6 +3,7 @@ import { prismaClient } from "@libs/prismaDatabase"; import { BadRequestException } from "@constants/exceptions"; import { createElysia } from "@libs/elysia"; import blogModel from "@models/blog.model"; +import { redis } from "@libs/redisClient"; export default createElysia() .use(blogModel) @@ -20,6 +21,8 @@ export default createElysia() throw new BadRequestException("Blog not found."); } + await redis.del(`blog.${blog.slug}`); + const existingReaction = await prismaClient.blogReaction.findFirst({ where: { blogId: blog.id,