[{"data":1,"prerenderedAt":6714},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-core-features-controllers":198,"-docs-core-features-controllers-surround":6710},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,109,123,134],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drivers","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":41,"body":200,"description":6704,"extension":6705,"links":6706,"meta":6707,"navigation":56,"path":42,"seo":6708,"stem":43,"__hash__":6709},"docs\u002Fdocs\u002F2.core-features\u002F2.controllers.md",{"type":201,"value":202,"toc":6665},"minimark",[203,207,212,224,229,420,424,647,651,654,659,663,666,701,704,708,712,784,791,803,807,978,984,987,1000,1004,1109,1112,1116,1119,1448,1452,1459,1735,1738,1742,1748,1997,2054,2067,2297,2301,2311,2585,2647,2801,3039,3043,3052,3314,3318,3321,3325,3391,3395,3498,3502,3648,3652,3740,3744,3944,3948,3951,4281,4284,4288,4291,4634,4638,4641,5028,5031,5173,5177,5180,5378,5381,5385,5389,5397,5401,5407,5411,5417,5640,5646,5740,5746,5933,5939,6013,6017,6021,6481,6485,6661],[204,205,206],"p",{},"Controllers are the heart of your API in Vercube. They organize your endpoints into logical groups, handle incoming requests, and return responses. Think of controllers as the \"traffic directors\" of your application - they receive requests, process them, and send back responses.",[208,209,211],"h2",{"id":210},"what-is-a-controller","What is a Controller?",[204,213,214,215,219,220,223],{},"A controller is a class that groups related HTTP endpoints together. Instead of scattering your API endpoints across different files, you organize them by resource or feature. For example, all user-related operations go in ",[216,217,218],"code",{},"UserController",", all product operations go in ",[216,221,222],{},"ProductController",", and so on.",[225,226,228],"h3",{"id":227},"the-problem-without-controllers","The Problem Without Controllers",[230,231,236],"pre",{"className":232,"code":233,"language":234,"meta":235,"style":235},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ❌ Scattered endpoints - hard to maintain\napp.get('\u002Fusers', getUsersHandler);\napp.post('\u002Fusers', createUserHandler);\napp.get('\u002Fusers\u002F:id', getUserHandler);\napp.delete('\u002Fusers\u002F:id', deleteUserHandler);\napp.put('\u002Fusers\u002F:id', updateUserHandler);\n\u002F\u002F ... hundreds of lines later\napp.get('\u002Fproducts', getProductsHandler);\n\u002F\u002F ... where does one resource end and another begin?\n","ts","",[216,237,238,247,283,308,333,358,383,389,414],{"__ignoreMap":235},[239,240,243],"span",{"class":241,"line":242},"line",1,[239,244,246],{"class":245},"sHwdD","\u002F\u002F ❌ Scattered endpoints - hard to maintain\n",[239,248,250,254,258,262,265,268,272,274,277,280],{"class":241,"line":249},2,[239,251,253],{"class":252},"sTEyZ","app",[239,255,257],{"class":256},"sMK4o",".",[239,259,261],{"class":260},"s2Zo4","get",[239,263,264],{"class":252},"(",[239,266,267],{"class":256},"'",[239,269,271],{"class":270},"sfazB","\u002Fusers",[239,273,267],{"class":256},[239,275,276],{"class":256},",",[239,278,279],{"class":252}," getUsersHandler)",[239,281,282],{"class":256},";\n",[239,284,286,288,290,293,295,297,299,301,303,306],{"class":241,"line":285},3,[239,287,253],{"class":252},[239,289,257],{"class":256},[239,291,292],{"class":260},"post",[239,294,264],{"class":252},[239,296,267],{"class":256},[239,298,271],{"class":270},[239,300,267],{"class":256},[239,302,276],{"class":256},[239,304,305],{"class":252}," createUserHandler)",[239,307,282],{"class":256},[239,309,311,313,315,317,319,321,324,326,328,331],{"class":241,"line":310},4,[239,312,253],{"class":252},[239,314,257],{"class":256},[239,316,261],{"class":260},[239,318,264],{"class":252},[239,320,267],{"class":256},[239,322,323],{"class":270},"\u002Fusers\u002F:id",[239,325,267],{"class":256},[239,327,276],{"class":256},[239,329,330],{"class":252}," getUserHandler)",[239,332,282],{"class":256},[239,334,336,338,340,343,345,347,349,351,353,356],{"class":241,"line":335},5,[239,337,253],{"class":252},[239,339,257],{"class":256},[239,341,342],{"class":260},"delete",[239,344,264],{"class":252},[239,346,267],{"class":256},[239,348,323],{"class":270},[239,350,267],{"class":256},[239,352,276],{"class":256},[239,354,355],{"class":252}," deleteUserHandler)",[239,357,282],{"class":256},[239,359,361,363,365,368,370,372,374,376,378,381],{"class":241,"line":360},6,[239,362,253],{"class":252},[239,364,257],{"class":256},[239,366,367],{"class":260},"put",[239,369,264],{"class":252},[239,371,267],{"class":256},[239,373,323],{"class":270},[239,375,267],{"class":256},[239,377,276],{"class":256},[239,379,380],{"class":252}," updateUserHandler)",[239,382,282],{"class":256},[239,384,386],{"class":241,"line":385},7,[239,387,388],{"class":245},"\u002F\u002F ... hundreds of lines later\n",[239,390,392,394,396,398,400,402,405,407,409,412],{"class":241,"line":391},8,[239,393,253],{"class":252},[239,395,257],{"class":256},[239,397,261],{"class":260},[239,399,264],{"class":252},[239,401,267],{"class":256},[239,403,404],{"class":270},"\u002Fproducts",[239,406,267],{"class":256},[239,408,276],{"class":256},[239,410,411],{"class":252}," getProductsHandler)",[239,413,282],{"class":256},[239,415,417],{"class":241,"line":416},9,[239,418,419],{"class":245},"\u002F\u002F ... where does one resource end and another begin?\n",[225,421,423],{"id":422},"the-solution-with-controllers","The Solution With Controllers",[230,425,427],{"className":232,"code":426,"language":234,"meta":235,"style":235},"\u002F\u002F ✅ Organized, clean, maintainable\n@Controller('\u002Fusers')\nexport class UserController {\n  @Get('\u002F')\n  getUsers() { }\n  \n  @Post('\u002F')\n  createUser() { }\n  \n  @Get('\u002F:id')\n  getUser() { }\n  \n  @Put('\u002F:id')\n  updateUser() { }\n  \n  @Delete('\u002F:id')\n  deleteUser() { }\n}\n",[216,428,429,434,453,470,489,504,509,526,537,541,559,571,576,594,606,611,629,641],{"__ignoreMap":235},[239,430,431],{"class":241,"line":242},[239,432,433],{"class":245},"\u002F\u002F ✅ Organized, clean, maintainable\n",[239,435,436,439,442,444,446,448,450],{"class":241,"line":249},[239,437,438],{"class":256},"@",[239,440,441],{"class":260},"Controller",[239,443,264],{"class":252},[239,445,267],{"class":256},[239,447,271],{"class":270},[239,449,267],{"class":256},[239,451,452],{"class":252},")\n",[239,454,455,459,463,467],{"class":241,"line":285},[239,456,458],{"class":457},"s7zQu","export",[239,460,462],{"class":461},"spNyl"," class",[239,464,466],{"class":465},"sBMFI"," UserController",[239,468,469],{"class":256}," {\n",[239,471,472,475,478,480,482,485,487],{"class":241,"line":310},[239,473,474],{"class":256},"  @",[239,476,477],{"class":260},"Get",[239,479,264],{"class":252},[239,481,267],{"class":256},[239,483,484],{"class":270},"\u002F",[239,486,267],{"class":256},[239,488,452],{"class":252},[239,490,491,495,498,501],{"class":241,"line":335},[239,492,494],{"class":493},"swJcz","  getUsers",[239,496,497],{"class":256},"()",[239,499,500],{"class":256}," {",[239,502,503],{"class":256}," }\n",[239,505,506],{"class":241,"line":360},[239,507,508],{"class":252},"  \n",[239,510,511,513,516,518,520,522,524],{"class":241,"line":385},[239,512,474],{"class":256},[239,514,515],{"class":260},"Post",[239,517,264],{"class":252},[239,519,267],{"class":256},[239,521,484],{"class":270},[239,523,267],{"class":256},[239,525,452],{"class":252},[239,527,528,531,533,535],{"class":241,"line":391},[239,529,530],{"class":493},"  createUser",[239,532,497],{"class":256},[239,534,500],{"class":256},[239,536,503],{"class":256},[239,538,539],{"class":241,"line":416},[239,540,508],{"class":252},[239,542,544,546,548,550,552,555,557],{"class":241,"line":543},10,[239,545,474],{"class":256},[239,547,477],{"class":260},[239,549,264],{"class":252},[239,551,267],{"class":256},[239,553,554],{"class":270},"\u002F:id",[239,556,267],{"class":256},[239,558,452],{"class":252},[239,560,562,565,567,569],{"class":241,"line":561},11,[239,563,564],{"class":493},"  getUser",[239,566,497],{"class":256},[239,568,500],{"class":256},[239,570,503],{"class":256},[239,572,574],{"class":241,"line":573},12,[239,575,508],{"class":252},[239,577,579,581,584,586,588,590,592],{"class":241,"line":578},13,[239,580,474],{"class":256},[239,582,583],{"class":260},"Put",[239,585,264],{"class":252},[239,587,267],{"class":256},[239,589,554],{"class":270},[239,591,267],{"class":256},[239,593,452],{"class":252},[239,595,597,600,602,604],{"class":241,"line":596},14,[239,598,599],{"class":493},"  updateUser",[239,601,497],{"class":256},[239,603,500],{"class":256},[239,605,503],{"class":256},[239,607,609],{"class":241,"line":608},15,[239,610,508],{"class":252},[239,612,614,616,619,621,623,625,627],{"class":241,"line":613},16,[239,615,474],{"class":256},[239,617,618],{"class":260},"Delete",[239,620,264],{"class":252},[239,622,267],{"class":256},[239,624,554],{"class":270},[239,626,267],{"class":256},[239,628,452],{"class":252},[239,630,632,635,637,639],{"class":241,"line":631},17,[239,633,634],{"class":493},"  deleteUser",[239,636,497],{"class":256},[239,638,500],{"class":256},[239,640,503],{"class":256},[239,642,644],{"class":241,"line":643},18,[239,645,646],{"class":256},"}\n",[208,648,650],{"id":649},"how-controllers-work","How Controllers Work",[204,652,653],{},"Here's the complete flow from request to response:",[655,656],"img",{"src":657,"alt":658},"\u002Fimages\u002Fcontroller-1.svg","How controllers works",[225,660,662],{"id":661},"behind-the-scenes","Behind the Scenes",[204,664,665],{},"When you create a controller with decorators, Vercube automatically:",[667,668,669,677,683,689,695],"ol",{},[670,671,672,676],"li",{},[673,674,675],"strong",{},"Registers routes"," - Combines controller path with method paths",[670,678,679,682],{},[673,680,681],{},"Creates handlers"," - Wraps your methods in proper HTTP handlers",[670,684,685,688],{},[673,686,687],{},"Resolves parameters"," - Extracts data from URL, body, headers, etc.",[670,690,691,694],{},[673,692,693],{},"Handles responses"," - Serializes your return value to JSON",[670,696,697,700],{},[673,698,699],{},"Manages errors"," - Catches and formats errors appropriately",[655,702],{"src":703,"alt":662},"\u002Fimages\u002Fcontroller-2.svg",[208,705,707],{"id":706},"creating-your-first-controller","Creating Your First Controller",[225,709,711],{"id":710},"step-1-create-the-controller-class","Step 1: Create the Controller Class",[230,713,716],{"className":232,"code":714,"filename":715,"language":234,"meta":235,"style":235},"import { Controller } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \u002F\u002F Your endpoints will go here\n}\n","UserController.ts",[216,717,718,744,749,765,775,780],{"__ignoreMap":235},[239,719,720,723,725,728,731,734,737,740,742],{"class":241,"line":242},[239,721,722],{"class":457},"import",[239,724,500],{"class":256},[239,726,727],{"class":252}," Controller",[239,729,730],{"class":256}," }",[239,732,733],{"class":457}," from",[239,735,736],{"class":256}," '",[239,738,739],{"class":270},"@vercube\u002Fcore",[239,741,267],{"class":256},[239,743,282],{"class":256},[239,745,746],{"class":241,"line":249},[239,747,748],{"emptyLinePlaceholder":56},"\n",[239,750,751,753,755,757,759,761,763],{"class":241,"line":285},[239,752,438],{"class":256},[239,754,441],{"class":260},[239,756,264],{"class":252},[239,758,267],{"class":256},[239,760,271],{"class":270},[239,762,267],{"class":256},[239,764,452],{"class":252},[239,766,767,769,771,773],{"class":241,"line":310},[239,768,458],{"class":457},[239,770,462],{"class":461},[239,772,466],{"class":465},[239,774,469],{"class":256},[239,776,777],{"class":241,"line":335},[239,778,779],{"class":245},"  \u002F\u002F Your endpoints will go here\n",[239,781,782],{"class":241,"line":360},[239,783,646],{"class":256},[204,785,786,787,790],{},"The ",[216,788,789],{},"@Controller('\u002Fusers')"," decorator does two things:",[792,793,794,797],"ul",{},[670,795,796],{},"Marks this class as a controller",[670,798,799,800,802],{},"Sets ",[216,801,271],{}," as the base path for all routes",[225,804,806],{"id":805},"step-2-add-route-handlers","Step 2: Add Route Handlers",[230,808,810],{"className":232,"code":809,"filename":715,"language":234,"meta":235,"style":235},"import { Controller, Get } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F')\n  getAllUsers() {\n    return [\n      { id: 1, name: 'Alice' },\n      { id: 2, name: 'Bob' }\n    ];\n  }\n}\n",[216,811,812,837,841,857,867,871,887,896,904,936,962,969,974],{"__ignoreMap":235},[239,813,814,816,818,820,822,825,827,829,831,833,835],{"class":241,"line":242},[239,815,722],{"class":457},[239,817,500],{"class":256},[239,819,727],{"class":252},[239,821,276],{"class":256},[239,823,824],{"class":252}," Get",[239,826,730],{"class":256},[239,828,733],{"class":457},[239,830,736],{"class":256},[239,832,739],{"class":270},[239,834,267],{"class":256},[239,836,282],{"class":256},[239,838,839],{"class":241,"line":249},[239,840,748],{"emptyLinePlaceholder":56},[239,842,843,845,847,849,851,853,855],{"class":241,"line":285},[239,844,438],{"class":256},[239,846,441],{"class":260},[239,848,264],{"class":252},[239,850,267],{"class":256},[239,852,271],{"class":270},[239,854,267],{"class":256},[239,856,452],{"class":252},[239,858,859,861,863,865],{"class":241,"line":310},[239,860,458],{"class":457},[239,862,462],{"class":461},[239,864,466],{"class":465},[239,866,469],{"class":256},[239,868,869],{"class":241,"line":335},[239,870,508],{"class":252},[239,872,873,875,877,879,881,883,885],{"class":241,"line":360},[239,874,474],{"class":256},[239,876,477],{"class":260},[239,878,264],{"class":252},[239,880,267],{"class":256},[239,882,484],{"class":270},[239,884,267],{"class":256},[239,886,452],{"class":252},[239,888,889,892,894],{"class":241,"line":385},[239,890,891],{"class":493},"  getAllUsers",[239,893,497],{"class":256},[239,895,469],{"class":256},[239,897,898,901],{"class":241,"line":391},[239,899,900],{"class":457},"    return",[239,902,903],{"class":493}," [\n",[239,905,906,909,912,915,919,921,924,926,928,931,933],{"class":241,"line":416},[239,907,908],{"class":256},"      {",[239,910,911],{"class":493}," id",[239,913,914],{"class":256},":",[239,916,918],{"class":917},"sbssI"," 1",[239,920,276],{"class":256},[239,922,923],{"class":493}," name",[239,925,914],{"class":256},[239,927,736],{"class":256},[239,929,930],{"class":270},"Alice",[239,932,267],{"class":256},[239,934,935],{"class":256}," },\n",[239,937,938,940,942,944,947,949,951,953,955,958,960],{"class":241,"line":543},[239,939,908],{"class":256},[239,941,911],{"class":493},[239,943,914],{"class":256},[239,945,946],{"class":917}," 2",[239,948,276],{"class":256},[239,950,923],{"class":493},[239,952,914],{"class":256},[239,954,736],{"class":256},[239,956,957],{"class":270},"Bob",[239,959,267],{"class":256},[239,961,503],{"class":256},[239,963,964,967],{"class":241,"line":561},[239,965,966],{"class":493},"    ]",[239,968,282],{"class":256},[239,970,971],{"class":241,"line":573},[239,972,973],{"class":256},"  }\n",[239,975,976],{"class":241,"line":578},[239,977,646],{"class":256},[204,979,980,981],{},"This creates: ",[216,982,983],{},"GET \u002Fusers\u002F",[204,985,986],{},"Vercube automatically:",[792,988,989,992,997],{},[670,990,991],{},"Converts the return value to JSON",[670,993,799,994],{},[216,995,996],{},"Content-Type: application\u002Fjson",[670,998,999],{},"Sends status code 200",[225,1001,1003],{"id":1002},"step-3-register-the-controller","Step 3: Register the Controller",[230,1005,1008],{"className":232,"code":1006,"filename":1007,"language":234,"meta":235,"style":235},"import { type App } from '@vercube\u002Fcore';\nimport { UserController } from '.\u002Fcontrollers\u002FUserController';\n\nexport function setup(app: App): void {\n  app.useController(UserController);\n}\n","setup.ts",[216,1009,1010,1034,1055,1059,1086,1105],{"__ignoreMap":235},[239,1011,1012,1014,1016,1019,1022,1024,1026,1028,1030,1032],{"class":241,"line":242},[239,1013,722],{"class":457},[239,1015,500],{"class":256},[239,1017,1018],{"class":457}," type",[239,1020,1021],{"class":252}," App",[239,1023,730],{"class":256},[239,1025,733],{"class":457},[239,1027,736],{"class":256},[239,1029,739],{"class":270},[239,1031,267],{"class":256},[239,1033,282],{"class":256},[239,1035,1036,1038,1040,1042,1044,1046,1048,1051,1053],{"class":241,"line":249},[239,1037,722],{"class":457},[239,1039,500],{"class":256},[239,1041,466],{"class":252},[239,1043,730],{"class":256},[239,1045,733],{"class":457},[239,1047,736],{"class":256},[239,1049,1050],{"class":270},".\u002Fcontrollers\u002FUserController",[239,1052,267],{"class":256},[239,1054,282],{"class":256},[239,1056,1057],{"class":241,"line":285},[239,1058,748],{"emptyLinePlaceholder":56},[239,1060,1061,1063,1066,1069,1071,1074,1076,1078,1081,1084],{"class":241,"line":310},[239,1062,458],{"class":457},[239,1064,1065],{"class":461}," function",[239,1067,1068],{"class":260}," setup",[239,1070,264],{"class":256},[239,1072,253],{"class":1073},"sHdIc",[239,1075,914],{"class":256},[239,1077,1021],{"class":465},[239,1079,1080],{"class":256},"):",[239,1082,1083],{"class":465}," void",[239,1085,469],{"class":256},[239,1087,1088,1091,1093,1096,1098,1100,1103],{"class":241,"line":335},[239,1089,1090],{"class":252},"  app",[239,1092,257],{"class":256},[239,1094,1095],{"class":260},"useController",[239,1097,264],{"class":493},[239,1099,218],{"class":252},[239,1101,1102],{"class":493},")",[239,1104,282],{"class":256},[239,1106,1107],{"class":241,"line":360},[239,1108,646],{"class":256},[204,1110,1111],{},"That's it! Your API is ready to handle requests.",[208,1113,1115],{"id":1114},"http-methods","HTTP Methods",[204,1117,1118],{},"Vercube provides decorators for all standard HTTP methods:",[230,1120,1122],{"className":232,"code":1121,"language":234,"meta":235,"style":235},"import { Controller, Get, Post, Put, Patch, Delete } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F')\n  list() {\n    \u002F\u002F GET \u002Fusers - List all users\n  }\n  \n  @Get('\u002F:id')\n  get() {\n    \u002F\u002F GET \u002Fusers\u002F:id - Get specific user\n  }\n  \n  @Post('\u002F')\n  create() {\n    \u002F\u002F POST \u002Fusers - Create new user\n  }\n  \n  @Put('\u002F:id')\n  update() {\n    \u002F\u002F PUT \u002Fusers\u002F:id - Replace user\n  }\n  \n  @Patch('\u002F:id')\n  modify() {\n    \u002F\u002F PATCH \u002Fusers\u002F:id - Partially update user\n  }\n  \n  @Delete('\u002F:id')\n  remove() {\n    \u002F\u002F DELETE \u002Fusers\u002F:id - Delete user\n  }\n}\n",[216,1123,1124,1168,1172,1188,1198,1202,1218,1227,1232,1236,1240,1256,1265,1270,1274,1278,1294,1303,1308,1313,1318,1335,1345,1351,1356,1361,1379,1389,1395,1400,1405,1422,1432,1438,1443],{"__ignoreMap":235},[239,1125,1126,1128,1130,1132,1134,1136,1138,1141,1143,1146,1148,1151,1153,1156,1158,1160,1162,1164,1166],{"class":241,"line":242},[239,1127,722],{"class":457},[239,1129,500],{"class":256},[239,1131,727],{"class":252},[239,1133,276],{"class":256},[239,1135,824],{"class":252},[239,1137,276],{"class":256},[239,1139,1140],{"class":252}," Post",[239,1142,276],{"class":256},[239,1144,1145],{"class":252}," Put",[239,1147,276],{"class":256},[239,1149,1150],{"class":252}," Patch",[239,1152,276],{"class":256},[239,1154,1155],{"class":252}," Delete",[239,1157,730],{"class":256},[239,1159,733],{"class":457},[239,1161,736],{"class":256},[239,1163,739],{"class":270},[239,1165,267],{"class":256},[239,1167,282],{"class":256},[239,1169,1170],{"class":241,"line":249},[239,1171,748],{"emptyLinePlaceholder":56},[239,1173,1174,1176,1178,1180,1182,1184,1186],{"class":241,"line":285},[239,1175,438],{"class":256},[239,1177,441],{"class":260},[239,1179,264],{"class":252},[239,1181,267],{"class":256},[239,1183,271],{"class":270},[239,1185,267],{"class":256},[239,1187,452],{"class":252},[239,1189,1190,1192,1194,1196],{"class":241,"line":310},[239,1191,458],{"class":457},[239,1193,462],{"class":461},[239,1195,466],{"class":465},[239,1197,469],{"class":256},[239,1199,1200],{"class":241,"line":335},[239,1201,508],{"class":252},[239,1203,1204,1206,1208,1210,1212,1214,1216],{"class":241,"line":360},[239,1205,474],{"class":256},[239,1207,477],{"class":260},[239,1209,264],{"class":252},[239,1211,267],{"class":256},[239,1213,484],{"class":270},[239,1215,267],{"class":256},[239,1217,452],{"class":252},[239,1219,1220,1223,1225],{"class":241,"line":385},[239,1221,1222],{"class":493},"  list",[239,1224,497],{"class":256},[239,1226,469],{"class":256},[239,1228,1229],{"class":241,"line":391},[239,1230,1231],{"class":245},"    \u002F\u002F GET \u002Fusers - List all users\n",[239,1233,1234],{"class":241,"line":416},[239,1235,973],{"class":256},[239,1237,1238],{"class":241,"line":543},[239,1239,508],{"class":252},[239,1241,1242,1244,1246,1248,1250,1252,1254],{"class":241,"line":561},[239,1243,474],{"class":256},[239,1245,477],{"class":260},[239,1247,264],{"class":252},[239,1249,267],{"class":256},[239,1251,554],{"class":270},[239,1253,267],{"class":256},[239,1255,452],{"class":252},[239,1257,1258,1261,1263],{"class":241,"line":573},[239,1259,1260],{"class":493},"  get",[239,1262,497],{"class":256},[239,1264,469],{"class":256},[239,1266,1267],{"class":241,"line":578},[239,1268,1269],{"class":245},"    \u002F\u002F GET \u002Fusers\u002F:id - Get specific user\n",[239,1271,1272],{"class":241,"line":596},[239,1273,973],{"class":256},[239,1275,1276],{"class":241,"line":608},[239,1277,508],{"class":252},[239,1279,1280,1282,1284,1286,1288,1290,1292],{"class":241,"line":613},[239,1281,474],{"class":256},[239,1283,515],{"class":260},[239,1285,264],{"class":252},[239,1287,267],{"class":256},[239,1289,484],{"class":270},[239,1291,267],{"class":256},[239,1293,452],{"class":252},[239,1295,1296,1299,1301],{"class":241,"line":631},[239,1297,1298],{"class":493},"  create",[239,1300,497],{"class":256},[239,1302,469],{"class":256},[239,1304,1305],{"class":241,"line":643},[239,1306,1307],{"class":245},"    \u002F\u002F POST \u002Fusers - Create new user\n",[239,1309,1311],{"class":241,"line":1310},19,[239,1312,973],{"class":256},[239,1314,1316],{"class":241,"line":1315},20,[239,1317,508],{"class":252},[239,1319,1321,1323,1325,1327,1329,1331,1333],{"class":241,"line":1320},21,[239,1322,474],{"class":256},[239,1324,583],{"class":260},[239,1326,264],{"class":252},[239,1328,267],{"class":256},[239,1330,554],{"class":270},[239,1332,267],{"class":256},[239,1334,452],{"class":252},[239,1336,1338,1341,1343],{"class":241,"line":1337},22,[239,1339,1340],{"class":493},"  update",[239,1342,497],{"class":256},[239,1344,469],{"class":256},[239,1346,1348],{"class":241,"line":1347},23,[239,1349,1350],{"class":245},"    \u002F\u002F PUT \u002Fusers\u002F:id - Replace user\n",[239,1352,1354],{"class":241,"line":1353},24,[239,1355,973],{"class":256},[239,1357,1359],{"class":241,"line":1358},25,[239,1360,508],{"class":252},[239,1362,1364,1366,1369,1371,1373,1375,1377],{"class":241,"line":1363},26,[239,1365,474],{"class":256},[239,1367,1368],{"class":260},"Patch",[239,1370,264],{"class":252},[239,1372,267],{"class":256},[239,1374,554],{"class":270},[239,1376,267],{"class":256},[239,1378,452],{"class":252},[239,1380,1382,1385,1387],{"class":241,"line":1381},27,[239,1383,1384],{"class":493},"  modify",[239,1386,497],{"class":256},[239,1388,469],{"class":256},[239,1390,1392],{"class":241,"line":1391},28,[239,1393,1394],{"class":245},"    \u002F\u002F PATCH \u002Fusers\u002F:id - Partially update user\n",[239,1396,1398],{"class":241,"line":1397},29,[239,1399,973],{"class":256},[239,1401,1403],{"class":241,"line":1402},30,[239,1404,508],{"class":252},[239,1406,1408,1410,1412,1414,1416,1418,1420],{"class":241,"line":1407},31,[239,1409,474],{"class":256},[239,1411,618],{"class":260},[239,1413,264],{"class":252},[239,1415,267],{"class":256},[239,1417,554],{"class":270},[239,1419,267],{"class":256},[239,1421,452],{"class":252},[239,1423,1425,1428,1430],{"class":241,"line":1424},32,[239,1426,1427],{"class":493},"  remove",[239,1429,497],{"class":256},[239,1431,469],{"class":256},[239,1433,1435],{"class":241,"line":1434},33,[239,1436,1437],{"class":245},"    \u002F\u002F DELETE \u002Fusers\u002F:id - Delete user\n",[239,1439,1441],{"class":241,"line":1440},34,[239,1442,973],{"class":256},[239,1444,1446],{"class":241,"line":1445},35,[239,1447,646],{"class":256},[208,1449,1451],{"id":1450},"path-parameters","Path Parameters",[204,1453,1454,1455,1458],{},"Extract dynamic values from URLs using the ",[216,1456,1457],{},"@Param"," decorator:",[230,1460,1462],{"className":232,"code":1461,"language":234,"meta":235,"style":235},"import { Controller, Get, Param } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F:id')\n  getUserById(@Param('id') id: string) {\n    return { id, name: 'User ' + id };\n  }\n  \n  @Get('\u002F:userId\u002Fposts\u002F:postId')\n  getUserPost(\n    @Param('userId') userId: string,\n    @Param('postId') postId: string\n  ) {\n    return { userId, postId, title: 'Post title' };\n  }\n}\n",[216,1463,1464,1493,1497,1513,1523,1527,1543,1577,1606,1610,1614,1631,1639,1666,1690,1697,1727,1731],{"__ignoreMap":235},[239,1465,1466,1468,1470,1472,1474,1476,1478,1481,1483,1485,1487,1489,1491],{"class":241,"line":242},[239,1467,722],{"class":457},[239,1469,500],{"class":256},[239,1471,727],{"class":252},[239,1473,276],{"class":256},[239,1475,824],{"class":252},[239,1477,276],{"class":256},[239,1479,1480],{"class":252}," Param",[239,1482,730],{"class":256},[239,1484,733],{"class":457},[239,1486,736],{"class":256},[239,1488,739],{"class":270},[239,1490,267],{"class":256},[239,1492,282],{"class":256},[239,1494,1495],{"class":241,"line":249},[239,1496,748],{"emptyLinePlaceholder":56},[239,1498,1499,1501,1503,1505,1507,1509,1511],{"class":241,"line":285},[239,1500,438],{"class":256},[239,1502,441],{"class":260},[239,1504,264],{"class":252},[239,1506,267],{"class":256},[239,1508,271],{"class":270},[239,1510,267],{"class":256},[239,1512,452],{"class":252},[239,1514,1515,1517,1519,1521],{"class":241,"line":310},[239,1516,458],{"class":457},[239,1518,462],{"class":461},[239,1520,466],{"class":465},[239,1522,469],{"class":256},[239,1524,1525],{"class":241,"line":335},[239,1526,508],{"class":252},[239,1528,1529,1531,1533,1535,1537,1539,1541],{"class":241,"line":360},[239,1530,474],{"class":256},[239,1532,477],{"class":260},[239,1534,264],{"class":252},[239,1536,267],{"class":256},[239,1538,554],{"class":270},[239,1540,267],{"class":256},[239,1542,452],{"class":252},[239,1544,1545,1548,1551,1554,1556,1558,1561,1563,1566,1568,1570,1573,1575],{"class":241,"line":385},[239,1546,1547],{"class":493},"  getUserById",[239,1549,1550],{"class":256},"(@",[239,1552,1553],{"class":260},"Param",[239,1555,264],{"class":252},[239,1557,267],{"class":256},[239,1559,1560],{"class":270},"id",[239,1562,267],{"class":256},[239,1564,1565],{"class":252},") ",[239,1567,1560],{"class":1073},[239,1569,914],{"class":256},[239,1571,1572],{"class":465}," string",[239,1574,1102],{"class":256},[239,1576,469],{"class":256},[239,1578,1579,1581,1583,1585,1587,1589,1591,1593,1596,1598,1601,1603],{"class":241,"line":391},[239,1580,900],{"class":457},[239,1582,500],{"class":256},[239,1584,911],{"class":252},[239,1586,276],{"class":256},[239,1588,923],{"class":493},[239,1590,914],{"class":256},[239,1592,736],{"class":256},[239,1594,1595],{"class":270},"User ",[239,1597,267],{"class":256},[239,1599,1600],{"class":256}," +",[239,1602,911],{"class":252},[239,1604,1605],{"class":256}," };\n",[239,1607,1608],{"class":241,"line":416},[239,1609,973],{"class":256},[239,1611,1612],{"class":241,"line":543},[239,1613,508],{"class":252},[239,1615,1616,1618,1620,1622,1624,1627,1629],{"class":241,"line":561},[239,1617,474],{"class":256},[239,1619,477],{"class":260},[239,1621,264],{"class":252},[239,1623,267],{"class":256},[239,1625,1626],{"class":270},"\u002F:userId\u002Fposts\u002F:postId",[239,1628,267],{"class":256},[239,1630,452],{"class":252},[239,1632,1633,1636],{"class":241,"line":573},[239,1634,1635],{"class":493},"  getUserPost",[239,1637,1638],{"class":256},"(\n",[239,1640,1641,1644,1646,1648,1650,1653,1655,1657,1659,1661,1663],{"class":241,"line":578},[239,1642,1643],{"class":256},"    @",[239,1645,1553],{"class":260},[239,1647,264],{"class":252},[239,1649,267],{"class":256},[239,1651,1652],{"class":270},"userId",[239,1654,267],{"class":256},[239,1656,1565],{"class":252},[239,1658,1652],{"class":1073},[239,1660,914],{"class":256},[239,1662,1572],{"class":465},[239,1664,1665],{"class":256},",\n",[239,1667,1668,1670,1672,1674,1676,1679,1681,1683,1685,1687],{"class":241,"line":596},[239,1669,1643],{"class":256},[239,1671,1553],{"class":260},[239,1673,264],{"class":252},[239,1675,267],{"class":256},[239,1677,1678],{"class":270},"postId",[239,1680,267],{"class":256},[239,1682,1565],{"class":252},[239,1684,1678],{"class":1073},[239,1686,914],{"class":256},[239,1688,1689],{"class":465}," string\n",[239,1691,1692,1695],{"class":241,"line":608},[239,1693,1694],{"class":256},"  )",[239,1696,469],{"class":256},[239,1698,1699,1701,1703,1706,1708,1711,1713,1716,1718,1720,1723,1725],{"class":241,"line":613},[239,1700,900],{"class":457},[239,1702,500],{"class":256},[239,1704,1705],{"class":252}," userId",[239,1707,276],{"class":256},[239,1709,1710],{"class":252}," postId",[239,1712,276],{"class":256},[239,1714,1715],{"class":493}," title",[239,1717,914],{"class":256},[239,1719,736],{"class":256},[239,1721,1722],{"class":270},"Post title",[239,1724,267],{"class":256},[239,1726,1605],{"class":256},[239,1728,1729],{"class":241,"line":631},[239,1730,973],{"class":256},[239,1732,1733],{"class":241,"line":643},[239,1734,646],{"class":256},[655,1736],{"src":1737,"alt":1451},"\u002Fimages\u002Fcontroller-3.svg",[208,1739,1741],{"id":1740},"request-body","Request Body",[204,1743,1744,1745,1458],{},"Access request body data with the ",[216,1746,1747],{},"@Body",[230,1749,1751],{"className":232,"code":1750,"language":234,"meta":235,"style":235},"import { Controller, Post, Body } from '@vercube\u002Fcore';\n\ninterface CreateUserDto {\n  name: string;\n  email: string;\n  age: number;\n}\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Post('\u002F')\n  createUser(@Body() userData: CreateUserDto) {\n    \u002F\u002F userData is automatically parsed from JSON\n    console.log(userData.name);   \u002F\u002F \"Alice\"\n    console.log(userData.email);  \u002F\u002F \"alice@example.com\"\n    \n    return { id: 1, ...userData };\n  }\n}\n",[216,1752,1753,1782,1786,1796,1807,1818,1830,1834,1838,1854,1864,1868,1884,1907,1912,1939,1963,1968,1989,1993],{"__ignoreMap":235},[239,1754,1755,1757,1759,1761,1763,1765,1767,1770,1772,1774,1776,1778,1780],{"class":241,"line":242},[239,1756,722],{"class":457},[239,1758,500],{"class":256},[239,1760,727],{"class":252},[239,1762,276],{"class":256},[239,1764,1140],{"class":252},[239,1766,276],{"class":256},[239,1768,1769],{"class":252}," Body",[239,1771,730],{"class":256},[239,1773,733],{"class":457},[239,1775,736],{"class":256},[239,1777,739],{"class":270},[239,1779,267],{"class":256},[239,1781,282],{"class":256},[239,1783,1784],{"class":241,"line":249},[239,1785,748],{"emptyLinePlaceholder":56},[239,1787,1788,1791,1794],{"class":241,"line":285},[239,1789,1790],{"class":461},"interface",[239,1792,1793],{"class":465}," CreateUserDto",[239,1795,469],{"class":256},[239,1797,1798,1801,1803,1805],{"class":241,"line":310},[239,1799,1800],{"class":493},"  name",[239,1802,914],{"class":256},[239,1804,1572],{"class":465},[239,1806,282],{"class":256},[239,1808,1809,1812,1814,1816],{"class":241,"line":335},[239,1810,1811],{"class":493},"  email",[239,1813,914],{"class":256},[239,1815,1572],{"class":465},[239,1817,282],{"class":256},[239,1819,1820,1823,1825,1828],{"class":241,"line":360},[239,1821,1822],{"class":493},"  age",[239,1824,914],{"class":256},[239,1826,1827],{"class":465}," number",[239,1829,282],{"class":256},[239,1831,1832],{"class":241,"line":385},[239,1833,646],{"class":256},[239,1835,1836],{"class":241,"line":391},[239,1837,748],{"emptyLinePlaceholder":56},[239,1839,1840,1842,1844,1846,1848,1850,1852],{"class":241,"line":416},[239,1841,438],{"class":256},[239,1843,441],{"class":260},[239,1845,264],{"class":252},[239,1847,267],{"class":256},[239,1849,271],{"class":270},[239,1851,267],{"class":256},[239,1853,452],{"class":252},[239,1855,1856,1858,1860,1862],{"class":241,"line":543},[239,1857,458],{"class":457},[239,1859,462],{"class":461},[239,1861,466],{"class":465},[239,1863,469],{"class":256},[239,1865,1866],{"class":241,"line":561},[239,1867,508],{"class":252},[239,1869,1870,1872,1874,1876,1878,1880,1882],{"class":241,"line":573},[239,1871,474],{"class":256},[239,1873,515],{"class":260},[239,1875,264],{"class":252},[239,1877,267],{"class":256},[239,1879,484],{"class":270},[239,1881,267],{"class":256},[239,1883,452],{"class":252},[239,1885,1886,1888,1890,1893,1896,1899,1901,1903,1905],{"class":241,"line":578},[239,1887,530],{"class":493},[239,1889,1550],{"class":256},[239,1891,1892],{"class":260},"Body",[239,1894,1895],{"class":252},"() ",[239,1897,1898],{"class":1073},"userData",[239,1900,914],{"class":256},[239,1902,1793],{"class":465},[239,1904,1102],{"class":256},[239,1906,469],{"class":256},[239,1908,1909],{"class":241,"line":596},[239,1910,1911],{"class":245},"    \u002F\u002F userData is automatically parsed from JSON\n",[239,1913,1914,1917,1919,1922,1924,1926,1928,1931,1933,1936],{"class":241,"line":608},[239,1915,1916],{"class":252},"    console",[239,1918,257],{"class":256},[239,1920,1921],{"class":260},"log",[239,1923,264],{"class":493},[239,1925,1898],{"class":252},[239,1927,257],{"class":256},[239,1929,1930],{"class":252},"name",[239,1932,1102],{"class":493},[239,1934,1935],{"class":256},";",[239,1937,1938],{"class":245},"   \u002F\u002F \"Alice\"\n",[239,1940,1941,1943,1945,1947,1949,1951,1953,1956,1958,1960],{"class":241,"line":613},[239,1942,1916],{"class":252},[239,1944,257],{"class":256},[239,1946,1921],{"class":260},[239,1948,264],{"class":493},[239,1950,1898],{"class":252},[239,1952,257],{"class":256},[239,1954,1955],{"class":252},"email",[239,1957,1102],{"class":493},[239,1959,1935],{"class":256},[239,1961,1962],{"class":245},"  \u002F\u002F \"alice@example.com\"\n",[239,1964,1965],{"class":241,"line":631},[239,1966,1967],{"class":493},"    \n",[239,1969,1970,1972,1974,1976,1978,1980,1982,1985,1987],{"class":241,"line":643},[239,1971,900],{"class":457},[239,1973,500],{"class":256},[239,1975,911],{"class":493},[239,1977,914],{"class":256},[239,1979,918],{"class":917},[239,1981,276],{"class":256},[239,1983,1984],{"class":256}," ...",[239,1986,1898],{"class":252},[239,1988,1605],{"class":256},[239,1990,1991],{"class":241,"line":1310},[239,1992,973],{"class":256},[239,1994,1995],{"class":241,"line":1315},[239,1996,646],{"class":256},[230,1998,2002],{"className":1999,"code":2000,"language":2001,"meta":235,"style":235},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Client sends:\ncurl -X POST http:\u002F\u002Flocalhost:3000\u002Fusers \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\":\"Alice\",\"email\":\"alice@example.com\",\"age\":25}'\n","bash",[216,2003,2004,2009,2026,2041],{"__ignoreMap":235},[239,2005,2006],{"class":241,"line":242},[239,2007,2008],{"class":245},"# Client sends:\n",[239,2010,2011,2014,2017,2020,2023],{"class":241,"line":249},[239,2012,2013],{"class":465},"curl",[239,2015,2016],{"class":270}," -X",[239,2018,2019],{"class":270}," POST",[239,2021,2022],{"class":270}," http:\u002F\u002Flocalhost:3000\u002Fusers",[239,2024,2025],{"class":252}," \\\n",[239,2027,2028,2031,2034,2036,2039],{"class":241,"line":285},[239,2029,2030],{"class":270},"  -H",[239,2032,2033],{"class":256}," \"",[239,2035,996],{"class":270},[239,2037,2038],{"class":256},"\"",[239,2040,2025],{"class":252},[239,2042,2043,2046,2048,2051],{"class":241,"line":310},[239,2044,2045],{"class":270},"  -d",[239,2047,736],{"class":256},[239,2049,2050],{"class":270},"{\"name\":\"Alice\",\"email\":\"alice@example.com\",\"age\":25}",[239,2052,2053],{"class":256},"'\n",[2055,2056,2057],"tip",{},[204,2058,786,2059,2062,2063,2066],{},[216,2060,2061],{},"@Body()"," decorator automatically parses JSON request bodies. No manual ",[216,2064,2065],{},"JSON.parse()"," needed!",[2055,2068,2069,2076],{},[204,2070,2071,2072,2075],{},"You can validate and transform request body automatically using Zod schemas. This ensures type safety and data integrity. Learn more in the ",[2073,2074,49],"a",{"href":50}," guide.",[230,2077,2079],{"className":232,"code":2078,"language":234,"meta":235,"style":235},"import { z } from 'zod';\n\nconst CreateUserSchema = z.object({\n  name: z.string(),\n  email: z.string().email(),\n  age: z.number().min(18)\n});\n\ntype CreateUserDto = z.infer\u003Ctypeof CreateUserSchema>;\n\n@Post('\u002F')\ncreateUser(@Body({ validationSchema: CreateUserSchema }) userData: CreateUserDto) {\n  \u002F\u002F userData is validated and type-safe!\n  \u002F\u002F If validation fails, automatic 400 Bad Request response\n}\n",[216,2080,2081,2103,2107,2130,2147,2169,2196,2205,2209,2235,2239,2255,2283,2288,2293],{"__ignoreMap":235},[239,2082,2083,2085,2087,2090,2092,2094,2096,2099,2101],{"class":241,"line":242},[239,2084,722],{"class":457},[239,2086,500],{"class":256},[239,2088,2089],{"class":252}," z",[239,2091,730],{"class":256},[239,2093,733],{"class":457},[239,2095,736],{"class":256},[239,2097,2098],{"class":270},"zod",[239,2100,267],{"class":256},[239,2102,282],{"class":256},[239,2104,2105],{"class":241,"line":249},[239,2106,748],{"emptyLinePlaceholder":56},[239,2108,2109,2112,2115,2118,2120,2122,2125,2127],{"class":241,"line":285},[239,2110,2111],{"class":461},"const",[239,2113,2114],{"class":252}," CreateUserSchema ",[239,2116,2117],{"class":256},"=",[239,2119,2089],{"class":252},[239,2121,257],{"class":256},[239,2123,2124],{"class":260},"object",[239,2126,264],{"class":252},[239,2128,2129],{"class":256},"{\n",[239,2131,2132,2134,2136,2138,2140,2143,2145],{"class":241,"line":310},[239,2133,1800],{"class":493},[239,2135,914],{"class":256},[239,2137,2089],{"class":252},[239,2139,257],{"class":256},[239,2141,2142],{"class":260},"string",[239,2144,497],{"class":252},[239,2146,1665],{"class":256},[239,2148,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167],{"class":241,"line":335},[239,2150,1811],{"class":493},[239,2152,914],{"class":256},[239,2154,2089],{"class":252},[239,2156,257],{"class":256},[239,2158,2142],{"class":260},[239,2160,497],{"class":252},[239,2162,257],{"class":256},[239,2164,1955],{"class":260},[239,2166,497],{"class":252},[239,2168,1665],{"class":256},[239,2170,2171,2173,2175,2177,2179,2182,2184,2186,2189,2191,2194],{"class":241,"line":360},[239,2172,1822],{"class":493},[239,2174,914],{"class":256},[239,2176,2089],{"class":252},[239,2178,257],{"class":256},[239,2180,2181],{"class":260},"number",[239,2183,497],{"class":252},[239,2185,257],{"class":256},[239,2187,2188],{"class":260},"min",[239,2190,264],{"class":252},[239,2192,2193],{"class":917},"18",[239,2195,452],{"class":252},[239,2197,2198,2201,2203],{"class":241,"line":385},[239,2199,2200],{"class":256},"}",[239,2202,1102],{"class":252},[239,2204,282],{"class":256},[239,2206,2207],{"class":241,"line":391},[239,2208,748],{"emptyLinePlaceholder":56},[239,2210,2211,2214,2216,2219,2221,2223,2226,2229,2232],{"class":241,"line":416},[239,2212,2213],{"class":461},"type",[239,2215,1793],{"class":465},[239,2217,2218],{"class":256}," =",[239,2220,2089],{"class":465},[239,2222,257],{"class":256},[239,2224,2225],{"class":465},"infer",[239,2227,2228],{"class":256},"\u003Ctypeof",[239,2230,2231],{"class":252}," CreateUserSchema",[239,2233,2234],{"class":256},">;\n",[239,2236,2237],{"class":241,"line":543},[239,2238,748],{"emptyLinePlaceholder":56},[239,2240,2241,2243,2245,2247,2249,2251,2253],{"class":241,"line":561},[239,2242,438],{"class":256},[239,2244,515],{"class":260},[239,2246,264],{"class":252},[239,2248,267],{"class":256},[239,2250,484],{"class":270},[239,2252,267],{"class":256},[239,2254,452],{"class":252},[239,2256,2257,2260,2262,2264,2266,2269,2272,2274,2276,2278,2281],{"class":241,"line":573},[239,2258,2259],{"class":260},"createUser",[239,2261,1550],{"class":252},[239,2263,1892],{"class":260},[239,2265,264],{"class":252},[239,2267,2268],{"class":256},"{",[239,2270,2271],{"class":493}," validationSchema",[239,2273,914],{"class":256},[239,2275,2114],{"class":252},[239,2277,2200],{"class":256},[239,2279,2280],{"class":252},") userData: CreateUserDto) ",[239,2282,2129],{"class":256},[239,2284,2285],{"class":241,"line":578},[239,2286,2287],{"class":245},"  \u002F\u002F userData is validated and type-safe!\n",[239,2289,2290],{"class":241,"line":596},[239,2291,2292],{"class":245},"  \u002F\u002F If validation fails, automatic 400 Bad Request response\n",[239,2294,2295],{"class":241,"line":608},[239,2296,646],{"class":256},[208,2298,2300],{"id":2299},"query-parameters","Query Parameters",[204,2302,2303,2304,2307,2308,914],{},"Extract URL query parameters using ",[216,2305,2306],{},"@QueryParam"," or ",[216,2309,2310],{},"@QueryParams",[230,2312,2314],{"className":232,"code":2313,"language":234,"meta":235,"style":235},"import { Controller, Get, QueryParam, QueryParams } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002Fsearch')\n  searchUsers(\n    @QueryParam('name') name: string,\n    @QueryParam('minAge') minAge: string,  \u002F\u002F Always string!\n    @QueryParams() allParams: Record\u003Cstring, string>  \u002F\u002F Always strings!\n  ) {\n    \u002F\u002F Convert to number if needed\n    const minAgeNumber = parseInt(minAge, 10);\n    \n    return {\n      searching: { name, minAge: minAgeNumber },\n      allQueryParams: allParams\n    };\n  }\n}\n",[216,2315,2316,2350,2354,2370,2380,2384,2401,2408,2433,2461,2493,2499,2504,2530,2534,2540,2562,2572,2577,2581],{"__ignoreMap":235},[239,2317,2318,2320,2322,2324,2326,2328,2330,2333,2335,2338,2340,2342,2344,2346,2348],{"class":241,"line":242},[239,2319,722],{"class":457},[239,2321,500],{"class":256},[239,2323,727],{"class":252},[239,2325,276],{"class":256},[239,2327,824],{"class":252},[239,2329,276],{"class":256},[239,2331,2332],{"class":252}," QueryParam",[239,2334,276],{"class":256},[239,2336,2337],{"class":252}," QueryParams",[239,2339,730],{"class":256},[239,2341,733],{"class":457},[239,2343,736],{"class":256},[239,2345,739],{"class":270},[239,2347,267],{"class":256},[239,2349,282],{"class":256},[239,2351,2352],{"class":241,"line":249},[239,2353,748],{"emptyLinePlaceholder":56},[239,2355,2356,2358,2360,2362,2364,2366,2368],{"class":241,"line":285},[239,2357,438],{"class":256},[239,2359,441],{"class":260},[239,2361,264],{"class":252},[239,2363,267],{"class":256},[239,2365,271],{"class":270},[239,2367,267],{"class":256},[239,2369,452],{"class":252},[239,2371,2372,2374,2376,2378],{"class":241,"line":310},[239,2373,458],{"class":457},[239,2375,462],{"class":461},[239,2377,466],{"class":465},[239,2379,469],{"class":256},[239,2381,2382],{"class":241,"line":335},[239,2383,508],{"class":252},[239,2385,2386,2388,2390,2392,2394,2397,2399],{"class":241,"line":360},[239,2387,474],{"class":256},[239,2389,477],{"class":260},[239,2391,264],{"class":252},[239,2393,267],{"class":256},[239,2395,2396],{"class":270},"\u002Fsearch",[239,2398,267],{"class":256},[239,2400,452],{"class":252},[239,2402,2403,2406],{"class":241,"line":385},[239,2404,2405],{"class":493},"  searchUsers",[239,2407,1638],{"class":256},[239,2409,2410,2412,2415,2417,2419,2421,2423,2425,2427,2429,2431],{"class":241,"line":391},[239,2411,1643],{"class":256},[239,2413,2414],{"class":260},"QueryParam",[239,2416,264],{"class":252},[239,2418,267],{"class":256},[239,2420,1930],{"class":270},[239,2422,267],{"class":256},[239,2424,1565],{"class":252},[239,2426,1930],{"class":1073},[239,2428,914],{"class":256},[239,2430,1572],{"class":465},[239,2432,1665],{"class":256},[239,2434,2435,2437,2439,2441,2443,2446,2448,2450,2452,2454,2456,2458],{"class":241,"line":416},[239,2436,1643],{"class":256},[239,2438,2414],{"class":260},[239,2440,264],{"class":252},[239,2442,267],{"class":256},[239,2444,2445],{"class":270},"minAge",[239,2447,267],{"class":256},[239,2449,1565],{"class":252},[239,2451,2445],{"class":1073},[239,2453,914],{"class":256},[239,2455,1572],{"class":465},[239,2457,276],{"class":256},[239,2459,2460],{"class":245},"  \u002F\u002F Always string!\n",[239,2462,2463,2465,2468,2470,2473,2475,2478,2481,2483,2485,2487,2490],{"class":241,"line":543},[239,2464,1643],{"class":256},[239,2466,2467],{"class":260},"QueryParams",[239,2469,1895],{"class":252},[239,2471,2472],{"class":1073},"allParams",[239,2474,914],{"class":256},[239,2476,2477],{"class":465}," Record",[239,2479,2480],{"class":256},"\u003C",[239,2482,2142],{"class":465},[239,2484,276],{"class":256},[239,2486,1572],{"class":465},[239,2488,2489],{"class":256},">",[239,2491,2492],{"class":245},"  \u002F\u002F Always strings!\n",[239,2494,2495,2497],{"class":241,"line":561},[239,2496,1694],{"class":256},[239,2498,469],{"class":256},[239,2500,2501],{"class":241,"line":573},[239,2502,2503],{"class":245},"    \u002F\u002F Convert to number if needed\n",[239,2505,2506,2509,2512,2514,2517,2519,2521,2523,2526,2528],{"class":241,"line":578},[239,2507,2508],{"class":461},"    const",[239,2510,2511],{"class":252}," minAgeNumber",[239,2513,2218],{"class":256},[239,2515,2516],{"class":260}," parseInt",[239,2518,264],{"class":493},[239,2520,2445],{"class":252},[239,2522,276],{"class":256},[239,2524,2525],{"class":917}," 10",[239,2527,1102],{"class":493},[239,2529,282],{"class":256},[239,2531,2532],{"class":241,"line":596},[239,2533,1967],{"class":493},[239,2535,2536,2538],{"class":241,"line":608},[239,2537,900],{"class":457},[239,2539,469],{"class":256},[239,2541,2542,2545,2547,2549,2551,2553,2556,2558,2560],{"class":241,"line":613},[239,2543,2544],{"class":493},"      searching",[239,2546,914],{"class":256},[239,2548,500],{"class":256},[239,2550,923],{"class":252},[239,2552,276],{"class":256},[239,2554,2555],{"class":493}," minAge",[239,2557,914],{"class":256},[239,2559,2511],{"class":252},[239,2561,935],{"class":256},[239,2563,2564,2567,2569],{"class":241,"line":631},[239,2565,2566],{"class":493},"      allQueryParams",[239,2568,914],{"class":256},[239,2570,2571],{"class":252}," allParams\n",[239,2573,2574],{"class":241,"line":643},[239,2575,2576],{"class":256},"    };\n",[239,2578,2579],{"class":241,"line":1310},[239,2580,973],{"class":256},[239,2582,2583],{"class":241,"line":1315},[239,2584,646],{"class":256},[230,2586,2588],{"className":1999,"code":2587,"language":2001,"meta":235,"style":235},"# Request:\nGET \u002Fusers\u002Fsearch?name=Alice&minAge=21&city=NYC\n\n# Your method receives:\n# name = \"Alice\"  (string)\n# minAge = \"21\"   (string, not number!)\n# allParams = { name: \"Alice\", minAge: \"21\", city: \"NYC\" }  (all strings)\n",[216,2589,2590,2595,2623,2627,2632,2637,2642],{"__ignoreMap":235},[239,2591,2592],{"class":241,"line":242},[239,2593,2594],{"class":245},"# Request:\n",[239,2596,2597,2600,2603,2606,2608,2610,2613,2615,2618,2620],{"class":241,"line":249},[239,2598,2599],{"class":465},"GET",[239,2601,2602],{"class":270}," \u002Fusers\u002Fsearch?name=Alice",[239,2604,2605],{"class":256},"&",[239,2607,2445],{"class":252},[239,2609,2117],{"class":256},[239,2611,2612],{"class":270},"21",[239,2614,2605],{"class":256},[239,2616,2617],{"class":252},"city",[239,2619,2117],{"class":256},[239,2621,2622],{"class":270},"NYC\n",[239,2624,2625],{"class":241,"line":285},[239,2626,748],{"emptyLinePlaceholder":56},[239,2628,2629],{"class":241,"line":310},[239,2630,2631],{"class":245},"# Your method receives:\n",[239,2633,2634],{"class":241,"line":335},[239,2635,2636],{"class":245},"# name = \"Alice\"  (string)\n",[239,2638,2639],{"class":241,"line":360},[239,2640,2641],{"class":245},"# minAge = \"21\"   (string, not number!)\n",[239,2643,2644],{"class":241,"line":385},[239,2645,2646],{"class":245},"# allParams = { name: \"Alice\", minAge: \"21\", city: \"NYC\" }  (all strings)\n",[2648,2649,2650,2671],"warning",{},[204,2651,2652,2655,2656,2662,2663,2666,2667,2670],{},[673,2653,2654],{},"Important:"," Query parameters are ALWAYS strings according to the ",[2073,2657,2661],{"href":2658,"rel":2659},"https:\u002F\u002Furl.spec.whatwg.org\u002F#urlsearchparams",[2660],"nofollow","URL specification",". Even if the value looks like a number (",[216,2664,2665],{},"?age=25","), you'll receive it as the string ",[216,2668,2669],{},"\"25\"",". You must manually convert to numbers, booleans, or other types:",[230,2672,2674],{"className":232,"code":2673,"language":234,"meta":235,"style":235},"@Get('\u002Fsearch')\nsearchUsers(\n  @QueryParam('age') age: string,\n  @QueryParam('active') active: string\n) {\n  const ageNumber = parseInt(age, 10);           \u002F\u002F \"25\" → 25\n  const isActive = active === 'true';            \u002F\u002F \"true\" → true\n}\n",[216,2675,2676,2692,2699,2719,2737,2743,2770,2797],{"__ignoreMap":235},[239,2677,2678,2680,2682,2684,2686,2688,2690],{"class":241,"line":242},[239,2679,438],{"class":256},[239,2681,477],{"class":260},[239,2683,264],{"class":252},[239,2685,267],{"class":256},[239,2687,2396],{"class":270},[239,2689,267],{"class":256},[239,2691,452],{"class":252},[239,2693,2694,2697],{"class":241,"line":249},[239,2695,2696],{"class":260},"searchUsers",[239,2698,1638],{"class":252},[239,2700,2701,2703,2705,2707,2709,2712,2714,2717],{"class":241,"line":285},[239,2702,474],{"class":252},[239,2704,2414],{"class":260},[239,2706,264],{"class":252},[239,2708,267],{"class":256},[239,2710,2711],{"class":270},"age",[239,2713,267],{"class":256},[239,2715,2716],{"class":252},") age: string",[239,2718,1665],{"class":256},[239,2720,2721,2723,2725,2727,2729,2732,2734],{"class":241,"line":310},[239,2722,474],{"class":252},[239,2724,2414],{"class":260},[239,2726,264],{"class":252},[239,2728,267],{"class":256},[239,2730,2731],{"class":270},"active",[239,2733,267],{"class":256},[239,2735,2736],{"class":252},") active: string\n",[239,2738,2739,2741],{"class":241,"line":335},[239,2740,1565],{"class":252},[239,2742,2129],{"class":256},[239,2744,2745,2748,2751,2753,2755,2757,2759,2761,2763,2765,2767],{"class":241,"line":360},[239,2746,2747],{"class":461},"  const",[239,2749,2750],{"class":252}," ageNumber",[239,2752,2218],{"class":256},[239,2754,2516],{"class":260},[239,2756,264],{"class":493},[239,2758,2711],{"class":252},[239,2760,276],{"class":256},[239,2762,2525],{"class":917},[239,2764,1102],{"class":493},[239,2766,1935],{"class":256},[239,2768,2769],{"class":245},"           \u002F\u002F \"25\" → 25\n",[239,2771,2772,2774,2777,2779,2782,2785,2787,2790,2792,2794],{"class":241,"line":385},[239,2773,2747],{"class":461},[239,2775,2776],{"class":252}," isActive",[239,2778,2218],{"class":256},[239,2780,2781],{"class":252}," active",[239,2783,2784],{"class":256}," ===",[239,2786,736],{"class":256},[239,2788,2789],{"class":270},"true",[239,2791,267],{"class":256},[239,2793,1935],{"class":256},[239,2795,2796],{"class":245},"            \u002F\u002F \"true\" → true\n",[239,2798,2799],{"class":241,"line":391},[239,2800,646],{"class":256},[2055,2802,2803,2811],{},[204,2804,2805,2808,2809,2075],{},[673,2806,2807],{},"Better approach:"," Use Zod schemas to automatically validate and transform query parameters to the correct types. This eliminates manual parsing and ensures type safety. Learn more in the ",[2073,2810,49],{"href":50},[230,2812,2814],{"className":232,"code":2813,"language":234,"meta":235,"style":235},"import { z } from 'zod';\n\nconst SearchUsersSchema = z.object({\n  age: z.coerce.number().min(0),      \u002F\u002F Automatically converts string to number!\n  active: z.coerce.boolean(),         \u002F\u002F Automatically converts string to boolean!\n  name: z.string().optional()\n});\n\ntype SearchUsersDto = z.infer\u003Ctypeof SearchUsersSchema>;\n\n@Get('\u002Fsearch')\nsearchUsers(@QueryParams({ validationSchema: SearchUsersSchema }) query: SearchUsersDto) {\n  \u002F\u002F query.age is now a number: 25\n  \u002F\u002F query.active is now a boolean: true\n  \u002F\u002F No manual conversion needed!\n}\n",[216,2815,2816,2836,2840,2859,2894,2919,2941,2949,2953,2975,2979,2995,3020,3025,3030,3035],{"__ignoreMap":235},[239,2817,2818,2820,2822,2824,2826,2828,2830,2832,2834],{"class":241,"line":242},[239,2819,722],{"class":457},[239,2821,500],{"class":256},[239,2823,2089],{"class":252},[239,2825,730],{"class":256},[239,2827,733],{"class":457},[239,2829,736],{"class":256},[239,2831,2098],{"class":270},[239,2833,267],{"class":256},[239,2835,282],{"class":256},[239,2837,2838],{"class":241,"line":249},[239,2839,748],{"emptyLinePlaceholder":56},[239,2841,2842,2844,2847,2849,2851,2853,2855,2857],{"class":241,"line":285},[239,2843,2111],{"class":461},[239,2845,2846],{"class":252}," SearchUsersSchema ",[239,2848,2117],{"class":256},[239,2850,2089],{"class":252},[239,2852,257],{"class":256},[239,2854,2124],{"class":260},[239,2856,264],{"class":252},[239,2858,2129],{"class":256},[239,2860,2861,2863,2865,2867,2869,2872,2874,2876,2878,2880,2882,2884,2887,2889,2891],{"class":241,"line":310},[239,2862,1822],{"class":493},[239,2864,914],{"class":256},[239,2866,2089],{"class":252},[239,2868,257],{"class":256},[239,2870,2871],{"class":252},"coerce",[239,2873,257],{"class":256},[239,2875,2181],{"class":260},[239,2877,497],{"class":252},[239,2879,257],{"class":256},[239,2881,2188],{"class":260},[239,2883,264],{"class":252},[239,2885,2886],{"class":917},"0",[239,2888,1102],{"class":252},[239,2890,276],{"class":256},[239,2892,2893],{"class":245},"      \u002F\u002F Automatically converts string to number!\n",[239,2895,2896,2899,2901,2903,2905,2907,2909,2912,2914,2916],{"class":241,"line":335},[239,2897,2898],{"class":493},"  active",[239,2900,914],{"class":256},[239,2902,2089],{"class":252},[239,2904,257],{"class":256},[239,2906,2871],{"class":252},[239,2908,257],{"class":256},[239,2910,2911],{"class":260},"boolean",[239,2913,497],{"class":252},[239,2915,276],{"class":256},[239,2917,2918],{"class":245},"         \u002F\u002F Automatically converts string to boolean!\n",[239,2920,2921,2923,2925,2927,2929,2931,2933,2935,2938],{"class":241,"line":360},[239,2922,1800],{"class":493},[239,2924,914],{"class":256},[239,2926,2089],{"class":252},[239,2928,257],{"class":256},[239,2930,2142],{"class":260},[239,2932,497],{"class":252},[239,2934,257],{"class":256},[239,2936,2937],{"class":260},"optional",[239,2939,2940],{"class":252},"()\n",[239,2942,2943,2945,2947],{"class":241,"line":385},[239,2944,2200],{"class":256},[239,2946,1102],{"class":252},[239,2948,282],{"class":256},[239,2950,2951],{"class":241,"line":391},[239,2952,748],{"emptyLinePlaceholder":56},[239,2954,2955,2957,2960,2962,2964,2966,2968,2970,2973],{"class":241,"line":416},[239,2956,2213],{"class":461},[239,2958,2959],{"class":465}," SearchUsersDto",[239,2961,2218],{"class":256},[239,2963,2089],{"class":465},[239,2965,257],{"class":256},[239,2967,2225],{"class":465},[239,2969,2228],{"class":256},[239,2971,2972],{"class":252}," SearchUsersSchema",[239,2974,2234],{"class":256},[239,2976,2977],{"class":241,"line":543},[239,2978,748],{"emptyLinePlaceholder":56},[239,2980,2981,2983,2985,2987,2989,2991,2993],{"class":241,"line":561},[239,2982,438],{"class":256},[239,2984,477],{"class":260},[239,2986,264],{"class":252},[239,2988,267],{"class":256},[239,2990,2396],{"class":270},[239,2992,267],{"class":256},[239,2994,452],{"class":252},[239,2996,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3018],{"class":241,"line":573},[239,2998,2696],{"class":260},[239,3000,1550],{"class":252},[239,3002,2467],{"class":260},[239,3004,264],{"class":252},[239,3006,2268],{"class":256},[239,3008,2271],{"class":493},[239,3010,914],{"class":256},[239,3012,2846],{"class":252},[239,3014,2200],{"class":256},[239,3016,3017],{"class":252},") query: SearchUsersDto) ",[239,3019,2129],{"class":256},[239,3021,3022],{"class":241,"line":578},[239,3023,3024],{"class":245},"  \u002F\u002F query.age is now a number: 25\n",[239,3026,3027],{"class":241,"line":596},[239,3028,3029],{"class":245},"  \u002F\u002F query.active is now a boolean: true\n",[239,3031,3032],{"class":241,"line":608},[239,3033,3034],{"class":245},"  \u002F\u002F No manual conversion needed!\n",[239,3036,3037],{"class":241,"line":613},[239,3038,646],{"class":256},[208,3040,3042],{"id":3041},"headers","Headers",[204,3044,3045,3046,2307,3049,914],{},"Access request headers with ",[216,3047,3048],{},"@Header",[216,3050,3051],{},"@Headers",[230,3053,3055],{"className":232,"code":3054,"language":234,"meta":235,"style":235},"import { Controller, Get, Header, Headers } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F')\n  getUsers(\n    @Header('Authorization') token: string,\n    @Header('X-API-Key') apiKey: string,\n    @Headers() allHeaders: Record\u003Cstring, string>\n  ) {\n    console.log('Token:', token);\n    console.log('API Key:', apiKey);\n    \n    return { authenticated: !!token };\n  }\n}\n",[216,3056,3057,3091,3095,3111,3121,3125,3141,3147,3174,3200,3226,3232,3258,3284,3288,3306,3310],{"__ignoreMap":235},[239,3058,3059,3061,3063,3065,3067,3069,3071,3074,3076,3079,3081,3083,3085,3087,3089],{"class":241,"line":242},[239,3060,722],{"class":457},[239,3062,500],{"class":256},[239,3064,727],{"class":252},[239,3066,276],{"class":256},[239,3068,824],{"class":252},[239,3070,276],{"class":256},[239,3072,3073],{"class":252}," Header",[239,3075,276],{"class":256},[239,3077,3078],{"class":252}," Headers",[239,3080,730],{"class":256},[239,3082,733],{"class":457},[239,3084,736],{"class":256},[239,3086,739],{"class":270},[239,3088,267],{"class":256},[239,3090,282],{"class":256},[239,3092,3093],{"class":241,"line":249},[239,3094,748],{"emptyLinePlaceholder":56},[239,3096,3097,3099,3101,3103,3105,3107,3109],{"class":241,"line":285},[239,3098,438],{"class":256},[239,3100,441],{"class":260},[239,3102,264],{"class":252},[239,3104,267],{"class":256},[239,3106,271],{"class":270},[239,3108,267],{"class":256},[239,3110,452],{"class":252},[239,3112,3113,3115,3117,3119],{"class":241,"line":310},[239,3114,458],{"class":457},[239,3116,462],{"class":461},[239,3118,466],{"class":465},[239,3120,469],{"class":256},[239,3122,3123],{"class":241,"line":335},[239,3124,508],{"class":252},[239,3126,3127,3129,3131,3133,3135,3137,3139],{"class":241,"line":360},[239,3128,474],{"class":256},[239,3130,477],{"class":260},[239,3132,264],{"class":252},[239,3134,267],{"class":256},[239,3136,484],{"class":270},[239,3138,267],{"class":256},[239,3140,452],{"class":252},[239,3142,3143,3145],{"class":241,"line":385},[239,3144,494],{"class":493},[239,3146,1638],{"class":256},[239,3148,3149,3151,3154,3156,3158,3161,3163,3165,3168,3170,3172],{"class":241,"line":391},[239,3150,1643],{"class":256},[239,3152,3153],{"class":260},"Header",[239,3155,264],{"class":252},[239,3157,267],{"class":256},[239,3159,3160],{"class":270},"Authorization",[239,3162,267],{"class":256},[239,3164,1565],{"class":252},[239,3166,3167],{"class":1073},"token",[239,3169,914],{"class":256},[239,3171,1572],{"class":465},[239,3173,1665],{"class":256},[239,3175,3176,3178,3180,3182,3184,3187,3189,3191,3194,3196,3198],{"class":241,"line":416},[239,3177,1643],{"class":256},[239,3179,3153],{"class":260},[239,3181,264],{"class":252},[239,3183,267],{"class":256},[239,3185,3186],{"class":270},"X-API-Key",[239,3188,267],{"class":256},[239,3190,1565],{"class":252},[239,3192,3193],{"class":1073},"apiKey",[239,3195,914],{"class":256},[239,3197,1572],{"class":465},[239,3199,1665],{"class":256},[239,3201,3202,3204,3206,3208,3211,3213,3215,3217,3219,3221,3223],{"class":241,"line":543},[239,3203,1643],{"class":256},[239,3205,3042],{"class":260},[239,3207,1895],{"class":252},[239,3209,3210],{"class":1073},"allHeaders",[239,3212,914],{"class":256},[239,3214,2477],{"class":465},[239,3216,2480],{"class":256},[239,3218,2142],{"class":465},[239,3220,276],{"class":256},[239,3222,1572],{"class":465},[239,3224,3225],{"class":256},">\n",[239,3227,3228,3230],{"class":241,"line":561},[239,3229,1694],{"class":256},[239,3231,469],{"class":256},[239,3233,3234,3236,3238,3240,3242,3244,3247,3249,3251,3254,3256],{"class":241,"line":573},[239,3235,1916],{"class":252},[239,3237,257],{"class":256},[239,3239,1921],{"class":260},[239,3241,264],{"class":493},[239,3243,267],{"class":256},[239,3245,3246],{"class":270},"Token:",[239,3248,267],{"class":256},[239,3250,276],{"class":256},[239,3252,3253],{"class":252}," token",[239,3255,1102],{"class":493},[239,3257,282],{"class":256},[239,3259,3260,3262,3264,3266,3268,3270,3273,3275,3277,3280,3282],{"class":241,"line":578},[239,3261,1916],{"class":252},[239,3263,257],{"class":256},[239,3265,1921],{"class":260},[239,3267,264],{"class":493},[239,3269,267],{"class":256},[239,3271,3272],{"class":270},"API Key:",[239,3274,267],{"class":256},[239,3276,276],{"class":256},[239,3278,3279],{"class":252}," apiKey",[239,3281,1102],{"class":493},[239,3283,282],{"class":256},[239,3285,3286],{"class":241,"line":596},[239,3287,1967],{"class":493},[239,3289,3290,3292,3294,3297,3299,3302,3304],{"class":241,"line":608},[239,3291,900],{"class":457},[239,3293,500],{"class":256},[239,3295,3296],{"class":493}," authenticated",[239,3298,914],{"class":256},[239,3300,3301],{"class":256}," !!",[239,3303,3167],{"class":252},[239,3305,1605],{"class":256},[239,3307,3308],{"class":241,"line":613},[239,3309,973],{"class":256},[239,3311,3312],{"class":241,"line":631},[239,3313,646],{"class":256},[208,3315,3317],{"id":3316},"returning-responses","Returning Responses",[204,3319,3320],{},"You have multiple ways to return responses from your controllers:",[225,3322,3324],{"id":3323},"simple-values-auto-json","Simple Values (Auto JSON)",[230,3326,3328],{"className":232,"code":3327,"language":234,"meta":235,"style":235},"@Get('\u002F')\ngetUser() {\n  \u002F\u002F Automatically converted to JSON with status 200\n  return { id: 1, name: 'Alice' };\n}\n",[216,3329,3330,3346,3355,3360,3387],{"__ignoreMap":235},[239,3331,3332,3334,3336,3338,3340,3342,3344],{"class":241,"line":242},[239,3333,438],{"class":256},[239,3335,477],{"class":260},[239,3337,264],{"class":252},[239,3339,267],{"class":256},[239,3341,484],{"class":270},[239,3343,267],{"class":256},[239,3345,452],{"class":252},[239,3347,3348,3351,3353],{"class":241,"line":249},[239,3349,3350],{"class":260},"getUser",[239,3352,1895],{"class":252},[239,3354,2129],{"class":256},[239,3356,3357],{"class":241,"line":285},[239,3358,3359],{"class":245},"  \u002F\u002F Automatically converted to JSON with status 200\n",[239,3361,3362,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385],{"class":241,"line":310},[239,3363,3364],{"class":457},"  return",[239,3366,500],{"class":256},[239,3368,911],{"class":493},[239,3370,914],{"class":256},[239,3372,918],{"class":917},[239,3374,276],{"class":256},[239,3376,923],{"class":493},[239,3378,914],{"class":256},[239,3380,736],{"class":256},[239,3382,930],{"class":270},[239,3384,267],{"class":256},[239,3386,1605],{"class":256},[239,3388,3389],{"class":241,"line":335},[239,3390,646],{"class":256},[225,3392,3394],{"id":3393},"custom-status-code","Custom Status Code",[230,3396,3398],{"className":232,"code":3397,"language":234,"meta":235,"style":235},"import { Status } from '@vercube\u002Fcore';\n\n@Post('\u002F')\n@Status(201)\ncreateUser(@Body() data: any) {\n  \u002F\u002F Returns status 201 Created\n  return { id: 1, ...data };\n}\n",[216,3399,3400,3421,3425,3441,3455,3468,3473,3494],{"__ignoreMap":235},[239,3401,3402,3404,3406,3409,3411,3413,3415,3417,3419],{"class":241,"line":242},[239,3403,722],{"class":457},[239,3405,500],{"class":256},[239,3407,3408],{"class":252}," Status",[239,3410,730],{"class":256},[239,3412,733],{"class":457},[239,3414,736],{"class":256},[239,3416,739],{"class":270},[239,3418,267],{"class":256},[239,3420,282],{"class":256},[239,3422,3423],{"class":241,"line":249},[239,3424,748],{"emptyLinePlaceholder":56},[239,3426,3427,3429,3431,3433,3435,3437,3439],{"class":241,"line":285},[239,3428,438],{"class":256},[239,3430,515],{"class":260},[239,3432,264],{"class":252},[239,3434,267],{"class":256},[239,3436,484],{"class":270},[239,3438,267],{"class":256},[239,3440,452],{"class":252},[239,3442,3443,3445,3448,3450,3453],{"class":241,"line":310},[239,3444,438],{"class":256},[239,3446,3447],{"class":260},"Status",[239,3449,264],{"class":252},[239,3451,3452],{"class":917},"201",[239,3454,452],{"class":252},[239,3456,3457,3459,3461,3463,3466],{"class":241,"line":335},[239,3458,2259],{"class":260},[239,3460,1550],{"class":252},[239,3462,1892],{"class":260},[239,3464,3465],{"class":252},"() data: any) ",[239,3467,2129],{"class":256},[239,3469,3470],{"class":241,"line":360},[239,3471,3472],{"class":245},"  \u002F\u002F Returns status 201 Created\n",[239,3474,3475,3477,3479,3481,3483,3485,3487,3489,3492],{"class":241,"line":385},[239,3476,3364],{"class":457},[239,3478,500],{"class":256},[239,3480,911],{"class":493},[239,3482,914],{"class":256},[239,3484,918],{"class":917},[239,3486,276],{"class":256},[239,3488,1984],{"class":256},[239,3490,3491],{"class":252},"data",[239,3493,1605],{"class":256},[239,3495,3496],{"class":241,"line":391},[239,3497,646],{"class":256},[225,3499,3501],{"id":3500},"custom-headers","Custom Headers",[230,3503,3505],{"className":232,"code":3504,"language":234,"meta":235,"style":235},"import { SetHeader } from '@vercube\u002Fcore';\n\n@Get('\u002F')\n@SetHeader('X-Custom-Header', 'value')\n@SetHeader('X-Rate-Limit', '1000')\ngetUsers() {\n  return [{ id: 1, name: 'Alice' }];\n}\n",[216,3506,3507,3528,3532,3548,3575,3601,3610,3644],{"__ignoreMap":235},[239,3508,3509,3511,3513,3516,3518,3520,3522,3524,3526],{"class":241,"line":242},[239,3510,722],{"class":457},[239,3512,500],{"class":256},[239,3514,3515],{"class":252}," SetHeader",[239,3517,730],{"class":256},[239,3519,733],{"class":457},[239,3521,736],{"class":256},[239,3523,739],{"class":270},[239,3525,267],{"class":256},[239,3527,282],{"class":256},[239,3529,3530],{"class":241,"line":249},[239,3531,748],{"emptyLinePlaceholder":56},[239,3533,3534,3536,3538,3540,3542,3544,3546],{"class":241,"line":285},[239,3535,438],{"class":256},[239,3537,477],{"class":260},[239,3539,264],{"class":252},[239,3541,267],{"class":256},[239,3543,484],{"class":270},[239,3545,267],{"class":256},[239,3547,452],{"class":252},[239,3549,3550,3552,3555,3557,3559,3562,3564,3566,3568,3571,3573],{"class":241,"line":310},[239,3551,438],{"class":256},[239,3553,3554],{"class":260},"SetHeader",[239,3556,264],{"class":252},[239,3558,267],{"class":256},[239,3560,3561],{"class":270},"X-Custom-Header",[239,3563,267],{"class":256},[239,3565,276],{"class":256},[239,3567,736],{"class":256},[239,3569,3570],{"class":270},"value",[239,3572,267],{"class":256},[239,3574,452],{"class":252},[239,3576,3577,3579,3581,3583,3585,3588,3590,3592,3594,3597,3599],{"class":241,"line":335},[239,3578,438],{"class":256},[239,3580,3554],{"class":260},[239,3582,264],{"class":252},[239,3584,267],{"class":256},[239,3586,3587],{"class":270},"X-Rate-Limit",[239,3589,267],{"class":256},[239,3591,276],{"class":256},[239,3593,736],{"class":256},[239,3595,3596],{"class":270},"1000",[239,3598,267],{"class":256},[239,3600,452],{"class":252},[239,3602,3603,3606,3608],{"class":241,"line":360},[239,3604,3605],{"class":260},"getUsers",[239,3607,1895],{"class":252},[239,3609,2129],{"class":256},[239,3611,3612,3614,3617,3619,3621,3623,3625,3627,3629,3631,3633,3635,3637,3639,3642],{"class":241,"line":385},[239,3613,3364],{"class":457},[239,3615,3616],{"class":493}," [",[239,3618,2268],{"class":256},[239,3620,911],{"class":493},[239,3622,914],{"class":256},[239,3624,918],{"class":917},[239,3626,276],{"class":256},[239,3628,923],{"class":493},[239,3630,914],{"class":256},[239,3632,736],{"class":256},[239,3634,930],{"class":270},[239,3636,267],{"class":256},[239,3638,730],{"class":256},[239,3640,3641],{"class":493},"]",[239,3643,282],{"class":256},[239,3645,3646],{"class":241,"line":391},[239,3647,646],{"class":256},[225,3649,3651],{"id":3650},"redirects","Redirects",[230,3653,3655],{"className":232,"code":3654,"language":234,"meta":235,"style":235},"import { Redirect } from '@vercube\u002Fcore';\n\n@Get('\u002Fold-endpoint')\n@Redirect('\u002Fnew-endpoint', 301)\noldEndpoint() {\n  \u002F\u002F Automatically redirects to \u002Fnew-endpoint\n}\n",[216,3656,3657,3678,3682,3699,3722,3731,3736],{"__ignoreMap":235},[239,3658,3659,3661,3663,3666,3668,3670,3672,3674,3676],{"class":241,"line":242},[239,3660,722],{"class":457},[239,3662,500],{"class":256},[239,3664,3665],{"class":252}," Redirect",[239,3667,730],{"class":256},[239,3669,733],{"class":457},[239,3671,736],{"class":256},[239,3673,739],{"class":270},[239,3675,267],{"class":256},[239,3677,282],{"class":256},[239,3679,3680],{"class":241,"line":249},[239,3681,748],{"emptyLinePlaceholder":56},[239,3683,3684,3686,3688,3690,3692,3695,3697],{"class":241,"line":285},[239,3685,438],{"class":256},[239,3687,477],{"class":260},[239,3689,264],{"class":252},[239,3691,267],{"class":256},[239,3693,3694],{"class":270},"\u002Fold-endpoint",[239,3696,267],{"class":256},[239,3698,452],{"class":252},[239,3700,3701,3703,3706,3708,3710,3713,3715,3717,3720],{"class":241,"line":310},[239,3702,438],{"class":256},[239,3704,3705],{"class":260},"Redirect",[239,3707,264],{"class":252},[239,3709,267],{"class":256},[239,3711,3712],{"class":270},"\u002Fnew-endpoint",[239,3714,267],{"class":256},[239,3716,276],{"class":256},[239,3718,3719],{"class":917}," 301",[239,3721,452],{"class":252},[239,3723,3724,3727,3729],{"class":241,"line":335},[239,3725,3726],{"class":260},"oldEndpoint",[239,3728,1895],{"class":252},[239,3730,2129],{"class":256},[239,3732,3733],{"class":241,"line":360},[239,3734,3735],{"class":245},"  \u002F\u002F Automatically redirects to \u002Fnew-endpoint\n",[239,3737,3738],{"class":241,"line":385},[239,3739,646],{"class":256},[225,3741,3743],{"id":3742},"manual-response-control","Manual Response Control",[230,3745,3747],{"className":232,"code":3746,"language":234,"meta":235,"style":235},"import { Response } from '@vercube\u002Fcore';\n\n@Get('\u002F')\ngetUsers(@Response() res: Response) {\n  res.headers.set('X-Custom', 'value');\n  \n  return new Response(\n    JSON.stringify({ data: [] }),\n    { \n      status: 200,\n      headers: { 'Content-Type': 'application\u002Fjson' }\n    }\n  );\n}\n",[216,3748,3749,3770,3774,3790,3804,3839,3843,3854,3882,3890,3902,3929,3934,3940],{"__ignoreMap":235},[239,3750,3751,3753,3755,3758,3760,3762,3764,3766,3768],{"class":241,"line":242},[239,3752,722],{"class":457},[239,3754,500],{"class":256},[239,3756,3757],{"class":252}," Response",[239,3759,730],{"class":256},[239,3761,733],{"class":457},[239,3763,736],{"class":256},[239,3765,739],{"class":270},[239,3767,267],{"class":256},[239,3769,282],{"class":256},[239,3771,3772],{"class":241,"line":249},[239,3773,748],{"emptyLinePlaceholder":56},[239,3775,3776,3778,3780,3782,3784,3786,3788],{"class":241,"line":285},[239,3777,438],{"class":256},[239,3779,477],{"class":260},[239,3781,264],{"class":252},[239,3783,267],{"class":256},[239,3785,484],{"class":270},[239,3787,267],{"class":256},[239,3789,452],{"class":252},[239,3791,3792,3794,3796,3799,3802],{"class":241,"line":310},[239,3793,3605],{"class":260},[239,3795,1550],{"class":252},[239,3797,3798],{"class":260},"Response",[239,3800,3801],{"class":252},"() res: Response) ",[239,3803,2129],{"class":256},[239,3805,3806,3809,3811,3813,3815,3818,3820,3822,3825,3827,3829,3831,3833,3835,3837],{"class":241,"line":335},[239,3807,3808],{"class":252},"  res",[239,3810,257],{"class":256},[239,3812,3041],{"class":252},[239,3814,257],{"class":256},[239,3816,3817],{"class":260},"set",[239,3819,264],{"class":493},[239,3821,267],{"class":256},[239,3823,3824],{"class":270},"X-Custom",[239,3826,267],{"class":256},[239,3828,276],{"class":256},[239,3830,736],{"class":256},[239,3832,3570],{"class":270},[239,3834,267],{"class":256},[239,3836,1102],{"class":493},[239,3838,282],{"class":256},[239,3840,3841],{"class":241,"line":360},[239,3842,508],{"class":493},[239,3844,3845,3847,3850,3852],{"class":241,"line":385},[239,3846,3364],{"class":457},[239,3848,3849],{"class":256}," new",[239,3851,3757],{"class":260},[239,3853,1638],{"class":493},[239,3855,3856,3859,3861,3864,3866,3868,3871,3873,3876,3878,3880],{"class":241,"line":391},[239,3857,3858],{"class":252},"    JSON",[239,3860,257],{"class":256},[239,3862,3863],{"class":260},"stringify",[239,3865,264],{"class":493},[239,3867,2268],{"class":256},[239,3869,3870],{"class":493}," data",[239,3872,914],{"class":256},[239,3874,3875],{"class":493}," [] ",[239,3877,2200],{"class":256},[239,3879,1102],{"class":493},[239,3881,1665],{"class":256},[239,3883,3884,3887],{"class":241,"line":416},[239,3885,3886],{"class":256},"    {",[239,3888,3889],{"class":493}," \n",[239,3891,3892,3895,3897,3900],{"class":241,"line":543},[239,3893,3894],{"class":493},"      status",[239,3896,914],{"class":256},[239,3898,3899],{"class":917}," 200",[239,3901,1665],{"class":256},[239,3903,3904,3907,3909,3911,3913,3916,3918,3920,3922,3925,3927],{"class":241,"line":561},[239,3905,3906],{"class":493},"      headers",[239,3908,914],{"class":256},[239,3910,500],{"class":256},[239,3912,736],{"class":256},[239,3914,3915],{"class":493},"Content-Type",[239,3917,267],{"class":256},[239,3919,914],{"class":256},[239,3921,736],{"class":256},[239,3923,3924],{"class":270},"application\u002Fjson",[239,3926,267],{"class":256},[239,3928,503],{"class":256},[239,3930,3931],{"class":241,"line":573},[239,3932,3933],{"class":256},"    }\n",[239,3935,3936,3938],{"class":241,"line":578},[239,3937,1694],{"class":493},[239,3939,282],{"class":256},[239,3941,3942],{"class":241,"line":596},[239,3943,646],{"class":256},[208,3945,3947],{"id":3946},"working-with-services","Working with Services",[204,3949,3950],{},"Controllers should be thin - they coordinate but don't contain business logic. Use dependency injection to access services:",[230,3952,3954],{"className":232,"code":3953,"language":234,"meta":235,"style":235},"import { Controller, Get, Inject } from '@vercube\u002Fcore';\nimport { UserService } from '..\u002Fservices\u002FUserService';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Inject(UserService)\n  private userService!: UserService;\n  \n  @Get('\u002F')\n  async getAllUsers() {\n    \u002F\u002F Business logic is in the service\n    return await this.userService.findAll();\n  }\n  \n  @Get('\u002F:id')\n  async getUserById(@Param('id') id: string) {\n    return await this.userService.findById(id);\n  }\n  \n  @Post('\u002F')\n  async createUser(@Body() data: CreateUserDto) {\n    return await this.userService.create(data);\n  }\n}\n",[216,3955,3956,3985,4007,4011,4027,4037,4041,4051,4066,4070,4086,4098,4103,4125,4129,4133,4149,4180,4203,4207,4211,4227,4250,4273,4277],{"__ignoreMap":235},[239,3957,3958,3960,3962,3964,3966,3968,3970,3973,3975,3977,3979,3981,3983],{"class":241,"line":242},[239,3959,722],{"class":457},[239,3961,500],{"class":256},[239,3963,727],{"class":252},[239,3965,276],{"class":256},[239,3967,824],{"class":252},[239,3969,276],{"class":256},[239,3971,3972],{"class":252}," Inject",[239,3974,730],{"class":256},[239,3976,733],{"class":457},[239,3978,736],{"class":256},[239,3980,739],{"class":270},[239,3982,267],{"class":256},[239,3984,282],{"class":256},[239,3986,3987,3989,3991,3994,3996,3998,4000,4003,4005],{"class":241,"line":249},[239,3988,722],{"class":457},[239,3990,500],{"class":256},[239,3992,3993],{"class":252}," UserService",[239,3995,730],{"class":256},[239,3997,733],{"class":457},[239,3999,736],{"class":256},[239,4001,4002],{"class":270},"..\u002Fservices\u002FUserService",[239,4004,267],{"class":256},[239,4006,282],{"class":256},[239,4008,4009],{"class":241,"line":285},[239,4010,748],{"emptyLinePlaceholder":56},[239,4012,4013,4015,4017,4019,4021,4023,4025],{"class":241,"line":310},[239,4014,438],{"class":256},[239,4016,441],{"class":260},[239,4018,264],{"class":252},[239,4020,267],{"class":256},[239,4022,271],{"class":270},[239,4024,267],{"class":256},[239,4026,452],{"class":252},[239,4028,4029,4031,4033,4035],{"class":241,"line":335},[239,4030,458],{"class":457},[239,4032,462],{"class":461},[239,4034,466],{"class":465},[239,4036,469],{"class":256},[239,4038,4039],{"class":241,"line":360},[239,4040,508],{"class":252},[239,4042,4043,4045,4048],{"class":241,"line":385},[239,4044,474],{"class":256},[239,4046,4047],{"class":260},"Inject",[239,4049,4050],{"class":252},"(UserService)\n",[239,4052,4053,4056,4059,4062,4064],{"class":241,"line":391},[239,4054,4055],{"class":461},"  private",[239,4057,4058],{"class":493}," userService",[239,4060,4061],{"class":256},"!:",[239,4063,3993],{"class":465},[239,4065,282],{"class":256},[239,4067,4068],{"class":241,"line":416},[239,4069,508],{"class":252},[239,4071,4072,4074,4076,4078,4080,4082,4084],{"class":241,"line":543},[239,4073,474],{"class":256},[239,4075,477],{"class":260},[239,4077,264],{"class":252},[239,4079,267],{"class":256},[239,4081,484],{"class":270},[239,4083,267],{"class":256},[239,4085,452],{"class":252},[239,4087,4088,4091,4094,4096],{"class":241,"line":561},[239,4089,4090],{"class":461},"  async",[239,4092,4093],{"class":493}," getAllUsers",[239,4095,497],{"class":256},[239,4097,469],{"class":256},[239,4099,4100],{"class":241,"line":573},[239,4101,4102],{"class":245},"    \u002F\u002F Business logic is in the service\n",[239,4104,4105,4107,4110,4113,4116,4118,4121,4123],{"class":241,"line":578},[239,4106,900],{"class":457},[239,4108,4109],{"class":457}," await",[239,4111,4112],{"class":256}," this.",[239,4114,4115],{"class":252},"userService",[239,4117,257],{"class":256},[239,4119,4120],{"class":260},"findAll",[239,4122,497],{"class":493},[239,4124,282],{"class":256},[239,4126,4127],{"class":241,"line":596},[239,4128,973],{"class":256},[239,4130,4131],{"class":241,"line":608},[239,4132,508],{"class":252},[239,4134,4135,4137,4139,4141,4143,4145,4147],{"class":241,"line":613},[239,4136,474],{"class":256},[239,4138,477],{"class":260},[239,4140,264],{"class":252},[239,4142,267],{"class":256},[239,4144,554],{"class":270},[239,4146,267],{"class":256},[239,4148,452],{"class":252},[239,4150,4151,4153,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178],{"class":241,"line":631},[239,4152,4090],{"class":461},[239,4154,4155],{"class":493}," getUserById",[239,4157,1550],{"class":256},[239,4159,1553],{"class":260},[239,4161,264],{"class":252},[239,4163,267],{"class":256},[239,4165,1560],{"class":270},[239,4167,267],{"class":256},[239,4169,1565],{"class":252},[239,4171,1560],{"class":1073},[239,4173,914],{"class":256},[239,4175,1572],{"class":465},[239,4177,1102],{"class":256},[239,4179,469],{"class":256},[239,4181,4182,4184,4186,4188,4190,4192,4195,4197,4199,4201],{"class":241,"line":643},[239,4183,900],{"class":457},[239,4185,4109],{"class":457},[239,4187,4112],{"class":256},[239,4189,4115],{"class":252},[239,4191,257],{"class":256},[239,4193,4194],{"class":260},"findById",[239,4196,264],{"class":493},[239,4198,1560],{"class":252},[239,4200,1102],{"class":493},[239,4202,282],{"class":256},[239,4204,4205],{"class":241,"line":1310},[239,4206,973],{"class":256},[239,4208,4209],{"class":241,"line":1315},[239,4210,508],{"class":252},[239,4212,4213,4215,4217,4219,4221,4223,4225],{"class":241,"line":1320},[239,4214,474],{"class":256},[239,4216,515],{"class":260},[239,4218,264],{"class":252},[239,4220,267],{"class":256},[239,4222,484],{"class":270},[239,4224,267],{"class":256},[239,4226,452],{"class":252},[239,4228,4229,4231,4234,4236,4238,4240,4242,4244,4246,4248],{"class":241,"line":1337},[239,4230,4090],{"class":461},[239,4232,4233],{"class":493}," createUser",[239,4235,1550],{"class":256},[239,4237,1892],{"class":260},[239,4239,1895],{"class":252},[239,4241,3491],{"class":1073},[239,4243,914],{"class":256},[239,4245,1793],{"class":465},[239,4247,1102],{"class":256},[239,4249,469],{"class":256},[239,4251,4252,4254,4256,4258,4260,4262,4265,4267,4269,4271],{"class":241,"line":1347},[239,4253,900],{"class":457},[239,4255,4109],{"class":457},[239,4257,4112],{"class":256},[239,4259,4115],{"class":252},[239,4261,257],{"class":256},[239,4263,4264],{"class":260},"create",[239,4266,264],{"class":493},[239,4268,3491],{"class":252},[239,4270,1102],{"class":493},[239,4272,282],{"class":256},[239,4274,4275],{"class":241,"line":1353},[239,4276,973],{"class":256},[239,4278,4279],{"class":241,"line":1358},[239,4280,646],{"class":256},[655,4282],{"src":4283,"alt":3947},"\u002Fimages\u002Fcontroller-4.svg",[208,4285,4287],{"id":4286},"async-handlers","Async Handlers",[204,4289,4290],{},"Controllers fully support async\u002Fawait:",[230,4292,4294],{"className":232,"code":4293,"language":234,"meta":235,"style":235},"@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Inject(UserService)\n  private userService!: UserService;\n  \n  @Get('\u002F:id')\n  async getUser(@Param('id') id: string) {\n    \u002F\u002F Await is handled automatically\n    const user = await this.userService.findById(id);\n    \n    if (!user) {\n      throw new NotFoundException('User not found');\n    }\n    \n    return user;\n  }\n  \n  @Post('\u002F')\n  async createUser(@Body() data: CreateUserDto) {\n    \u002F\u002F Multiple awaits work perfectly\n    await this.userService.validateEmail(data.email);\n    const user = await this.userService.create(data);\n    await this.userService.sendWelcomeEmail(user);\n    \n    return user;\n  }\n}\n",[216,4295,4296,4312,4322,4326,4334,4346,4350,4366,4397,4402,4429,4433,4451,4474,4478,4482,4490,4494,4498,4514,4536,4541,4567,4593,4614,4618,4626,4630],{"__ignoreMap":235},[239,4297,4298,4300,4302,4304,4306,4308,4310],{"class":241,"line":242},[239,4299,438],{"class":256},[239,4301,441],{"class":260},[239,4303,264],{"class":252},[239,4305,267],{"class":256},[239,4307,271],{"class":270},[239,4309,267],{"class":256},[239,4311,452],{"class":252},[239,4313,4314,4316,4318,4320],{"class":241,"line":249},[239,4315,458],{"class":457},[239,4317,462],{"class":461},[239,4319,466],{"class":465},[239,4321,469],{"class":256},[239,4323,4324],{"class":241,"line":285},[239,4325,508],{"class":252},[239,4327,4328,4330,4332],{"class":241,"line":310},[239,4329,474],{"class":256},[239,4331,4047],{"class":260},[239,4333,4050],{"class":252},[239,4335,4336,4338,4340,4342,4344],{"class":241,"line":335},[239,4337,4055],{"class":461},[239,4339,4058],{"class":493},[239,4341,4061],{"class":256},[239,4343,3993],{"class":465},[239,4345,282],{"class":256},[239,4347,4348],{"class":241,"line":360},[239,4349,508],{"class":252},[239,4351,4352,4354,4356,4358,4360,4362,4364],{"class":241,"line":385},[239,4353,474],{"class":256},[239,4355,477],{"class":260},[239,4357,264],{"class":252},[239,4359,267],{"class":256},[239,4361,554],{"class":270},[239,4363,267],{"class":256},[239,4365,452],{"class":252},[239,4367,4368,4370,4373,4375,4377,4379,4381,4383,4385,4387,4389,4391,4393,4395],{"class":241,"line":391},[239,4369,4090],{"class":461},[239,4371,4372],{"class":493}," getUser",[239,4374,1550],{"class":256},[239,4376,1553],{"class":260},[239,4378,264],{"class":252},[239,4380,267],{"class":256},[239,4382,1560],{"class":270},[239,4384,267],{"class":256},[239,4386,1565],{"class":252},[239,4388,1560],{"class":1073},[239,4390,914],{"class":256},[239,4392,1572],{"class":465},[239,4394,1102],{"class":256},[239,4396,469],{"class":256},[239,4398,4399],{"class":241,"line":416},[239,4400,4401],{"class":245},"    \u002F\u002F Await is handled automatically\n",[239,4403,4404,4406,4409,4411,4413,4415,4417,4419,4421,4423,4425,4427],{"class":241,"line":543},[239,4405,2508],{"class":461},[239,4407,4408],{"class":252}," user",[239,4410,2218],{"class":256},[239,4412,4109],{"class":457},[239,4414,4112],{"class":256},[239,4416,4115],{"class":252},[239,4418,257],{"class":256},[239,4420,4194],{"class":260},[239,4422,264],{"class":493},[239,4424,1560],{"class":252},[239,4426,1102],{"class":493},[239,4428,282],{"class":256},[239,4430,4431],{"class":241,"line":561},[239,4432,1967],{"class":493},[239,4434,4435,4438,4441,4444,4447,4449],{"class":241,"line":573},[239,4436,4437],{"class":457},"    if",[239,4439,4440],{"class":493}," (",[239,4442,4443],{"class":256},"!",[239,4445,4446],{"class":252},"user",[239,4448,1565],{"class":493},[239,4450,2129],{"class":256},[239,4452,4453,4456,4458,4461,4463,4465,4468,4470,4472],{"class":241,"line":578},[239,4454,4455],{"class":457},"      throw",[239,4457,3849],{"class":256},[239,4459,4460],{"class":260}," NotFoundException",[239,4462,264],{"class":493},[239,4464,267],{"class":256},[239,4466,4467],{"class":270},"User not found",[239,4469,267],{"class":256},[239,4471,1102],{"class":493},[239,4473,282],{"class":256},[239,4475,4476],{"class":241,"line":596},[239,4477,3933],{"class":256},[239,4479,4480],{"class":241,"line":608},[239,4481,1967],{"class":493},[239,4483,4484,4486,4488],{"class":241,"line":613},[239,4485,900],{"class":457},[239,4487,4408],{"class":252},[239,4489,282],{"class":256},[239,4491,4492],{"class":241,"line":631},[239,4493,973],{"class":256},[239,4495,4496],{"class":241,"line":643},[239,4497,508],{"class":252},[239,4499,4500,4502,4504,4506,4508,4510,4512],{"class":241,"line":1310},[239,4501,474],{"class":256},[239,4503,515],{"class":260},[239,4505,264],{"class":252},[239,4507,267],{"class":256},[239,4509,484],{"class":270},[239,4511,267],{"class":256},[239,4513,452],{"class":252},[239,4515,4516,4518,4520,4522,4524,4526,4528,4530,4532,4534],{"class":241,"line":1315},[239,4517,4090],{"class":461},[239,4519,4233],{"class":493},[239,4521,1550],{"class":256},[239,4523,1892],{"class":260},[239,4525,1895],{"class":252},[239,4527,3491],{"class":1073},[239,4529,914],{"class":256},[239,4531,1793],{"class":465},[239,4533,1102],{"class":256},[239,4535,469],{"class":256},[239,4537,4538],{"class":241,"line":1320},[239,4539,4540],{"class":245},"    \u002F\u002F Multiple awaits work perfectly\n",[239,4542,4543,4546,4548,4550,4552,4555,4557,4559,4561,4563,4565],{"class":241,"line":1337},[239,4544,4545],{"class":457},"    await",[239,4547,4112],{"class":256},[239,4549,4115],{"class":252},[239,4551,257],{"class":256},[239,4553,4554],{"class":260},"validateEmail",[239,4556,264],{"class":493},[239,4558,3491],{"class":252},[239,4560,257],{"class":256},[239,4562,1955],{"class":252},[239,4564,1102],{"class":493},[239,4566,282],{"class":256},[239,4568,4569,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591],{"class":241,"line":1347},[239,4570,2508],{"class":461},[239,4572,4408],{"class":252},[239,4574,2218],{"class":256},[239,4576,4109],{"class":457},[239,4578,4112],{"class":256},[239,4580,4115],{"class":252},[239,4582,257],{"class":256},[239,4584,4264],{"class":260},[239,4586,264],{"class":493},[239,4588,3491],{"class":252},[239,4590,1102],{"class":493},[239,4592,282],{"class":256},[239,4594,4595,4597,4599,4601,4603,4606,4608,4610,4612],{"class":241,"line":1353},[239,4596,4545],{"class":457},[239,4598,4112],{"class":256},[239,4600,4115],{"class":252},[239,4602,257],{"class":256},[239,4604,4605],{"class":260},"sendWelcomeEmail",[239,4607,264],{"class":493},[239,4609,4446],{"class":252},[239,4611,1102],{"class":493},[239,4613,282],{"class":256},[239,4615,4616],{"class":241,"line":1358},[239,4617,1967],{"class":493},[239,4619,4620,4622,4624],{"class":241,"line":1363},[239,4621,900],{"class":457},[239,4623,4408],{"class":252},[239,4625,282],{"class":256},[239,4627,4628],{"class":241,"line":1381},[239,4629,973],{"class":256},[239,4631,4632],{"class":241,"line":1391},[239,4633,646],{"class":256},[208,4635,4637],{"id":4636},"error-handling","Error Handling",[204,4639,4640],{},"Vercube provides HTTP exception classes for common errors:",[230,4642,4644],{"className":232,"code":4643,"language":234,"meta":235,"style":235},"import { \n  NotFoundException, \n  BadRequestException,\n  UnauthorizedException,\n  ForbiddenException\n} from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F:id')\n  async getUser(@Param('id') id: string) {\n    const user = await this.userService.findById(id);\n    \n    if (!user) {\n      throw new NotFoundException('User not found');\n    }\n    \n    return user;\n  }\n  \n  @Post('\u002F')\n  createUser(@Body() data: CreateUserDto) {\n    if (!data.email) {\n      throw new BadRequestException('Email is required');\n    }\n    \n    if (data.age \u003C 18) {\n      throw new ForbiddenException('Must be 18 or older');\n    }\n    \n    return this.userService.create(data);\n  }\n}\n",[216,4645,4646,4654,4663,4670,4677,4682,4696,4700,4716,4726,4730,4746,4776,4802,4806,4820,4840,4844,4848,4856,4860,4864,4880,4900,4918,4940,4944,4948,4970,4992,4996,5000,5020,5024],{"__ignoreMap":235},[239,4647,4648,4650,4652],{"class":241,"line":242},[239,4649,722],{"class":457},[239,4651,500],{"class":256},[239,4653,3889],{"class":493},[239,4655,4656,4659,4661],{"class":241,"line":249},[239,4657,4658],{"class":252},"  NotFoundException",[239,4660,276],{"class":256},[239,4662,3889],{"class":493},[239,4664,4665,4668],{"class":241,"line":285},[239,4666,4667],{"class":252},"  BadRequestException",[239,4669,1665],{"class":256},[239,4671,4672,4675],{"class":241,"line":310},[239,4673,4674],{"class":252},"  UnauthorizedException",[239,4676,1665],{"class":256},[239,4678,4679],{"class":241,"line":335},[239,4680,4681],{"class":252},"  ForbiddenException\n",[239,4683,4684,4686,4688,4690,4692,4694],{"class":241,"line":360},[239,4685,2200],{"class":256},[239,4687,733],{"class":457},[239,4689,736],{"class":256},[239,4691,739],{"class":270},[239,4693,267],{"class":256},[239,4695,282],{"class":256},[239,4697,4698],{"class":241,"line":385},[239,4699,748],{"emptyLinePlaceholder":56},[239,4701,4702,4704,4706,4708,4710,4712,4714],{"class":241,"line":391},[239,4703,438],{"class":256},[239,4705,441],{"class":260},[239,4707,264],{"class":252},[239,4709,267],{"class":256},[239,4711,271],{"class":270},[239,4713,267],{"class":256},[239,4715,452],{"class":252},[239,4717,4718,4720,4722,4724],{"class":241,"line":416},[239,4719,458],{"class":457},[239,4721,462],{"class":461},[239,4723,466],{"class":465},[239,4725,469],{"class":256},[239,4727,4728],{"class":241,"line":543},[239,4729,508],{"class":252},[239,4731,4732,4734,4736,4738,4740,4742,4744],{"class":241,"line":561},[239,4733,474],{"class":256},[239,4735,477],{"class":260},[239,4737,264],{"class":252},[239,4739,267],{"class":256},[239,4741,554],{"class":270},[239,4743,267],{"class":256},[239,4745,452],{"class":252},[239,4747,4748,4750,4752,4754,4756,4758,4760,4762,4764,4766,4768,4770,4772,4774],{"class":241,"line":573},[239,4749,4090],{"class":461},[239,4751,4372],{"class":493},[239,4753,1550],{"class":256},[239,4755,1553],{"class":260},[239,4757,264],{"class":252},[239,4759,267],{"class":256},[239,4761,1560],{"class":270},[239,4763,267],{"class":256},[239,4765,1565],{"class":252},[239,4767,1560],{"class":1073},[239,4769,914],{"class":256},[239,4771,1572],{"class":465},[239,4773,1102],{"class":256},[239,4775,469],{"class":256},[239,4777,4778,4780,4782,4784,4786,4788,4790,4792,4794,4796,4798,4800],{"class":241,"line":578},[239,4779,2508],{"class":461},[239,4781,4408],{"class":252},[239,4783,2218],{"class":256},[239,4785,4109],{"class":457},[239,4787,4112],{"class":256},[239,4789,4115],{"class":252},[239,4791,257],{"class":256},[239,4793,4194],{"class":260},[239,4795,264],{"class":493},[239,4797,1560],{"class":252},[239,4799,1102],{"class":493},[239,4801,282],{"class":256},[239,4803,4804],{"class":241,"line":596},[239,4805,1967],{"class":493},[239,4807,4808,4810,4812,4814,4816,4818],{"class":241,"line":608},[239,4809,4437],{"class":457},[239,4811,4440],{"class":493},[239,4813,4443],{"class":256},[239,4815,4446],{"class":252},[239,4817,1565],{"class":493},[239,4819,2129],{"class":256},[239,4821,4822,4824,4826,4828,4830,4832,4834,4836,4838],{"class":241,"line":613},[239,4823,4455],{"class":457},[239,4825,3849],{"class":256},[239,4827,4460],{"class":260},[239,4829,264],{"class":493},[239,4831,267],{"class":256},[239,4833,4467],{"class":270},[239,4835,267],{"class":256},[239,4837,1102],{"class":493},[239,4839,282],{"class":256},[239,4841,4842],{"class":241,"line":631},[239,4843,3933],{"class":256},[239,4845,4846],{"class":241,"line":643},[239,4847,1967],{"class":493},[239,4849,4850,4852,4854],{"class":241,"line":1310},[239,4851,900],{"class":457},[239,4853,4408],{"class":252},[239,4855,282],{"class":256},[239,4857,4858],{"class":241,"line":1315},[239,4859,973],{"class":256},[239,4861,4862],{"class":241,"line":1320},[239,4863,508],{"class":252},[239,4865,4866,4868,4870,4872,4874,4876,4878],{"class":241,"line":1337},[239,4867,474],{"class":256},[239,4869,515],{"class":260},[239,4871,264],{"class":252},[239,4873,267],{"class":256},[239,4875,484],{"class":270},[239,4877,267],{"class":256},[239,4879,452],{"class":252},[239,4881,4882,4884,4886,4888,4890,4892,4894,4896,4898],{"class":241,"line":1347},[239,4883,530],{"class":493},[239,4885,1550],{"class":256},[239,4887,1892],{"class":260},[239,4889,1895],{"class":252},[239,4891,3491],{"class":1073},[239,4893,914],{"class":256},[239,4895,1793],{"class":465},[239,4897,1102],{"class":256},[239,4899,469],{"class":256},[239,4901,4902,4904,4906,4908,4910,4912,4914,4916],{"class":241,"line":1353},[239,4903,4437],{"class":457},[239,4905,4440],{"class":493},[239,4907,4443],{"class":256},[239,4909,3491],{"class":252},[239,4911,257],{"class":256},[239,4913,1955],{"class":252},[239,4915,1565],{"class":493},[239,4917,2129],{"class":256},[239,4919,4920,4922,4924,4927,4929,4931,4934,4936,4938],{"class":241,"line":1358},[239,4921,4455],{"class":457},[239,4923,3849],{"class":256},[239,4925,4926],{"class":260}," BadRequestException",[239,4928,264],{"class":493},[239,4930,267],{"class":256},[239,4932,4933],{"class":270},"Email is required",[239,4935,267],{"class":256},[239,4937,1102],{"class":493},[239,4939,282],{"class":256},[239,4941,4942],{"class":241,"line":1363},[239,4943,3933],{"class":256},[239,4945,4946],{"class":241,"line":1381},[239,4947,1967],{"class":493},[239,4949,4950,4952,4954,4956,4958,4960,4963,4966,4968],{"class":241,"line":1391},[239,4951,4437],{"class":457},[239,4953,4440],{"class":493},[239,4955,3491],{"class":252},[239,4957,257],{"class":256},[239,4959,2711],{"class":252},[239,4961,4962],{"class":256}," \u003C",[239,4964,4965],{"class":917}," 18",[239,4967,1565],{"class":493},[239,4969,2129],{"class":256},[239,4971,4972,4974,4976,4979,4981,4983,4986,4988,4990],{"class":241,"line":1397},[239,4973,4455],{"class":457},[239,4975,3849],{"class":256},[239,4977,4978],{"class":260}," ForbiddenException",[239,4980,264],{"class":493},[239,4982,267],{"class":256},[239,4984,4985],{"class":270},"Must be 18 or older",[239,4987,267],{"class":256},[239,4989,1102],{"class":493},[239,4991,282],{"class":256},[239,4993,4994],{"class":241,"line":1402},[239,4995,3933],{"class":256},[239,4997,4998],{"class":241,"line":1407},[239,4999,1967],{"class":493},[239,5001,5002,5004,5006,5008,5010,5012,5014,5016,5018],{"class":241,"line":1424},[239,5003,900],{"class":457},[239,5005,4112],{"class":256},[239,5007,4115],{"class":252},[239,5009,257],{"class":256},[239,5011,4264],{"class":260},[239,5013,264],{"class":493},[239,5015,3491],{"class":252},[239,5017,1102],{"class":493},[239,5019,282],{"class":256},[239,5021,5022],{"class":241,"line":1434},[239,5023,973],{"class":256},[239,5025,5026],{"class":241,"line":1440},[239,5027,646],{"class":256},[204,5029,5030],{},"These exceptions are automatically converted to proper HTTP responses:",[230,5032,5036],{"className":5033,"code":5034,"language":5035,"meta":235,"style":235},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F NotFoundException → 404\n{\n  \"statusCode\": 404,\n  \"message\": \"User not found\",\n  \"error\": \"Not Found\"\n}\n\n\u002F\u002F BadRequestException → 400\n{\n  \"statusCode\": 400,\n  \"message\": \"Email is required\",\n  \"error\": \"Bad Request\"\n}\n","json",[216,5037,5038,5043,5047,5064,5083,5102,5106,5110,5115,5119,5134,5152,5169],{"__ignoreMap":235},[239,5039,5040],{"class":241,"line":242},[239,5041,5042],{"class":245},"\u002F\u002F NotFoundException → 404\n",[239,5044,5045],{"class":241,"line":249},[239,5046,2129],{"class":256},[239,5048,5049,5052,5055,5057,5059,5062],{"class":241,"line":285},[239,5050,5051],{"class":256},"  \"",[239,5053,5054],{"class":461},"statusCode",[239,5056,2038],{"class":256},[239,5058,914],{"class":256},[239,5060,5061],{"class":917}," 404",[239,5063,1665],{"class":256},[239,5065,5066,5068,5071,5073,5075,5077,5079,5081],{"class":241,"line":310},[239,5067,5051],{"class":256},[239,5069,5070],{"class":461},"message",[239,5072,2038],{"class":256},[239,5074,914],{"class":256},[239,5076,2033],{"class":256},[239,5078,4467],{"class":270},[239,5080,2038],{"class":256},[239,5082,1665],{"class":256},[239,5084,5085,5087,5090,5092,5094,5096,5099],{"class":241,"line":335},[239,5086,5051],{"class":256},[239,5088,5089],{"class":461},"error",[239,5091,2038],{"class":256},[239,5093,914],{"class":256},[239,5095,2033],{"class":256},[239,5097,5098],{"class":270},"Not Found",[239,5100,5101],{"class":256},"\"\n",[239,5103,5104],{"class":241,"line":360},[239,5105,646],{"class":256},[239,5107,5108],{"class":241,"line":385},[239,5109,748],{"emptyLinePlaceholder":56},[239,5111,5112],{"class":241,"line":391},[239,5113,5114],{"class":245},"\u002F\u002F BadRequestException → 400\n",[239,5116,5117],{"class":241,"line":416},[239,5118,2129],{"class":256},[239,5120,5121,5123,5125,5127,5129,5132],{"class":241,"line":543},[239,5122,5051],{"class":256},[239,5124,5054],{"class":461},[239,5126,2038],{"class":256},[239,5128,914],{"class":256},[239,5130,5131],{"class":917}," 400",[239,5133,1665],{"class":256},[239,5135,5136,5138,5140,5142,5144,5146,5148,5150],{"class":241,"line":561},[239,5137,5051],{"class":256},[239,5139,5070],{"class":461},[239,5141,2038],{"class":256},[239,5143,914],{"class":256},[239,5145,2033],{"class":256},[239,5147,4933],{"class":270},[239,5149,2038],{"class":256},[239,5151,1665],{"class":256},[239,5153,5154,5156,5158,5160,5162,5164,5167],{"class":241,"line":573},[239,5155,5051],{"class":256},[239,5157,5089],{"class":461},[239,5159,2038],{"class":256},[239,5161,914],{"class":256},[239,5163,2033],{"class":256},[239,5165,5166],{"class":270},"Bad Request",[239,5168,5101],{"class":256},[239,5170,5171],{"class":241,"line":578},[239,5172,646],{"class":256},[208,5174,5176],{"id":5175},"middleware-integration","Middleware Integration",[204,5178,5179],{},"Apply middleware to controllers or specific routes:",[230,5181,5183],{"className":232,"code":5182,"language":234,"meta":235,"style":235},"import { Controller, Get, Middleware } from '@vercube\u002Fcore';\nimport { AuthMiddleware, LoggingMiddleware } from '..\u002Fmiddlewares';\n\n\u002F\u002F Applies to ALL routes in this controller\n@Controller('\u002Fusers')\n@Middleware(AuthMiddleware)\nexport class UserController {\n  \n  @Get('\u002F')\n  getUsers() {\n    \u002F\u002F Protected by AuthMiddleware\n  }\n  \n  \u002F\u002F Additional middleware for this route only\n  @Get('\u002F:id')\n  @Middleware(LoggingMiddleware)\n  getUserById() {\n    \u002F\u002F Protected by AuthMiddleware + LoggingMiddleware\n  }\n}\n",[216,5184,5185,5214,5241,5245,5250,5266,5276,5286,5290,5306,5314,5319,5323,5327,5332,5348,5357,5365,5370,5374],{"__ignoreMap":235},[239,5186,5187,5189,5191,5193,5195,5197,5199,5202,5204,5206,5208,5210,5212],{"class":241,"line":242},[239,5188,722],{"class":457},[239,5190,500],{"class":256},[239,5192,727],{"class":252},[239,5194,276],{"class":256},[239,5196,824],{"class":252},[239,5198,276],{"class":256},[239,5200,5201],{"class":252}," Middleware",[239,5203,730],{"class":256},[239,5205,733],{"class":457},[239,5207,736],{"class":256},[239,5209,739],{"class":270},[239,5211,267],{"class":256},[239,5213,282],{"class":256},[239,5215,5216,5218,5220,5223,5225,5228,5230,5232,5234,5237,5239],{"class":241,"line":249},[239,5217,722],{"class":457},[239,5219,500],{"class":256},[239,5221,5222],{"class":252}," AuthMiddleware",[239,5224,276],{"class":256},[239,5226,5227],{"class":252}," LoggingMiddleware",[239,5229,730],{"class":256},[239,5231,733],{"class":457},[239,5233,736],{"class":256},[239,5235,5236],{"class":270},"..\u002Fmiddlewares",[239,5238,267],{"class":256},[239,5240,282],{"class":256},[239,5242,5243],{"class":241,"line":285},[239,5244,748],{"emptyLinePlaceholder":56},[239,5246,5247],{"class":241,"line":310},[239,5248,5249],{"class":245},"\u002F\u002F Applies to ALL routes in this controller\n",[239,5251,5252,5254,5256,5258,5260,5262,5264],{"class":241,"line":335},[239,5253,438],{"class":256},[239,5255,441],{"class":260},[239,5257,264],{"class":252},[239,5259,267],{"class":256},[239,5261,271],{"class":270},[239,5263,267],{"class":256},[239,5265,452],{"class":252},[239,5267,5268,5270,5273],{"class":241,"line":360},[239,5269,438],{"class":256},[239,5271,5272],{"class":260},"Middleware",[239,5274,5275],{"class":252},"(AuthMiddleware)\n",[239,5277,5278,5280,5282,5284],{"class":241,"line":385},[239,5279,458],{"class":457},[239,5281,462],{"class":461},[239,5283,466],{"class":465},[239,5285,469],{"class":256},[239,5287,5288],{"class":241,"line":391},[239,5289,508],{"class":252},[239,5291,5292,5294,5296,5298,5300,5302,5304],{"class":241,"line":416},[239,5293,474],{"class":256},[239,5295,477],{"class":260},[239,5297,264],{"class":252},[239,5299,267],{"class":256},[239,5301,484],{"class":270},[239,5303,267],{"class":256},[239,5305,452],{"class":252},[239,5307,5308,5310,5312],{"class":241,"line":543},[239,5309,494],{"class":493},[239,5311,497],{"class":256},[239,5313,469],{"class":256},[239,5315,5316],{"class":241,"line":561},[239,5317,5318],{"class":245},"    \u002F\u002F Protected by AuthMiddleware\n",[239,5320,5321],{"class":241,"line":573},[239,5322,973],{"class":256},[239,5324,5325],{"class":241,"line":578},[239,5326,508],{"class":252},[239,5328,5329],{"class":241,"line":596},[239,5330,5331],{"class":245},"  \u002F\u002F Additional middleware for this route only\n",[239,5333,5334,5336,5338,5340,5342,5344,5346],{"class":241,"line":608},[239,5335,474],{"class":256},[239,5337,477],{"class":260},[239,5339,264],{"class":252},[239,5341,267],{"class":256},[239,5343,554],{"class":270},[239,5345,267],{"class":256},[239,5347,452],{"class":252},[239,5349,5350,5352,5354],{"class":241,"line":613},[239,5351,474],{"class":256},[239,5353,5272],{"class":260},[239,5355,5356],{"class":252},"(LoggingMiddleware)\n",[239,5358,5359,5361,5363],{"class":241,"line":631},[239,5360,1547],{"class":493},[239,5362,497],{"class":256},[239,5364,469],{"class":256},[239,5366,5367],{"class":241,"line":643},[239,5368,5369],{"class":245},"    \u002F\u002F Protected by AuthMiddleware + LoggingMiddleware\n",[239,5371,5372],{"class":241,"line":1310},[239,5373,973],{"class":256},[239,5375,5376],{"class":241,"line":1315},[239,5377,646],{"class":256},[655,5379],{"src":5380,"alt":3947},"\u002Fimages\u002Fcontroller-5.svg",[208,5382,5384],{"id":5383},"organizing-controllers","Organizing Controllers",[225,5386,5388],{"id":5387},"by-resource-recommended","By Resource (Recommended)",[230,5390,5395],{"className":5391,"code":5393,"language":5394},[5392],"language-text","src\u002F\n├── controllers\u002F\n│   ├── UserController.ts       # All user operations\n│   ├── ProductController.ts    # All product operations\n│   ├── OrderController.ts      # All order operations\n│   └── AuthController.ts       # All auth operations\n","text",[216,5396,5393],{"__ignoreMap":235},[225,5398,5400],{"id":5399},"by-feature","By Feature",[230,5402,5405],{"className":5403,"code":5404,"language":5394},[5392],"src\u002F\n├── features\u002F\n│   ├── users\u002F\n│   │   ├── UserController.ts\n│   │   ├── UserService.ts\n│   │   └── User.model.ts\n│   └── products\u002F\n│       ├── ProductController.ts\n│       ├── ProductService.ts\n│       └── Product.model.ts\n",[216,5406,5404],{"__ignoreMap":235},[208,5408,5410],{"id":5409},"best-practices","Best Practices",[204,5412,5413,5416],{},[673,5414,5415],{},"Keep controllers thin"," - Business logic belongs in services",[230,5418,5420],{"className":232,"code":5419,"language":234,"meta":235,"style":235},"\u002F\u002F ❌ Bad - logic in controller\n@Get('\u002F:id')\nasync getUser(@Param('id') id: string) {\n  const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);\n  delete user.password;\n  user.fullName = user.firstName + ' ' + user.lastName;\n  return user;\n}\n\n\u002F\u002F ✅ Good - logic in service\n@Get('\u002F:id')\nasync getUser(@Param('id') id: string) {\n  return await this.userService.findById(id);\n}\n",[216,5421,5422,5427,5443,5467,5505,5519,5555,5563,5567,5571,5576,5592,5614,5636],{"__ignoreMap":235},[239,5423,5424],{"class":241,"line":242},[239,5425,5426],{"class":245},"\u002F\u002F ❌ Bad - logic in controller\n",[239,5428,5429,5431,5433,5435,5437,5439,5441],{"class":241,"line":249},[239,5430,438],{"class":256},[239,5432,477],{"class":260},[239,5434,264],{"class":252},[239,5436,267],{"class":256},[239,5438,554],{"class":270},[239,5440,267],{"class":256},[239,5442,452],{"class":252},[239,5444,5445,5448,5450,5452,5454,5456,5458,5460,5462,5465],{"class":241,"line":285},[239,5446,5447],{"class":252},"async ",[239,5449,3350],{"class":260},[239,5451,1550],{"class":252},[239,5453,1553],{"class":260},[239,5455,264],{"class":252},[239,5457,267],{"class":256},[239,5459,1560],{"class":270},[239,5461,267],{"class":256},[239,5463,5464],{"class":252},") id: string) ",[239,5466,2129],{"class":256},[239,5468,5469,5471,5473,5475,5477,5480,5482,5485,5487,5489,5492,5494,5496,5498,5500,5503],{"class":241,"line":310},[239,5470,2747],{"class":461},[239,5472,4408],{"class":252},[239,5474,2218],{"class":256},[239,5476,4109],{"class":457},[239,5478,5479],{"class":252}," db",[239,5481,257],{"class":256},[239,5483,5484],{"class":260},"query",[239,5486,264],{"class":493},[239,5488,267],{"class":256},[239,5490,5491],{"class":270},"SELECT * FROM users WHERE id = ?",[239,5493,267],{"class":256},[239,5495,276],{"class":256},[239,5497,3616],{"class":493},[239,5499,1560],{"class":252},[239,5501,5502],{"class":493},"])",[239,5504,282],{"class":256},[239,5506,5507,5510,5512,5514,5517],{"class":241,"line":335},[239,5508,5509],{"class":256},"  delete",[239,5511,4408],{"class":252},[239,5513,257],{"class":256},[239,5515,5516],{"class":252},"password",[239,5518,282],{"class":256},[239,5520,5521,5524,5526,5529,5531,5533,5535,5538,5540,5542,5544,5546,5548,5550,5553],{"class":241,"line":360},[239,5522,5523],{"class":252},"  user",[239,5525,257],{"class":256},[239,5527,5528],{"class":252},"fullName",[239,5530,2218],{"class":256},[239,5532,4408],{"class":252},[239,5534,257],{"class":256},[239,5536,5537],{"class":252},"firstName",[239,5539,1600],{"class":256},[239,5541,736],{"class":256},[239,5543,736],{"class":256},[239,5545,1600],{"class":256},[239,5547,4408],{"class":252},[239,5549,257],{"class":256},[239,5551,5552],{"class":252},"lastName",[239,5554,282],{"class":256},[239,5556,5557,5559,5561],{"class":241,"line":385},[239,5558,3364],{"class":457},[239,5560,4408],{"class":252},[239,5562,282],{"class":256},[239,5564,5565],{"class":241,"line":391},[239,5566,646],{"class":256},[239,5568,5569],{"class":241,"line":416},[239,5570,748],{"emptyLinePlaceholder":56},[239,5572,5573],{"class":241,"line":543},[239,5574,5575],{"class":245},"\u002F\u002F ✅ Good - logic in service\n",[239,5577,5578,5580,5582,5584,5586,5588,5590],{"class":241,"line":561},[239,5579,438],{"class":256},[239,5581,477],{"class":260},[239,5583,264],{"class":252},[239,5585,267],{"class":256},[239,5587,554],{"class":270},[239,5589,267],{"class":256},[239,5591,452],{"class":252},[239,5593,5594,5596,5598,5600,5602,5604,5606,5608,5610,5612],{"class":241,"line":573},[239,5595,5447],{"class":252},[239,5597,3350],{"class":260},[239,5599,1550],{"class":252},[239,5601,1553],{"class":260},[239,5603,264],{"class":252},[239,5605,267],{"class":256},[239,5607,1560],{"class":270},[239,5609,267],{"class":256},[239,5611,5464],{"class":252},[239,5613,2129],{"class":256},[239,5615,5616,5618,5620,5622,5624,5626,5628,5630,5632,5634],{"class":241,"line":578},[239,5617,3364],{"class":457},[239,5619,4109],{"class":457},[239,5621,4112],{"class":256},[239,5623,4115],{"class":252},[239,5625,257],{"class":256},[239,5627,4194],{"class":260},[239,5629,264],{"class":493},[239,5631,1560],{"class":252},[239,5633,1102],{"class":493},[239,5635,282],{"class":256},[239,5637,5638],{"class":241,"line":596},[239,5639,646],{"class":256},[204,5641,5642,5645],{},[673,5643,5644],{},"Use DTOs for request validation"," - Type your inputs",[230,5647,5649],{"className":232,"code":5648,"language":234,"meta":235,"style":235},"\u002F\u002F ✅ Good\ninterface CreateUserDto {\n  name: string;\n  email: string;\n  age: number;\n}\n\n@Post('\u002F')\ncreateUser(@Body() data: CreateUserDto) {\n  \u002F\u002F TypeScript ensures data structure\n}\n",[216,5650,5651,5656,5664,5674,5684,5694,5698,5702,5718,5731,5736],{"__ignoreMap":235},[239,5652,5653],{"class":241,"line":242},[239,5654,5655],{"class":245},"\u002F\u002F ✅ Good\n",[239,5657,5658,5660,5662],{"class":241,"line":249},[239,5659,1790],{"class":461},[239,5661,1793],{"class":465},[239,5663,469],{"class":256},[239,5665,5666,5668,5670,5672],{"class":241,"line":285},[239,5667,1800],{"class":493},[239,5669,914],{"class":256},[239,5671,1572],{"class":465},[239,5673,282],{"class":256},[239,5675,5676,5678,5680,5682],{"class":241,"line":310},[239,5677,1811],{"class":493},[239,5679,914],{"class":256},[239,5681,1572],{"class":465},[239,5683,282],{"class":256},[239,5685,5686,5688,5690,5692],{"class":241,"line":335},[239,5687,1822],{"class":493},[239,5689,914],{"class":256},[239,5691,1827],{"class":465},[239,5693,282],{"class":256},[239,5695,5696],{"class":241,"line":360},[239,5697,646],{"class":256},[239,5699,5700],{"class":241,"line":385},[239,5701,748],{"emptyLinePlaceholder":56},[239,5703,5704,5706,5708,5710,5712,5714,5716],{"class":241,"line":391},[239,5705,438],{"class":256},[239,5707,515],{"class":260},[239,5709,264],{"class":252},[239,5711,267],{"class":256},[239,5713,484],{"class":270},[239,5715,267],{"class":256},[239,5717,452],{"class":252},[239,5719,5720,5722,5724,5726,5729],{"class":241,"line":416},[239,5721,2259],{"class":260},[239,5723,1550],{"class":252},[239,5725,1892],{"class":260},[239,5727,5728],{"class":252},"() data: CreateUserDto) ",[239,5730,2129],{"class":256},[239,5732,5733],{"class":241,"line":543},[239,5734,5735],{"class":245},"  \u002F\u002F TypeScript ensures data structure\n",[239,5737,5738],{"class":241,"line":561},[239,5739,646],{"class":256},[204,5741,5742,5745],{},[673,5743,5744],{},"One responsibility per controller"," - Don't mix concerns",[230,5747,5749],{"className":232,"code":5748,"language":234,"meta":235,"style":235},"\u002F\u002F ❌ Bad - mixed concerns\n@Controller('\u002Fapi')\nexport class ApiController {\n  @Get('\u002Fusers') getUsers() { }\n  @Get('\u002Fproducts') getProducts() { }\n  @Get('\u002Forders') getOrders() { }\n}\n\n\u002F\u002F ✅ Good - focused controllers\n@Controller('\u002Fusers')\nexport class UserController { }\n\n@Controller('\u002Fproducts')\nexport class ProductController { }\n",[216,5750,5751,5756,5773,5784,5808,5833,5859,5863,5867,5872,5888,5900,5904,5920],{"__ignoreMap":235},[239,5752,5753],{"class":241,"line":242},[239,5754,5755],{"class":245},"\u002F\u002F ❌ Bad - mixed concerns\n",[239,5757,5758,5760,5762,5764,5766,5769,5771],{"class":241,"line":249},[239,5759,438],{"class":256},[239,5761,441],{"class":260},[239,5763,264],{"class":252},[239,5765,267],{"class":256},[239,5767,5768],{"class":270},"\u002Fapi",[239,5770,267],{"class":256},[239,5772,452],{"class":252},[239,5774,5775,5777,5779,5782],{"class":241,"line":285},[239,5776,458],{"class":457},[239,5778,462],{"class":461},[239,5780,5781],{"class":465}," ApiController",[239,5783,469],{"class":256},[239,5785,5786,5788,5790,5792,5794,5796,5798,5800,5802,5804,5806],{"class":241,"line":310},[239,5787,474],{"class":256},[239,5789,477],{"class":260},[239,5791,264],{"class":252},[239,5793,267],{"class":256},[239,5795,271],{"class":270},[239,5797,267],{"class":256},[239,5799,1565],{"class":252},[239,5801,3605],{"class":493},[239,5803,497],{"class":256},[239,5805,500],{"class":256},[239,5807,503],{"class":256},[239,5809,5810,5812,5814,5816,5818,5820,5822,5824,5827,5829,5831],{"class":241,"line":335},[239,5811,474],{"class":256},[239,5813,477],{"class":260},[239,5815,264],{"class":252},[239,5817,267],{"class":256},[239,5819,404],{"class":270},[239,5821,267],{"class":256},[239,5823,1565],{"class":252},[239,5825,5826],{"class":493},"getProducts",[239,5828,497],{"class":256},[239,5830,500],{"class":256},[239,5832,503],{"class":256},[239,5834,5835,5837,5839,5841,5843,5846,5848,5850,5853,5855,5857],{"class":241,"line":360},[239,5836,474],{"class":256},[239,5838,477],{"class":260},[239,5840,264],{"class":252},[239,5842,267],{"class":256},[239,5844,5845],{"class":270},"\u002Forders",[239,5847,267],{"class":256},[239,5849,1565],{"class":252},[239,5851,5852],{"class":493},"getOrders",[239,5854,497],{"class":256},[239,5856,500],{"class":256},[239,5858,503],{"class":256},[239,5860,5861],{"class":241,"line":385},[239,5862,646],{"class":256},[239,5864,5865],{"class":241,"line":391},[239,5866,748],{"emptyLinePlaceholder":56},[239,5868,5869],{"class":241,"line":416},[239,5870,5871],{"class":245},"\u002F\u002F ✅ Good - focused controllers\n",[239,5873,5874,5876,5878,5880,5882,5884,5886],{"class":241,"line":543},[239,5875,438],{"class":256},[239,5877,441],{"class":260},[239,5879,264],{"class":252},[239,5881,267],{"class":256},[239,5883,271],{"class":270},[239,5885,267],{"class":256},[239,5887,452],{"class":252},[239,5889,5890,5892,5894,5896,5898],{"class":241,"line":561},[239,5891,458],{"class":457},[239,5893,462],{"class":461},[239,5895,466],{"class":465},[239,5897,500],{"class":256},[239,5899,503],{"class":256},[239,5901,5902],{"class":241,"line":573},[239,5903,748],{"emptyLinePlaceholder":56},[239,5905,5906,5908,5910,5912,5914,5916,5918],{"class":241,"line":578},[239,5907,438],{"class":256},[239,5909,441],{"class":260},[239,5911,264],{"class":252},[239,5913,267],{"class":256},[239,5915,404],{"class":270},[239,5917,267],{"class":256},[239,5919,452],{"class":252},[239,5921,5922,5924,5926,5929,5931],{"class":241,"line":596},[239,5923,458],{"class":457},[239,5925,462],{"class":461},[239,5927,5928],{"class":465}," ProductController",[239,5930,500],{"class":256},[239,5932,503],{"class":256},[204,5934,5935,5938],{},[673,5936,5937],{},"Use meaningful route names"," - Be clear about what each endpoint does",[230,5940,5942],{"className":232,"code":5941,"language":234,"meta":235,"style":235},"\u002F\u002F ❌ Unclear\n@Get('\u002Fdata')\ngetData() { }\n\n\u002F\u002F ✅ Clear\n@Get('\u002Fusers')\ngetAllUsers() { }\n",[216,5943,5944,5949,5966,5977,5981,5986,6002],{"__ignoreMap":235},[239,5945,5946],{"class":241,"line":242},[239,5947,5948],{"class":245},"\u002F\u002F ❌ Unclear\n",[239,5950,5951,5953,5955,5957,5959,5962,5964],{"class":241,"line":249},[239,5952,438],{"class":256},[239,5954,477],{"class":260},[239,5956,264],{"class":252},[239,5958,267],{"class":256},[239,5960,5961],{"class":270},"\u002Fdata",[239,5963,267],{"class":256},[239,5965,452],{"class":252},[239,5967,5968,5971,5973,5975],{"class":241,"line":285},[239,5969,5970],{"class":260},"getData",[239,5972,1895],{"class":252},[239,5974,2268],{"class":256},[239,5976,503],{"class":256},[239,5978,5979],{"class":241,"line":310},[239,5980,748],{"emptyLinePlaceholder":56},[239,5982,5983],{"class":241,"line":335},[239,5984,5985],{"class":245},"\u002F\u002F ✅ Clear\n",[239,5987,5988,5990,5992,5994,5996,5998,6000],{"class":241,"line":360},[239,5989,438],{"class":256},[239,5991,477],{"class":260},[239,5993,264],{"class":252},[239,5995,267],{"class":256},[239,5997,271],{"class":270},[239,5999,267],{"class":256},[239,6001,452],{"class":252},[239,6003,6004,6007,6009,6011],{"class":241,"line":385},[239,6005,6006],{"class":260},"getAllUsers",[239,6008,1895],{"class":252},[239,6010,2268],{"class":256},[239,6012,503],{"class":256},[208,6014,6016],{"id":6015},"common-patterns","Common Patterns",[225,6018,6020],{"id":6019},"crud-controller-template","CRUD Controller Template",[230,6022,6024],{"className":232,"code":6023,"language":234,"meta":235,"style":235},"@Controller('\u002Fusers')\nexport class UserController {\n  @Inject(UserService)\n  private userService!: UserService;\n  \n  @Get('\u002F')\n  async findAll() {\n    return await this.userService.findAll();\n  }\n  \n  @Get('\u002F:id')\n  async findOne(@Param('id') id: string) {\n    return await this.userService.findById(id);\n  }\n  \n  @Post('\u002F')\n  @Status(201)\n  async create(@Body() data: CreateUserDto) {\n    return await this.userService.create(data);\n  }\n  \n  @Put('\u002F:id')\n  async update(\n    @Param('id') id: string,\n    @Body() data: UpdateUserDto\n  ) {\n    return await this.userService.update(id, data);\n  }\n  \n  @Delete('\u002F:id')\n  @Status(204)\n  async remove(@Param('id') id: string) {\n    await this.userService.remove(id);\n  }\n}\n",[216,6025,6026,6042,6052,6060,6072,6076,6092,6103,6121,6125,6129,6145,6176,6198,6202,6206,6222,6234,6257,6279,6283,6287,6303,6312,6336,6351,6357,6384,6388,6392,6408,6421,6452,6473,6477],{"__ignoreMap":235},[239,6027,6028,6030,6032,6034,6036,6038,6040],{"class":241,"line":242},[239,6029,438],{"class":256},[239,6031,441],{"class":260},[239,6033,264],{"class":252},[239,6035,267],{"class":256},[239,6037,271],{"class":270},[239,6039,267],{"class":256},[239,6041,452],{"class":252},[239,6043,6044,6046,6048,6050],{"class":241,"line":249},[239,6045,458],{"class":457},[239,6047,462],{"class":461},[239,6049,466],{"class":465},[239,6051,469],{"class":256},[239,6053,6054,6056,6058],{"class":241,"line":285},[239,6055,474],{"class":256},[239,6057,4047],{"class":260},[239,6059,4050],{"class":252},[239,6061,6062,6064,6066,6068,6070],{"class":241,"line":310},[239,6063,4055],{"class":461},[239,6065,4058],{"class":493},[239,6067,4061],{"class":256},[239,6069,3993],{"class":465},[239,6071,282],{"class":256},[239,6073,6074],{"class":241,"line":335},[239,6075,508],{"class":252},[239,6077,6078,6080,6082,6084,6086,6088,6090],{"class":241,"line":360},[239,6079,474],{"class":256},[239,6081,477],{"class":260},[239,6083,264],{"class":252},[239,6085,267],{"class":256},[239,6087,484],{"class":270},[239,6089,267],{"class":256},[239,6091,452],{"class":252},[239,6093,6094,6096,6099,6101],{"class":241,"line":385},[239,6095,4090],{"class":461},[239,6097,6098],{"class":493}," findAll",[239,6100,497],{"class":256},[239,6102,469],{"class":256},[239,6104,6105,6107,6109,6111,6113,6115,6117,6119],{"class":241,"line":391},[239,6106,900],{"class":457},[239,6108,4109],{"class":457},[239,6110,4112],{"class":256},[239,6112,4115],{"class":252},[239,6114,257],{"class":256},[239,6116,4120],{"class":260},[239,6118,497],{"class":493},[239,6120,282],{"class":256},[239,6122,6123],{"class":241,"line":416},[239,6124,973],{"class":256},[239,6126,6127],{"class":241,"line":543},[239,6128,508],{"class":252},[239,6130,6131,6133,6135,6137,6139,6141,6143],{"class":241,"line":561},[239,6132,474],{"class":256},[239,6134,477],{"class":260},[239,6136,264],{"class":252},[239,6138,267],{"class":256},[239,6140,554],{"class":270},[239,6142,267],{"class":256},[239,6144,452],{"class":252},[239,6146,6147,6149,6152,6154,6156,6158,6160,6162,6164,6166,6168,6170,6172,6174],{"class":241,"line":573},[239,6148,4090],{"class":461},[239,6150,6151],{"class":493}," findOne",[239,6153,1550],{"class":256},[239,6155,1553],{"class":260},[239,6157,264],{"class":252},[239,6159,267],{"class":256},[239,6161,1560],{"class":270},[239,6163,267],{"class":256},[239,6165,1565],{"class":252},[239,6167,1560],{"class":1073},[239,6169,914],{"class":256},[239,6171,1572],{"class":465},[239,6173,1102],{"class":256},[239,6175,469],{"class":256},[239,6177,6178,6180,6182,6184,6186,6188,6190,6192,6194,6196],{"class":241,"line":578},[239,6179,900],{"class":457},[239,6181,4109],{"class":457},[239,6183,4112],{"class":256},[239,6185,4115],{"class":252},[239,6187,257],{"class":256},[239,6189,4194],{"class":260},[239,6191,264],{"class":493},[239,6193,1560],{"class":252},[239,6195,1102],{"class":493},[239,6197,282],{"class":256},[239,6199,6200],{"class":241,"line":596},[239,6201,973],{"class":256},[239,6203,6204],{"class":241,"line":608},[239,6205,508],{"class":252},[239,6207,6208,6210,6212,6214,6216,6218,6220],{"class":241,"line":613},[239,6209,474],{"class":256},[239,6211,515],{"class":260},[239,6213,264],{"class":252},[239,6215,267],{"class":256},[239,6217,484],{"class":270},[239,6219,267],{"class":256},[239,6221,452],{"class":252},[239,6223,6224,6226,6228,6230,6232],{"class":241,"line":631},[239,6225,474],{"class":256},[239,6227,3447],{"class":260},[239,6229,264],{"class":252},[239,6231,3452],{"class":917},[239,6233,452],{"class":252},[239,6235,6236,6238,6241,6243,6245,6247,6249,6251,6253,6255],{"class":241,"line":643},[239,6237,4090],{"class":461},[239,6239,6240],{"class":493}," create",[239,6242,1550],{"class":256},[239,6244,1892],{"class":260},[239,6246,1895],{"class":252},[239,6248,3491],{"class":1073},[239,6250,914],{"class":256},[239,6252,1793],{"class":465},[239,6254,1102],{"class":256},[239,6256,469],{"class":256},[239,6258,6259,6261,6263,6265,6267,6269,6271,6273,6275,6277],{"class":241,"line":1310},[239,6260,900],{"class":457},[239,6262,4109],{"class":457},[239,6264,4112],{"class":256},[239,6266,4115],{"class":252},[239,6268,257],{"class":256},[239,6270,4264],{"class":260},[239,6272,264],{"class":493},[239,6274,3491],{"class":252},[239,6276,1102],{"class":493},[239,6278,282],{"class":256},[239,6280,6281],{"class":241,"line":1315},[239,6282,973],{"class":256},[239,6284,6285],{"class":241,"line":1320},[239,6286,508],{"class":252},[239,6288,6289,6291,6293,6295,6297,6299,6301],{"class":241,"line":1337},[239,6290,474],{"class":256},[239,6292,583],{"class":260},[239,6294,264],{"class":252},[239,6296,267],{"class":256},[239,6298,554],{"class":270},[239,6300,267],{"class":256},[239,6302,452],{"class":252},[239,6304,6305,6307,6310],{"class":241,"line":1347},[239,6306,4090],{"class":461},[239,6308,6309],{"class":493}," update",[239,6311,1638],{"class":256},[239,6313,6314,6316,6318,6320,6322,6324,6326,6328,6330,6332,6334],{"class":241,"line":1353},[239,6315,1643],{"class":256},[239,6317,1553],{"class":260},[239,6319,264],{"class":252},[239,6321,267],{"class":256},[239,6323,1560],{"class":270},[239,6325,267],{"class":256},[239,6327,1565],{"class":252},[239,6329,1560],{"class":1073},[239,6331,914],{"class":256},[239,6333,1572],{"class":465},[239,6335,1665],{"class":256},[239,6337,6338,6340,6342,6344,6346,6348],{"class":241,"line":1358},[239,6339,1643],{"class":256},[239,6341,1892],{"class":260},[239,6343,1895],{"class":252},[239,6345,3491],{"class":1073},[239,6347,914],{"class":256},[239,6349,6350],{"class":465}," UpdateUserDto\n",[239,6352,6353,6355],{"class":241,"line":1363},[239,6354,1694],{"class":256},[239,6356,469],{"class":256},[239,6358,6359,6361,6363,6365,6367,6369,6372,6374,6376,6378,6380,6382],{"class":241,"line":1381},[239,6360,900],{"class":457},[239,6362,4109],{"class":457},[239,6364,4112],{"class":256},[239,6366,4115],{"class":252},[239,6368,257],{"class":256},[239,6370,6371],{"class":260},"update",[239,6373,264],{"class":493},[239,6375,1560],{"class":252},[239,6377,276],{"class":256},[239,6379,3870],{"class":252},[239,6381,1102],{"class":493},[239,6383,282],{"class":256},[239,6385,6386],{"class":241,"line":1391},[239,6387,973],{"class":256},[239,6389,6390],{"class":241,"line":1397},[239,6391,508],{"class":252},[239,6393,6394,6396,6398,6400,6402,6404,6406],{"class":241,"line":1402},[239,6395,474],{"class":256},[239,6397,618],{"class":260},[239,6399,264],{"class":252},[239,6401,267],{"class":256},[239,6403,554],{"class":270},[239,6405,267],{"class":256},[239,6407,452],{"class":252},[239,6409,6410,6412,6414,6416,6419],{"class":241,"line":1407},[239,6411,474],{"class":256},[239,6413,3447],{"class":260},[239,6415,264],{"class":252},[239,6417,6418],{"class":917},"204",[239,6420,452],{"class":252},[239,6422,6423,6425,6428,6430,6432,6434,6436,6438,6440,6442,6444,6446,6448,6450],{"class":241,"line":1424},[239,6424,4090],{"class":461},[239,6426,6427],{"class":493}," remove",[239,6429,1550],{"class":256},[239,6431,1553],{"class":260},[239,6433,264],{"class":252},[239,6435,267],{"class":256},[239,6437,1560],{"class":270},[239,6439,267],{"class":256},[239,6441,1565],{"class":252},[239,6443,1560],{"class":1073},[239,6445,914],{"class":256},[239,6447,1572],{"class":465},[239,6449,1102],{"class":256},[239,6451,469],{"class":256},[239,6453,6454,6456,6458,6460,6462,6465,6467,6469,6471],{"class":241,"line":1434},[239,6455,4545],{"class":457},[239,6457,4112],{"class":256},[239,6459,4115],{"class":252},[239,6461,257],{"class":256},[239,6463,6464],{"class":260},"remove",[239,6466,264],{"class":493},[239,6468,1560],{"class":252},[239,6470,1102],{"class":493},[239,6472,282],{"class":256},[239,6474,6475],{"class":241,"line":1440},[239,6476,973],{"class":256},[239,6478,6479],{"class":241,"line":1445},[239,6480,646],{"class":256},[225,6482,6484],{"id":6483},"nested-resources","Nested Resources",[230,6486,6488],{"className":232,"code":6487,"language":234,"meta":235,"style":235},"@Controller('\u002Fusers\u002F:userId\u002Fposts')\nexport class UserPostController {\n  \n  @Get('\u002F')\n  getUserPosts(@Param('userId') userId: string) {\n    \u002F\u002F GET \u002Fusers\u002F123\u002Fposts\n  }\n  \n  @Post('\u002F')\n  createUserPost(\n    @Param('userId') userId: string,\n    @Body() data: CreatePostDto\n  ) {\n    \u002F\u002F POST \u002Fusers\u002F123\u002Fposts\n  }\n}\n",[216,6489,6490,6507,6518,6522,6538,6567,6572,6576,6580,6596,6603,6627,6642,6648,6653,6657],{"__ignoreMap":235},[239,6491,6492,6494,6496,6498,6500,6503,6505],{"class":241,"line":242},[239,6493,438],{"class":256},[239,6495,441],{"class":260},[239,6497,264],{"class":252},[239,6499,267],{"class":256},[239,6501,6502],{"class":270},"\u002Fusers\u002F:userId\u002Fposts",[239,6504,267],{"class":256},[239,6506,452],{"class":252},[239,6508,6509,6511,6513,6516],{"class":241,"line":249},[239,6510,458],{"class":457},[239,6512,462],{"class":461},[239,6514,6515],{"class":465}," UserPostController",[239,6517,469],{"class":256},[239,6519,6520],{"class":241,"line":285},[239,6521,508],{"class":252},[239,6523,6524,6526,6528,6530,6532,6534,6536],{"class":241,"line":310},[239,6525,474],{"class":256},[239,6527,477],{"class":260},[239,6529,264],{"class":252},[239,6531,267],{"class":256},[239,6533,484],{"class":270},[239,6535,267],{"class":256},[239,6537,452],{"class":252},[239,6539,6540,6543,6545,6547,6549,6551,6553,6555,6557,6559,6561,6563,6565],{"class":241,"line":335},[239,6541,6542],{"class":493},"  getUserPosts",[239,6544,1550],{"class":256},[239,6546,1553],{"class":260},[239,6548,264],{"class":252},[239,6550,267],{"class":256},[239,6552,1652],{"class":270},[239,6554,267],{"class":256},[239,6556,1565],{"class":252},[239,6558,1652],{"class":1073},[239,6560,914],{"class":256},[239,6562,1572],{"class":465},[239,6564,1102],{"class":256},[239,6566,469],{"class":256},[239,6568,6569],{"class":241,"line":360},[239,6570,6571],{"class":245},"    \u002F\u002F GET \u002Fusers\u002F123\u002Fposts\n",[239,6573,6574],{"class":241,"line":385},[239,6575,973],{"class":256},[239,6577,6578],{"class":241,"line":391},[239,6579,508],{"class":252},[239,6581,6582,6584,6586,6588,6590,6592,6594],{"class":241,"line":416},[239,6583,474],{"class":256},[239,6585,515],{"class":260},[239,6587,264],{"class":252},[239,6589,267],{"class":256},[239,6591,484],{"class":270},[239,6593,267],{"class":256},[239,6595,452],{"class":252},[239,6597,6598,6601],{"class":241,"line":543},[239,6599,6600],{"class":493},"  createUserPost",[239,6602,1638],{"class":256},[239,6604,6605,6607,6609,6611,6613,6615,6617,6619,6621,6623,6625],{"class":241,"line":561},[239,6606,1643],{"class":256},[239,6608,1553],{"class":260},[239,6610,264],{"class":252},[239,6612,267],{"class":256},[239,6614,1652],{"class":270},[239,6616,267],{"class":256},[239,6618,1565],{"class":252},[239,6620,1652],{"class":1073},[239,6622,914],{"class":256},[239,6624,1572],{"class":465},[239,6626,1665],{"class":256},[239,6628,6629,6631,6633,6635,6637,6639],{"class":241,"line":573},[239,6630,1643],{"class":256},[239,6632,1892],{"class":260},[239,6634,1895],{"class":252},[239,6636,3491],{"class":1073},[239,6638,914],{"class":256},[239,6640,6641],{"class":465}," CreatePostDto\n",[239,6643,6644,6646],{"class":241,"line":578},[239,6645,1694],{"class":256},[239,6647,469],{"class":256},[239,6649,6650],{"class":241,"line":596},[239,6651,6652],{"class":245},"    \u002F\u002F POST \u002Fusers\u002F123\u002Fposts\n",[239,6654,6655],{"class":241,"line":608},[239,6656,973],{"class":256},[239,6658,6659],{"class":241,"line":613},[239,6660,646],{"class":256},[6662,6663,6664],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":235,"searchDepth":242,"depth":249,"links":6666},[6667,6671,6674,6679,6680,6681,6682,6683,6684,6691,6692,6693,6694,6695,6699,6700],{"id":210,"depth":249,"text":211,"children":6668},[6669,6670],{"id":227,"depth":285,"text":228},{"id":422,"depth":285,"text":423},{"id":649,"depth":249,"text":650,"children":6672},[6673],{"id":661,"depth":285,"text":662},{"id":706,"depth":249,"text":707,"children":6675},[6676,6677,6678],{"id":710,"depth":285,"text":711},{"id":805,"depth":285,"text":806},{"id":1002,"depth":285,"text":1003},{"id":1114,"depth":249,"text":1115},{"id":1450,"depth":249,"text":1451},{"id":1740,"depth":249,"text":1741},{"id":2299,"depth":249,"text":2300},{"id":3041,"depth":249,"text":3042},{"id":3316,"depth":249,"text":3317,"children":6685},[6686,6687,6688,6689,6690],{"id":3323,"depth":285,"text":3324},{"id":3393,"depth":285,"text":3394},{"id":3500,"depth":285,"text":3501},{"id":3650,"depth":285,"text":3651},{"id":3742,"depth":285,"text":3743},{"id":3946,"depth":249,"text":3947},{"id":4286,"depth":249,"text":4287},{"id":4636,"depth":249,"text":4637},{"id":5175,"depth":249,"text":5176},{"id":5383,"depth":249,"text":5384,"children":6696},[6697,6698],{"id":5387,"depth":285,"text":5388},{"id":5399,"depth":285,"text":5400},{"id":5409,"depth":249,"text":5410},{"id":6015,"depth":249,"text":6016,"children":6701},[6702,6703],{"id":6019,"depth":285,"text":6020},{"id":6483,"depth":285,"text":6484},"Building APIs with Controllers in Vercube","md",null,{},{"title":41,"description":6704},"ilkW-RwDjcq9AE8_lhto6aOahRLYazFsSZYVrXE7bQg",[6711,6713],{"title":37,"path":38,"stem":39,"description":6712,"children":-1},"Understanding and using the Dependency Injection container in Vercube",{"title":45,"path":46,"stem":47,"description":6706,"children":-1},1775552780365]