Skip to content

Commit

Permalink
🎨 #310 TOO_MANY_REQUESTS Errorを生成する関数を共通化
Browse files Browse the repository at this point in the history
  • Loading branch information
keitakn committed Mar 26, 2024
1 parent c137958 commit 0bb2413
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 32 deletions.
22 changes: 22 additions & 0 deletions src/app/api/_utils/http.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { httpStatusCode } from '@/constants';
import { NextResponse } from 'next/server';

const tooManyRequestsResponseBody = {
type: 'TOO_MANY_REQUESTS',
title: 'Too many requests.',
detail: 'Too many requests from this IP. Please try again after some time.',
} as const;

export const createTooManyRequestsError = (): NextResponse<
typeof tooManyRequestsResponseBody
> => {
const responseBody = {
type: 'TOO_MANY_REQUESTS',
title: 'Too many requests.',
detail: 'Too many requests from this IP. Please try again after some time.',
} as const;

const status = httpStatusCode.tooManyRequests;

return NextResponse.json(responseBody, { status });
};

Check warning on line 22 in src/app/api/_utils/http.ts

View check run for this annotation

Codecov / codecov/patch

src/app/api/_utils/http.ts#L2-L22

Added lines #L2 - L22 were not covered by tests
1 change: 1 addition & 0 deletions src/app/api/_utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './http';
12 changes: 2 additions & 10 deletions src/app/api/cat-images/validation-results/route.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { issueClientCredentialsAccessToken } from '@/api';
import { createTooManyRequestsError } from '@/app/api/_utils/http';
import {
httpStatusCode,
upstashRedisRestToken,
Expand Down Expand Up @@ -62,16 +63,7 @@ const isAcceptableCatImageResponse = (
export const POST = async (request: NextRequest): Promise<Response> => {
const { success } = await rateLimit.limit(request.ip ?? 'anonymous');
if (!success) {
const responseBody = {
type: 'TOO_MANY_REQUESTS',
title: 'Too many requests.',
detail:
'Too many requests from this IP. Please try again after some time.',
};

const status = httpStatusCode.tooManyRequests;

return NextResponse.json(responseBody, { status });
return createTooManyRequestsError();
}

const requestBody = (await request.json()) as CatImageValidationRequestBody;
Expand Down
12 changes: 2 additions & 10 deletions src/app/api/lgtm-images/recently-created/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
isFetchLgtmImagesResponseBody,
issueClientCredentialsAccessToken,
} from '@/api';
import { createTooManyRequestsError } from '@/app/api/_utils/http';
import {
httpStatusCode,
upstashRedisRestToken,
Expand Down Expand Up @@ -34,16 +35,7 @@ const rateLimit = new Ratelimit({
export const GET = async (request: NextRequest): Promise<Response> => {
const { success } = await rateLimit.limit(request.ip ?? 'anonymous');
if (!success) {
const responseBody = {
type: 'TOO_MANY_REQUESTS',
title: 'Too many requests.',
detail:
'Too many requests from this IP. Please try again after some time.',
};

const status = httpStatusCode.tooManyRequests;

return NextResponse.json(responseBody, { status });
return createTooManyRequestsError();
}

const accessToken = await issueClientCredentialsAccessToken();
Expand Down
21 changes: 9 additions & 12 deletions src/app/api/lgtm-images/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
isFetchLgtmImagesResponseBody,
issueClientCredentialsAccessToken,
} from '@/api';
import { createTooManyRequestsError } from '@/app/api/_utils/http';
import {
httpStatusCode,
upstashRedisRestToken,
Expand Down Expand Up @@ -38,16 +39,7 @@ const rateLimit = new Ratelimit({
export const GET = async (request: NextRequest): Promise<Response> => {
const { success } = await rateLimit.limit(request.ip ?? 'anonymous');
if (!success) {
const responseBody = {
type: 'TOO_MANY_REQUESTS',
title: 'Too many requests.',
detail:
'Too many requests from this IP. Please try again after some time.',
};

const status = httpStatusCode.tooManyRequests;

return NextResponse.json(responseBody, { status });
return createTooManyRequestsError();
}

const accessToken = await issueClientCredentialsAccessToken();
Expand Down Expand Up @@ -119,8 +111,13 @@ const isUploadLgtmImageResponse = (
return validation(uploadLgtmImageResponseSchema, value).isValidate;
};

export const POST = async (req: Request): Promise<Response> => {
const requestBody = (await req.json()) as UploadLgtmImageRequestBody;
export const POST = async (request: NextRequest): Promise<Response> => {
const { success } = await rateLimit.limit(request.ip ?? 'anonymous');
if (!success) {
return createTooManyRequestsError();
}

const requestBody = (await request.json()) as UploadLgtmImageRequestBody;
const validationResult = validateUploadLgtmImageRequestBody(requestBody);
if (!validationResult.isValidate && validationResult.invalidParams) {
const validationErrorBody = {
Expand Down

0 comments on commit 0bb2413

Please sign in to comment.