Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions src/app/actions/get-papers-by-id.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import { type PaperResponse } from "@/interface";
import type { PaperResponse, ApiResponse } from "@/interface";
import axios, { type AxiosResponse } from "axios";

export const fetchPaperID = async (id: string): Promise<PaperResponse> => {
const serverUrl = process.env.SERVER_URL ?? "https://papers.codechefvit.com";

try {
const response: AxiosResponse<PaperResponse> = await axios.get(
const response: AxiosResponse<ApiResponse<PaperResponse>> = await axios.get(
`${serverUrl}/api/paper-by-id/${id}`,
);
return response.data;

if (!response.data.data) {
throw new Error("Paper not found");
}
return response.data.data;
} catch (err: unknown) {
if (axios.isAxiosError(err)) {
console.error("Axios error:", err.response?.data ?? err.message);
const errorMessage =
(err.response?.data as { message?: string })?.message ??
"Failed to fetch paper";
if (axios.isAxiosError<ApiResponse<unknown>>(err)) {
const errorMessage = err.response?.data?.message ?? err.message;
console.error("Axios error:", errorMessage);
throw new Error(errorMessage);
} else {
console.error("Unexpected error:", err);
Expand Down
9 changes: 3 additions & 6 deletions src/app/api/course-list/route.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import { NextResponse } from "next/server";
import { getCourseList } from "@/lib/services/subject";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

export async function GET() {
try {
const courses = await getCourseList();
return NextResponse.json(courses, { status: 200 });
return success(courses);
} catch (error) {
console.error(error);
return NextResponse.json(
{ message: "Failed to fetch courses", error },
{ status: 500 },
);
return failure("Failed to fetch courses", 500);
}
}
14 changes: 5 additions & 9 deletions src/app/api/paper-by-id/[id]/route.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
import { NextResponse } from "next/server";
import { Types } from "mongoose";
import { getPaperById } from "@/lib/services/paper";
import { success, failure } from "@/lib/utils/response"

export async function GET(req: Request, { params }: { params: { id: string } }) {
try {
const { id } = params;

if (!Types.ObjectId.isValid(id)) {
return NextResponse.json({ message: "Invalid paper ID" }, { status: 400 });
return failure("Invalid paper ID");
}

const paper = await getPaperById(id);

return NextResponse.json(paper, { status: 200 });
return success(paper);
} catch (error) {
console.error(error);
return NextResponse.json(
{ message: "Failed to fetch paper", error },
{ status: 500 },
);
return failure("Failed to fetch paper", 500);
}
}
10 changes: 4 additions & 6 deletions src/app/api/papers/count/route.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
import { NextResponse } from "next/server";
import { getCourseCounts } from "@/lib/services/paper";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

export async function GET(req: Request) {
try {
const courseCount = await getCourseCounts();

return NextResponse.json(courseCount, { status: 200 });
return success(courseCount);
} catch (error) {
return NextResponse.json(
{ message: "Failed to fetch course counts", error },
{ status: 500 },
);
console.error(error);
return failure("Failed to fetch course counts", 500);
}
}
16 changes: 6 additions & 10 deletions src/app/api/papers/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { NextResponse, type NextRequest } from "next/server";
import { type NextRequest } from "next/server";
import { getPapersBySubject } from "@/lib/services/paper";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

Expand All @@ -8,18 +9,13 @@ export async function GET(req: NextRequest) {
const url = req.nextUrl.searchParams;
const sub = url.get("subject");
if (!sub) {
return NextResponse.json(
{ message: "Subject query parameter is required" },
{ status: 400 },
);
return failure("Subject query parameter is required");
}
const paper = await getPapersBySubject(sub);

return NextResponse.json(paper, { status: 200 });
return success(paper);
} catch (error) {
return NextResponse.json(
{ message: "Failed to fetch papers", error },
{ status: 500 },
);
console.error(error);
return failure("Failed to fetch papers", 500);
}
}
19 changes: 6 additions & 13 deletions src/app/api/related-subject/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { getRelatedSubjects } from "@/lib/services/subject";
import { NextResponse, type NextRequest } from "next/server";
import { type NextRequest } from "next/server";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

Expand All @@ -9,21 +10,13 @@ export async function GET(req: NextRequest) {
const subject = url.get("subject");

if (!subject) {
return NextResponse.json(
{ message: "Subject query parameter is required" },
{ status: 400 },
);
return failure("Subject query parameter is required", 400);
}
const relatedSubjects = await getRelatedSubjects(subject);

return NextResponse.json(
{related_subjects: relatedSubjects},
{ status: 200 },
);
return success({ related_subjects: relatedSubjects });
} catch (error) {
return NextResponse.json(
{ message: "Failed to fetch related subject", error },
{ status: 500 },
);
console.error(error);
return failure("Failed to fetch related subject", 500);
}
}
12 changes: 3 additions & 9 deletions src/app/api/report-tag/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from "next/server";
import { reportTag, ReportTagBody } from "@/lib/services/report";
import { rateLimitCheck } from "@/lib/utils/rate-limiter";
import { success, failure } from "@/lib/utils/response";
import { customErrorHandler } from "@/lib/utils/error";

export async function POST(req: Request & { ip?: string }) {
Expand All @@ -9,18 +9,12 @@ export async function POST(req: Request & { ip?: string }) {
const paperId = typeof body.paperId === "string" ? body.paperId : undefined;

if (!paperId) {
return NextResponse.json(
{ error: "paperId is required" },
{ status: 400 }
);
return failure("paperId is required", 400);
}
await rateLimitCheck(req, paperId);
const newReport = await reportTag(paperId, body);

return NextResponse.json(
{ message: "Report submitted.", report: newReport },
{ status: 201 }
);
return success({ message: "Report submitted.", report: newReport }, "Created", 201);
} catch (err) {
console.error(err);
return customErrorHandler(err, "Failed to submit tag report.");
Expand Down
17 changes: 4 additions & 13 deletions src/app/api/request/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import PaperRequest from "@/db/paperRequest";
import { success, failure } from "@/lib/utils/response";

export async function POST(req: Request) {
try {
Expand All @@ -15,22 +15,13 @@ export async function POST(req: Request) {
const { subject, exam, slot, year } = body;

if (!subject || !exam || !slot || !year) {
return NextResponse.json(
{ error: "All fields are required." },
{ status: 400 },
);
return failure("All fields are required.", 400);
}

const newRequest = await PaperRequest.create({ subject, exam, slot, year });
return NextResponse.json(
{ message: "Paper request submitted successfully!", request: newRequest },
{ status: 201 },
);
return success({ message: "Paper request submitted successfully!", request: newRequest }, "Created", 201);
} catch (error) {
console.error("Error creating paper request:", error);
return NextResponse.json(
{ error: "Failed to submit request." },
{ status: 500 },
);
return failure("Failed to submit request.", 500);
}
}
20 changes: 4 additions & 16 deletions src/app/api/selected-papers/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import Paper from "@/db/papers";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

Expand All @@ -11,23 +11,11 @@ export async function GET() {
const selectedPapers = await Paper.find({ isSelected: true }).limit(8);

if (selectedPapers.length === 0) {
return NextResponse.json(
{
message: "No selected papers found.",
},
{ status: 404 },
);
return failure("No selected papers found.", 404);
}
return NextResponse.json(selectedPapers, {
status: 200,
});
return success(selectedPapers);
} catch (error) {
console.error("Error fetching papers:", error);
return NextResponse.json(
{
error: "Failed to fetch papers.",
},
{ status: 500 },
);
return failure("Failed to fetch papers.", 500);
}
}
10 changes: 5 additions & 5 deletions src/app/api/subscribe/route.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { NextResponse } from "next/server";
import { customErrorHandler } from "@/lib/utils/error";
import { subscribeEmail } from "@/lib/services/subscribe";
import { success, failure } from "@/lib/utils/response";
import { customErrorHandler } from "@/lib/utils/error";

export async function POST(req: Request) {
try {
const { email } = (await req.json()) as { email: string };

if (!email) {
return NextResponse.json({ error: "Email is required" }, { status: 400 });
return failure("Email is required", 400);
}
await subscribeEmail(email);

return NextResponse.json({ message: "Email added successfully" });
return success({ message: "Email added successfully" });
} catch (error) {
console.error("Error adding email:", error);
return customErrorHandler(error, "Failed to add email");
}
}
}
20 changes: 4 additions & 16 deletions src/app/api/upcoming-papers/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import UpcomingSubject from "@/db/upcoming-paper";
import { success, failure } from "@/lib/utils/response";

export const dynamic = "force-dynamic";

Expand All @@ -13,24 +13,12 @@ export async function GET() {
.lean();

if (selectedSubjects.length === 0) {
return NextResponse.json(
{
message: "No selected papers found.",
},
{ status: 404 },
);
return failure("No selected papers found.", 404);
}

return NextResponse.json(selectedSubjects, {
status: 200,
});
return success(selectedSubjects);
} catch (error) {
console.error("Error fetching papers:", error);
return NextResponse.json(
{
error: "Failed to fetch papers.",
},
{ status: 500 },
);
return failure("Failed to fetch papers.", 500);
}
}
22 changes: 5 additions & 17 deletions src/app/api/upload/route.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import { PaperAdmin } from "@/db/papers";
import { createPDFfromImages } from "@/lib/storage/pdf";
import { uploadPDF, uploadThumbnail } from "@/lib/storage/gcp";
import { success, failure } from "@/lib/utils/response";

export const runtime = "nodejs";

Expand All @@ -15,19 +15,13 @@ export async function POST(req: Request) {
const thumb = formData.get("thumbnail") as File | null;

if (files.length === 0) {
return NextResponse.json(
{ error: "No files received." },
{ status: 400 },
);
return failure("No files received.", 400);
}

let pdfBytes: Uint8Array;
if (isPdf) {
if (!files[0]) {
return NextResponse.json(
{ error: "No PDF file provided." },
{ status: 400 },
);
return failure("No PDF file provided.", 400);
}
pdfBytes = new Uint8Array(await files[0].arrayBuffer());
} else {
Expand Down Expand Up @@ -57,15 +51,9 @@ export async function POST(req: Request) {
});
await paper.save();

return NextResponse.json(
{ status: "success", file_url, thumbnail_url },
{ status: 201 },
);
return success({ file_url, thumbnail_url }, "Created", 201);
} catch (error) {
console.error(error);
return NextResponse.json(
{ message: "Failed to upload papers", error },
{ status: 500 },
);
return failure("Failed to upload papers", 500);
}
}
Loading
Loading