feat: initialize asin-check project with Bun

- Add README.md with installation and usage instructions.
- Create bun.lock for dependency management.
- Add package.json to define project metadata and dependencies.
- Implement caching with Redis in cache.ts for ASIN data.
- Configure environment variables in config.ts for API keys and Redis URL.
- Develop main application logic in index.ts to read products, fetch data, and analyze results.
- Integrate Keepa API for product data retrieval in keepa.ts.
- Create LLM analysis functionality in llm.ts for product viability assessment.
- Implement product reading from Excel files in reader.ts.
- Stub SP-API integration in sp-api.ts for future implementation.
- Define TypeScript types in types.ts for product and analysis data structures.
- Write results to console and CSV in writer.ts.
- Configure TypeScript settings in tsconfig.json for project compilation.
This commit is contained in:
Victor Noguera
2026-04-04 21:33:27 -04:00
commit 061f771279
17 changed files with 1005 additions and 0 deletions

49
src/cache.ts Normal file
View File

@@ -0,0 +1,49 @@
import Redis from "ioredis";
import { config } from "./config.ts";
import type { EnrichedProduct } from "./types.ts";
let redis: Redis | null = null;
let disabled = false;
export async function connectCache(): Promise<void> {
if (disabled) return;
try {
redis = new Redis(config.redisUrl, {
maxRetriesPerRequest: 1,
connectTimeout: 3000,
lazyConnect: true,
});
await redis.connect();
console.log("Redis connected");
} catch (err) {
console.warn(`Redis unavailable, running without cache: ${err}`);
redis = null;
disabled = true;
}
}
export async function getCache(asin: string): Promise<EnrichedProduct | null> {
if (!redis) return null;
try {
const data = await redis.get(`asin:${asin}`);
return data ? JSON.parse(data) : null;
} catch {
return null;
}
}
export async function setCache(asin: string, data: EnrichedProduct): Promise<void> {
if (!redis) return;
try {
await redis.set(`asin:${asin}`, JSON.stringify(data), "EX", config.cacheTtl);
} catch {
// Non-critical, continue without caching
}
}
export async function disconnectCache(): Promise<void> {
if (redis) {
await redis.quit();
redis = null;
}
}