Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
78ca6da
Fix dropdown hover border radius
shashified May 19, 2026
5f1db7f
fixed hover issue
shashified May 19, 2026
84afafc
Merge branch 'CodeChefVIT:staging' into staging
shashified May 19, 2026
c92a721
Fix dropdown hover radius alignment
shashified May 21, 2026
80fec55
fix: fixed sharebutton's behaviour during fullscreen
Gslmao Jun 4, 2026
0db8130
removed console.logs for debugging
Gslmao Jun 4, 2026
c6ce2e7
removed unused import
Gslmao Jun 4, 2026
4e26d30
fix(#507): force fixed width on subject-count badge using shrink-0
tvesha09 Jun 5, 2026
bc041eb
Merge branch 'CodeChefVIT:staging' into staging
tvesha09 Jun 5, 2026
dd49428
Merge pull request #510 from tvesha09/staging
Skywalker-organa Jun 9, 2026
8fafe23
Merge pull request #509 from Gslmao-s-Org/Gslmao/fixShareButton
Skywalker-organa Jun 9, 2026
7c0120a
fix: images can be dropped inside the upload box
Gslmao Jun 10, 2026
2f0fb2c
feat: define helpers for backend responses
Gslmao Jun 11, 2026
c10c3ff
feat: implement helper functions in course-list, papers/count endpoin…
Gslmao Jun 11, 2026
c5f26da
implement: helpers for papers, related-subject endpoints
Gslmao Jun 11, 2026
e079e5b
implement: helpers for report-tag endpoint
Gslmao Jun 11, 2026
78039bd
implement: helpers for request, upcoming-papers endpoints
Gslmao Jun 11, 2026
aadd279
implement: helpers for selected-papers endpoint
Gslmao Jun 11, 2026
e07ceb9
implement: helpers for subscribe endpoint
Gslmao Jun 11, 2026
3bac052
implement: helpers for upload endpoint
Gslmao Jun 11, 2026
991491e
implement: helpers for user-papers endpoint
Gslmao Jun 11, 2026
fe4ee84
update frontend callers to match api shape
Gslmao Jun 11, 2026
c151ac0
update error handler to comply with api response
Gslmao Jun 11, 2026
fc1a0d4
impl: helper for paper-by-is endpoint and update callers
Gslmao Jun 13, 2026
5e4369f
update middleware to comply with response shape
Gslmao Jun 13, 2026
1f0ff3c
refactor: backend doesent send error objects to frontend
Gslmao Jun 14, 2026
6938b21
fix: lint errors
Gslmao Jun 14, 2026
397f6dd
feat: pdf.js compression on upload
YOGESH-08 Jun 16, 2026
ef9ee19
feat: increase images count for long question papers
YOGESH-08 Jun 16, 2026
c3c72e2
Merge pull request #512 from Gslmao-s-Org/Gslmao/backendResp
YOGESH-08 Jun 16, 2026
16f04b4
Merge pull request #511 from Gslmao-s-Org/Gslmao/fixDropArea
YOGESH-08 Jun 16, 2026
e5d068a
Merge branch 'staging' into feat/compression-on-upload
YOGESH-08 Jun 16, 2026
1f96df2
fix: consistent be response
YOGESH-08 Jun 16, 2026
c30a2ac
fix
YOGESH-08 Jun 16, 2026
6319555
Merge branch 'staging' into pr-506
YOGESH-08 Jun 16, 2026
34bf8b9
Merge pull request #513 from CodeChefVIT/staging-pr
YOGESH-08 Jun 16, 2026
9dc0bf9
Merge pull request #514 from CodeChefVIT/feat/compression-on-upload
YOGESH-08 Jun 16, 2026
da16136
fix: ESLint errors
Gslmao Jun 16, 2026
fd74255
Merge pull request #515 from Gslmao-s-Org/Gslmao/fixLintWarns
YOGESH-08 Jun 17, 2026
07dd8a1
logic seperation from request endpoint
Gslmao Jun 18, 2026
e51ceff
logic seperation from upcoing-papers endpoint
Gslmao Jun 18, 2026
259417a
logic seperation from upload endpoint
Gslmao Jun 18, 2026
264218c
logic seperation from selected-papers endpoint
Gslmao Jun 18, 2026
cb8e4d1
logic seperation from user-papers endpoint
Gslmao Jun 18, 2026
8e189c3
minor fixes
Gslmao Jun 18, 2026
08246c7
fix: ESLint unsafe any type error
Gslmao Jun 18, 2026
8719769
Merge pull request #516 from Gslmao-s-Org/Gslmao/breakApart
YOGESH-08 Jun 21, 2026
27e63f6
Fix sidebar , scroll , render issues
Rithish-2914 Jul 30, 2026
42a6b86
Merge branch 'CodeChefVIT:staging' into staging
Rithish-2914 Jul 30, 2026
e7bd497
for issues #463 #498 #474 #476 #461 #454
Rithish-2914 Jul 31, 2026
017d7d1
Merge pull request #517 from Rithish-2914/staging
YOGESH-08 Aug 3, 2026
2e38992
fix: totalPageNumber
YOGESH-08 Aug 3, 2026
10a8eea
fix: edit pageNumber
YOGESH-08 Aug 3, 2026
2c68416
fix: automate upcoming slot with lastSync
YOGESH-08 Aug 3, 2026
5b95471
fix: dropdown
YOGESH-08 Aug 3, 2026
d06c6a7
fix: pdf size error
YOGESH-08 Aug 3, 2026
658c2f4
fix: build
YOGESH-08 Aug 3, 2026
76283f4
revert
YOGESH-08 Aug 4, 2026
0e9ab7b
Merge pull request #518 from Rithish-2914/rithish/pdf-fix
YOGESH-08 Aug 4, 2026
b740089
fix: zoomLevel
YOGESH-08 Aug 4, 2026
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);
}
}
16 changes: 7 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,21 @@
import { NextResponse } from "next/server";
import { Types } from "mongoose";
import { getPaperById } from "@/lib/services/paper";
import { success, failure } from "@/lib/utils/response"

export const dynamic = "force-dynamic";

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);
}
}
12 changes: 5 additions & 7 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) {
export async function GET() {
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);
}
}
14 changes: 4 additions & 10 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 { reportTag, type 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
33 changes: 8 additions & 25 deletions src/app/api/request/route.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,19 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import PaperRequest from "@/db/paperRequest";
import { success, failure } from "@/lib/utils/response";
import { createPaperRequest } from "@/lib/services/paper"
import type { CreatePaperInputType } from "@/lib/services/paper"

export async function POST(req: Request) {
try {
await connectToDatabase();
const body = (await req.json()) as {
subject: string;
exam: string;
slot: string;
year: string;
};

const { subject, exam, slot, year } = body;
const {subject, exam, slot, year} = (await req.json()) as CreatePaperInputType

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 },
);
const newRequest = await createPaperRequest({subject, exam, slot, year});
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);
}
}
29 changes: 7 additions & 22 deletions src/app/api/selected-papers/route.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,18 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import Paper from "@/db/papers";
import { success, failure } from "@/lib/utils/response";
import { getSelectedPapers } from "@/lib/services/paper";

export const dynamic = "force-dynamic";

export async function GET() {
try {
await connectToDatabase();

const selectedPapers = await Paper.find({ isSelected: true }).limit(8);
const selectedPapers = await getSelectedPapers();

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");
}
}
}
33 changes: 8 additions & 25 deletions src/app/api/upcoming-papers/route.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,19 @@
import { NextResponse } from "next/server";
import { connectToDatabase } from "@/lib/database/mongoose";
import UpcomingSubject from "@/db/upcoming-paper";
import { success, failure } from "@/lib/utils/response";
import { getUpcomingSubjects } from "@/lib/services/subject";

export const dynamic = "force-dynamic";

export async function GET() {
try {
await connectToDatabase();
const selectedSubjects = await UpcomingSubject.find()
.sort({ _id: 1 })
.limit(16)
.lean();

const selectedSubjects = await getUpcomingSubjects();

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);
}
}
}
Loading
Loading