- Add admin dashboard with sync controls and data browser - Implement RMM, Auvik, and Addigy organization mappings - Add chunked ticket sync with progress tracking - Implement entity sync service with rate limiting - Add analytics engine and performance optimizer - Create data browser for all PSA entities - Add navigation components and UI improvements - Implement background processing and sync services - Add comprehensive documentation and migration scripts - Update configuration items with multi-system support - Enhance contact management and purchase history - Add issue type assignment and LLM analyzer - Improve error handling and logging utilities
3.9 KiB
3.9 KiB
Complete Cache Invalidation for All System Mappings
Issue
Company 29683395 (TK Plastics) was not showing Addigy (ARMM) devices even though:
- 3 Addigy org mappings existed in the database
- The API code was correct to fetch Addigy devices
- The cache was returning stale data from before the mappings were added
Root Cause
The cache key only included RMM mapping count:
rmm-devices:29683395:active:mappings-2
When Addigy or Auvik mappings were added, the cache key didn't change, so the system continued serving cached data with 0 Addigy/Auvik devices.
Database Verification
Company 29683395 Mappings:
-
RMM Sites: 2 mappings
- TK Plastics (612f6b1f-9228-4e2a-8e63-f0ec5d0b6aaa)
- TK Plastics - Kaercher (aba39a7b-d9b3-4eff-88e4-4d0182d478cb)
-
Auvik Tenants: 1 mapping
- tkplastics (1228237269652810493)
-
Addigy Orgs: 3 mappings
- TK Plastics (b194ffe7-c354-4cb0-a5e5-c99876729b4b)
- TK - iPads (393f67b0-5449-41b4-a5f2-f72de849c5d5)
- TK - Macs (36f89454-6dbf-4c03-8843-3dfc34b9534f)
Solution
Updated the cache key to include mapping counts for ALL three external systems:
Before:
const cacheKey = `rmm-devices:${companyId}:${activeFilter}:mappings-${mappingCount}`;
After:
const cacheKey = `rmm-devices:${companyId}:${activeFilter}:rmm-${rmmMappingCount}:auvik-${auvikMappingCount}:addigy-${addigyMappingCount}`;
Implementation:
// Get mapping counts to include in cache key (so cache invalidates when mappings change)
let rmmMappingCount = 0;
let auvikMappingCount = 0;
let addigyMappingCount = 0;
if (companyId) {
// RMM site mappings
const rmmMappingsResult = await pool.query(
'SELECT COUNT(*) as count FROM rmm_site_mappings WHERE company_id = $1',
[parseInt(companyId)]
);
rmmMappingCount = parseInt(rmmMappingsResult.rows[0]?.count || '0');
// Auvik tenant mappings
const auvikMappingsResult = await pool.query(
'SELECT COUNT(*) as count FROM auvik_tenant_mappings WHERE autotask_company_id = $1',
[parseInt(companyId)]
);
auvikMappingCount = parseInt(auvikMappingsResult.rows[0]?.count || '0');
// Addigy org mappings
const addigyMappingsResult = await pool.query(
'SELECT COUNT(*) as count FROM addigy_org_mappings WHERE autotask_company_id = $1',
[parseInt(companyId)]
);
addigyMappingCount = parseInt(addigyMappingsResult.rows[0]?.count || '0');
}
Cache Key Examples
For Company 29683395:
- Old key:
rmm-devices:29683395:active:mappings-2 - New key:
rmm-devices:29683395:active:rmm-2:auvik-1:addigy-3
Cache Invalidation Scenarios:
- Add RMM site mapping:
rmm-2→rmm-3(cache invalidated) - Add Auvik tenant mapping:
auvik-1→auvik-2(cache invalidated) - Add Addigy org mapping:
addigy-3→addigy-4(cache invalidated) - Remove any mapping: Count decreases, cache invalidated
Benefits
- Automatic Cache Invalidation: Cache automatically expires when ANY system mapping changes
- No Manual Cache Clearing: No need to manually clear cache or use skipCache parameter
- Accurate Data: Users always see current device data after mapping changes
- System Consistency: All three external systems (RMM, NMS, ARMM) are treated equally
Files Modified
/app/api/rmm-devices/route.ts- Updated cache key generation logic
Testing
After deploying:
- The cache key for company 29683395 will change from
rmm-devices:29683395:active:mappings-2tormm-devices:29683395:active:rmm-2:auvik-1:addigy-3 - This will trigger a fresh API call
- Addigy devices from all 3 mapped organizations will be fetched and displayed
- Future mapping changes will automatically invalidate the cache
Related Documentation
/docs/fixes/rmm-cache-invalidation-fix.md- Initial RMM cache fix/docs/fixes/all-systems-inventory-display.md- All systems display implementation/docs/rmm-multi-site-integration.md- RMM multi-site architecture