[{"data":1,"prerenderedAt":1160},["ShallowReactive",2],{"navigation":3,"\u002Fnest\u002Fdatabase\u002Fplugins":173,"\u002Fnest\u002Fdatabase\u002Fplugins-surround":1155},[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":67,"body":175,"description":1148,"extension":1149,"links":1150,"meta":1151,"navigation":1152,"path":68,"seo":1153,"stem":69,"__hash__":1154},"docs\u002F11.nest\u002F2.database\u002F3.plugins.md",{"type":176,"value":177,"toc":1139},"minimark",[178,182,186,189,214,219,227,263,266,273,277,284,545,548,552,555,959,962,986,996,1000,1003,1032,1035,1039,1042,1045,1106,1110,1113,1116,1119,1125,1129,1132,1135],[179,180,67],"h1",{"id":181},"plugins",[183,184,185],"p",{},"Database plugins allow you to define reusable behaviors that can be applied to database models through the OpenSya runtime.",[183,187,188],{},"They are useful for shared logic such as:",[190,191,192,196,199,202,205,208,211],"ul",{},[193,194,195],"li",{},"JSON serialization",[193,197,198],{},"Soft delete",[193,200,201],{},"Audit fields",[193,203,204],{},"Slugs",[193,206,207],{},"Timestamps",[193,209,210],{},"Sensitive field cleanup",[193,212,213],{},"Common schema transformations",[215,216,218],"h2",{"id":217},"filesystem-structure","Filesystem Structure",[183,220,221,222,226],{},"Database plugins are placed inside the ",[223,224,225],"code",{},"server\u002Fdatabase\u002Fplugins"," directory.",[228,229,235],"pre",{"className":230,"code":231,"filename":232,"language":233,"meta":234,"style":234},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server\u002Fdatabase\u002Fplugins\u002F\n├── to-json.ts\n├── soft-delete.ts\n└── audit.ts\n","Structure","txt","",[223,236,237,245,251,257],{"__ignoreMap":234},[238,239,242],"span",{"class":240,"line":241},"line",1,[238,243,244],{},"server\u002Fdatabase\u002Fplugins\u002F\n",[238,246,248],{"class":240,"line":247},2,[238,249,250],{},"├── to-json.ts\n",[238,252,254],{"class":240,"line":253},3,[238,255,256],{},"├── soft-delete.ts\n",[238,258,260],{"class":240,"line":259},4,[238,261,262],{},"└── audit.ts\n",[183,264,265],{},"Each plugin file is automatically discovered by the runtime.",[267,268,270],"callout",{"color":269,"icon":70},"primary",[183,271,272],{},"Plugins make database behaviors reusable across models and modules.",[215,274,276],{"id":275},"creating-a-plugin","Creating a Plugin",[183,278,279,280,283],{},"A database plugin is created using ",[223,281,282],{},"defineMongoosePlugin",".",[228,285,290],{"className":286,"code":287,"filename":288,"language":289,"meta":234,"style":234},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineMongoosePlugin((schema) => {\n  schema.set('toJSON', {\n    depopulate: false,\n    schemaFieldsOnly: false,\n\n    transform(doc, ret) {\n      _.set(ret, 'id', ret._id?.toString());\n      _.unset(ret, '_id');\n      _.unset(ret, '__v');\n\n      return ret;\n    },\n  });\n});\n","server\u002Fdatabase\u002Fplugins\u002Fto-json.ts","ts",[223,291,292,326,353,368,379,386,406,452,478,504,509,519,525,535],{"__ignoreMap":234},[238,293,294,298,301,305,309,312,316,319,323],{"class":240,"line":241},[238,295,297],{"class":296},"s7zQu","export",[238,299,300],{"class":296}," default",[238,302,304],{"class":303},"s2Zo4"," defineMongoosePlugin",[238,306,308],{"class":307},"sTEyZ","(",[238,310,308],{"class":311},"sMK4o",[238,313,315],{"class":314},"sHdIc","schema",[238,317,318],{"class":311},")",[238,320,322],{"class":321},"spNyl"," =>",[238,324,325],{"class":311}," {\n",[238,327,328,331,333,336,339,342,346,348,351],{"class":240,"line":247},[238,329,330],{"class":307},"  schema",[238,332,283],{"class":311},[238,334,335],{"class":303},"set",[238,337,308],{"class":338},"swJcz",[238,340,341],{"class":311},"'",[238,343,345],{"class":344},"sfazB","toJSON",[238,347,341],{"class":311},[238,349,350],{"class":311},",",[238,352,325],{"class":311},[238,354,355,358,361,365],{"class":240,"line":253},[238,356,357],{"class":338},"    depopulate",[238,359,360],{"class":311},":",[238,362,364],{"class":363},"sfNiH"," false",[238,366,367],{"class":311},",\n",[238,369,370,373,375,377],{"class":240,"line":259},[238,371,372],{"class":338},"    schemaFieldsOnly",[238,374,360],{"class":311},[238,376,364],{"class":363},[238,378,367],{"class":311},[238,380,382],{"class":240,"line":381},5,[238,383,385],{"emptyLinePlaceholder":384},true,"\n",[238,387,389,392,394,397,399,402,404],{"class":240,"line":388},6,[238,390,391],{"class":338},"    transform",[238,393,308],{"class":311},[238,395,396],{"class":314},"doc",[238,398,350],{"class":311},[238,400,401],{"class":314}," ret",[238,403,318],{"class":311},[238,405,325],{"class":311},[238,407,409,412,414,416,418,421,423,426,429,431,433,435,437,440,443,446,449],{"class":240,"line":408},7,[238,410,411],{"class":307},"      _",[238,413,283],{"class":311},[238,415,335],{"class":303},[238,417,308],{"class":338},[238,419,420],{"class":307},"ret",[238,422,350],{"class":311},[238,424,425],{"class":311}," '",[238,427,428],{"class":344},"id",[238,430,341],{"class":311},[238,432,350],{"class":311},[238,434,401],{"class":307},[238,436,283],{"class":311},[238,438,439],{"class":307},"_id",[238,441,442],{"class":311},"?.",[238,444,445],{"class":303},"toString",[238,447,448],{"class":338},"())",[238,450,451],{"class":311},";\n",[238,453,455,457,459,462,464,466,468,470,472,474,476],{"class":240,"line":454},8,[238,456,411],{"class":307},[238,458,283],{"class":311},[238,460,461],{"class":303},"unset",[238,463,308],{"class":338},[238,465,420],{"class":307},[238,467,350],{"class":311},[238,469,425],{"class":311},[238,471,439],{"class":344},[238,473,341],{"class":311},[238,475,318],{"class":338},[238,477,451],{"class":311},[238,479,481,483,485,487,489,491,493,495,498,500,502],{"class":240,"line":480},9,[238,482,411],{"class":307},[238,484,283],{"class":311},[238,486,461],{"class":303},[238,488,308],{"class":338},[238,490,420],{"class":307},[238,492,350],{"class":311},[238,494,425],{"class":311},[238,496,497],{"class":344},"__v",[238,499,341],{"class":311},[238,501,318],{"class":338},[238,503,451],{"class":311},[238,505,507],{"class":240,"line":506},10,[238,508,385],{"emptyLinePlaceholder":384},[238,510,512,515,517],{"class":240,"line":511},11,[238,513,514],{"class":296},"      return",[238,516,401],{"class":307},[238,518,451],{"class":311},[238,520,522],{"class":240,"line":521},12,[238,523,524],{"class":311},"    },\n",[238,526,528,531,533],{"class":240,"line":527},13,[238,529,530],{"class":311},"  }",[238,532,318],{"class":338},[238,534,451],{"class":311},[238,536,538,541,543],{"class":240,"line":537},14,[238,539,540],{"class":311},"}",[238,542,318],{"class":307},[238,544,451],{"class":311},[183,546,547],{},"The plugin receives the Mongoose schema and can customize it before the model is registered.",[215,549,551],{"id":550},"example-clean-json-output","Example: Clean JSON Output",[183,553,554],{},"A common use case is normalizing JSON responses before sending data to the client.",[228,556,559],{"className":286,"code":557,"filename":558,"language":289,"meta":234,"style":234},"export default defineMongoosePlugin((schema) => {\n  schema.set('toJSON', {\n    depopulate: false,\n    schemaFieldsOnly: false,\n\n    transform(doc, ret) {\n      _.set(ret, 'id', ret._id?.toString());\n\n      _.unset(ret, '_id');\n      _.unset(ret, '__v');\n      _.unset(ret, 'password');\n\n      for (const key in ret) {\n        if (!Object.hasOwn(ret, key)) continue;\n\n        const data: any = ret[key];\n\n        if (data?.type !== 'Buffer') continue;\n\n        _.unset(ret, key);\n      }\n\n      return ret;\n    },\n  });\n});\n","server\u002Fdatabase\u002Fplugins\u002Fclean-json.ts",[223,560,561,581,601,611,621,625,641,677,681,705,729,754,758,783,817,822,853,858,889,894,916,922,927,936,941,950],{"__ignoreMap":234},[238,562,563,565,567,569,571,573,575,577,579],{"class":240,"line":241},[238,564,297],{"class":296},[238,566,300],{"class":296},[238,568,304],{"class":303},[238,570,308],{"class":307},[238,572,308],{"class":311},[238,574,315],{"class":314},[238,576,318],{"class":311},[238,578,322],{"class":321},[238,580,325],{"class":311},[238,582,583,585,587,589,591,593,595,597,599],{"class":240,"line":247},[238,584,330],{"class":307},[238,586,283],{"class":311},[238,588,335],{"class":303},[238,590,308],{"class":338},[238,592,341],{"class":311},[238,594,345],{"class":344},[238,596,341],{"class":311},[238,598,350],{"class":311},[238,600,325],{"class":311},[238,602,603,605,607,609],{"class":240,"line":253},[238,604,357],{"class":338},[238,606,360],{"class":311},[238,608,364],{"class":363},[238,610,367],{"class":311},[238,612,613,615,617,619],{"class":240,"line":259},[238,614,372],{"class":338},[238,616,360],{"class":311},[238,618,364],{"class":363},[238,620,367],{"class":311},[238,622,623],{"class":240,"line":381},[238,624,385],{"emptyLinePlaceholder":384},[238,626,627,629,631,633,635,637,639],{"class":240,"line":388},[238,628,391],{"class":338},[238,630,308],{"class":311},[238,632,396],{"class":314},[238,634,350],{"class":311},[238,636,401],{"class":314},[238,638,318],{"class":311},[238,640,325],{"class":311},[238,642,643,645,647,649,651,653,655,657,659,661,663,665,667,669,671,673,675],{"class":240,"line":408},[238,644,411],{"class":307},[238,646,283],{"class":311},[238,648,335],{"class":303},[238,650,308],{"class":338},[238,652,420],{"class":307},[238,654,350],{"class":311},[238,656,425],{"class":311},[238,658,428],{"class":344},[238,660,341],{"class":311},[238,662,350],{"class":311},[238,664,401],{"class":307},[238,666,283],{"class":311},[238,668,439],{"class":307},[238,670,442],{"class":311},[238,672,445],{"class":303},[238,674,448],{"class":338},[238,676,451],{"class":311},[238,678,679],{"class":240,"line":454},[238,680,385],{"emptyLinePlaceholder":384},[238,682,683,685,687,689,691,693,695,697,699,701,703],{"class":240,"line":480},[238,684,411],{"class":307},[238,686,283],{"class":311},[238,688,461],{"class":303},[238,690,308],{"class":338},[238,692,420],{"class":307},[238,694,350],{"class":311},[238,696,425],{"class":311},[238,698,439],{"class":344},[238,700,341],{"class":311},[238,702,318],{"class":338},[238,704,451],{"class":311},[238,706,707,709,711,713,715,717,719,721,723,725,727],{"class":240,"line":506},[238,708,411],{"class":307},[238,710,283],{"class":311},[238,712,461],{"class":303},[238,714,308],{"class":338},[238,716,420],{"class":307},[238,718,350],{"class":311},[238,720,425],{"class":311},[238,722,497],{"class":344},[238,724,341],{"class":311},[238,726,318],{"class":338},[238,728,451],{"class":311},[238,730,731,733,735,737,739,741,743,745,748,750,752],{"class":240,"line":511},[238,732,411],{"class":307},[238,734,283],{"class":311},[238,736,461],{"class":303},[238,738,308],{"class":338},[238,740,420],{"class":307},[238,742,350],{"class":311},[238,744,425],{"class":311},[238,746,747],{"class":344},"password",[238,749,341],{"class":311},[238,751,318],{"class":338},[238,753,451],{"class":311},[238,755,756],{"class":240,"line":521},[238,757,385],{"emptyLinePlaceholder":384},[238,759,760,763,766,769,772,775,777,780],{"class":240,"line":527},[238,761,762],{"class":296},"      for",[238,764,765],{"class":338}," (",[238,767,768],{"class":321},"const",[238,770,771],{"class":307}," key",[238,773,774],{"class":311}," in",[238,776,401],{"class":307},[238,778,779],{"class":338},") ",[238,781,782],{"class":311},"{\n",[238,784,785,788,790,793,796,798,801,803,805,807,809,812,815],{"class":240,"line":537},[238,786,787],{"class":296},"        if",[238,789,765],{"class":338},[238,791,792],{"class":311},"!",[238,794,795],{"class":307},"Object",[238,797,283],{"class":311},[238,799,800],{"class":303},"hasOwn",[238,802,308],{"class":338},[238,804,420],{"class":307},[238,806,350],{"class":311},[238,808,771],{"class":307},[238,810,811],{"class":338},")) ",[238,813,814],{"class":296},"continue",[238,816,451],{"class":311},[238,818,820],{"class":240,"line":819},15,[238,821,385],{"emptyLinePlaceholder":384},[238,823,825,828,831,833,837,840,842,845,848,851],{"class":240,"line":824},16,[238,826,827],{"class":321},"        const",[238,829,830],{"class":307}," data",[238,832,360],{"class":311},[238,834,836],{"class":835},"sBMFI"," any",[238,838,839],{"class":311}," =",[238,841,401],{"class":307},[238,843,844],{"class":338},"[",[238,846,847],{"class":307},"key",[238,849,850],{"class":338},"]",[238,852,451],{"class":311},[238,854,856],{"class":240,"line":855},17,[238,857,385],{"emptyLinePlaceholder":384},[238,859,861,863,865,868,870,873,876,878,881,883,885,887],{"class":240,"line":860},18,[238,862,787],{"class":296},[238,864,765],{"class":338},[238,866,867],{"class":307},"data",[238,869,442],{"class":311},[238,871,872],{"class":307},"type",[238,874,875],{"class":311}," !==",[238,877,425],{"class":311},[238,879,880],{"class":344},"Buffer",[238,882,341],{"class":311},[238,884,779],{"class":338},[238,886,814],{"class":296},[238,888,451],{"class":311},[238,890,892],{"class":240,"line":891},19,[238,893,385],{"emptyLinePlaceholder":384},[238,895,897,900,902,904,906,908,910,912,914],{"class":240,"line":896},20,[238,898,899],{"class":307},"        _",[238,901,283],{"class":311},[238,903,461],{"class":303},[238,905,308],{"class":338},[238,907,420],{"class":307},[238,909,350],{"class":311},[238,911,771],{"class":307},[238,913,318],{"class":338},[238,915,451],{"class":311},[238,917,919],{"class":240,"line":918},21,[238,920,921],{"class":311},"      }\n",[238,923,925],{"class":240,"line":924},22,[238,926,385],{"emptyLinePlaceholder":384},[238,928,930,932,934],{"class":240,"line":929},23,[238,931,514],{"class":296},[238,933,401],{"class":307},[238,935,451],{"class":311},[238,937,939],{"class":240,"line":938},24,[238,940,524],{"class":311},[238,942,944,946,948],{"class":240,"line":943},25,[238,945,530],{"class":311},[238,947,318],{"class":338},[238,949,451],{"class":311},[238,951,953,955,957],{"class":240,"line":952},26,[238,954,540],{"class":311},[238,956,318],{"class":307},[238,958,451],{"class":311},[183,960,961],{},"This plugin:",[190,963,964,972,975,980],{},[193,965,966,967,969,970],{},"Converts ",[223,968,439],{}," to ",[223,971,428],{},[193,973,974],{},"Removes MongoDB internal fields",[193,976,977,978],{},"Removes sensitive fields such as ",[223,979,747],{},[193,981,982,983,985],{},"Removes raw ",[223,984,880],{}," fields from JSON output",[267,987,990,993],{"color":988,"icon":989},"warning","i-lucide-shield-alert",[183,991,992],{},"Be careful when removing fields globally.",[183,994,995],{},"A plugin applied to multiple models can affect many API responses.",[215,997,999],{"id":998},"runtime-discovery","Runtime Discovery",[183,1001,1002],{},"During startup, OpenSya automatically discovers database plugins from the filesystem.",[228,1004,1006],{"className":230,"code":1005,"filename":999,"language":233,"meta":234,"style":234},"server\u002Fdatabase\u002Fplugins\u002Fclean-json.ts\n                ↓\nDiscovered by OpenSya runtime\n                ↓\nApplied during model registration\n",[223,1007,1008,1013,1018,1023,1027],{"__ignoreMap":234},[238,1009,1010],{"class":240,"line":241},[238,1011,1012],{},"server\u002Fdatabase\u002Fplugins\u002Fclean-json.ts\n",[238,1014,1015],{"class":240,"line":247},[238,1016,1017],{},"                ↓\n",[238,1019,1020],{"class":240,"line":253},[238,1021,1022],{},"Discovered by OpenSya runtime\n",[238,1024,1025],{"class":240,"line":259},[238,1026,1017],{},[238,1028,1029],{"class":240,"line":381},[238,1030,1031],{},"Applied during model registration\n",[183,1033,1034],{},"The runtime integrates plugins into the generated backend runtime automatically.",[215,1036,1038],{"id":1037},"plugin-responsibilities","Plugin Responsibilities",[183,1040,1041],{},"Plugins should be used for reusable database behaviors.",[183,1043,1044],{},"Good examples include:",[1046,1047,1048,1062],"table",{},[1049,1050,1051],"thead",{},[1052,1053,1054,1059],"tr",{},[1055,1056,1058],"th",{"align":1057},"left","Plugin",[1055,1060,1061],{"align":1057},"Purpose",[1063,1064,1065,1076,1086,1096],"tbody",{},[1052,1066,1067,1073],{},[1068,1069,1070],"td",{},[223,1071,1072],{},"clean-json.ts",[1068,1074,1075],{},"Normalize JSON output and remove internal fields.",[1052,1077,1078,1083],{},[1068,1079,1080],{},[223,1081,1082],{},"soft-delete.ts",[1068,1084,1085],{},"Add soft delete behavior to models.",[1052,1087,1088,1093],{},[1068,1089,1090],{},[223,1091,1092],{},"audit.ts",[1068,1094,1095],{},"Add created by \u002F updated by metadata.",[1052,1097,1098,1103],{},[1068,1099,1100],{},[223,1101,1102],{},"slug.ts",[1068,1104,1105],{},"Generate slugs from model fields.",[215,1107,1109],{"id":1108},"best-practices","Best Practices",[183,1111,1112],{},"Keep plugins small and focused.",[183,1114,1115],{},"A plugin should generally handle one reusable behavior.",[183,1117,1118],{},"Avoid putting business-specific logic inside global plugins. Business rules should usually live inside services.",[267,1120,1122],{"color":1121,"icon":8},"info",[183,1123,1124],{},"Plugins are best used for shared database behaviors, not application workflows.",[215,1126,1128],{"id":1127},"philosophy","Philosophy",[183,1130,1131],{},"Plugins help OpenSya keep database logic modular and reusable.",[183,1133,1134],{},"They allow recruitment and business infrastructures to evolve consistently while avoiding repeated schema logic across models.",[1136,1137,1138],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":234,"searchDepth":241,"depth":247,"links":1140},[1141,1142,1143,1144,1145,1146,1147],{"id":217,"depth":247,"text":218},{"id":275,"depth":247,"text":276},{"id":550,"depth":247,"text":551},{"id":998,"depth":247,"text":999},{"id":1037,"depth":247,"text":1038},{"id":1108,"depth":247,"text":1109},{"id":1127,"depth":247,"text":1128},"Learn how to create reusable database plugins with the OpenSya MongoDB runtime.","md",null,{},{"icon":70},{"title":67,"description":1148},"5EFacPEEWeYH-Sj0ZGa6dRnW5u22IdDRKQe5IblGGIo",[1156,1158],{"title":62,"path":63,"stem":64,"description":1157,"icon":65,"children":-1},"Learn how to define and orchestrate database models in OpenSya.",{"title":73,"path":74,"stem":75,"description":1159,"icon":76,"children":-1},"Learn how to define HTTP controllers with the OpenSya Nest runtime.",1779143770870]