refactor: improve type safety in guest ID comparisons

Replace loose equality/inequality operators with strict comparisons and proper type conversion for guest vmid matching:

- Use parseInt() with strict equality for all guest ID comparisons
- Prevents type coercion bugs between string and number vmids
- Ensures consistent behavior across different data sources
- Improves reliability in multi-cluster environments

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
courtmanr@gmail.com
2025-05-31 09:35:12 +01:00
parent ef7ad49c3b
commit be303cea3a
3 changed files with 16 additions and 16 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ PulseApp.ui.backupSummaryCards = (() => {
? backupData[type].filter(item => {
// Match vmid
const itemVmid = item.vmid || item['backup-id'] || item.backupVMID;
if (itemVmid != guestId) return false;
if (parseInt(itemVmid, 10) !== parseInt(guestId, 10)) return false;
// For PBS backups (centralized), don't filter by node
if (type === 'pbsSnapshots') return true;
+7 -7
View File
@@ -1167,7 +1167,7 @@ PulseApp.ui.backups = (() => {
const vmsData = PulseApp.state.get('vmsData') || [];
const containersData = PulseApp.state.get('containersData') || [];
const allGuests = [...vmsData, ...containersData];
const guest = allGuests.find(g => g.vmid == guestId);
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
if (!guest) return null;
@@ -1232,7 +1232,7 @@ PulseApp.ui.backups = (() => {
// Match vmid
const taskVmid = task.vmid || task.guestId;
if (taskVmid != guestId) return false;
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
const date = new Date(task.starttime * 1000);
const utcDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
@@ -1300,7 +1300,7 @@ PulseApp.ui.backups = (() => {
(ds.snapshots || []).filter(snap => {
const vmid = snap['backup-id'];
const timestamp = snap['backup-time'];
return vmid == guestId && timestamp >= startTimestamp && timestamp < endTimestamp;
return parseInt(vmid, 10) === parseInt(guestId, 10) && timestamp >= startTimestamp && timestamp < endTimestamp;
})
)
);
@@ -1310,7 +1310,7 @@ PulseApp.ui.backups = (() => {
// Check PVE storage backups
if (pveBackups.storageBackups && Array.isArray(pveBackups.storageBackups)) {
const matchingBackups = pveBackups.storageBackups.filter(backup => {
return backup.vmid == guestId &&
return parseInt(backup.vmid, 10) === parseInt(guestId, 10) &&
backup.ctime >= startTimestamp &&
backup.ctime < endTimestamp;
});
@@ -1982,7 +1982,7 @@ PulseApp.ui.backups = (() => {
const pbsDates = {};
backupData.pbsSnapshots.forEach(snap => {
const snapId = snap['backup-id'] || snap.backupVMID;
if (snapId == guestId) {
if (parseInt(snapId, 10) === parseInt(guestId, 10)) {
const timestamp = snap['backup-time'];
if (timestamp) {
const date = new Date(timestamp * 1000);
@@ -2005,7 +2005,7 @@ PulseApp.ui.backups = (() => {
if ((backupTypeFilter === 'all' || backupTypeFilter === 'pve') && backupData.pveBackups) {
const pveDates = {};
backupData.pveBackups.forEach(backup => {
if (backup.vmid == guestId) {
if (parseInt(backup.vmid, 10) === parseInt(guestId, 10)) {
const timestamp = backup['backup-time'] || backup.ctime;
if (timestamp) {
const date = new Date(timestamp * 1000);
@@ -2034,7 +2034,7 @@ PulseApp.ui.backups = (() => {
if ((backupTypeFilter === 'all' || backupTypeFilter === 'snapshots') && backupData.vmSnapshots) {
const snapDates = {};
backupData.vmSnapshots.forEach(snap => {
if (snap.vmid == guestId) {
if (parseInt(snap.vmid, 10) === parseInt(guestId, 10)) {
const timestamp = snap.snaptime;
if (timestamp) {
const date = new Date(timestamp * 1000);
+8 -8
View File
@@ -22,13 +22,13 @@ PulseApp.ui.calendarHeatmap = (() => {
return tasks.filter(task => {
// Match vmid
const taskVmid = task.vmid || task.guestId;
if (taskVmid != guestId) return false;
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
// For single guest filtering, we need to get the guest node info
const vmsData = PulseApp.state.get('vmsData') || [];
const containersData = PulseApp.state.get('containersData') || [];
const allGuests = [...vmsData, ...containersData];
const guest = allGuests.find(g => g.vmid == guestId);
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
if (!guest) return true; // Fallback if guest not found
@@ -527,7 +527,7 @@ PulseApp.ui.calendarHeatmap = (() => {
if (!vmid) return;
// Apply filtering logic
if (guestId && vmid != guestId) return;
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
// Use unique guest key that includes node information
@@ -669,7 +669,7 @@ PulseApp.ui.calendarHeatmap = (() => {
const vmsData = PulseApp.state.get('vmsData') || [];
const containersData = PulseApp.state.get('containersData') || [];
const allGuests = [...vmsData, ...containersData];
const guest = allGuests.find(g => g.vmid == guestId);
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
const guestName = guest ? guest.name : `Guest ${guestId}`;
guestDisplayText = `${stats.activeGuests} (${guestName})`;
}
@@ -732,7 +732,7 @@ PulseApp.ui.calendarHeatmap = (() => {
if (!vmid) return;
// Apply filtering logic
if (guestId && vmid != guestId) return;
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
// Track unique guests using node-aware keys
@@ -814,7 +814,7 @@ PulseApp.ui.calendarHeatmap = (() => {
const vmsData = PulseApp.state.get('vmsData') || [];
const containersData = PulseApp.state.get('containersData') || [];
const allGuests = [...vmsData, ...containersData];
const guest = allGuests.find(g => g.vmid == guestId);
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
const guestName = guest ? guest.name : `Guest ${guestId}`;
guestDisplayText = `${stats.activeGuests} (${guestName})`;
}
@@ -975,7 +975,7 @@ PulseApp.ui.calendarHeatmap = (() => {
if (!vmid) return;
// Skip if filtering by specific guest
if (guestId && vmid != guestId) return;
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
// Skip if filtered guest list is provided and this guest is not in it
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
@@ -1162,7 +1162,7 @@ PulseApp.ui.calendarHeatmap = (() => {
}
// Skip if filtering by specific guest
if (guestId && vmid != guestId) return;
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
// Skip if filtered guest list is provided and this guest is not in it
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;