This commit is contained in:
Andreas Knuth 2026-02-17 13:13:05 -06:00
parent c34f0391b3
commit 272f325d98
1 changed files with 12 additions and 10 deletions

View File

@ -1,4 +1,4 @@
// qbo_helper.js - FINALE VERSION // qbo_helper.js - FIX FÜR ERROR 3200
require('dotenv').config(); require('dotenv').config();
const OAuthClient = require('intuit-oauth'); const OAuthClient = require('intuit-oauth');
const fs = require('fs'); const fs = require('fs');
@ -19,7 +19,6 @@ const getOAuthClient = () => {
let savedToken = null; let savedToken = null;
try { try {
if (fs.existsSync(tokenFile)) { if (fs.existsSync(tokenFile)) {
// Wir lesen nur, wenn es kein Ordner ist (für lokale Tests ohne Docker)
const stat = fs.statSync(tokenFile); const stat = fs.statSync(tokenFile);
if (stat.isFile()) { if (stat.isFile()) {
const content = fs.readFileSync(tokenFile, 'utf8'); const content = fs.readFileSync(tokenFile, 'utf8');
@ -74,34 +73,37 @@ async function makeQboApiCall(requestOptions) {
} }
}; };
// --- WICHTIG: KEINE isAccessTokenValid() PRÜFUNG HIER! ---
// Wir vertrauen darauf, dass der Token (egal ob Datei oder .env) funktioniert.
// Wir refreshen nur, wenn QBO uns abweist.
try { try {
const response = await client.makeApiCall(requestOptions); const response = await client.makeApiCall(requestOptions);
// Prüfen, ob die Antwort JSON ist (manche Auth-Fehler sind HTML/Text)
const data = response.getJson ? response.getJson() : response.json; const data = response.getJson ? response.getJson() : response.json;
if (data.fault && data.fault.error) { if (data.fault && data.fault.error) {
const errorCode = data.fault.error[0].code; const errorCode = data.fault.error[0].code;
if (errorCode === '3202' || errorCode === '3100') {
// --- FIX: 3200 (Auth Failed) HINZUGEFÜGT ---
if (errorCode === '3200' || errorCode === '3202' || errorCode === '3100') {
console.log(`⚠️ QBO meldet Token-Fehler (${errorCode}). Versuche Refresh und Retry...`); console.log(`⚠️ QBO meldet Token-Fehler (${errorCode}). Versuche Refresh und Retry...`);
await doRefresh(); await doRefresh();
// Retry mit neuem Token
return await client.makeApiCall(requestOptions); return await client.makeApiCall(requestOptions);
} }
throw new Error(`QBO API Error ${errorCode}: ${data.fault.error[0].message}`); throw new Error(`QBO API Error ${errorCode}: ${data.fault.error[0].message}`);
} }
// Bei Erfolg: Speichern (falls sich intern was geändert hat durch die Lib)
saveTokens(); saveTokens();
return response; return response;
} catch (e) { } catch (e) {
const isAuthError = e.response?.status === 401 || (e.authResponse && e.authResponse.response && e.authResponse.response.status === 401); // HTTP 401 Unauthorized fangen (falls die Lib wirft, statt data.fault zurückzugeben)
const isAuthError =
e.response?.status === 401 ||
(e.authResponse && e.authResponse.response && e.authResponse.response.status === 401) ||
e.message?.includes('AuthenticationFailed');
if (isAuthError) { if (isAuthError) {
console.log("⚠️ 401 Unauthorized erhalten. Versuche Refresh und Retry..."); console.log("⚠️ 401 Unauthorized / AuthFailed erhalten. Versuche Refresh und Retry...");
await doRefresh(); await doRefresh();
return await client.makeApiCall(requestOptions); return await client.makeApiCall(requestOptions);
} }