diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-09-30 15:05:41 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-09-30 15:05:41 +0700 |
| commit | 0626907b555ead7991d03c374edc096254aced8d (patch) | |
| tree | f988f1e469a7c0191198c4ef1755da70e14540cb | |
| parent | 3e8a67cc49a46a5a6527aea04e608cf7214b11b9 (diff) | |
<Miqdad> Fix Login & upload image
| -rw-r--r-- | app/lib/api/odooApi.ts | 43 | ||||
| -rw-r--r-- | app/page.tsx | 38 |
2 files changed, 48 insertions, 33 deletions
diff --git a/app/lib/api/odooApi.ts b/app/lib/api/odooApi.ts index f172158..6b3c48a 100644 --- a/app/lib/api/odooApi.ts +++ b/app/lib/api/odooApi.ts @@ -20,10 +20,11 @@ interface AuthPayload { [key: string]: unknown; } +const API_HOST = process.env.NEXT_PUBLIC_ODOO_API_HOST ?? ""; + +/** ── Ambil service token dari /api/token (public) ─────────────────────────── */ const renewToken = async (): Promise<string> => { - const token = await axios.get( - `${process.env.NEXT_PUBLIC_ODOO_API_HOST}/api/token` - ); + const token = await axios.get(`${API_HOST}/api/token`); setCookie("token", token.data.result); return token.data.result as string; }; @@ -34,6 +35,16 @@ const getToken = async (): Promise<string> => { return token; }; +/** ── Hanya endpoint tertentu yang butuh Authorization service ─────────────── */ +const SERVICE_AUTH_WHITELIST = [ + "/api/token", + "/api/v1/user/login", +]; + +const needsServiceAuth = (url: string) => + SERVICE_AUTH_WHITELIST.some((p) => url.startsWith(p)); + +/** ── Client API utama ─────────────────────────────────────────────────────── */ const odooApi = async ( method: MethodType, url: string, @@ -41,16 +52,23 @@ const odooApi = async ( headers: HeaderMap = {} ) => { try { - const bearer = await getToken(); const authObj = getAuth() as AuthPayload | string | null; const axiosParameter: AxiosParameters = { method, - url: `${process.env.NEXT_PUBLIC_ODOO_API_HOST}${url}`, - headers: { Authorization: bearer ?? "", ...headers }, + url: `${API_HOST}${url}`, + headers: { ...headers }, }; - // pasang header Token bila ada + // 1) PASANG Authorization HANYA untuk endpoint di whitelist + if (needsServiceAuth(url)) { + const bearer = await getToken(); + if (bearer) { + axiosParameter.headers["Authorization"] = bearer; + } + } + + // 2) PASANG header Token (user FE) bila ada if (authObj && typeof authObj === "object" && "token" in authObj) { const t = authObj.token; if (typeof t === "string" && t) { @@ -60,19 +78,14 @@ const odooApi = async ( const upper = method.toUpperCase() as MethodType; - // Body methods + // 3) Body methods → gunakan x-www-form-urlencoded (sesuai backend kamu) if (upper === "POST" || upper === "PUT" || upper === "PATCH") { axiosParameter.headers["Content-Type"] = "application/x-www-form-urlencoded"; } - // hanya kirim body untuk method yang pakai body - if ( - Object.keys(data).length > 0 && - upper !== "GET" && - upper !== "HEAD" - ) { - // filter undefined/null/'' agar field opsional tidak terkirim + // 4) Hanya kirim body untuk method yang pakai body + if (Object.keys(data).length > 0 && upper !== "GET" && upper !== "HEAD") { const entries = Object.entries(data).filter( ([, v]) => typeof v === "string" && v !== "" ) as [string, string][]; diff --git a/app/page.tsx b/app/page.tsx index f295c33..fe94498 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -120,25 +120,25 @@ export default function Home() { } } - try { - // const newSjImage = imageSj.replace(/^.*?,/, ""); - // const newPackageImage = imagePackage.replace(/^.*?,/, ""); - // const newDispatchImage = - // imageDispatch && imageDispatch.startsWith("data:") - // ? imageDispatch.replace(/^.*?,/, "") - // : undefined; + // siapkan base64 tanpa prefix, kalau kosong biarkan undefined const newSjImage = imageSj ? imageSj.replace(/^.*?,/, "") : undefined; const newPackageImage = imagePackage ? imagePackage.replace(/^.*?,/, "") : undefined; const newDispatchImage = imageDispatch && imageDispatch.startsWith("data:") ? imageDispatch.replace(/^.*?,/, "") - : undefined; + : imageDispatch || undefined; // kalau sudah base64 tanpa prefix + + // tandai mana yang BENAR-BENAR akan dikirim + const submittedSj = !!newSjImage; + const submittedPackage = !!newPackageImage; + const submittedDispatch = !!newDispatchImage && !isDriver; + // bangun payload: hanya isi yang ada const data: Record<string, string> = {}; - if (newSjImage) data.sj_document = newSjImage; - if (newPackageImage) data.paket_document = newPackageImage; - if (!isDriver && newDispatchImage) data.dispatch_document = newDispatchImage; + if (submittedSj) data.sj_document = newSjImage!; + if (submittedPackage) data.paket_document = newPackageImage!; + if (submittedDispatch) data.dispatch_document = newDispatchImage!; const response = (await odooApi( "PUT", @@ -148,20 +148,22 @@ export default function Home() { if (response?.status?.code === 200) { alert("Berhasil Submit Data"); + // barcode bebas: kalau mau tetap kosongkan setBarcode(""); - setImageSj(""); - setImagePackage(""); - setImageDispatch(""); + + if (submittedSj) setImageSj(""); + if (submittedPackage) setImagePackage(""); + if (submittedDispatch) setImageDispatch(""); } else if (response?.status?.code === 404) { alert("Gagal Submit Data, Picking Code Tidak Ditemukan "); } else { alert("Gagal Submit Data, Silahkan Coba Lagi"); } } catch (error) { - if (error instanceof Error) { - console.error("Error mengirim data:", error.message); - } else if (axios.isAxiosError(error)) { + if (axios.isAxiosError(error)) { console.error("Error:", error.response?.data); + } else if (error instanceof Error) { + console.error("Error mengirim data:", error.message); } else { console.error("Unknown error:", error); } @@ -182,7 +184,7 @@ export default function Home() { <div className="h-4" /> <div className="flex justify-between"> <SjCamera /> - <PackageCamera /> + {!isDispatch && <PackageCamera />} {!isDriver && <DispatchCamera />} </div> <div className="h-2" /> |
