summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-09-30 15:05:41 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-09-30 15:05:41 +0700
commit0626907b555ead7991d03c374edc096254aced8d (patch)
treef988f1e469a7c0191198c4ef1755da70e14540cb
parent3e8a67cc49a46a5a6527aea04e608cf7214b11b9 (diff)
<Miqdad> Fix Login & upload image
-rw-r--r--app/lib/api/odooApi.ts43
-rw-r--r--app/page.tsx38
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" />