// 1️⃣ limit check const recent = await GenjotLog.count( where: userId, kakakId, createdAt: $gt: Date.now() - 60*60*1000 , ); if (recent >= 5) return res.status(429).json( error: 'Rate limit exceeded' );
res.json( status: 'ok', new_happiness_score: kakak.happinessScore, animation: 'happy', reward_points: 1, ); ); CREATE TABLE kakak ( id UUID PRIMARY KEY, name TEXT NOT NULL, happiness_score INT DEFAULT 0, avatar_url TEXT ); // 1️⃣ limit check const recent = await GenjotLog
// 2️⃣ update score const kakak = await Kakak.findByPk(kakakId); kakak.happinessScore += 1; await kakak.save(); createdAt: $gt: Date.now() - 60*60*1000
export const GenjotButton = ( kakakId : kakakId: string ) => const [loading, setLoading] = useState(false); const [showHappy, setShowHappy] = useState(false); if (recent >
// 4️⃣ analytics (pseudo) analytics.track('genjot_success', userId, kakakId );
showHappy && ( <div className="happy-overlay" aria-live="polite"> <Lottie options= animationData: happyAnim, loop: false /> </div> ) </> ); ; // routes/kakak.js router.post('/:id/genjot', async (req, res) => const kakakId = req.params.id; const userId = req.user.id;