record errors and decode existing vins on migration

This commit is contained in:
2026-03-26 07:51:38 -04:00
parent 8503c48944
commit c38bced329
4 changed files with 69 additions and 15 deletions

View File

@@ -76,10 +76,20 @@ class VehiclesController < ApplicationController
end
end
# used by the polling JS in vehicle#show
def status
vehicle = Vehicle.find(params[:id])
# decode the vin if it hasn't been done for some reason
unless vehicle.vin_decoded
if vehicle.error.nil?
VehicleVinDecodeJob.perform_later(vehicle)
end
end
render json: {
decoded: vehicle.vin_decoded
decoded: vehicle.vin_decoded,
error: vehicle.error
}
end

View File

@@ -20,7 +20,7 @@ class VehicleVinDecodeJob < ApplicationJob
unless result.success?
log "Failed to decode vin"
vehicle.update(vin_decoded: false)
vehicle.update(vin_decoded: false, error: result.error)
return
end
@@ -33,7 +33,8 @@ class VehicleVinDecodeJob < ApplicationJob
doors: details.doors.presence || vehicle.doors,
trim: details.trim.presence || vehicle.trim,
name: vehicle.to_s,
vin_decoded: true
vin_decoded: true,
error: nil
)
end

View File

@@ -1,8 +1,12 @@
<h2><%=t(:field_vehicle)%> #<%=@vehicle.id%></h2>
<% unless @vehicle.vin_decoded? %>
<div id="vin-status" class="flash notice">
<%= t :notice_decoding_vin %>
<div id="vin-status" class="flash <%= @vehicle.error ? "error" : "notice" %>">
<% if @vehicle.error%>
<%= @vehicle.error %>
<% else %>
<%= t :notice_decoding_vin %>
<% end %>
</div>
<% end %>
@@ -35,9 +39,11 @@
if (alreadyDecoded) return;
const interval = 3000; // 3 seconds
const interval = 3000;
let attempts = 0;
const maxAttempts = 40; // ~2 minutes
const maxAttempts = 40;
const statusEl = document.getElementById("vin-status");
const checkStatus = () => {
fetch(`/vehicles/${vehicleId}/status`, {
@@ -45,22 +51,54 @@
})
.then(res => res.json())
.then(data => {
// SUCCESS → reload
if (data.decoded) {
window.location.reload();
} else {
attempts++;
if (attempts >= maxAttempts) {
clearInterval(timer);
console.warn("VIN decode polling timed out");
return;
}
// ERROR → stop + show message
if (data.error) {
clearInterval(timer);
if (statusEl) {
statusEl.classList.remove("notice");
statusEl.classList.add("error");
statusEl.textContent = data.error;
}
console.warn("VIN decode failed:", data.error);
return;
}
// continue polling
attempts++;
if (attempts >= maxAttempts) {
clearInterval(timer);
if (statusEl) {
statusEl.classList.remove("notice");
statusEl.classList.add("warning");
statusEl.textContent = "VIN decode timed out. Please refresh or try again.";
}
console.warn("VIN decode polling timed out");
}
})
.catch(err => {
console.error("Polling error:", err);
clearInterval(timer);
if (statusEl) {
statusEl.classList.remove("notice");
statusEl.classList.add("error");
statusEl.textContent = "Error checking VIN status.";
}
console.error("Polling error:", err);
});
};
const timer = setInterval(checkStatus, interval);
})();
</script>
</script>