119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
const axios = require('axios');
|
|
const { createClient } = require('redis');
|
|
|
|
class GorgiasService {
|
|
constructor() {
|
|
this.redis = createClient({
|
|
url: process.env.REDIS_URL
|
|
});
|
|
|
|
this.redis.on('error', err => console.error('Redis Client Error:', err));
|
|
this.redis.connect().catch(err => console.error('Redis connection error:', err));
|
|
|
|
// Create base64 encoded auth string
|
|
const auth = Buffer.from(`${process.env.GORGIAS_API_USERNAME}:${process.env.GORGIAS_API_KEY}`).toString('base64');
|
|
|
|
this.apiClient = axios.create({
|
|
baseURL: `https://${process.env.GORGIAS_DOMAIN}.gorgias.com/api`,
|
|
headers: {
|
|
'Authorization': `Basic ${auth}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
}
|
|
|
|
async getStatistics(name, filters = {}) {
|
|
const cacheKey = `gorgias:stats:${name}:${JSON.stringify(filters)}`;
|
|
|
|
try {
|
|
// Try Redis first
|
|
const cachedData = await this.redis.get(cacheKey);
|
|
if (cachedData) {
|
|
console.log(`Statistics ${name} found in Redis cache`);
|
|
return JSON.parse(cachedData);
|
|
}
|
|
|
|
console.log(`Fetching ${name} statistics with filters:`, filters);
|
|
|
|
// Convert dates to UTC midnight if not already set
|
|
if (!filters.start_datetime || !filters.end_datetime) {
|
|
const start = new Date(filters.start_datetime || filters.start_date);
|
|
start.setUTCHours(0, 0, 0, 0);
|
|
const end = new Date(filters.end_datetime || filters.end_date);
|
|
end.setUTCHours(23, 59, 59, 999);
|
|
|
|
filters = {
|
|
...filters,
|
|
start_datetime: start.toISOString(),
|
|
end_datetime: end.toISOString()
|
|
};
|
|
}
|
|
|
|
// Fetch from API
|
|
const response = await this.apiClient.post(`/stats/${name}`, filters);
|
|
const data = response.data;
|
|
|
|
// Save to Redis with 5 minute expiry
|
|
await this.redis.set(cacheKey, JSON.stringify(data), {
|
|
EX: 300 // 5 minutes
|
|
});
|
|
|
|
return data;
|
|
} catch (error) {
|
|
console.error(`Error in getStatistics for ${name}:`, {
|
|
error: error.message,
|
|
filters,
|
|
response: error.response?.data
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async getTickets(params = {}) {
|
|
const cacheKey = `gorgias:tickets:${JSON.stringify(params)}`;
|
|
|
|
try {
|
|
// Try Redis first
|
|
const cachedData = await this.redis.get(cacheKey);
|
|
if (cachedData) {
|
|
console.log('Tickets found in Redis cache');
|
|
return JSON.parse(cachedData);
|
|
}
|
|
|
|
// Convert dates to UTC midnight
|
|
const formattedParams = { ...params };
|
|
if (params.start_date) {
|
|
const start = new Date(params.start_date);
|
|
start.setUTCHours(0, 0, 0, 0);
|
|
formattedParams.start_datetime = start.toISOString();
|
|
delete formattedParams.start_date;
|
|
}
|
|
if (params.end_date) {
|
|
const end = new Date(params.end_date);
|
|
end.setUTCHours(23, 59, 59, 999);
|
|
formattedParams.end_datetime = end.toISOString();
|
|
delete formattedParams.end_date;
|
|
}
|
|
|
|
// Fetch from API
|
|
const response = await this.apiClient.get('/tickets', { params: formattedParams });
|
|
const data = response.data;
|
|
|
|
// Save to Redis with 5 minute expiry
|
|
await this.redis.set(cacheKey, JSON.stringify(data), {
|
|
EX: 300 // 5 minutes
|
|
});
|
|
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Error fetching tickets:', {
|
|
error: error.message,
|
|
params,
|
|
response: error.response?.data
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new GorgiasService();
|