88 lines
No EOL
2.6 KiB
TypeScript
88 lines
No EOL
2.6 KiB
TypeScript
// 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<void> {
|
|
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<Banner | null> {
|
|
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<Banner[]> {
|
|
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 [];
|
|
}
|
|
} |