170 lines
5.7 KiB
JavaScript
170 lines
5.7 KiB
JavaScript
const representAPI = require('../services/represent-api');
|
|
const nocoDB = require('../services/nocodb');
|
|
|
|
// Helper function to cache representatives
|
|
async function cacheRepresentatives(postalCode, representatives, representData) {
|
|
try {
|
|
// Cache the postal code info
|
|
await nocoDB.storePostalCodeInfo({
|
|
postal_code: postalCode,
|
|
city: representData.city,
|
|
province: representData.province
|
|
});
|
|
|
|
// Cache representatives using the existing method
|
|
await nocoDB.storeRepresentatives(postalCode, representatives);
|
|
|
|
console.log(`Successfully cached representatives for ${postalCode}`);
|
|
} catch (error) {
|
|
console.log(`Failed to cache representatives for ${postalCode}:`, error.message);
|
|
// Don't throw - caching is optional
|
|
}
|
|
}
|
|
|
|
class RepresentativesController {
|
|
async testConnection(req, res, next) {
|
|
try {
|
|
const result = await representAPI.testConnection();
|
|
res.json(result);
|
|
} catch (error) {
|
|
console.error('Test connection error:', error);
|
|
res.status(500).json({
|
|
error: 'Failed to test connection',
|
|
message: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
async getByPostalCode(req, res, next) {
|
|
try {
|
|
const { postalCode } = req.params;
|
|
const formattedPostalCode = postalCode.replace(/\s/g, '').toUpperCase();
|
|
|
|
// Try to check cached data first, but don't fail if NocoDB is down
|
|
let cachedData = [];
|
|
try {
|
|
cachedData = await nocoDB.getRepresentativesByPostalCode(formattedPostalCode);
|
|
console.log(`Cache check for ${formattedPostalCode}: found ${cachedData.length} records`);
|
|
|
|
if (cachedData && cachedData.length > 0) {
|
|
return res.json({
|
|
source: 'cache',
|
|
postalCode: formattedPostalCode,
|
|
representatives: cachedData
|
|
});
|
|
}
|
|
} catch (cacheError) {
|
|
console.log(`Cache unavailable for ${formattedPostalCode}, proceeding with API call:`, cacheError.message);
|
|
}
|
|
|
|
// If not in cache, fetch from Represent API
|
|
console.log(`Fetching representatives from Represent API for ${postalCode}`);
|
|
const representData = await representAPI.getRepresentativesByPostalCode(postalCode);
|
|
|
|
if (!representData) {
|
|
return res.json({
|
|
success: false,
|
|
message: 'No data found for this postal code',
|
|
data: {
|
|
postalCode,
|
|
location: null,
|
|
representatives: []
|
|
}
|
|
});
|
|
}
|
|
|
|
// Process representatives from both concordance and centroid
|
|
let representatives = [];
|
|
|
|
// Add concordance representatives (if any)
|
|
if (representData.boundaries_concordance && representData.boundaries_concordance.length > 0) {
|
|
representatives = representatives.concat(representData.boundaries_concordance);
|
|
}
|
|
|
|
// Add centroid representatives (if any) - these are the actual elected officials
|
|
if (representData.representatives_centroid && representData.representatives_centroid.length > 0) {
|
|
representatives = representatives.concat(representData.representatives_centroid);
|
|
}
|
|
|
|
console.log(`Representatives concordance count: ${representData.boundaries_concordance ? representData.boundaries_concordance.length : 0}`);
|
|
console.log(`Representatives centroid count: ${representData.representatives_centroid ? representData.representatives_centroid.length : 0}`);
|
|
console.log(`Total representatives found: ${representatives.length}`);
|
|
|
|
if (representatives.length === 0) {
|
|
return res.json({
|
|
success: false,
|
|
message: 'No representatives found for this postal code',
|
|
data: {
|
|
postalCode,
|
|
location: {
|
|
city: representData.city,
|
|
province: representData.province
|
|
},
|
|
representatives: []
|
|
}
|
|
});
|
|
}
|
|
|
|
// Try to cache the results (will fail gracefully if NocoDB is down)
|
|
console.log(`Attempting to cache ${representatives.length} representatives for ${postalCode}`);
|
|
await cacheRepresentatives(postalCode, representatives, representData);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: {
|
|
postalCode,
|
|
location: {
|
|
city: representData.city,
|
|
province: representData.province
|
|
},
|
|
representatives
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Get representatives error:', error);
|
|
res.status(500).json({
|
|
error: 'Failed to fetch representatives',
|
|
message: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
async refreshPostalCode(req, res, next) {
|
|
try {
|
|
const { postalCode } = req.params;
|
|
const formattedPostalCode = postalCode.replace(/\s/g, '').toUpperCase();
|
|
|
|
// Clear cached data
|
|
await nocoDB.clearRepresentativesByPostalCode(formattedPostalCode);
|
|
|
|
// Fetch fresh data from API
|
|
const representData = await representAPI.getRepresentativesByPostalCode(formattedPostalCode);
|
|
|
|
if (!representData || !representData.representatives_concordance) {
|
|
return res.status(404).json({
|
|
error: 'No representatives found for this postal code',
|
|
postalCode: formattedPostalCode
|
|
});
|
|
}
|
|
|
|
// Cache the fresh results
|
|
await nocoDB.storeRepresentatives(formattedPostalCode, representData.representatives_concordance);
|
|
|
|
res.json({
|
|
source: 'refreshed',
|
|
postalCode: formattedPostalCode,
|
|
representatives: representData.representatives_concordance,
|
|
city: representData.city,
|
|
province: representData.province
|
|
});
|
|
} catch (error) {
|
|
console.error('Refresh representatives error:', error);
|
|
res.status(500).json({
|
|
error: 'Failed to refresh representatives',
|
|
message: error.message
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new RepresentativesController(); |