[{"data":1,"prerenderedAt":806},["ShallowReactive",2],{"games":3,"level:poisoned-review:store-dashboard":107,"levels:poisoned-review":793},[4,17,30,41,52,63,74,85,96],{"id":5,"order":6,"domain":7,"glyph":8,"requiresSandbox":9,"title":10,"tagline":13,"levelCount":6,"status":16},"legacy-nightmare",1,"refactoring","{ }",true,{"fr":11,"en":12},"Le cauchemar du Legacy","Legacy Nightmare",{"fr":14,"en":15},"Corrige le bug caché dans un code spaghetti, sans rien casser.","Fix the bug buried in spaghetti code without breaking anything.","available",{"id":18,"order":19,"domain":20,"glyph":20,"requiresSandbox":21,"title":22,"tagline":25,"levelCount":28,"status":29},"git-untangle",2,"git",false,{"fr":23,"en":24},"Démêlage d'historique","History Untangling",{"fr":26,"en":27},"Transforme un graphe de commits chaotique en historique propre.","Turn a chaotic commit graph into a clean history.",0,"coming-soon",{"id":31,"order":32,"domain":33,"glyph":34,"requiresSandbox":21,"title":35,"tagline":38,"levelCount":28,"status":29},"prod-pressure",3,"devops","RPS",{"fr":36,"en":37},"Pression en Prod","Prod Pressure",{"fr":39,"en":40},"Fais tenir la prod pendant le Black Friday, sans exploser le budget.","Keep production alive through Black Friday, on budget.",{"id":42,"order":43,"domain":44,"glyph":45,"requiresSandbox":9,"title":46,"tagline":49,"levelCount":28,"status":29},"the-heist",4,"security","0day",{"fr":47,"en":48},"Le braquage","The Heist",{"fr":50,"en":51},"Lis l'API, trouve la faille logique, exploite-la.","Read the API, find the logic flaw, exploit it.",{"id":53,"order":54,"domain":55,"glyph":56,"requiresSandbox":21,"title":57,"tagline":60,"levelCount":6,"status":16},"tech-dilemmas",5,"product","A|B",{"fr":58,"en":59},"Dilemmes","Tech Dilemmas",{"fr":61,"en":62},"Survis à un sprint d'arbitrages impossibles.","Survive a sprint of impossible trade-offs.",{"id":64,"order":65,"domain":66,"glyph":67,"requiresSandbox":21,"title":68,"tagline":71,"levelCount":28,"status":29},"cap-workshop",6,"distributed","CAP",{"fr":69,"en":70},"L'Atelier du Théorème CAP","CAP Workshop",{"fr":72,"en":73},"Choisis les bons compromis avant que le réseau ne se coupe.","Pick the right trade-offs before the network splits.",{"id":75,"order":76,"domain":77,"glyph":78,"requiresSandbox":9,"title":79,"tagline":82,"levelCount":28,"status":29},"feature-creeps",7,"patterns","\u003CT>",{"fr":80,"en":81},"L'attaque des Feature Creeps","Attack of the Feature Creeps",{"fr":83,"en":84},"Absorbe des règles métier sans fin sans réécrire ton cœur.","Absorb endless business rules without rewriting your core.",{"id":86,"order":87,"domain":88,"glyph":89,"requiresSandbox":21,"title":90,"tagline":93,"levelCount":32,"status":16},"poisoned-review",8,"review","PR",{"fr":91,"en":92},"La Code Review Empoisonnée","Poisoned Code Review",{"fr":94,"en":95},"Une PR parfaite en apparence cache une bombe. Trouve la ligne.","A flawless-looking PR hides a time bomb. Find the line.",{"id":97,"order":98,"domain":99,"glyph":100,"requiresSandbox":21,"hidden":9,"title":101,"tagline":104,"levelCount":6,"status":16},"engine-demo",99,"demo","?",{"fr":102,"en":103},"Démo du moteur de niveaux","Level engine demo",{"fr":105,"en":106},"Niveau factice qui exerce le moteur de bout en bout : indices, validation, score, débrief.","Dummy level exercising the engine end to end: hints, validation, score, debrief.",{"id":108,"gameId":86,"order":6,"title":109,"difficulty":19,"estimatedMinutes":65,"context":112,"objective":115,"tools":118,"initialState":121,"hints":783,"scoring":790},"store-dashboard",{"fr":110,"en":111},"Le dashboard des magasins","The store dashboard",{"fr":113,"en":114},"Le back-office affiche un widget « Dernières commandes » sur la tablette de **chaque magasin** (≈ 800 magasins), rafraîchi **toutes les 10 secondes**.\n\nCette PR ajoute l'endpoint qui l'alimente. Elle est verte en CI, et la démo en local (base de seed : 3 commandes) est instantanée. Elle part en prod demain matin.","The back office shows a \"Latest orders\" widget on the tablet of **every store** (≈ 800 stores), refreshed **every 10 seconds**.\n\nThis PR adds the endpoint behind it. CI is green, and the local demo (seed database: 3 orders) is instant. It ships to production tomorrow morning.",{"fr":116,"en":117},"Trouve la ligne qui va faire souffrir la base de données en production, puis nomme le problème.","Find the line that will hurt the database in production, then name the problem.",[119,120],"diff-viewer","justification-menu",{"pr":122,"justificationOptions":133,"files":164},{"number":123,"title":124,"author":127,"description":128,"base":131,"head":132},482,{"fr":125,"en":126},"feat(orders) : widget des dernières commandes avec infos client","feat(orders): latest orders widget with customer details","nora-k",{"fr":129,"en":130},"## Résumé\nAjoute `GET \u002Fstores\u002F:storeId\u002Forders\u002Frecent`, utilisé par le nouveau widget du back-office.\n\n## Changements\n- `OrdersService.getRecentSummaries()` : dernières commandes du magasin, enrichies avec le nom et le statut du client\n- Limite plafonnée à 100 pour protéger l'API\n- DTO `OrderSummary` dédié, sans champ sensible\n\n## Tests\n- ✅ Tests unitaires du service (repositories mockés)\n- ✅ Testé en local sur la base de seed : réponse en 4 ms\n\n_Description générée avec l'assistant de PR._","## Summary\nAdds `GET \u002Fstores\u002F:storeId\u002Forders\u002Frecent`, used by the new back-office widget.\n\n## Changes\n- `OrdersService.getRecentSummaries()`: latest orders of the store, enriched with the customer's name and tier\n- Limit capped at 100 to protect the API\n- Dedicated `OrderSummary` DTO, no sensitive field\n\n## Testing\n- ✅ Service unit tests (mocked repositories)\n- ✅ Tested locally on the seed database: 4 ms response\n\n_Description generated with the PR assistant._","main","feat\u002Frecent-orders-widget",[134,139,144,149,154,159],{"id":135,"label":136},"missing-index",{"fr":137,"en":138},"Index manquant (scan complet)","Missing index (full scan)",{"id":140,"label":141},"n-plus-one",{"fr":142,"en":143},"Requête N+1","N+1 query",{"id":145,"label":146},"unbounded-query",{"fr":147,"en":148},"Requête non bornée (pas de pagination)","Unbounded query (no pagination)",{"id":150,"label":151},"float-money",{"fr":152,"en":153},"Montants en virgule flottante","Floating-point money",{"id":155,"label":156},"race-condition",{"fr":157,"en":158},"Condition de course","Race condition",{"id":160,"label":161},"memory-leak",{"fr":162,"en":163},"Fuite mémoire","Memory leak",[165,562,689],{"path":166,"language":167,"status":168,"hunks":169},"src\u002Forders\u002Forders.service.ts","typescript","modified",[170,251],{"header":171,"lines":172},"@@ -1,6 +1,7 @@",[173,189,199,209,224,227,237],{"id":174,"type":175,"oldNo":6,"newNo":6,"tokens":176},"487a4b6f6f","ctx",[177,180,182,184,186],{"content":178,"color":179},"import","#FF7B72",{"content":181}," { Injectable } ",{"content":183,"color":179},"from",{"content":185}," ",{"content":187,"color":188},"'@nestjs\u002Fcommon'","#A5D6FF",{"id":190,"type":175,"oldNo":19,"newNo":19,"tokens":191},"d6729f5ffd",[192,193,195,196,197],{"content":178,"color":179},{"content":194}," { OrderRepository } ",{"content":183,"color":179},{"content":185},{"content":198,"color":188},"'.\u002Forder.repository'",{"id":200,"type":175,"oldNo":32,"newNo":32,"tokens":201},"43a85c670a",[202,203,205,206,207],{"content":178,"color":179},{"content":204}," { CustomerRepository } ",{"content":183,"color":179},{"content":185},{"content":208,"color":188},"'..\u002Fcustomers\u002Fcustomer.repository'",{"id":210,"type":211,"oldNo":212,"newNo":43,"tokens":213},"fd3f184195","add",null,[214,215,216,218,220,221,222],{"content":178,"color":179},{"content":185},{"content":217,"color":179},"type",{"content":219}," { OrderSummary } ",{"content":183,"color":179},{"content":185},{"content":223,"color":188},"'.\u002Forder-summary.dto'",{"id":225,"type":175,"oldNo":43,"newNo":54,"tokens":226},"6c1716016a",[],{"id":228,"type":175,"oldNo":54,"newNo":65,"tokens":229},"2c0ff9043f",[230,232,235],{"content":231},"@",{"content":233,"color":234},"Injectable","#D2A8FF",{"content":236},"()",{"id":238,"type":175,"oldNo":65,"newNo":76,"tokens":239},"cc4951608f",[240,242,243,245,246,249],{"content":241,"color":179},"export",{"content":185},{"content":244,"color":179},"class",{"content":185},{"content":247,"color":248},"OrdersService","#FFA657",{"content":250}," {",{"header":252,"lines":253},"@@ -18,4 +19,29 @@ export class OrdersService {",[254,265,283,289,293,302,308,314,320,345,362,368,378,392,398,402,411,424,440,446,456,471,484,518,533,539,545,551,556],{"id":255,"type":175,"oldNo":256,"newNo":257,"tokens":258},"c08b89f8d4",18,19,[259,261,263],{"content":260},"  async ",{"content":262,"color":234},"findById",{"content":264},"(id: string) {",{"id":266,"type":175,"oldNo":257,"newNo":267,"tokens":268},"1a3f40e736",20,[269,271,273,274,277,279,281],{"content":270},"    ",{"content":272,"color":179},"return",{"content":185},{"content":275,"color":276},"this","#79C0FF",{"content":278},".orders.",{"content":280,"color":234},"findOne",{"content":282},"({ where: { id } })",{"id":284,"type":175,"oldNo":267,"newNo":285,"tokens":286},"55443aad48",21,[287],{"content":288},"  }",{"id":290,"type":211,"oldNo":212,"newNo":291,"tokens":292},"189ab2726c",22,[],{"id":294,"type":211,"oldNo":212,"newNo":295,"tokens":296},"7d18c3ad25",23,[297,299],{"content":298},"  ",{"content":300,"color":301},"\u002F**","#8B949E",{"id":303,"type":211,"oldNo":212,"newNo":304,"tokens":305},"503bb5d1a7",24,[306],{"content":307,"color":301},"   * Latest orders of a store, enriched with the customer's display data,",{"id":309,"type":211,"oldNo":212,"newNo":310,"tokens":311},"18dc935b6b",25,[312],{"content":313,"color":301},"   * for the back-office dashboard.",{"id":315,"type":211,"oldNo":212,"newNo":316,"tokens":317},"da1512482e",26,[318],{"content":319,"color":301},"   *\u002F",{"id":321,"type":211,"oldNo":212,"newNo":322,"tokens":323},"96eeee4b85",27,[324,325,327,329,331,332,334,336,338,340,342,344],{"content":260},{"content":326,"color":234},"getRecentSummaries",{"content":328},"(storeId: string, limit ",{"content":330,"color":179},"=",{"content":185},{"content":333,"color":276},"50",{"content":335},"): ",{"content":337,"color":276},"Promise",{"content":339,"color":179},"\u003C",{"content":341},"OrderSummary[]",{"content":343,"color":179},">",{"content":250},{"id":346,"type":211,"oldNo":212,"newNo":347,"tokens":348},"55b0e3851d",28,[349,351,352,353,355,356,357,358,360],{"content":350},"    const orders ",{"content":330,"color":179},{"content":185},{"content":354,"color":179},"await",{"content":185},{"content":275,"color":276},{"content":278},{"content":359,"color":234},"find",{"content":361},"({",{"id":363,"type":211,"oldNo":212,"newNo":364,"tokens":365},"83dcdf1777",29,[366],{"content":367},"      where: { storeId },",{"id":369,"type":211,"oldNo":212,"newNo":370,"tokens":371},"c9729bdb08",30,[372,374,376],{"content":373},"      order: { createdAt: ",{"content":375,"color":188},"'DESC'",{"content":377}," },",{"id":379,"type":211,"oldNo":212,"newNo":380,"tokens":381},"148e1188bc",31,[382,384,386,388,390],{"content":383},"      take: Math.",{"content":385,"color":234},"min",{"content":387},"(limit, ",{"content":389,"color":276},"100",{"content":391},"),",{"id":393,"type":211,"oldNo":212,"newNo":394,"tokens":395},"57e4dfc4bc",32,[396],{"content":397},"    })",{"id":399,"type":211,"oldNo":212,"newNo":400,"tokens":401},"50df1cac02",33,[],{"id":403,"type":211,"oldNo":212,"newNo":404,"tokens":405},"b285ea27ee",34,[406,408,409],{"content":407},"    const summaries: OrderSummary[] ",{"content":330,"color":179},{"content":410}," []",{"id":412,"type":211,"oldNo":212,"newNo":413,"tokens":414},"dfd6ced868",35,[415,416,418,420,422],{"content":270},{"content":417,"color":234},"for",{"content":419}," (const order ",{"content":421,"color":179},"of",{"content":423}," orders) {",{"id":425,"type":211,"oldNo":212,"newNo":426,"tokens":427},"123e51322e",36,[428,430,431,432,433,434,435,437,438],{"content":429},"      const customer ",{"content":330,"color":179},{"content":185},{"content":354,"color":179},{"content":185},{"content":275,"color":276},{"content":436},".customers.",{"content":280,"color":234},{"content":439},"({ where: { id: order.customerId } })",{"id":441,"type":211,"oldNo":212,"newNo":442,"tokens":443},"2aad0b146e",37,[444],{"content":445},"      summaries.push({",{"id":447,"type":211,"oldNo":212,"newNo":448,"tokens":449},"d0c8233a38",38,[450,452,454],{"content":451},"        ",{"content":453,"color":248},"id",{"content":455},": order.id,",{"id":457,"type":211,"oldNo":212,"newNo":458,"tokens":459},"2f194aa380",39,[460,461,463,465,467,468,469],{"content":451},{"content":462,"color":248},"total",{"content":464},": order.totalCents ",{"content":466,"color":179},"\u002F",{"content":185},{"content":389,"color":276},{"content":470},",",{"id":472,"type":211,"oldNo":212,"newNo":473,"tokens":474},"01caddd250",40,[475,476,478,480,482],{"content":451},{"content":477,"color":248},"createdAt",{"content":479},": order.createdAt.",{"content":481,"color":234},"toISOString",{"content":483},"(),",{"id":485,"type":211,"oldNo":212,"newNo":486,"tokens":487},"b0ce732eab",41,[488,489,491,493,494,495,497,499,501,503,505,506,507,509,511,512,514,515,517],{"content":451},{"content":490,"color":248},"customerName",{"content":492},": customer ",{"content":100,"color":179},{"content":185},{"content":496,"color":188},"`${",{"content":498},"customer",{"content":500,"color":188},".",{"content":502},"firstName",{"content":504,"color":188},"} ${",{"content":498},{"content":500,"color":188},{"content":508},"lastName",{"content":510,"color":188},"}`",{"content":185},{"content":513,"color":179},":",{"content":185},{"content":516,"color":188},"'Unknown customer'",{"content":470},{"id":519,"type":211,"oldNo":212,"newNo":520,"tokens":521},"608c3d98fa",42,[522,523,525,527,529,530,532],{"content":451},{"content":524,"color":248},"customerTier",{"content":526},": customer?.tier ",{"content":528,"color":179},"??",{"content":185},{"content":531,"color":188},"'standard'",{"content":470},{"id":534,"type":211,"oldNo":212,"newNo":535,"tokens":536},"774d6786c5",43,[537],{"content":538},"      })",{"id":540,"type":211,"oldNo":212,"newNo":541,"tokens":542},"a3d2442ecd",44,[543],{"content":544},"    }",{"id":546,"type":211,"oldNo":212,"newNo":547,"tokens":548},"10808e8ae0",45,[549],{"content":550},"    return summaries",{"id":552,"type":211,"oldNo":212,"newNo":553,"tokens":554},"4a73e89783",46,[555],{"content":288},{"id":557,"type":175,"oldNo":285,"newNo":558,"tokens":559},"007883401e",47,[560],{"content":561},"}",{"path":563,"language":167,"status":168,"hunks":564},"src\u002Forders\u002Forders.controller.ts",[565],{"header":566,"lines":567},"@@ -14,5 +14,11 @@ export class OrdersController {",[568,582,597,610,615,618,627,635,659,681,685],{"id":569,"type":175,"oldNo":570,"newNo":570,"tokens":571},"0c7f122aa3",14,[572,574,576,578,580],{"content":573},"  @",{"content":575,"color":234},"Get",{"content":577},"(",{"content":579,"color":188},"':orderId'",{"content":581},")",{"id":583,"type":175,"oldNo":584,"newNo":584,"tokens":585},"fce9e13140",15,[586,587,588,590,592,593,595],{"content":298},{"content":280,"color":234},{"content":589},"(@",{"content":591,"color":234},"Param",{"content":577},{"content":594,"color":188},"'orderId'",{"content":596},") orderId: string) {",{"id":598,"type":175,"oldNo":599,"newNo":599,"tokens":600},"5231672756",16,[601,602,603,604,605,607,608],{"content":270},{"content":272,"color":179},{"content":185},{"content":275,"color":276},{"content":606},".ordersService.",{"content":262,"color":234},{"content":609},"(orderId)",{"id":611,"type":175,"oldNo":612,"newNo":612,"tokens":613},"fe05be6ca4",17,[614],{"content":288},{"id":616,"type":211,"oldNo":212,"newNo":256,"tokens":617},"541ef53159",[],{"id":619,"type":211,"oldNo":212,"newNo":257,"tokens":620},"0a7280e9e3",[621,622,623,624,626],{"content":573},{"content":575,"color":234},{"content":577},{"content":625,"color":188},"'recent'",{"content":581},{"id":628,"type":211,"oldNo":212,"newNo":267,"tokens":629},"2f5441e3a6",[630,631,633],{"content":573},{"content":632,"color":234},"UseGuards",{"content":634},"(StoreStaffGuard)",{"id":636,"type":211,"oldNo":212,"newNo":285,"tokens":637},"b14e4852f9",[638,639,641,642,643,644,646,648,650,651,653,655,657],{"content":298},{"content":640,"color":234},"getRecent",{"content":589},{"content":591,"color":234},{"content":577},{"content":645,"color":188},"'storeId'",{"content":647},") storeId: string, @",{"content":649,"color":234},"Query",{"content":577},{"content":652,"color":188},"'limit'",{"content":654},") limit",{"content":656,"color":179},"?:",{"content":658}," string) {",{"id":660,"type":211,"oldNo":212,"newNo":291,"tokens":661},"c4a21f1457",[662,663,664,665,666,667,668,670,671,672,674,676,677,678,680],{"content":270},{"content":272,"color":179},{"content":185},{"content":275,"color":276},{"content":606},{"content":326,"color":234},{"content":669},"(storeId, limit ",{"content":100,"color":179},{"content":185},{"content":673,"color":234},"Number",{"content":675},"(limit) ",{"content":513,"color":179},{"content":185},{"content":679,"color":276},"undefined",{"content":581},{"id":682,"type":211,"oldNo":212,"newNo":295,"tokens":683},"c41de9cdd6",[684],{"content":288},{"id":686,"type":175,"oldNo":256,"newNo":304,"tokens":687},"d071d699e9",[688],{"content":561},{"path":690,"language":167,"status":691,"hunks":692},"src\u002Forders\u002Forder-summary.dto.ts","added",[693],{"header":694,"lines":695},"@@ -0,0 +1,11 @@",[696,708,711,716,727,736,742,751,759,768,778],{"id":697,"type":211,"oldNo":212,"newNo":6,"tokens":698},"35dbaad932",[699,700,701,702,704,705,706],{"content":178,"color":179},{"content":185},{"content":217,"color":179},{"content":703}," { CustomerTier } ",{"content":183,"color":179},{"content":185},{"content":707,"color":188},"'..\u002Fcustomers\u002Fcustomer.entity'",{"id":709,"type":211,"oldNo":212,"newNo":19,"tokens":710},"5252d49421",[],{"id":712,"type":211,"oldNo":212,"newNo":32,"tokens":713},"f02adf13ba",[714],{"content":715,"color":301},"\u002F** Row of the back-office \"recent orders\" widget *\u002F",{"id":717,"type":211,"oldNo":212,"newNo":43,"tokens":718},"dda9f50875",[719,720,721,723,724,726],{"content":241,"color":179},{"content":185},{"content":722,"color":179},"interface",{"content":185},{"content":725,"color":248},"OrderSummary",{"content":250},{"id":728,"type":211,"oldNo":212,"newNo":54,"tokens":729},"001060fba9",[730,731,732,733,734],{"content":298},{"content":453,"color":248},{"content":513,"color":179},{"content":185},{"content":735,"color":276},"string",{"id":737,"type":211,"oldNo":212,"newNo":65,"tokens":738},"96c398f44f",[739,740],{"content":298},{"content":741,"color":301},"\u002F** In euros, for display only *\u002F",{"id":743,"type":211,"oldNo":212,"newNo":76,"tokens":744},"92a7625ea2",[745,746,747,748,749],{"content":298},{"content":462,"color":248},{"content":513,"color":179},{"content":185},{"content":750,"color":276},"number",{"id":752,"type":211,"oldNo":212,"newNo":87,"tokens":753},"6ce3849900",[754,755,756,757,758],{"content":298},{"content":477,"color":248},{"content":513,"color":179},{"content":185},{"content":735,"color":276},{"id":760,"type":211,"oldNo":212,"newNo":761,"tokens":762},"4e76afd1fc",9,[763,764,765,766,767],{"content":298},{"content":490,"color":248},{"content":513,"color":179},{"content":185},{"content":735,"color":276},{"id":769,"type":211,"oldNo":212,"newNo":770,"tokens":771},"f758d1d781",10,[772,773,774,775,776],{"content":298},{"content":524,"color":248},{"content":513,"color":179},{"content":185},{"content":777,"color":248},"CustomerTier",{"id":779,"type":211,"oldNo":212,"newNo":780,"tokens":781},"b191069cf0",11,[782],{"content":561},[784,786,788],{"type":785},"observation",{"type":787},"reflection",{"type":789},"focus",{"base":791,"parTimeSeconds":792},100,240,[794,796,801],{"id":108,"gameId":86,"order":6,"title":795,"difficulty":19,"estimatedMinutes":65},{"fr":110,"en":111},{"id":797,"gameId":86,"order":19,"title":798,"difficulty":32,"estimatedMinutes":87},"wallet-transfer",{"fr":799,"en":800},"Virements entre portefeuilles","Wallet transfers",{"id":802,"gameId":86,"order":32,"title":803,"difficulty":32,"estimatedMinutes":770},"fx-rates-client",{"fr":804,"en":805},"Le client de taux de change","The FX rates client",1790619204020]