officernd-mcp-server
Version:
MCP server for OfficeRnD workspace management - create, search, update and cancel bookings
118 lines • 3.39 kB
JavaScript
export class ResourceRateCache {
cache = new Map();
resourceRatesCache = new Map();
cacheLifetime; // in milliseconds
constructor(cacheLifetimeMinutes = 60) {
this.cacheLifetime = cacheLifetimeMinutes * 60 * 1000;
}
/**
* Get a resource rate from cache if it exists and is not expired
*/
getRate(rateId) {
const cached = this.cache.get(rateId);
if (!cached) {
return null;
}
const now = new Date();
const age = now.getTime() - cached.fetchedAt.getTime();
if (age > this.cacheLifetime) {
// Cache expired
this.cache.delete(rateId);
return null;
}
return cached.rate;
}
/**
* Get rates for a specific resource from cache
*/
getRatesForResource(resourceId) {
const cached = this.resourceRatesCache.get(resourceId);
if (!cached) {
return null;
}
const now = new Date();
const age = now.getTime() - cached.fetchedAt.getTime();
if (age > this.cacheLifetime) {
// Cache expired
this.resourceRatesCache.delete(resourceId);
return null;
}
return cached.rates;
}
/**
* Store a resource rate in cache
*/
setRate(rate) {
this.cache.set(rate._id, {
rate,
fetchedAt: new Date(),
});
}
/**
* Store multiple resource rates in cache
*/
setRates(rates) {
const now = new Date();
rates.forEach(rate => {
this.cache.set(rate._id, {
rate,
fetchedAt: now,
});
});
// Also cache by resource ID
const ratesByResource = new Map();
rates.forEach(rate => {
if (!ratesByResource.has(rate.resource)) {
ratesByResource.set(rate.resource, []);
}
ratesByResource.get(rate.resource).push(rate);
});
ratesByResource.forEach((resourceRates, resourceId) => {
this.resourceRatesCache.set(resourceId, {
rates: resourceRates,
fetchedAt: now,
});
});
}
/**
* Clear all cached rates
*/
clear() {
this.cache.clear();
this.resourceRatesCache.clear();
}
/**
* Get cache statistics
*/
getStats() {
const rates = Array.from(this.cache.keys());
const resources = Array.from(this.resourceRatesCache.keys());
return {
size: this.cache.size,
rates,
resources,
};
}
/**
* Remove expired entries from cache
*/
cleanExpired() {
const now = new Date();
let removed = 0;
for (const [key, value] of this.cache.entries()) {
const age = now.getTime() - value.fetchedAt.getTime();
if (age > this.cacheLifetime) {
this.cache.delete(key);
removed++;
}
}
for (const [key, value] of this.resourceRatesCache.entries()) {
const age = now.getTime() - value.fetchedAt.getTime();
if (age > this.cacheLifetime) {
this.resourceRatesCache.delete(key);
}
}
return removed;
}
}
//# sourceMappingURL=resource-rate-cache.js.map