Skip to content

Commit be303ce

Browse files
rcourtmanclaude
andcommitted
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>
1 parent ef7ad49 commit be303ce

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

src/public/js/ui/backup-summary-cards.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ PulseApp.ui.backupSummaryCards = (() => {
2121
? backupData[type].filter(item => {
2222
// Match vmid
2323
const itemVmid = item.vmid || item['backup-id'] || item.backupVMID;
24-
if (itemVmid != guestId) return false;
24+
if (parseInt(itemVmid, 10) !== parseInt(guestId, 10)) return false;
2525

2626
// For PBS backups (centralized), don't filter by node
2727
if (type === 'pbsSnapshots') return true;

src/public/js/ui/backups.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,7 +1167,7 @@ PulseApp.ui.backups = (() => {
11671167
const vmsData = PulseApp.state.get('vmsData') || [];
11681168
const containersData = PulseApp.state.get('containersData') || [];
11691169
const allGuests = [...vmsData, ...containersData];
1170-
const guest = allGuests.find(g => g.vmid == guestId);
1170+
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
11711171

11721172
if (!guest) return null;
11731173

@@ -1232,7 +1232,7 @@ PulseApp.ui.backups = (() => {
12321232

12331233
// Match vmid
12341234
const taskVmid = task.vmid || task.guestId;
1235-
if (taskVmid != guestId) return false;
1235+
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
12361236

12371237
const date = new Date(task.starttime * 1000);
12381238
const utcDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
@@ -1300,7 +1300,7 @@ PulseApp.ui.backups = (() => {
13001300
(ds.snapshots || []).filter(snap => {
13011301
const vmid = snap['backup-id'];
13021302
const timestamp = snap['backup-time'];
1303-
return vmid == guestId && timestamp >= startTimestamp && timestamp < endTimestamp;
1303+
return parseInt(vmid, 10) === parseInt(guestId, 10) && timestamp >= startTimestamp && timestamp < endTimestamp;
13041304
})
13051305
)
13061306
);
@@ -1310,7 +1310,7 @@ PulseApp.ui.backups = (() => {
13101310
// Check PVE storage backups
13111311
if (pveBackups.storageBackups && Array.isArray(pveBackups.storageBackups)) {
13121312
const matchingBackups = pveBackups.storageBackups.filter(backup => {
1313-
return backup.vmid == guestId &&
1313+
return parseInt(backup.vmid, 10) === parseInt(guestId, 10) &&
13141314
backup.ctime >= startTimestamp &&
13151315
backup.ctime < endTimestamp;
13161316
});
@@ -1982,7 +1982,7 @@ PulseApp.ui.backups = (() => {
19821982
const pbsDates = {};
19831983
backupData.pbsSnapshots.forEach(snap => {
19841984
const snapId = snap['backup-id'] || snap.backupVMID;
1985-
if (snapId == guestId) {
1985+
if (parseInt(snapId, 10) === parseInt(guestId, 10)) {
19861986
const timestamp = snap['backup-time'];
19871987
if (timestamp) {
19881988
const date = new Date(timestamp * 1000);
@@ -2005,7 +2005,7 @@ PulseApp.ui.backups = (() => {
20052005
if ((backupTypeFilter === 'all' || backupTypeFilter === 'pve') && backupData.pveBackups) {
20062006
const pveDates = {};
20072007
backupData.pveBackups.forEach(backup => {
2008-
if (backup.vmid == guestId) {
2008+
if (parseInt(backup.vmid, 10) === parseInt(guestId, 10)) {
20092009
const timestamp = backup['backup-time'] || backup.ctime;
20102010
if (timestamp) {
20112011
const date = new Date(timestamp * 1000);
@@ -2034,7 +2034,7 @@ PulseApp.ui.backups = (() => {
20342034
if ((backupTypeFilter === 'all' || backupTypeFilter === 'snapshots') && backupData.vmSnapshots) {
20352035
const snapDates = {};
20362036
backupData.vmSnapshots.forEach(snap => {
2037-
if (snap.vmid == guestId) {
2037+
if (parseInt(snap.vmid, 10) === parseInt(guestId, 10)) {
20382038
const timestamp = snap.snaptime;
20392039
if (timestamp) {
20402040
const date = new Date(timestamp * 1000);

src/public/js/ui/calendar-heatmap.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ PulseApp.ui.calendarHeatmap = (() => {
2222
return tasks.filter(task => {
2323
// Match vmid
2424
const taskVmid = task.vmid || task.guestId;
25-
if (taskVmid != guestId) return false;
25+
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
2626

2727
// For single guest filtering, we need to get the guest node info
2828
const vmsData = PulseApp.state.get('vmsData') || [];
2929
const containersData = PulseApp.state.get('containersData') || [];
3030
const allGuests = [...vmsData, ...containersData];
31-
const guest = allGuests.find(g => g.vmid == guestId);
31+
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
3232

3333
if (!guest) return true; // Fallback if guest not found
3434

@@ -527,7 +527,7 @@ PulseApp.ui.calendarHeatmap = (() => {
527527
if (!vmid) return;
528528

529529
// Apply filtering logic
530-
if (guestId && vmid != guestId) return;
530+
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
531531
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
532532

533533
// Use unique guest key that includes node information
@@ -669,7 +669,7 @@ PulseApp.ui.calendarHeatmap = (() => {
669669
const vmsData = PulseApp.state.get('vmsData') || [];
670670
const containersData = PulseApp.state.get('containersData') || [];
671671
const allGuests = [...vmsData, ...containersData];
672-
const guest = allGuests.find(g => g.vmid == guestId);
672+
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
673673
const guestName = guest ? guest.name : `Guest ${guestId}`;
674674
guestDisplayText = `${stats.activeGuests} (${guestName})`;
675675
}
@@ -732,7 +732,7 @@ PulseApp.ui.calendarHeatmap = (() => {
732732
if (!vmid) return;
733733

734734
// Apply filtering logic
735-
if (guestId && vmid != guestId) return;
735+
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
736736
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
737737

738738
// Track unique guests using node-aware keys
@@ -814,7 +814,7 @@ PulseApp.ui.calendarHeatmap = (() => {
814814
const vmsData = PulseApp.state.get('vmsData') || [];
815815
const containersData = PulseApp.state.get('containersData') || [];
816816
const allGuests = [...vmsData, ...containersData];
817-
const guest = allGuests.find(g => g.vmid == guestId);
817+
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
818818
const guestName = guest ? guest.name : `Guest ${guestId}`;
819819
guestDisplayText = `${stats.activeGuests} (${guestName})`;
820820
}
@@ -975,7 +975,7 @@ PulseApp.ui.calendarHeatmap = (() => {
975975
if (!vmid) return;
976976

977977
// Skip if filtering by specific guest
978-
if (guestId && vmid != guestId) return;
978+
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
979979

980980
// Skip if filtered guest list is provided and this guest is not in it
981981
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
@@ -1162,7 +1162,7 @@ PulseApp.ui.calendarHeatmap = (() => {
11621162
}
11631163

11641164
// Skip if filtering by specific guest
1165-
if (guestId && vmid != guestId) return;
1165+
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
11661166

11671167
// Skip if filtered guest list is provided and this guest is not in it
11681168
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;

0 commit comments

Comments
 (0)