feat(project): init
This commit is contained in:
174
app/api/transfer/[path]/route.ts
Normal file
174
app/api/transfer/[path]/route.ts
Normal file
@@ -0,0 +1,174 @@
|
||||
import {
|
||||
handleDeleteCookie,
|
||||
handleLoginData,
|
||||
handleRefreshToken,
|
||||
} from "@/components/login/libs/cookie"
|
||||
import { genAccessToken } from "@/components/login/libs/session"
|
||||
import { headers } from "next/headers"
|
||||
import {
|
||||
// NextRequest,
|
||||
NextResponse,
|
||||
} from "next/server"
|
||||
|
||||
const isParamsValid = (params: {} | null) =>
|
||||
params !== null && // 排除 null
|
||||
typeof params === "object" && // 确保是对象类型
|
||||
!Array.isArray(params) && // 排除数组(可选)
|
||||
Object.keys(params).length > 0 // 检查是否有自身可枚举属性
|
||||
|
||||
export async function POST(req: any) {
|
||||
try {
|
||||
const body = await req.json()
|
||||
|
||||
let {
|
||||
url,
|
||||
data,
|
||||
options = {},
|
||||
method = "GET",
|
||||
isDownload = false,
|
||||
isLogin = false,
|
||||
isRefresh = false,
|
||||
isDeleteCookie = false,
|
||||
notJson = false,
|
||||
} = body
|
||||
if (isDeleteCookie) {
|
||||
await handleDeleteCookie()
|
||||
return new NextResponse(
|
||||
JSON.stringify({
|
||||
message: "Successfully delete cookie!",
|
||||
code: 200,
|
||||
status: true,
|
||||
}),
|
||||
{
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
)
|
||||
}
|
||||
const userData = await genAccessToken(req)
|
||||
|
||||
let fetchOptions: any = {}
|
||||
|
||||
if (isRefresh) {
|
||||
if (!userData?.refresh_token) {
|
||||
return NextResponse.json(
|
||||
{ message: "Refresh token is empty", code: 406 },
|
||||
{ status: 200 }
|
||||
)
|
||||
}
|
||||
fetchOptions = {
|
||||
method,
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
token: userData?.refresh_token,
|
||||
}),
|
||||
}
|
||||
} else {
|
||||
const authorization = `bearer ${userData?.access_token}`
|
||||
fetchOptions = {
|
||||
method,
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
authorization: authorization,
|
||||
},
|
||||
}
|
||||
if (method === "POST" || method === "PUT") {
|
||||
fetchOptions.body = data
|
||||
} else {
|
||||
if (isParamsValid(data)) {
|
||||
let test = ""
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
test += `&${key}=${value}`
|
||||
}
|
||||
url += `?${test}`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const isPrefixUrl = url.startsWith("http://") || url.startsWith("https://")
|
||||
|
||||
const fetchUrl = isPrefixUrl ? url : `${process.env.NEXT_PUBLIC_URL}${url}`
|
||||
|
||||
const res = await fetch(fetchUrl, fetchOptions)
|
||||
|
||||
if (res?.status !== 200) {
|
||||
let error = ""
|
||||
if (res.headers.get("Content-Type")?.includes("application/json")) {
|
||||
const data = await res.json()
|
||||
error = data?.message || ""
|
||||
} else {
|
||||
error = await res.text()
|
||||
}
|
||||
return NextResponse.json({ message: error }, { status: res?.status })
|
||||
}
|
||||
|
||||
if (
|
||||
options?.responseType === "blob" ||
|
||||
options?.responseType === "arraybuffer" ||
|
||||
isDownload
|
||||
) {
|
||||
const blob = await res.blob()
|
||||
const buffer = await blob.arrayBuffer()
|
||||
return new NextResponse(buffer, {
|
||||
headers: {
|
||||
"Content-Type": blob.type,
|
||||
"x-real-name": res?.headers?.get("content-disposition") || "",
|
||||
},
|
||||
})
|
||||
} else if (!notJson) {
|
||||
try {
|
||||
const data = await (res.headers
|
||||
.get("Content-Type")
|
||||
?.includes("application/json")
|
||||
? res.json()
|
||||
: res.text())
|
||||
|
||||
if (isLogin) {
|
||||
const header = await headers()
|
||||
let clientIP =
|
||||
header.get("x-forwarded-for")?.split(",")[0] ||
|
||||
req?.socket?.remoteAddress
|
||||
// ip v6地址
|
||||
if (clientIP.startsWith("::")) {
|
||||
clientIP = clientIP.slice(7)
|
||||
}
|
||||
const newData = await handleLoginData({
|
||||
clientIP: clientIP,
|
||||
fingerprint: body.fingerprint,
|
||||
data,
|
||||
})
|
||||
return new NextResponse(JSON.stringify(newData), {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
}
|
||||
if (isRefresh) {
|
||||
const newData = await handleRefreshToken({
|
||||
userData,
|
||||
data,
|
||||
})
|
||||
return new NextResponse(JSON.stringify(newData), {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
}
|
||||
return new NextResponse(JSON.stringify(data), {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
} catch (err) {
|
||||
return NextResponse.json({ error: err }, { status: 500 })
|
||||
}
|
||||
} else {
|
||||
return res
|
||||
}
|
||||
} catch (err) {
|
||||
return NextResponse.json({ error: err }, { status: 500 })
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user