1
- import { NextRequest , NextResponse } from "next/server" ;
1
+ import { NextResponse } from "next/server" ;
2
2
import { PDFDocument } from "pdf-lib" ;
3
- import { courses , slots , years } from "@/components/select_options"
3
+ import { slots , years } from "@/components/select_options" ;
4
4
import { connectToDatabase } from "@/lib/mongoose" ;
5
5
import cloudinary from "cloudinary" ;
6
- import {
7
-
8
- CloudinaryUploadResult ,
9
- } from "@/interface" ;
10
- import { PaperAdmin } from "@/db/papers" ;
6
+ import { type ICourses , type CloudinaryUploadResult } from "@/interface" ;
7
+ import { PaperAdmin } from "@/db/papers" ;
8
+ import axios from "axios" ;
11
9
// TODO: REMOVE THUMBNAIL FROM admin-buffer DB
12
10
cloudinary . v2 . config ( {
13
11
cloud_name : process . env . NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME ,
@@ -29,14 +27,19 @@ export async function POST(req: Request) {
29
27
const year = formData . get ( "year" ) as string ;
30
28
const exam = formData . get ( "exam" ) as string ;
31
29
const isPdf = formData . get ( "isPdf" ) === "true" ; // Convert string to boolean
32
- if ( ! ( courses . includes ( subject ) && slots . includes ( slot ) && years . includes ( year ) ) )
33
- {
34
- return NextResponse . json (
35
- { message : "Bad Request" } ,
36
-
37
- { status : 400 } ,
38
- ) ;
30
+
31
+ const { data } = await axios . get < ICourses [ ] > ( `${ process . env . SERVER_URL } /api/course-list` ) ;
32
+ const courses = data . map ( ( course : { name : string } ) => course . name ) ;
33
+ if (
34
+ ! (
35
+ courses . includes ( subject ) &&
36
+ slots . includes ( slot ) &&
37
+ years . includes ( year )
38
+ )
39
+ ) {
40
+ return NextResponse . json ( { message : "Bad Request" } , { status : 400 } ) ;
39
41
}
42
+
40
43
await connectToDatabase ( ) ;
41
44
let finalUrl : string | undefined = "" ;
42
45
let public_id_cloudinary : string | undefined = "" ;
@@ -53,18 +56,25 @@ export async function POST(req: Request) {
53
56
if ( ! process . env . NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET ) {
54
57
return ;
55
58
}
56
-
59
+
57
60
const mergedPdfBytes = await CreatePDF ( files ) ;
58
- [ public_id_cloudinary , finalUrl ] = await uploadPDFFile ( mergedPdfBytes , uploadPreset ) ;
61
+ [ public_id_cloudinary , finalUrl ] = await uploadPDFFile (
62
+ mergedPdfBytes ,
63
+ uploadPreset ,
64
+ ) ;
59
65
} catch ( error ) {
60
66
return NextResponse . json (
61
67
{ error : "Failed to process PDF" } ,
62
68
{ status : 500 } ,
63
69
) ;
64
70
}
65
71
} else {
66
- [ public_id_cloudinary , finalUrl ] = await uploadPDFFile ( files [ 0 ] ! , uploadPreset ) ;
72
+ [ public_id_cloudinary , finalUrl ] = await uploadPDFFile (
73
+ files [ 0 ] ! ,
74
+ uploadPreset ,
75
+ ) ;
67
76
}
77
+
68
78
const thumbnailResponse = cloudinary . v2 . image ( finalUrl ! , {
69
79
format : "jpg" ,
70
80
} ) ;
@@ -73,7 +83,6 @@ export async function POST(req: Request) {
73
83
. replace ( "upload" , "upload/w_400,h_400,c_fill" )
74
84
. replace ( / < i m g s r c = ' | ' \s * \/ > / g, "" ) ;
75
85
const paper = new PaperAdmin ( {
76
-
77
86
public_id_cloudinary,
78
87
finalUrl,
79
88
thumbnailUrl,
@@ -91,35 +100,39 @@ export async function POST(req: Request) {
91
100
console . error ( error ) ;
92
101
return NextResponse . json (
93
102
{ message : "Failed to upload papers" , error } ,
94
-
95
103
{ status : 500 } ,
96
104
) ;
97
105
}
98
106
}
99
107
100
-
101
108
async function uploadPDFFile ( file : File | ArrayBuffer , uploadPreset : string ) {
102
109
let bytes ;
103
- if ( file instanceof File ) //for pdf
104
- {
110
+ if ( file instanceof File ) {
105
111
bytes = await file . arrayBuffer ( ) ;
106
- }
107
- else // for images that are pdf
108
- {
112
+ } else {
109
113
bytes = file ;
110
114
}
111
- return uploadFile ( bytes , uploadPreset , "application/pdf" )
115
+ return uploadFile ( bytes , uploadPreset , "application/pdf" ) ;
112
116
}
113
- async function uploadFile ( bytes : ArrayBuffer , uploadPreset : string , fileType : string ) {
117
+
118
+ async function uploadFile (
119
+ bytes : ArrayBuffer ,
120
+ uploadPreset : string ,
121
+ fileType : string ,
122
+ ) {
114
123
try {
115
124
const buffer = Buffer . from ( bytes ) ;
116
125
const dataUrl = `data:${ fileType } ;base64,${ buffer . toString ( "base64" ) } ` ;
117
- const uploadResult = await cloudinary . v2 . uploader . unsigned_upload ( dataUrl , uploadPreset ) as CloudinaryUploadResult ;
118
- return [ uploadResult . public_id , uploadResult . secure_url ] ;
126
+ const uploadResult = ( await cloudinary . v2 . uploader . unsigned_upload (
127
+ dataUrl ,
128
+ uploadPreset ,
129
+ ) ) as CloudinaryUploadResult ;
130
+ return [ uploadResult . public_id , uploadResult . secure_url ] ;
119
131
} catch ( e ) {
120
- throw ( e ) ;
132
+ throw e ;
121
133
}
122
134
}
135
+
123
136
async function CreatePDF ( files : File [ ] ) {
124
137
const pdfDoc = await PDFDocument . create ( ) ;
125
138
0 commit comments