[{"data":1,"prerenderedAt":2145},["ShallowReactive",2],{"navigation":3,"\u002Fnest\u002Fcontrollers":173,"\u002Fnest\u002Fcontrollers-surround":2140},[4,9,14,19,46,96,109,127,148],{"title":5,"path":6,"stem":7,"icon":8},"Introduction","\u002Fintroduction","01.introduction","i-lucide-info",{"title":10,"path":11,"stem":12,"icon":13},"Installation","\u002Finstallation","02.installation","i-lucide-circle-arrow-down",{"title":15,"path":16,"stem":17,"icon":18},"First App","\u002Ffirst-app","03.first-app","i-lucide-play",{"title":20,"icon":21,"path":22,"stem":23,"children":24,"page":45},"Core","i-lucide-container","\u002Fcore","10.core",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Architecture","\u002Fcore\u002Farchitecture","10.core\u002F1.architecture","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"Concepts","\u002Fcore\u002Fconcepts","10.core\u002F2.concepts","i-lucide-lightbulb",{"title":36,"path":37,"stem":38,"icon":39},"Runtime","\u002Fcore\u002Fruntime","10.core\u002F3.runtime","i-lucide-cpu",{"title":41,"path":42,"stem":43,"icon":44},"Modules","\u002Fcore\u002Fmodules","10.core\u002F4.modules","i-lucide-puzzle",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Server","i-simple-icons-nestjs","\u002Fnest","11.nest",[52,55,72,77,82,87,92],{"title":5,"path":53,"stem":54,"icon":8},"\u002Fnest\u002Fintroduction","11.nest\u002F1.introduction",{"title":56,"path":57,"stem":58,"children":59,"icon":71},"Database","\u002Fnest\u002Fdatabase","11.nest\u002F2.database\u002F1.index",[60,61,66],{"title":56,"path":57,"stem":58,"icon":8},{"title":62,"path":63,"stem":64,"icon":65},"Models","\u002Fnest\u002Fdatabase\u002Fmodels","11.nest\u002F2.database\u002F2.models","i-lucide-database-zap",{"title":67,"path":68,"stem":69,"icon":70},"Plugins","\u002Fnest\u002Fdatabase\u002Fplugins","11.nest\u002F2.database\u002F3.plugins","i-lucide-plug","i-lucide-database",{"title":73,"path":74,"stem":75,"icon":76},"Controllers","\u002Fnest\u002Fcontrollers","11.nest\u002F3.controllers","i-lucide-route",{"title":78,"path":79,"stem":80,"icon":81},"Guards","\u002Fnest\u002Fguards","11.nest\u002F4.guards","i-lucide-shield-check",{"title":83,"path":84,"stem":85,"icon":86},"Services","\u002Fnest\u002Fservices","11.nest\u002F5.services","i-lucide-layers",{"title":88,"path":89,"stem":90,"icon":91},"Locales","\u002Fnest\u002Flocales","11.nest\u002F6.locales","i-lucide-languages",{"title":93,"path":94,"stem":95},"Env","\u002Fnest\u002Fenv","11.nest\u002F7.env",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":45},"Client","i-simple-icons-nuxt","\u002Fnuxt","12.nuxt",[102,105],{"title":5,"path":103,"stem":104},"\u002Fnuxt\u002Fintroduction","12.nuxt\u002F1.introduction",{"title":106,"path":107,"stem":108},"Coming Soon","\u002Fnuxt\u002Fcoming-soon","12.nuxt\u002F2.coming-soon",{"title":110,"icon":111,"path":112,"stem":113,"children":114,"page":45},"Configuration","i-lucide-settings","\u002Fconfiguration","13.configuration",[115,119,123],{"title":116,"path":117,"stem":118},"Opensya Config","\u002Fconfiguration\u002Fopensya-config","13.configuration\u002F1.opensya-config",{"title":120,"path":121,"stem":122},"Runtime Config","\u002Fconfiguration\u002Fruntime-config","13.configuration\u002F2.runtime-config",{"title":124,"path":125,"stem":126},"Server Config","\u002Fconfiguration\u002Fserver-config","13.configuration\u002F3.server-config",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":45},"Deployment","i-lucide-cloud","\u002Fdeployment","14.deployment",[133,136,140,144],{"title":5,"path":134,"stem":135},"\u002Fdeployment\u002Fintroduction","14.deployment\u002F1.introduction",{"title":137,"path":138,"stem":139},"Docker","\u002Fdeployment\u002Fdocker","14.deployment\u002F2.docker",{"title":141,"path":142,"stem":143},"Production","\u002Fdeployment\u002Fproduction","14.deployment\u002F3.production",{"title":145,"path":146,"stem":147},"Self Hosting","\u002Fdeployment\u002Fself-hosting","14.deployment\u002F4.self-hosting",{"title":149,"icon":150,"path":151,"stem":152,"children":153,"page":45},"Advanced","i-lucide-plus","\u002Fadvanced","15.advanced",[154,158,162,165,169],{"title":155,"path":156,"stem":157},"Internals","\u002Fadvanced\u002Finternals","15.advanced\u002F1.internals",{"title":159,"path":160,"stem":161},"Compiler","\u002Fadvanced\u002Fcompiler","15.advanced\u002F2.compiler",{"title":41,"path":163,"stem":164},"\u002Fadvanced\u002Fmodules","15.advanced\u002F3.modules",{"title":166,"path":167,"stem":168},"Globals","\u002Fadvanced\u002Fglobals","15.advanced\u002F4.globals",{"title":170,"path":171,"stem":172},"Lifecycle","\u002Fadvanced\u002Flifecycle","15.advanced\u002F5.lifecycle",{"id":174,"title":73,"body":175,"description":2133,"extension":2134,"links":2135,"meta":2136,"navigation":2137,"path":74,"seo":2138,"stem":75,"__hash__":2139},"docs\u002F11.nest\u002F3.controllers.md",{"type":176,"value":177,"toc":2113},"minimark",[178,182,190,195,202,343,346,349,356,360,363,422,425,493,497,500,538,595,599,602,605,644,647,683,686,690,693,724,731,844,848,854,959,965,1072,1076,1079,1084,1091,1120,1123,1132,1136,1142,1144,1153,1179,1181,1190,1196,1200,1207,1272,1286,1290,1293,1307,1419,1423,1431,1454,1457,1526,1532,1680,1684,1687,1692,1816,1820,1823,1940,1944,1947,2014,2017,2022,2026,2029,2048,2096,2100,2103,2106,2109],[179,180,181],"p",{},"Controllers define HTTP endpoints in the backend runtime.",[179,183,184,185,189],{},"They are automatically discovered, compiled and registered by OpenSya from the ",[186,187,188],"code",{},"server\u002Fcontrollers"," directory.",[191,192,194],"h2",{"id":193},"creating-a-controller","Creating a Controller",[179,196,197,198,201],{},"A controller is created using the global ",[186,199,200],{},"defineController"," helper.",[203,204,210],"pre",{"className":205,"code":206,"filename":207,"language":208,"meta":209,"style":209},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineController(\n  async ({ req }) => {\n    const config = await useService('config.get')();\n\n    return config;\n  },\n  { public: true },\n);\n","server\u002Fcontrollers\u002Fconfig\u002Findex.get.ts","ts","",[186,211,212,232,256,293,300,310,316,335],{"__ignoreMap":209},[213,214,217,221,224,228],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"s7zQu","export",[213,222,223],{"class":219}," default",[213,225,227],{"class":226},"s2Zo4"," defineController",[213,229,231],{"class":230},"sTEyZ","(\n",[213,233,235,239,243,247,250,253],{"class":215,"line":234},2,[213,236,238],{"class":237},"spNyl","  async",[213,240,242],{"class":241},"sMK4o"," ({",[213,244,246],{"class":245},"sHdIc"," req",[213,248,249],{"class":241}," })",[213,251,252],{"class":237}," =>",[213,254,255],{"class":241}," {\n",[213,257,259,262,265,268,271,274,278,281,285,287,290],{"class":215,"line":258},3,[213,260,261],{"class":237},"    const",[213,263,264],{"class":230}," config",[213,266,267],{"class":241}," =",[213,269,270],{"class":219}," await",[213,272,273],{"class":226}," useService",[213,275,277],{"class":276},"swJcz","(",[213,279,280],{"class":241},"'",[213,282,284],{"class":283},"sfazB","config.get",[213,286,280],{"class":241},[213,288,289],{"class":276},")()",[213,291,292],{"class":241},";\n",[213,294,296],{"class":215,"line":295},4,[213,297,299],{"emptyLinePlaceholder":298},true,"\n",[213,301,303,306,308],{"class":215,"line":302},5,[213,304,305],{"class":219},"    return",[213,307,264],{"class":230},[213,309,292],{"class":241},[213,311,313],{"class":215,"line":312},6,[213,314,315],{"class":241},"  },\n",[213,317,319,322,325,328,332],{"class":215,"line":318},7,[213,320,321],{"class":241},"  {",[213,323,324],{"class":276}," public",[213,326,327],{"class":241},":",[213,329,331],{"class":330},"sfNiH"," true",[213,333,334],{"class":241}," },\n",[213,336,338,341],{"class":215,"line":337},8,[213,339,340],{"class":230},")",[213,342,292],{"class":241},[179,344,345],{},"The first argument is the controller handler.",[179,347,348],{},"The second argument defines route and access options.",[350,351,353],"callout",{"color":352,"icon":76},"primary",[179,354,355],{},"Controllers are discovered from the filesystem and registered automatically by the OpenSya runtime.",[191,357,359],{"id":358},"controller-context","Controller Context",[179,361,362],{},"Each controller receives a context object.",[203,364,366],{"className":205,"code":365,"language":208,"meta":209,"style":209},"type ControllerContext = {\n  req: Request;\n  res: Response;\n  next: NextFunction;\n};\n",[186,367,368,381,393,405,417],{"__ignoreMap":209},[213,369,370,373,377,379],{"class":215,"line":216},[213,371,372],{"class":237},"type",[213,374,376],{"class":375},"sBMFI"," ControllerContext",[213,378,267],{"class":241},[213,380,255],{"class":241},[213,382,383,386,388,391],{"class":215,"line":234},[213,384,385],{"class":276},"  req",[213,387,327],{"class":241},[213,389,390],{"class":375}," Request",[213,392,292],{"class":241},[213,394,395,398,400,403],{"class":215,"line":258},[213,396,397],{"class":276},"  res",[213,399,327],{"class":241},[213,401,402],{"class":375}," Response",[213,404,292],{"class":241},[213,406,407,410,412,415],{"class":215,"line":295},[213,408,409],{"class":276},"  next",[213,411,327],{"class":241},[213,413,414],{"class":375}," NextFunction",[213,416,292],{"class":241},[213,418,419],{"class":215,"line":302},[213,420,421],{"class":241},"};\n",[179,423,424],{},"You can access the current request, response and next function directly from the handler.",[203,426,429],{"className":205,"code":427,"filename":428,"language":208,"meta":209,"style":209},"export default defineController(async ({ req }) => {\n  return {\n    user: req._user,\n  };\n});\n","server\u002Fcontrollers\u002Fprofile\u002Findex.get.ts",[186,430,431,454,461,479,484],{"__ignoreMap":209},[213,432,433,435,437,439,441,444,446,448,450,452],{"class":215,"line":216},[213,434,220],{"class":219},[213,436,223],{"class":219},[213,438,227],{"class":226},[213,440,277],{"class":230},[213,442,443],{"class":237},"async",[213,445,242],{"class":241},[213,447,246],{"class":245},[213,449,249],{"class":241},[213,451,252],{"class":237},[213,453,255],{"class":241},[213,455,456,459],{"class":215,"line":234},[213,457,458],{"class":219},"  return",[213,460,255],{"class":241},[213,462,463,466,468,470,473,476],{"class":215,"line":258},[213,464,465],{"class":276},"    user",[213,467,327],{"class":241},[213,469,246],{"class":230},[213,471,472],{"class":241},".",[213,474,475],{"class":230},"_user",[213,477,478],{"class":241},",\n",[213,480,481],{"class":215,"line":295},[213,482,483],{"class":241},"  };\n",[213,485,486,489,491],{"class":215,"line":302},[213,487,488],{"class":241},"}",[213,490,340],{"class":230},[213,492,292],{"class":241},[191,494,496],{"id":495},"file-based-routing","File-based Routing",[179,498,499],{},"OpenSya infers routes from the controller file path.",[203,501,506],{"className":502,"code":503,"filename":504,"language":505,"meta":209,"style":209},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server\u002Fcontrollers\u002F\n├── candidates\u002F\n│   ├── index.get.ts\n│   ├── index.post.ts\n│   └── [id]\u002F\n│       └── index.get.ts\n","Example","txt",[186,507,508,513,518,523,528,533],{"__ignoreMap":209},[213,509,510],{"class":215,"line":216},[213,511,512],{},"server\u002Fcontrollers\u002F\n",[213,514,515],{"class":215,"line":234},[213,516,517],{},"├── candidates\u002F\n",[213,519,520],{"class":215,"line":258},[213,521,522],{},"│   ├── index.get.ts\n",[213,524,525],{"class":215,"line":295},[213,526,527],{},"│   ├── index.post.ts\n",[213,529,530],{"class":215,"line":302},[213,531,532],{},"│   └── [id]\u002F\n",[213,534,535],{"class":215,"line":312},[213,536,537],{},"│       └── index.get.ts\n",[539,540,541,555],"table",{},[542,543,544],"thead",{},[545,546,547,552],"tr",{},[548,549,551],"th",{"align":550},"left","File",[548,553,554],{"align":550},"Generated Route",[556,557,558,571,583],"tbody",{},[545,559,560,566],{},[561,562,563],"td",{},[186,564,565],{},"candidates\u002Findex.get.ts",[561,567,568],{},[186,569,570],{},"GET \u002Fcandidates",[545,572,573,578],{},[561,574,575],{},[186,576,577],{},"candidates\u002Findex.post.ts",[561,579,580],{},[186,581,582],{},"POST \u002Fcandidates",[545,584,585,590],{},[561,586,587],{},[186,588,589],{},"candidates\u002F[id]\u002Findex.get.ts",[561,591,592],{},[186,593,594],{},"GET \u002Fcandidates\u002F:id",[191,596,598],{"id":597},"nested-routes","Nested Routes",[179,600,601],{},"Controllers can be deeply nested to create hierarchical routes.",[179,603,604],{},"Example:",[203,606,608],{"className":502,"code":607,"filename":598,"language":505,"meta":209,"style":209},"server\u002Fcontrollers\u002F\n└── users\u002F\n    └── [id]\u002F\n        ├── profile\u002F\n        │   └── index.get.ts\n        └── jobs\u002F\n            └── list.get.ts\n",[186,609,610,614,619,624,629,634,639],{"__ignoreMap":209},[213,611,612],{"class":215,"line":216},[213,613,512],{},[213,615,616],{"class":215,"line":234},[213,617,618],{},"└── users\u002F\n",[213,620,621],{"class":215,"line":258},[213,622,623],{},"    └── [id]\u002F\n",[213,625,626],{"class":215,"line":295},[213,627,628],{},"        ├── profile\u002F\n",[213,630,631],{"class":215,"line":302},[213,632,633],{},"        │   └── index.get.ts\n",[213,635,636],{"class":215,"line":312},[213,637,638],{},"        └── jobs\u002F\n",[213,640,641],{"class":215,"line":318},[213,642,643],{},"            └── list.get.ts\n",[179,645,646],{},"Generated routes:",[539,648,649,657],{},[542,650,651],{},[545,652,653,655],{},[548,654,551],{"align":550},[548,656,554],{"align":550},[556,658,659,671],{},[545,660,661,666],{},[561,662,663],{},[186,664,665],{},"users\u002F[id]\u002Fprofile\u002Findex.get.ts",[561,667,668],{},[186,669,670],{},"GET \u002Fusers\u002F:id\u002Fprofile",[545,672,673,678],{},[561,674,675],{},[186,676,677],{},"users\u002F[id]\u002Fjobs\u002Flist.get.ts",[561,679,680],{},[186,681,682],{},"GET \u002Fusers\u002F:id\u002Fjobs\u002Flist",[179,684,685],{},"Nested routing allows applications to remain modular and organized while scaling to large infrastructures.",[191,687,689],{"id":688},"http-method","HTTP Method",[179,691,692],{},"By default, the HTTP method can be inferred from the filename.",[203,694,697],{"className":502,"code":695,"filename":696,"language":505,"meta":209,"style":209},".get.ts     → GET\n.post.ts    → POST\n.put.ts     → PUT\n.patch.ts   → PATCH\n.delete.ts  → DELETE\n","Methods",[186,698,699,704,709,714,719],{"__ignoreMap":209},[213,700,701],{"class":215,"line":216},[213,702,703],{},".get.ts     → GET\n",[213,705,706],{"class":215,"line":234},[213,707,708],{},".post.ts    → POST\n",[213,710,711],{"class":215,"line":258},[213,712,713],{},".put.ts     → PUT\n",[213,715,716],{"class":215,"line":295},[213,717,718],{},".patch.ts   → PATCH\n",[213,720,721],{"class":215,"line":302},[213,722,723],{},".delete.ts  → DELETE\n",[179,725,726,727,730],{},"You can also override the method manually using the ",[186,728,729],{},"method"," option.",[203,732,735],{"className":205,"code":733,"filename":734,"language":208,"meta":209,"style":209},"export default defineController(\n  async ({ req }) => {\n    return useService('candidate.search')(req.query);\n  },\n  {\n    method: 'post',\n    path: '\u002Fcandidates\u002Fsearch',\n  },\n);\n","server\u002Fcontrollers\u002Fcandidates\u002Fsearch.ts",[186,736,737,747,761,791,795,800,817,833,837],{"__ignoreMap":209},[213,738,739,741,743,745],{"class":215,"line":216},[213,740,220],{"class":219},[213,742,223],{"class":219},[213,744,227],{"class":226},[213,746,231],{"class":230},[213,748,749,751,753,755,757,759],{"class":215,"line":234},[213,750,238],{"class":237},[213,752,242],{"class":241},[213,754,246],{"class":245},[213,756,249],{"class":241},[213,758,252],{"class":237},[213,760,255],{"class":241},[213,762,763,765,767,769,771,774,776,779,782,784,787,789],{"class":215,"line":258},[213,764,305],{"class":219},[213,766,273],{"class":226},[213,768,277],{"class":276},[213,770,280],{"class":241},[213,772,773],{"class":283},"candidate.search",[213,775,280],{"class":241},[213,777,778],{"class":276},")(",[213,780,781],{"class":230},"req",[213,783,472],{"class":241},[213,785,786],{"class":230},"query",[213,788,340],{"class":276},[213,790,292],{"class":241},[213,792,793],{"class":215,"line":295},[213,794,315],{"class":241},[213,796,797],{"class":215,"line":302},[213,798,799],{"class":241},"  {\n",[213,801,802,805,807,810,813,815],{"class":215,"line":312},[213,803,804],{"class":276},"    method",[213,806,327],{"class":241},[213,808,809],{"class":241}," '",[213,811,812],{"class":283},"post",[213,814,280],{"class":241},[213,816,478],{"class":241},[213,818,819,822,824,826,829,831],{"class":215,"line":318},[213,820,821],{"class":276},"    path",[213,823,327],{"class":241},[213,825,809],{"class":241},[213,827,828],{"class":283},"\u002Fcandidates\u002Fsearch",[213,830,280],{"class":241},[213,832,478],{"class":241},[213,834,835],{"class":215,"line":337},[213,836,315],{"class":241},[213,838,840,842],{"class":215,"line":839},9,[213,841,340],{"class":230},[213,843,292],{"class":241},[191,845,847],{"id":846},"custom-path","Custom Path",[179,849,850,851,730],{},"The route path can be customized using the ",[186,852,853],{},"path",[203,855,858],{"className":205,"code":856,"filename":857,"language":208,"meta":209,"style":209},"export default defineController(\n  async () => {\n    return useService('config.get')();\n  },\n  {\n    public: true,\n    method: 'get',\n    path: '\u002Fsystem\u002Fconfig',\n  },\n);\n","server\u002Fcontrollers\u002Fsystem\u002Fconfig.ts",[186,859,860,870,881,899,903,907,918,933,948,952],{"__ignoreMap":209},[213,861,862,864,866,868],{"class":215,"line":216},[213,863,220],{"class":219},[213,865,223],{"class":219},[213,867,227],{"class":226},[213,869,231],{"class":230},[213,871,872,874,877,879],{"class":215,"line":234},[213,873,238],{"class":237},[213,875,876],{"class":241}," ()",[213,878,252],{"class":237},[213,880,255],{"class":241},[213,882,883,885,887,889,891,893,895,897],{"class":215,"line":258},[213,884,305],{"class":219},[213,886,273],{"class":226},[213,888,277],{"class":276},[213,890,280],{"class":241},[213,892,284],{"class":283},[213,894,280],{"class":241},[213,896,289],{"class":276},[213,898,292],{"class":241},[213,900,901],{"class":215,"line":295},[213,902,315],{"class":241},[213,904,905],{"class":215,"line":302},[213,906,799],{"class":241},[213,908,909,912,914,916],{"class":215,"line":312},[213,910,911],{"class":276},"    public",[213,913,327],{"class":241},[213,915,331],{"class":330},[213,917,478],{"class":241},[213,919,920,922,924,926,929,931],{"class":215,"line":318},[213,921,804],{"class":276},[213,923,327],{"class":241},[213,925,809],{"class":241},[213,927,928],{"class":283},"get",[213,930,280],{"class":241},[213,932,478],{"class":241},[213,934,935,937,939,941,944,946],{"class":215,"line":337},[213,936,821],{"class":276},[213,938,327],{"class":241},[213,940,809],{"class":241},[213,942,943],{"class":283},"\u002Fsystem\u002Fconfig",[213,945,280],{"class":241},[213,947,478],{"class":241},[213,949,950],{"class":215,"line":839},[213,951,315],{"class":241},[213,953,955,957],{"class":215,"line":954},10,[213,956,340],{"class":230},[213,958,292],{"class":241},[179,960,961,962,964],{},"The ",[186,963,853],{}," option can be a single path or multiple paths.",[203,966,969],{"className":205,"code":967,"filename":968,"language":208,"meta":209,"style":209},"export default defineController(\n  async () => {\n    return { status: 'ok' };\n  },\n  {\n    public: true,\n    path: ['\u002Fhealth', '\u002Fstatus'],\n  },\n);\n","server\u002Fcontrollers\u002Fhealth\u002Findex.ts",[186,970,971,981,991,1013,1017,1021,1031,1062,1066],{"__ignoreMap":209},[213,972,973,975,977,979],{"class":215,"line":216},[213,974,220],{"class":219},[213,976,223],{"class":219},[213,978,227],{"class":226},[213,980,231],{"class":230},[213,982,983,985,987,989],{"class":215,"line":234},[213,984,238],{"class":237},[213,986,876],{"class":241},[213,988,252],{"class":237},[213,990,255],{"class":241},[213,992,993,995,998,1001,1003,1005,1008,1010],{"class":215,"line":258},[213,994,305],{"class":219},[213,996,997],{"class":241}," {",[213,999,1000],{"class":276}," status",[213,1002,327],{"class":241},[213,1004,809],{"class":241},[213,1006,1007],{"class":283},"ok",[213,1009,280],{"class":241},[213,1011,1012],{"class":241}," };\n",[213,1014,1015],{"class":215,"line":295},[213,1016,315],{"class":241},[213,1018,1019],{"class":215,"line":302},[213,1020,799],{"class":241},[213,1022,1023,1025,1027,1029],{"class":215,"line":312},[213,1024,911],{"class":276},[213,1026,327],{"class":241},[213,1028,331],{"class":330},[213,1030,478],{"class":241},[213,1032,1033,1035,1037,1040,1042,1045,1047,1050,1052,1055,1057,1060],{"class":215,"line":318},[213,1034,821],{"class":276},[213,1036,327],{"class":241},[213,1038,1039],{"class":230}," [",[213,1041,280],{"class":241},[213,1043,1044],{"class":283},"\u002Fhealth",[213,1046,280],{"class":241},[213,1048,1049],{"class":241},",",[213,1051,809],{"class":241},[213,1053,1054],{"class":283},"\u002Fstatus",[213,1056,280],{"class":241},[213,1058,1059],{"class":230},"]",[213,1061,478],{"class":241},[213,1063,1064],{"class":215,"line":337},[213,1065,315],{"class":241},[213,1067,1068,1070],{"class":215,"line":839},[213,1069,340],{"class":230},[213,1071,292],{"class":241},[191,1073,1075],{"id":1074},"path-resolution","Path Resolution",[179,1077,1078],{},"Custom controller paths can be absolute or relative.",[1080,1081,1083],"h3",{"id":1082},"absolute-path","Absolute Path",[179,1085,1086,1087,1090],{},"If the path starts with ",[186,1088,1089],{},"\u002F",", it is attached directly to the API root.",[203,1092,1094],{"className":205,"code":1093,"language":208,"meta":209,"style":209},"{\n  path: '\u002Fsystem\u002Fconfig'\n}\n",[186,1095,1096,1101,1115],{"__ignoreMap":209},[213,1097,1098],{"class":215,"line":216},[213,1099,1100],{"class":241},"{\n",[213,1102,1103,1106,1108,1110,1112],{"class":215,"line":234},[213,1104,1105],{"class":375},"  path",[213,1107,327],{"class":241},[213,1109,809],{"class":241},[213,1111,943],{"class":283},[213,1113,1114],{"class":241},"'\n",[213,1116,1117],{"class":215,"line":258},[213,1118,1119],{"class":241},"}\n",[179,1121,1122],{},"Generated route:",[203,1124,1126],{"className":502,"code":1125,"language":505,"meta":209,"style":209},"\u002Fsystem\u002Fconfig\n",[186,1127,1128],{"__ignoreMap":209},[213,1129,1130],{"class":215,"line":216},[213,1131,1125],{},[1080,1133,1135],{"id":1134},"relative-path","Relative Path",[179,1137,1138,1139,1141],{},"If the path does not start with ",[186,1140,1089],{},", it is resolved relative to the controller parent path.",[179,1143,604],{},[203,1145,1147],{"className":502,"code":1146,"language":505,"meta":209,"style":209},"server\u002Fcontrollers\u002Fusers\u002F[id]\u002Fprofile\u002F\n",[186,1148,1149],{"__ignoreMap":209},[213,1150,1151],{"class":215,"line":216},[213,1152,1146],{},[203,1154,1156],{"className":205,"code":1155,"language":208,"meta":209,"style":209},"{\n  path: 'settings'\n}\n",[186,1157,1158,1162,1175],{"__ignoreMap":209},[213,1159,1160],{"class":215,"line":216},[213,1161,1100],{"class":241},[213,1163,1164,1166,1168,1170,1173],{"class":215,"line":234},[213,1165,1105],{"class":375},[213,1167,327],{"class":241},[213,1169,809],{"class":241},[213,1171,1172],{"class":283},"settings",[213,1174,1114],{"class":241},[213,1176,1177],{"class":215,"line":258},[213,1178,1119],{"class":241},[179,1180,1122],{},[203,1182,1184],{"className":502,"code":1183,"language":505,"meta":209,"style":209},"\u002Fusers\u002F:id\u002Fprofile\u002Fsettings\n",[186,1185,1186],{"__ignoreMap":209},[213,1187,1188],{"class":215,"line":216},[213,1189,1183],{},[350,1191,1193],{"color":1192,"icon":76},"info",[179,1194,1195],{},"Relative paths help keep nested controllers modular and composable.",[191,1197,1199],{"id":1198},"public-controllers","Public Controllers",[179,1201,1202,1203,1206],{},"Use ",[186,1204,1205],{},"{ public: true }"," to expose a controller without authentication or access checks.",[203,1208,1210],{"className":205,"code":1209,"filename":207,"language":208,"meta":209,"style":209},"export default defineController(\n  async () => {\n    return useService('config.get')();\n  },\n  { public: true },\n);\n",[186,1211,1212,1222,1232,1250,1254,1266],{"__ignoreMap":209},[213,1213,1214,1216,1218,1220],{"class":215,"line":216},[213,1215,220],{"class":219},[213,1217,223],{"class":219},[213,1219,227],{"class":226},[213,1221,231],{"class":230},[213,1223,1224,1226,1228,1230],{"class":215,"line":234},[213,1225,238],{"class":237},[213,1227,876],{"class":241},[213,1229,252],{"class":237},[213,1231,255],{"class":241},[213,1233,1234,1236,1238,1240,1242,1244,1246,1248],{"class":215,"line":258},[213,1235,305],{"class":219},[213,1237,273],{"class":226},[213,1239,277],{"class":276},[213,1241,280],{"class":241},[213,1243,284],{"class":283},[213,1245,280],{"class":241},[213,1247,289],{"class":276},[213,1249,292],{"class":241},[213,1251,1252],{"class":215,"line":295},[213,1253,315],{"class":241},[213,1255,1256,1258,1260,1262,1264],{"class":215,"line":302},[213,1257,321],{"class":241},[213,1259,324],{"class":276},[213,1261,327],{"class":241},[213,1263,331],{"class":330},[213,1265,334],{"class":241},[213,1267,1268,1270],{"class":215,"line":312},[213,1269,340],{"class":230},[213,1271,292],{"class":241},[350,1273,1276,1279],{"color":1274,"icon":1275},"warning","i-lucide-shield-alert",[179,1277,1278],{},"Public controllers are accessible without authentication.",[179,1280,1281,1282,1285],{},"Only use ",[186,1283,1284],{},"public: true"," for endpoints that are intentionally exposed.",[191,1287,1289],{"id":1288},"protected-controllers","Protected Controllers",[179,1291,1292],{},"By default, controllers are not public.",[179,1294,1295,1296,1299,1300,1303,1304,472],{},"You can define access rules using ",[186,1297,1298],{},"access",", ",[186,1301,1302],{},"roles"," or ",[186,1305,1306],{},"disallowSelfAction",[203,1308,1311],{"className":205,"code":1309,"filename":1310,"language":208,"meta":209,"style":209},"export default defineController(\n  async ({ req }) => {\n    return useService('candidate.delete')(req.params.id);\n  },\n  {\n    roles: ['admin'],\n    access: true,\n  },\n);\n","server\u002Fcontrollers\u002Fcandidates\u002F[id]\u002Findex.delete.ts",[186,1312,1313,1323,1337,1370,1374,1378,1398,1409,1413],{"__ignoreMap":209},[213,1314,1315,1317,1319,1321],{"class":215,"line":216},[213,1316,220],{"class":219},[213,1318,223],{"class":219},[213,1320,227],{"class":226},[213,1322,231],{"class":230},[213,1324,1325,1327,1329,1331,1333,1335],{"class":215,"line":234},[213,1326,238],{"class":237},[213,1328,242],{"class":241},[213,1330,246],{"class":245},[213,1332,249],{"class":241},[213,1334,252],{"class":237},[213,1336,255],{"class":241},[213,1338,1339,1341,1343,1345,1347,1350,1352,1354,1356,1358,1361,1363,1366,1368],{"class":215,"line":258},[213,1340,305],{"class":219},[213,1342,273],{"class":226},[213,1344,277],{"class":276},[213,1346,280],{"class":241},[213,1348,1349],{"class":283},"candidate.delete",[213,1351,280],{"class":241},[213,1353,778],{"class":276},[213,1355,781],{"class":230},[213,1357,472],{"class":241},[213,1359,1360],{"class":230},"params",[213,1362,472],{"class":241},[213,1364,1365],{"class":230},"id",[213,1367,340],{"class":276},[213,1369,292],{"class":241},[213,1371,1372],{"class":215,"line":295},[213,1373,315],{"class":241},[213,1375,1376],{"class":215,"line":302},[213,1377,799],{"class":241},[213,1379,1380,1383,1385,1387,1389,1392,1394,1396],{"class":215,"line":312},[213,1381,1382],{"class":276},"    roles",[213,1384,327],{"class":241},[213,1386,1039],{"class":230},[213,1388,280],{"class":241},[213,1390,1391],{"class":283},"admin",[213,1393,280],{"class":241},[213,1395,1059],{"class":230},[213,1397,478],{"class":241},[213,1399,1400,1403,1405,1407],{"class":215,"line":318},[213,1401,1402],{"class":276},"    access",[213,1404,327],{"class":241},[213,1406,331],{"class":330},[213,1408,478],{"class":241},[213,1410,1411],{"class":215,"line":337},[213,1412,315],{"class":241},[213,1414,1415,1417],{"class":215,"line":839},[213,1416,340],{"class":230},[213,1418,292],{"class":241},[191,1420,1422],{"id":1421},"access-options","Access Options",[179,1424,961,1425,1427,1428,472],{},[186,1426,1298],{}," option can be enabled with ",[186,1429,1430],{},"true",[203,1432,1434],{"className":205,"code":1433,"language":208,"meta":209,"style":209},"{\n  access: true\n}\n",[186,1435,1436,1440,1450],{"__ignoreMap":209},[213,1437,1438],{"class":215,"line":216},[213,1439,1100],{"class":241},[213,1441,1442,1445,1447],{"class":215,"line":234},[213,1443,1444],{"class":375},"  access",[213,1446,327],{"class":241},[213,1448,1449],{"class":330}," true\n",[213,1451,1452],{"class":215,"line":258},[213,1453,1119],{"class":241},[179,1455,1456],{},"It can also receive a job identifier.",[203,1458,1460],{"className":205,"code":1459,"language":208,"meta":209,"style":209},"{\n  access: {\n    jobID: 'job-id',\n    roles: ['recruiter', 'admin'],\n  }\n}\n",[186,1461,1462,1466,1474,1490,1517,1522],{"__ignoreMap":209},[213,1463,1464],{"class":215,"line":216},[213,1465,1100],{"class":241},[213,1467,1468,1470,1472],{"class":215,"line":234},[213,1469,1444],{"class":375},[213,1471,327],{"class":241},[213,1473,255],{"class":241},[213,1475,1476,1479,1481,1483,1486,1488],{"class":215,"line":258},[213,1477,1478],{"class":375},"    jobID",[213,1480,327],{"class":241},[213,1482,809],{"class":241},[213,1484,1485],{"class":283},"job-id",[213,1487,280],{"class":241},[213,1489,478],{"class":241},[213,1491,1492,1494,1496,1498,1500,1503,1505,1507,1509,1511,1513,1515],{"class":215,"line":295},[213,1493,1382],{"class":375},[213,1495,327],{"class":241},[213,1497,1039],{"class":276},[213,1499,280],{"class":241},[213,1501,1502],{"class":283},"recruiter",[213,1504,280],{"class":241},[213,1506,1049],{"class":241},[213,1508,809],{"class":241},[213,1510,1391],{"class":283},[213,1512,280],{"class":241},[213,1514,1059],{"class":276},[213,1516,478],{"class":241},[213,1518,1519],{"class":215,"line":302},[213,1520,1521],{"class":241},"  }\n",[213,1523,1524],{"class":215,"line":312},[213,1525,1119],{"class":241},[179,1527,961,1528,1531],{},[186,1529,1530],{},"jobID"," can also be resolved from the request.",[203,1533,1536],{"className":205,"code":1534,"filename":1535,"language":208,"meta":209,"style":209},"export default defineController(\n  async ({ req }) => {\n    return useService('application.list')(req.params.jobID);\n  },\n  {\n    access: {\n      jobID: (req) => req.params.jobID,\n      roles: ['recruiter', 'admin'],\n    },\n  },\n);\n","server\u002Fcontrollers\u002Fjobs\u002F[jobID]\u002Fapplications\u002Findex.get.ts",[186,1537,1538,1548,1562,1593,1597,1601,1609,1637,1664,1669,1673],{"__ignoreMap":209},[213,1539,1540,1542,1544,1546],{"class":215,"line":216},[213,1541,220],{"class":219},[213,1543,223],{"class":219},[213,1545,227],{"class":226},[213,1547,231],{"class":230},[213,1549,1550,1552,1554,1556,1558,1560],{"class":215,"line":234},[213,1551,238],{"class":237},[213,1553,242],{"class":241},[213,1555,246],{"class":245},[213,1557,249],{"class":241},[213,1559,252],{"class":237},[213,1561,255],{"class":241},[213,1563,1564,1566,1568,1570,1572,1575,1577,1579,1581,1583,1585,1587,1589,1591],{"class":215,"line":258},[213,1565,305],{"class":219},[213,1567,273],{"class":226},[213,1569,277],{"class":276},[213,1571,280],{"class":241},[213,1573,1574],{"class":283},"application.list",[213,1576,280],{"class":241},[213,1578,778],{"class":276},[213,1580,781],{"class":230},[213,1582,472],{"class":241},[213,1584,1360],{"class":230},[213,1586,472],{"class":241},[213,1588,1530],{"class":230},[213,1590,340],{"class":276},[213,1592,292],{"class":241},[213,1594,1595],{"class":215,"line":295},[213,1596,315],{"class":241},[213,1598,1599],{"class":215,"line":302},[213,1600,799],{"class":241},[213,1602,1603,1605,1607],{"class":215,"line":312},[213,1604,1402],{"class":276},[213,1606,327],{"class":241},[213,1608,255],{"class":241},[213,1610,1611,1614,1616,1619,1621,1623,1625,1627,1629,1631,1633,1635],{"class":215,"line":318},[213,1612,1613],{"class":226},"      jobID",[213,1615,327],{"class":241},[213,1617,1618],{"class":241}," (",[213,1620,781],{"class":245},[213,1622,340],{"class":241},[213,1624,252],{"class":237},[213,1626,246],{"class":230},[213,1628,472],{"class":241},[213,1630,1360],{"class":230},[213,1632,472],{"class":241},[213,1634,1530],{"class":230},[213,1636,478],{"class":241},[213,1638,1639,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662],{"class":215,"line":337},[213,1640,1641],{"class":276},"      roles",[213,1643,327],{"class":241},[213,1645,1039],{"class":230},[213,1647,280],{"class":241},[213,1649,1502],{"class":283},[213,1651,280],{"class":241},[213,1653,1049],{"class":241},[213,1655,809],{"class":241},[213,1657,1391],{"class":283},[213,1659,280],{"class":241},[213,1661,1059],{"class":230},[213,1663,478],{"class":241},[213,1665,1666],{"class":215,"line":839},[213,1667,1668],{"class":241},"    },\n",[213,1670,1671],{"class":215,"line":954},[213,1672,315],{"class":241},[213,1674,1676,1678],{"class":215,"line":1675},11,[213,1677,340],{"class":230},[213,1679,292],{"class":241},[191,1681,1683],{"id":1682},"disallow-self-action","Disallow Self Action",[179,1685,1686],{},"Some endpoints should prevent users from acting on themselves.",[179,1688,961,1689,1691],{},[186,1690,1306],{}," option can be used for this kind of rule.",[203,1693,1696],{"className":205,"code":1694,"filename":1695,"language":208,"meta":209,"style":209},"export default defineController(\n  async ({ req }) => {\n    return useService('user.delete')(req.params.id);\n  },\n  {\n    roles: ['admin'],\n    disallowSelfAction: (req) => req.params.id,\n  },\n);\n","server\u002Fcontrollers\u002Fusers\u002F[id]\u002Fdelete.ts",[186,1697,1698,1708,1722,1753,1757,1761,1779,1806,1810],{"__ignoreMap":209},[213,1699,1700,1702,1704,1706],{"class":215,"line":216},[213,1701,220],{"class":219},[213,1703,223],{"class":219},[213,1705,227],{"class":226},[213,1707,231],{"class":230},[213,1709,1710,1712,1714,1716,1718,1720],{"class":215,"line":234},[213,1711,238],{"class":237},[213,1713,242],{"class":241},[213,1715,246],{"class":245},[213,1717,249],{"class":241},[213,1719,252],{"class":237},[213,1721,255],{"class":241},[213,1723,1724,1726,1728,1730,1732,1735,1737,1739,1741,1743,1745,1747,1749,1751],{"class":215,"line":258},[213,1725,305],{"class":219},[213,1727,273],{"class":226},[213,1729,277],{"class":276},[213,1731,280],{"class":241},[213,1733,1734],{"class":283},"user.delete",[213,1736,280],{"class":241},[213,1738,778],{"class":276},[213,1740,781],{"class":230},[213,1742,472],{"class":241},[213,1744,1360],{"class":230},[213,1746,472],{"class":241},[213,1748,1365],{"class":230},[213,1750,340],{"class":276},[213,1752,292],{"class":241},[213,1754,1755],{"class":215,"line":295},[213,1756,315],{"class":241},[213,1758,1759],{"class":215,"line":302},[213,1760,799],{"class":241},[213,1762,1763,1765,1767,1769,1771,1773,1775,1777],{"class":215,"line":312},[213,1764,1382],{"class":276},[213,1766,327],{"class":241},[213,1768,1039],{"class":230},[213,1770,280],{"class":241},[213,1772,1391],{"class":283},[213,1774,280],{"class":241},[213,1776,1059],{"class":230},[213,1778,478],{"class":241},[213,1780,1781,1784,1786,1788,1790,1792,1794,1796,1798,1800,1802,1804],{"class":215,"line":318},[213,1782,1783],{"class":226},"    disallowSelfAction",[213,1785,327],{"class":241},[213,1787,1618],{"class":241},[213,1789,781],{"class":245},[213,1791,340],{"class":241},[213,1793,252],{"class":237},[213,1795,246],{"class":230},[213,1797,472],{"class":241},[213,1799,1360],{"class":230},[213,1801,472],{"class":241},[213,1803,1365],{"class":230},[213,1805,478],{"class":241},[213,1807,1808],{"class":215,"line":337},[213,1809,315],{"class":241},[213,1811,1812,1814],{"class":215,"line":839},[213,1813,340],{"class":230},[213,1815,292],{"class":241},[191,1817,1819],{"id":1818},"controller-options","Controller Options",[179,1821,1822],{},"Controllers support the following options:",[539,1824,1825,1838],{},[542,1826,1827],{},[545,1828,1829,1832,1835],{},[548,1830,1831],{"align":550},"Option",[548,1833,1834],{"align":550},"Type",[548,1836,1837],{"align":550},"Description",[556,1839,1840,1855,1869,1883,1898,1912,1926],{},[545,1841,1842,1847,1852],{},[561,1843,1844],{},[186,1845,1846],{},"name",[561,1848,1849],{},[186,1850,1851],{},"string",[561,1853,1854],{},"Custom controller name.",[545,1856,1857,1861,1866],{},[561,1858,1859],{},[186,1860,853],{},[561,1862,1863],{},[186,1864,1865],{},"string | string[]",[561,1867,1868],{},"Custom route path or list of paths.",[545,1870,1871,1875,1880],{},[561,1872,1873],{},[186,1874,729],{},[561,1876,1877],{},[186,1878,1879],{},"HttpMethod",[561,1881,1882],{},"HTTP method used by the route.",[545,1884,1885,1890,1895],{},[561,1886,1887],{},[186,1888,1889],{},"public",[561,1891,1892],{},[186,1893,1894],{},"true | false",[561,1896,1897],{},"Expose the endpoint without authentication.",[545,1899,1900,1904,1909],{},[561,1901,1902],{},[186,1903,1298],{},[561,1905,1906],{},[186,1907,1908],{},"AccessOptions",[561,1910,1911],{},"Define access control rules.",[545,1913,1914,1918,1923],{},[561,1915,1916],{},[186,1917,1302],{},[561,1919,1920],{},[186,1921,1922],{},"string[]",[561,1924,1925],{},"Restrict the controller to specific roles.",[545,1927,1928,1932,1937],{},[561,1929,1930],{},[186,1931,1306],{},[561,1933,1934],{},[186,1935,1936],{},"true | string | function",[561,1938,1939],{},"Prevent users from acting on themselves.",[191,1941,1943],{"id":1942},"using-services","Using Services",[179,1945,1946],{},"Controllers should stay thin and delegate business logic to services.",[203,1948,1951],{"className":205,"code":1949,"filename":1950,"language":208,"meta":209,"style":209},"export default defineController(async ({ req }) => {\n  return useService('candidate.findById')(req.params.id);\n});\n","server\u002Fcontrollers\u002Fcandidates\u002F[id]\u002Findex.get.ts",[186,1952,1953,1975,2006],{"__ignoreMap":209},[213,1954,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973],{"class":215,"line":216},[213,1956,220],{"class":219},[213,1958,223],{"class":219},[213,1960,227],{"class":226},[213,1962,277],{"class":230},[213,1964,443],{"class":237},[213,1966,242],{"class":241},[213,1968,246],{"class":245},[213,1970,249],{"class":241},[213,1972,252],{"class":237},[213,1974,255],{"class":241},[213,1976,1977,1979,1981,1983,1985,1988,1990,1992,1994,1996,1998,2000,2002,2004],{"class":215,"line":234},[213,1978,458],{"class":219},[213,1980,273],{"class":226},[213,1982,277],{"class":276},[213,1984,280],{"class":241},[213,1986,1987],{"class":283},"candidate.findById",[213,1989,280],{"class":241},[213,1991,778],{"class":276},[213,1993,781],{"class":230},[213,1995,472],{"class":241},[213,1997,1360],{"class":230},[213,1999,472],{"class":241},[213,2001,1365],{"class":230},[213,2003,340],{"class":276},[213,2005,292],{"class":241},[213,2007,2008,2010,2012],{"class":215,"line":258},[213,2009,488],{"class":241},[213,2011,340],{"class":230},[213,2013,292],{"class":241},[179,2015,2016],{},"This keeps controllers focused on HTTP concerns while services handle application logic.",[350,2018,2019],{"color":1192,"icon":86},[179,2020,2021],{},"A good controller should mainly handle request input, access rules and response output.",[191,2023,2025],{"id":2024},"runtime-integration","Runtime Integration",[179,2027,2028],{},"During startup, OpenSya automatically:",[2030,2031,2032,2036,2039,2042,2045],"ol",{},[2033,2034,2035],"li",{},"Discovers controller files",[2033,2037,2038],{},"Infers routes and HTTP methods",[2033,2040,2041],{},"Applies controller options",[2033,2043,2044],{},"Registers routes in the generated NestJS runtime",[2033,2046,2047],{},"Connects services, guards and access rules",[203,2049,2052],{"className":502,"code":2050,"filename":2051,"language":505,"meta":209,"style":209},"Filesystem Discovery\n        ↓\nController Compilation\n        ↓\nRoute Registration\n        ↓\nAccess Resolution\n        ↓\nRuntime Execution\n","Runtime Lifecycle",[186,2053,2054,2059,2064,2069,2073,2078,2082,2087,2091],{"__ignoreMap":209},[213,2055,2056],{"class":215,"line":216},[213,2057,2058],{},"Filesystem Discovery\n",[213,2060,2061],{"class":215,"line":234},[213,2062,2063],{},"        ↓\n",[213,2065,2066],{"class":215,"line":258},[213,2067,2068],{},"Controller Compilation\n",[213,2070,2071],{"class":215,"line":295},[213,2072,2063],{},[213,2074,2075],{"class":215,"line":302},[213,2076,2077],{},"Route Registration\n",[213,2079,2080],{"class":215,"line":312},[213,2081,2063],{},[213,2083,2084],{"class":215,"line":318},[213,2085,2086],{},"Access Resolution\n",[213,2088,2089],{"class":215,"line":337},[213,2090,2063],{},[213,2092,2093],{"class":215,"line":839},[213,2094,2095],{},"Runtime Execution\n",[191,2097,2099],{"id":2098},"philosophy","Philosophy",[179,2101,2102],{},"Controllers are the HTTP entry points of the OpenSya backend runtime.",[179,2104,2105],{},"They should remain small, predictable and focused on routing concerns.",[179,2107,2108],{},"Business logic should usually live in services, while controllers orchestrate request handling and access configuration.",[2110,2111,2112],"style",{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":209,"searchDepth":216,"depth":234,"links":2114},[2115,2116,2117,2118,2119,2120,2121,2125,2126,2127,2128,2129,2130,2131,2132],{"id":193,"depth":234,"text":194},{"id":358,"depth":234,"text":359},{"id":495,"depth":234,"text":496},{"id":597,"depth":234,"text":598},{"id":688,"depth":234,"text":689},{"id":846,"depth":234,"text":847},{"id":1074,"depth":234,"text":1075,"children":2122},[2123,2124],{"id":1082,"depth":258,"text":1083},{"id":1134,"depth":258,"text":1135},{"id":1198,"depth":234,"text":1199},{"id":1288,"depth":234,"text":1289},{"id":1421,"depth":234,"text":1422},{"id":1682,"depth":234,"text":1683},{"id":1818,"depth":234,"text":1819},{"id":1942,"depth":234,"text":1943},{"id":2024,"depth":234,"text":2025},{"id":2098,"depth":234,"text":2099},"Learn how to define HTTP controllers with the OpenSya Nest runtime.","md",null,{},{"icon":76},{"title":73,"description":2133},"PGUrwu_XLn8Axt3RMQpxxNwv0L6px9WZdZ1YAQFh7Ew",[2141,2143],{"title":67,"path":68,"stem":69,"description":2142,"icon":70,"children":-1},"Learn how to create reusable database plugins with the OpenSya MongoDB runtime.",{"title":78,"path":79,"stem":80,"description":2144,"icon":81,"children":-1},"Learn how to create runtime guards and access control rules in the OpenSya Nest runtime.",1779143767266]