// import redisClient from './redis-client'; import redisClient from 'src/lib/redis-client'; import { db } from '../db/db_index'; import { homeBanners } from '../db/schema'; import { isNotNull, asc } from 'drizzle-orm'; import { generateSignedUrlFromS3Url } from 'src/lib/s3-client'; // Banner Type (matches getBanners return) interface Banner { id: number; name: string; imageUrl: string | null; serialNum: number | null; productIds: number[] | null; createdAt: Date; // updatedAt: Date; } export async function initializeBannerStore(): Promise { try { console.log('Initializing banner store in Redis...'); const banners = await db.query.homeBanners.findMany({ where: isNotNull(homeBanners.serialNum), // Only show assigned banners orderBy: asc(homeBanners.serialNum), // Order by slot number 1-4 }); // Store each banner in Redis for (const banner of banners) { const signedImageUrl = banner.imageUrl ? await generateSignedUrlFromS3Url(banner.imageUrl) : banner.imageUrl; const bannerObj: Banner = { id: banner.id, name: banner.name, imageUrl: signedImageUrl, serialNum: banner.serialNum, productIds: banner.productIds, createdAt: banner.createdAt, // updatedAt: banner.updatedAt, }; await redisClient.set(`banner:${banner.id}`, JSON.stringify(bannerObj)); } console.log('Banner store initialized successfully'); } catch (error) { console.error('Error initializing banner store:', error); } } export async function getBannerById(id: number): Promise { try { const key = `banner:${id}`; const data = await redisClient.get(key); if (!data) return null; return JSON.parse(data) as Banner; } catch (error) { console.error(`Error getting banner ${id}:`, error); return null; } } export async function getAllBanners(): Promise { try { // Get all keys matching the pattern "banner:*" const keys = await redisClient.KEYS('banner:*'); if (keys.length === 0) return []; // Get all banners using MGET for better performance const bannersData = await redisClient.MGET(keys); const banners: Banner[] = []; for (const bannerData of bannersData) { if (bannerData) { banners.push(JSON.parse(bannerData) as Banner); } } // Sort by serialNum to maintain the same order as the original query banners.sort((a, b) => (a.serialNum || 0) - (b.serialNum || 0)); return banners; } catch (error) { console.error('Error getting all banners:', error); return []; } }