gas-form/utils/api.ts

96 lines
2.6 KiB
TypeScript

"use server"
let authToken: string | null = null
let tokenExpiry: number | null = null
async function getAuthToken() {
// Check if we have a valid token
if (authToken && tokenExpiry && Date.now() < tokenExpiry) {
return authToken
}
// Get new token
try {
const response = await fetch(`${process.env.LUBELOGGER_API_URL}/api/auth/login`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
username: process.env.LUBELOGGER_USERNAME,
password: process.env.LUBELOGGER_PASSWORD,
}),
})
if (!response.ok) {
throw new Error("Authentication failed")
}
const data = await response.json()
authToken = data.token
// Set token expiry to 1 hour from now
tokenExpiry = Date.now() + 60 * 60 * 1000
return authToken
} catch (error) {
console.error("Authentication error:", error)
throw new Error("Failed to authenticate with LubeLogger API")
}
}
export async function fetchVehicles() {
const token = await getAuthToken()
const response = await fetch(`${process.env.LUBELOGGER_API_URL}/api/vehicles`, {
headers: {
Authorization: `Bearer ${token}`,
},
})
if (!response.ok) {
throw new Error("Failed to fetch vehicles")
}
return response.json()
}
export async function submitFillup(data: {
name: string
vehicleId: string
mileage: number
gallons: number
cost: number
isFillToFull?: boolean
missedFuelUp?: boolean
notes?: string
tags?: string
}) {
const token = await getAuthToken()
const formData = new FormData()
formData.append("vehicleId", data.vehicleId)
formData.append("date", new Date().toISOString()) // Send current date/time
formData.append("odometer", data.mileage.toString())
formData.append("fuelConsumed", data.gallons.toString()) // Correct field name
formData.append("cost", data.cost.toString()) // Required by API
formData.append("isFillToFull", (data.isFillToFull ?? true).toString()) // Default: true
formData.append("missedFuelUp", (data.missedFuelUp ?? false).toString()) // Default: false
if (data.notes) formData.append("notes", data.notes)
if (data.tags) formData.append("tags", data.tags)
const response = await fetch(`${process.env.LUBELOGGER_API_URL}/api/vehicle/gasrecords/add`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
body: formData, // Use form-data instead of JSON
})
if (!response.ok) {
const error = await response.json().catch(() => ({ message: "Failed to submit fillup" }))
throw new Error(error.message)
}
return response.json()
}