Skip to content

Commit e1c6894

Browse files
Merge pull request #360 from Abh1noob/refactor
Refactor API routes to separate concerns between HTTP handlers and business logic
2 parents a6a46aa + 39c6085 commit e1c6894

35 files changed

Lines changed: 241 additions & 200 deletions

File tree

src/app/api/course-list/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import { Course } from "@/db/course";
44

55
export const dynamic = "force-dynamic";

src/app/api/paper-by-id/[id]/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import Paper from "@/db/papers";
44
import { Types } from "mongoose";
55

src/app/api/papers/count/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import CourseCount from "@/db/course";
44

55
export const dynamic = "force-dynamic";

src/app/api/papers/route.ts

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { NextResponse, type NextRequest } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import Paper from "@/db/papers";
44
import { type IPaper } from "@/interface";
5+
import { escapeRegExp } from "@/lib/utils/regex";
6+
import { extractUniqueValues } from "@/lib/utils/paper-aggregation";
57

68
export const dynamic = "force-dynamic";
79

@@ -10,10 +12,6 @@ export async function GET(req: NextRequest) {
1012
await connectToDatabase();
1113
const url = req.nextUrl.searchParams;
1214
const subject = url.get("subject");
13-
const escapeRegExp = (text: string) => {
14-
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
15-
};
16-
const escapedSubject = escapeRegExp(subject ?? "");
1715

1816
if (!subject) {
1917
return NextResponse.json(
@@ -22,42 +20,17 @@ export async function GET(req: NextRequest) {
2220
);
2321
}
2422

23+
const escapedSubject = escapeRegExp(subject);
2524
const papers: IPaper[] = await Paper.find({
2625
subject: { $regex: new RegExp(`${escapedSubject}`, "i") },
2726
});
2827

29-
if (papers.length === 0) {
30-
return NextResponse.json(
31-
{
32-
papers,
33-
unique_years: [],
34-
unique_slots: [],
35-
unique_exams: [],
36-
unique_campuses: [],
37-
unique_semesters: [],
38-
},
39-
{ status: 200 },
40-
);
41-
}
42-
43-
const unique_years = Array.from(new Set(papers.map((paper) => paper.year)));
44-
const unique_slots = Array.from(new Set(papers.map((paper) => paper.slot)));
45-
const unique_exams = Array.from(new Set(papers.map((paper) => paper.exam)));
46-
const unique_campuses = Array.from(
47-
new Set(papers.map((paper) => paper.campus)),
48-
);
49-
const unique_semesters = Array.from(
50-
new Set(papers.map((paper) => paper.semester)),
51-
);
28+
const uniqueValues = extractUniqueValues(papers);
5229

5330
return NextResponse.json(
5431
{
5532
papers,
56-
unique_years,
57-
unique_slots,
58-
unique_exams,
59-
unique_campuses,
60-
unique_semesters,
33+
...uniqueValues,
6134
},
6235
{ status: 200 },
6336
);
@@ -67,4 +40,4 @@ export async function GET(req: NextRequest) {
6740
{ status: 500 },
6841
);
6942
}
70-
}
43+
}

src/app/api/related-subject/route.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { NextResponse, type NextRequest } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import { IRelatedSubject } from "@/interface";
44
import RelatedSubject from "@/db/relatedSubjects";
5+
import { escapeRegExp } from "@/lib/utils/regex";
56

67
export const dynamic = "force-dynamic";
78

@@ -10,20 +11,19 @@ export async function GET(req: NextRequest) {
1011
await connectToDatabase();
1112
const url = req.nextUrl.searchParams;
1213
const subject = url.get("subject");
13-
const escapeRegExp = (text: string) => {
14-
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
15-
};
16-
const escapedSubject = escapeRegExp(subject ?? "");
1714

1815
if (!subject) {
1916
return NextResponse.json(
2017
{ message: "Subject query parameter is required" },
2118
{ status: 400 },
2219
);
2320
}
21+
22+
const escapedSubject = escapeRegExp(subject);
2423
const subjects: IRelatedSubject[] = await RelatedSubject.find({
2524
subject: { $regex: new RegExp(`${escapedSubject}`, "i") },
2625
});
26+
2727
console.log("realted", subjects);
2828

2929
return NextResponse.json(
@@ -38,4 +38,4 @@ export async function GET(req: NextRequest) {
3838
{ status: 500 },
3939
);
4040
}
41-
}
41+
}

src/app/api/request/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import PaperRequest from "@/db/paperRequest";
44

55
export async function POST(req: Request) {

src/app/api/selected-papers/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import Paper from "@/db/papers";
44

55
export const dynamic = "force-dynamic";

src/app/api/subscribe/route.ts

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,5 @@
11
import { NextResponse } from "next/server";
2-
import { google, sheets_v4 } from "googleapis";
3-
import { JWT } from "google-auth-library";
4-
5-
const SCOPES = ["https://www.googleapis.com/auth/spreadsheets"];
6-
const SHEET_ID = process.env.SHEET_ID;
7-
8-
async function getAuth(): Promise<JWT> {
9-
return new google.auth.JWT({
10-
email: process.env.GOOGLE_CLIENT_EMAIL,
11-
key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"),
12-
scopes: SCOPES,
13-
});
14-
}
15-
16-
async function appendEmailToSheet(email: string) {
17-
const authClient = await getAuth();
18-
const sheets: sheets_v4.Sheets = google.sheets({
19-
version: "v4",
20-
auth: authClient,
21-
});
22-
23-
await sheets.spreadsheets.values.append({
24-
spreadsheetId: SHEET_ID,
25-
range: "Sheet1!A:A",
26-
valueInputOption: "RAW",
27-
requestBody: {
28-
values: [[email]],
29-
},
30-
});
31-
}
2+
import { appendEmailToSheet } from "@/lib/services/google-sheets";
323

334
export async function POST(req: Request) {
345
try {
@@ -44,4 +15,4 @@ export async function POST(req: Request) {
4415
console.error("Error adding email:", error);
4516
return NextResponse.json({ error: "Failed to add email" }, { status: 500 });
4617
}
47-
}
18+
}

src/app/api/upcoming-papers/route.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import UpcomingSlot from "@/db/upcoming-slot";
44
import UpcomingSubject from "@/db/upcoming-paper";
5+
import { calculateCorrespondingSlots } from "@/lib/utils/slot-calculation";
56

67
export const dynamic = "force-dynamic";
78

@@ -10,6 +11,7 @@ export async function GET() {
1011
await connectToDatabase();
1112
const upcomingSlot = await UpcomingSlot.find();
1213
const slot = upcomingSlot[0]?.slot;
14+
1315
if (!slot) {
1416
return NextResponse.json(
1517
{
@@ -18,16 +20,12 @@ export async function GET() {
1820
{ status: 404 },
1921
);
2022
}
21-
const nextSlot = String.fromCharCode(slot.charCodeAt(0) + 1);
22-
const correspondingSlots = [
23-
slot + "1",
24-
slot + "2",
25-
nextSlot + "1",
26-
nextSlot + "2",
27-
];
23+
24+
const correspondingSlots = calculateCorrespondingSlots(slot);
2825
const selectedSubjects = await UpcomingSubject.find({
2926
slots: { $in: correspondingSlots },
3027
});
28+
3129
if (selectedSubjects.length === 0) {
3230
return NextResponse.json(
3331
{
@@ -49,4 +47,4 @@ export async function GET() {
4947
{ status: 500 },
5048
);
5149
}
52-
}
50+
}

src/app/api/upload/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { NextResponse } from "next/server";
2-
import { connectToDatabase } from "@/lib/mongoose";
2+
import { connectToDatabase } from "@/lib/database/mongoose";
33
import { PaperAdmin } from "@/db/papers";
4-
import { createPDFfromImages } from "@/lib/pdf";
5-
import { uploadPDF, uploadThumbnail } from "@/lib/storage";
4+
import { createPDFfromImages } from "@/lib/storage/pdf";
5+
import { uploadPDF, uploadThumbnail } from "@/lib/storage/gcp";
66

77
export const runtime = "nodejs";
88

0 commit comments

Comments
 (0)