From 968a843120c896fbcf1e7dc2cd13336ab6663320 Mon Sep 17 00:00:00 2001 From: b3ni15 Date: Thu, 16 Oct 2025 13:21:01 +0200 Subject: [PATCH] refactor: Add type annotations for response objects in API request handling --- src/app/api/cron/cleanup/route.ts | 4 ++-- src/app/api/delete/route.ts | 2 +- .../download-part/[file_id]/[part_index]/route.ts | 12 +++++++++++- src/app/api/upload-part/route.ts | 4 +--- src/lib/discordRateLimiter.ts | 10 +++++++--- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/app/api/cron/cleanup/route.ts b/src/app/api/cron/cleanup/route.ts index 2dca810..699c43f 100644 --- a/src/app/api/cron/cleanup/route.ts +++ b/src/app/api/cron/cleanup/route.ts @@ -50,7 +50,7 @@ export async function POST(request: Request) { for (const part of parts[0] as FilePart[]) { if (!part.discord_message_id) continue; try { - const res = await rateLimiter.request( + const res: Response = await rateLimiter.request( `/channels/${process.env.DISCORD_CHANNEL_ID}/messages/${part.discord_message_id}`, { method: 'DELETE', @@ -89,7 +89,7 @@ export async function POST(request: Request) { for (const part of partsRows[0] as FilePart[]) { if (!part.discord_message_id) continue; try { - const res = await rateLimiter.request( + const res: Response = await rateLimiter.request( `/channels/${process.env.DISCORD_CHANNEL_ID}/messages/${part.discord_message_id}`, { method: 'DELETE', diff --git a/src/app/api/delete/route.ts b/src/app/api/delete/route.ts index 39dc482..cf2be95 100644 --- a/src/app/api/delete/route.ts +++ b/src/app/api/delete/route.ts @@ -54,7 +54,7 @@ export async function POST(request: Request) { if (!part.discord_message_id) continue; try { - const res = await rateLimiter.request( + const res: Response = await rateLimiter.request( `/channels/${process.env.DISCORD_CHANNEL_ID}/messages/${part.discord_message_id}`, { method: 'DELETE', diff --git a/src/app/api/download-part/[file_id]/[part_index]/route.ts b/src/app/api/download-part/[file_id]/[part_index]/route.ts index ac2f3d8..0f25b25 100644 --- a/src/app/api/download-part/[file_id]/[part_index]/route.ts +++ b/src/app/api/download-part/[file_id]/[part_index]/route.ts @@ -16,6 +16,16 @@ interface RouteContext { }>; } +interface DiscordAttachment { + url: string; + filename: string; + size: number; +} + +interface DiscordMessageData { + attachments: DiscordAttachment[]; +} + if (!process.env.DISCORD_BOT_TOKEN || !process.env.DISCORD_CHANNEL_ID) { throw new Error('Discord bot token or channel ID is not configured'); } @@ -48,7 +58,7 @@ export async function GET(request: NextRequest, context: RouteContext) { } // 1. Get fresh message data from Discord - const messageData = await rateLimiter.request( + const messageData: DiscordMessageData = await rateLimiter.request( `/channels/${process.env.DISCORD_CHANNEL_ID}/messages/${part.discord_message_id}` ); diff --git a/src/app/api/upload-part/route.ts b/src/app/api/upload-part/route.ts index f833e8c..2be63b7 100644 --- a/src/app/api/upload-part/route.ts +++ b/src/app/api/upload-part/route.ts @@ -8,8 +8,6 @@ if (!process.env.DISCORD_BOT_TOKEN || !process.env.DISCORD_CHANNEL_ID) { throw new Error('Please define DISCORD_BOT_TOKEN and DISCORD_CHANNEL_ID in .env.local'); } -const DISCORD_API_URL = `https://discord.com/api/v10/channels/${process.env.DISCORD_CHANNEL_ID}/messages`; - const rateLimiter = new DiscordRateLimiter(DISCORD_API_BASE_URL, process.env.DISCORD_BOT_TOKEN); export async function POST(request: Request) { @@ -27,7 +25,7 @@ export async function POST(request: Request) { const discordFormData = new FormData(); discordFormData.append('file', chunk, `chunk-${partIndex}.bin`); - const discordRes = await rateLimiter.request( + const discordRes: Response = await rateLimiter.request( `/channels/${process.env.DISCORD_CHANNEL_ID}/messages`, { method: 'POST', diff --git a/src/lib/discordRateLimiter.ts b/src/lib/discordRateLimiter.ts index bd7ebcd..6c5d3cb 100644 --- a/src/lib/discordRateLimiter.ts +++ b/src/lib/discordRateLimiter.ts @@ -19,12 +19,16 @@ export class DiscordRateLimiter { public async request(path: string, options: RequestInit = {}): Promise { const url = `${this.baseUrl}${path}`; - const headers = { + const headers: Record = { 'Authorization': `Bot ${this.botToken}`, - 'Content-Type': 'application/json', - ...options.headers, + ...(options.headers as Record), }; + // Only set Content-Type to application/json if body is a string and not explicitly set + if (typeof options.body === 'string' && !('Content-Type' in headers)) { + headers['Content-Type'] = 'application/json'; + } + const response = await fetch(url, { ...options, headers }); if (response.status === 429) {