[{"data":1,"prerenderedAt":1817},["ShallowReactive",2],{"navigation_docs":3,"-engineering-contributing-back-end-api-guidelines":348,"-engineering-contributing-back-end-api-guidelines-surround":1812},[4,8,68,98,216,245,259,280,344],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"icon":10,"path":11,"stem":12,"children":13,"page":63},"Company","i-lucide-building-2","\u002Fcompany","1.company",[14,18,22,26,30,34,38,42,46,50,64],{"title":15,"path":16,"stem":17},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":19,"path":20,"stem":21},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":23,"path":24,"stem":25},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":27,"path":28,"stem":29},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":31,"path":32,"stem":33},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":35,"path":36,"stem":37},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":39,"path":40,"stem":41},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":43,"path":44,"stem":45},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":47,"path":48,"stem":49},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":51,"path":52,"stem":53,"children":54,"page":63},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[55,59],{"title":56,"path":57,"stem":58},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":60,"path":61,"stem":62},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":65,"path":66,"stem":67},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":63},"People Ops","i-lucide-users","\u002Fpeople-ops","2.people-ops",[74,78,82,86,90,94],{"title":75,"path":76,"stem":77},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":79,"path":80,"stem":81},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":83,"path":84,"stem":85},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":87,"path":88,"stem":89},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":91,"path":92,"stem":93},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":95,"path":96,"stem":97},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":63},"Engineering","i-lucide-rocket","\u002Fengineering","3.engineering",[104,147,151,171,192,196,204,208,212],{"title":105,"path":106,"stem":107,"children":108,"page":63},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",[109,113,117,121,125,138],{"title":110,"path":111,"stem":112},"Development Setup","\u002Fengineering\u002Fcontributing\u002Fdevelopment-setup","3.engineering\u002Fcontributing\u002F1.development-setup",{"title":114,"path":115,"stem":116},"Engineering Operations","\u002Fengineering\u002Fcontributing\u002Fengineering-operations","3.engineering\u002Fcontributing\u002F2.engineering-operations",{"title":118,"path":119,"stem":120},"Documentation","\u002Fengineering\u002Fcontributing\u002Fdocumentation","3.engineering\u002Fcontributing\u002F3.documentation",{"title":122,"path":123,"stem":124},"Agentic Coding","\u002Fengineering\u002Fcontributing\u002Fagentic-coding","3.engineering\u002Fcontributing\u002Fagentic-coding",{"title":126,"path":127,"stem":128,"children":129,"page":63},"Back End","\u002Fengineering\u002Fcontributing\u002Fback-end","3.engineering\u002Fcontributing\u002Fback-end",[130,134],{"title":131,"path":132,"stem":133},"API Guidelines","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines","3.engineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines",{"title":135,"path":136,"stem":137},"LLM Prompts & Langfuse Integration","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts","3.engineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts",{"title":139,"path":140,"stem":141,"children":142,"page":63},"Front End","\u002Fengineering\u002Fcontributing\u002Ffront-end","3.engineering\u002Fcontributing\u002Ffront-end",[143],{"title":144,"path":145,"stem":146},"Testing","\u002Fengineering\u002Fcontributing\u002Ffront-end\u002Ftesting","3.engineering\u002Fcontributing\u002Ffront-end\u002Ftesting",{"title":148,"path":149,"stem":150},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":152,"path":153,"stem":154,"children":155},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[156,159,163,167],{"title":56,"path":157,"stem":158},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":160,"path":161,"stem":162},"Langfuse Deployment","\u002Fengineering\u002Fdeployment\u002Fecs-langfuse-deployment","3.engineering\u002Fdeployment\u002Fecs-langfuse-deployment",{"title":164,"path":165,"stem":166},"ESP Platform Configuration","\u002Fengineering\u002Fdeployment\u002Fesp-platform-configuration","3.engineering\u002Fdeployment\u002Fesp-platform-configuration",{"title":168,"path":169,"stem":170},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":172,"path":173,"stem":174,"children":175,"page":63},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[176,180,184,188],{"title":177,"path":178,"stem":179},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":181,"path":182,"stem":183},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":185,"path":186,"stem":187},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":189,"path":190,"stem":191},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":193,"path":194,"stem":195},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":168,"path":197,"stem":198,"children":199,"page":63},"\u002Fengineering\u002Fplatform","3.engineering\u002Fplatform",[200],{"title":201,"path":202,"stem":203},"useAPI","\u002Fengineering\u002Fplatform\u002Fuse-api","3.engineering\u002Fplatform\u002Fuse-api",{"title":205,"path":206,"stem":207},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":209,"path":210,"stem":211},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":213,"path":214,"stem":215},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":217,"icon":218,"path":219,"stem":220,"children":221,"page":63},"Design","i-lucide-palette","\u002Fdesign","4.design",[222,226,230,234,238,241],{"title":223,"path":224,"stem":225},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002F1.design-thinking",{"title":227,"path":228,"stem":229},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002F2.figma-structure",{"title":231,"path":232,"stem":233},"Design & Development","\u002Fdesign\u002Fdesign-and-development","4.design\u002F3.design-and-development",{"title":235,"path":236,"stem":237},"Branding","\u002Fdesign\u002Fbranding","4.design\u002F4.branding",{"title":213,"path":239,"stem":240},"\u002Fdesign\u002Ftools","4.design\u002F5.tools",{"title":242,"path":243,"stem":244},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002F6.working-with-customers",{"title":246,"icon":247,"path":248,"stem":249,"children":250,"page":63},"Sales","i-lucide-dollar-sign","\u002Fsales","4.sales",[251,255],{"title":252,"path":253,"stem":254},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":256,"path":257,"stem":258},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":63},"Marketing","i-lucide-book-image","\u002Fmarketing","5.marketing",[265,269,273,276],{"title":266,"path":267,"stem":268},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":270,"path":271,"stem":272},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":274,"stem":275},"\u002Fmarketing\u002Ftools","5.marketing\u002Ftools",{"title":277,"path":278,"stem":279},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":63},"AI & Data Ops","i-lucide-database","\u002Fdata-ops","6.data-ops",[286,294,298,323,340],{"title":56,"path":287,"stem":288,"children":289,"page":63},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[290],{"title":291,"path":292,"stem":293},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":295,"path":296,"stem":297},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":299,"path":300,"stem":301,"children":302,"page":63},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[303,307,311,315,319],{"title":304,"path":305,"stem":306},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":308,"path":309,"stem":310},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":312,"path":313,"stem":314},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":316,"path":317,"stem":318},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":320,"path":321,"stem":322},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":324,"path":325,"stem":326,"children":327,"page":63},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[328,332,336],{"title":329,"path":330,"stem":331},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":333,"path":334,"stem":335},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":337,"path":338,"stem":339},"Evaluating Agents","\u002Fdata-ops\u002Fllm-ops\u002Fevaluations","6.data-ops\u002Fllm-ops\u002F3.evaluations",{"title":341,"path":342,"stem":343},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":345,"path":346,"stem":347},"Glossary","\u002Fglossary","glossary",{"id":349,"title":131,"body":350,"description":1805,"extension":1806,"links":1807,"meta":1808,"navigation":1809,"path":132,"seo":1810,"stem":133,"__hash__":1811},"docs\u002F3.engineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines.md",{"type":351,"value":352,"toc":1784},"minimark",[353,362,366,371,377,613,619,990,1002,1005,1008,1011,1018,1023,1030,1035,1038,1054,1059,1073,1081,1091,1097,1100,1102,1109,1115,1121,1124,1130,1136,1139,1145,1147,1154,1157,1164,1167,1173,1186,1192,1198,1204,1214,1220,1226,1229,1239,1244,1247,1253,1264,1269,1272,1278,1286,1288,1295,1306,1314,1384,1389,1395,1441,1444,1446,1453,1456,1462,1468,1474,1491,1495,1498,1523,1527,1534,1547,1553,1577,1579,1586,1589,1592,1768,1771,1773,1780],[354,355,357,358],"h2",{"id":356},"principle-1-what-comes-out-must-be-a-superset-of-what-goes-in","Principle 1 - ",[359,360,361],"strong",{},"What comes out must be a superset of what goes in",[363,364,365],"p",{},"This principle means that the output data transfer object (DTO) returned from our APIs should always include everything from the input DTO, plus any additional data. Both the structure and field names must match. This approach ensures that consumers, like the frontend or other integrations, can take the output object, modify its values, and send it back to our update endpoints without needing any conversion. The system will handle any extra fields by simply ignoring them when they aren’t needed.",[367,368,370],"h3",{"id":369},"example","Example:",[363,372,373,376],{},[359,374,375],{},"Input DTO"," (object sent to the API e.g. create endpoint):",[378,379,384],"pre",{"className":380,"code":381,"language":382,"meta":383,"style":383},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"taxMode\": \"EXCLUSIVE\",\n  \"taxRate\": 20.0,\n  \"purchase\": {\n    \"amount\": 50000.00\n  },\n  \"renewal\": {\n    \"amount\": 60000.00\n  },\n  \"lineItems\": [\n    {\n      \"product\": {\n        \"id\": \"baa5aabe-3ad5-4200-a6a7-6bd6a2f31723\"\n      },\n      \"units\": 100    \n    }\n  ]\n}\n","json","",[385,386,387,396,424,442,457,474,480,494,508,513,528,534,549,570,576,595,601,607],"code",{"__ignoreMap":383},[388,389,392],"span",{"class":390,"line":391},"line",1,[388,393,395],{"class":394},"sMK4o","{\n",[388,397,399,402,406,409,412,415,419,421],{"class":390,"line":398},2,[388,400,401],{"class":394},"  \"",[388,403,405],{"class":404},"spNyl","taxMode",[388,407,408],{"class":394},"\"",[388,410,411],{"class":394},":",[388,413,414],{"class":394}," \"",[388,416,418],{"class":417},"sfazB","EXCLUSIVE",[388,420,408],{"class":394},[388,422,423],{"class":394},",\n",[388,425,427,429,432,434,436,440],{"class":390,"line":426},3,[388,428,401],{"class":394},[388,430,431],{"class":404},"taxRate",[388,433,408],{"class":394},[388,435,411],{"class":394},[388,437,439],{"class":438},"sbssI"," 20.0",[388,441,423],{"class":394},[388,443,445,447,450,452,454],{"class":390,"line":444},4,[388,446,401],{"class":394},[388,448,449],{"class":404},"purchase",[388,451,408],{"class":394},[388,453,411],{"class":394},[388,455,456],{"class":394}," {\n",[388,458,460,463,467,469,471],{"class":390,"line":459},5,[388,461,462],{"class":394},"    \"",[388,464,466],{"class":465},"sBMFI","amount",[388,468,408],{"class":394},[388,470,411],{"class":394},[388,472,473],{"class":438}," 50000.00\n",[388,475,477],{"class":390,"line":476},6,[388,478,479],{"class":394},"  },\n",[388,481,483,485,488,490,492],{"class":390,"line":482},7,[388,484,401],{"class":394},[388,486,487],{"class":404},"renewal",[388,489,408],{"class":394},[388,491,411],{"class":394},[388,493,456],{"class":394},[388,495,497,499,501,503,505],{"class":390,"line":496},8,[388,498,462],{"class":394},[388,500,466],{"class":465},[388,502,408],{"class":394},[388,504,411],{"class":394},[388,506,507],{"class":438}," 60000.00\n",[388,509,511],{"class":390,"line":510},9,[388,512,479],{"class":394},[388,514,516,518,521,523,525],{"class":390,"line":515},10,[388,517,401],{"class":394},[388,519,520],{"class":404},"lineItems",[388,522,408],{"class":394},[388,524,411],{"class":394},[388,526,527],{"class":394}," [\n",[388,529,531],{"class":390,"line":530},11,[388,532,533],{"class":394},"    {\n",[388,535,537,540,543,545,547],{"class":390,"line":536},12,[388,538,539],{"class":394},"      \"",[388,541,542],{"class":465},"product",[388,544,408],{"class":394},[388,546,411],{"class":394},[388,548,456],{"class":394},[388,550,552,555,558,560,562,564,567],{"class":390,"line":551},13,[388,553,554],{"class":394},"        \"",[388,556,557],{"class":438},"id",[388,559,408],{"class":394},[388,561,411],{"class":394},[388,563,414],{"class":394},[388,565,566],{"class":417},"baa5aabe-3ad5-4200-a6a7-6bd6a2f31723",[388,568,569],{"class":394},"\"\n",[388,571,573],{"class":390,"line":572},14,[388,574,575],{"class":394},"      },\n",[388,577,579,581,584,586,588,591],{"class":390,"line":578},15,[388,580,539],{"class":394},[388,582,583],{"class":465},"units",[388,585,408],{"class":394},[388,587,411],{"class":394},[388,589,590],{"class":438}," 100",[388,592,594],{"class":593},"sTEyZ","    \n",[388,596,598],{"class":390,"line":597},16,[388,599,600],{"class":394},"    }\n",[388,602,604],{"class":390,"line":603},17,[388,605,606],{"class":394},"  ]\n",[388,608,610],{"class":390,"line":609},18,[388,611,612],{"class":394},"}\n",[363,614,615,618],{},[359,616,617],{},"Output DTO"," (object returned from the API):",[378,620,622],{"className":380,"code":621,"language":382,"meta":383,"style":383},"{\n  \"id\": \"253fe637-3c94-4f84-90fc-b79be8dab72a\",\n  \"taxMode\": \"EXCLUSIVE\",\n  \"taxRate\": 20.0,\n  \"purchase\": {\n    \"amount\": 50000.00,\n    \"totalNetAmount\": 50000.00,\n    \"totalTaxAmount\": 10000.00,\n    \"totalGrossAmount\": 60000.00\n  },\n  \"renewal\": {\n    \"amount\": 60000.00,\n    \"totalNetAmount\": 60000.00,\n    \"totalTaxAmount\": 12000.00,\n    \"totalGrossAmount\": 72000.00\n  },\n  \"lineItems\": [\n    {\n      \"product\": {\n        \"id\": \"baa5aabe-3ad5-4200-a6a7-6bd6a2f31723\",\n        \"name\": \"Symantec Endpoint Protection\",\n        \"vendor\": {\n          \"id\": \"8a998787-052b-44fc-81b7-e351b1f26adc\",\n          \"name\": \"Broadcom\"\n        }\n      },\n      \"units\": 100\n    }\n  ]\n}\n",[385,623,624,628,647,665,679,691,706,721,737,750,754,766,781,795,810,823,827,839,843,856,875,896,910,932,950,956,961,975,980,985],{"__ignoreMap":383},[388,625,626],{"class":390,"line":391},[388,627,395],{"class":394},[388,629,630,632,634,636,638,640,643,645],{"class":390,"line":398},[388,631,401],{"class":394},[388,633,557],{"class":404},[388,635,408],{"class":394},[388,637,411],{"class":394},[388,639,414],{"class":394},[388,641,642],{"class":417},"253fe637-3c94-4f84-90fc-b79be8dab72a",[388,644,408],{"class":394},[388,646,423],{"class":394},[388,648,649,651,653,655,657,659,661,663],{"class":390,"line":426},[388,650,401],{"class":394},[388,652,405],{"class":404},[388,654,408],{"class":394},[388,656,411],{"class":394},[388,658,414],{"class":394},[388,660,418],{"class":417},[388,662,408],{"class":394},[388,664,423],{"class":394},[388,666,667,669,671,673,675,677],{"class":390,"line":444},[388,668,401],{"class":394},[388,670,431],{"class":404},[388,672,408],{"class":394},[388,674,411],{"class":394},[388,676,439],{"class":438},[388,678,423],{"class":394},[388,680,681,683,685,687,689],{"class":390,"line":459},[388,682,401],{"class":394},[388,684,449],{"class":404},[388,686,408],{"class":394},[388,688,411],{"class":394},[388,690,456],{"class":394},[388,692,693,695,697,699,701,704],{"class":390,"line":476},[388,694,462],{"class":394},[388,696,466],{"class":465},[388,698,408],{"class":394},[388,700,411],{"class":394},[388,702,703],{"class":438}," 50000.00",[388,705,423],{"class":394},[388,707,708,710,713,715,717,719],{"class":390,"line":482},[388,709,462],{"class":394},[388,711,712],{"class":465},"totalNetAmount",[388,714,408],{"class":394},[388,716,411],{"class":394},[388,718,703],{"class":438},[388,720,423],{"class":394},[388,722,723,725,728,730,732,735],{"class":390,"line":496},[388,724,462],{"class":394},[388,726,727],{"class":465},"totalTaxAmount",[388,729,408],{"class":394},[388,731,411],{"class":394},[388,733,734],{"class":438}," 10000.00",[388,736,423],{"class":394},[388,738,739,741,744,746,748],{"class":390,"line":510},[388,740,462],{"class":394},[388,742,743],{"class":465},"totalGrossAmount",[388,745,408],{"class":394},[388,747,411],{"class":394},[388,749,507],{"class":438},[388,751,752],{"class":390,"line":515},[388,753,479],{"class":394},[388,755,756,758,760,762,764],{"class":390,"line":530},[388,757,401],{"class":394},[388,759,487],{"class":404},[388,761,408],{"class":394},[388,763,411],{"class":394},[388,765,456],{"class":394},[388,767,768,770,772,774,776,779],{"class":390,"line":536},[388,769,462],{"class":394},[388,771,466],{"class":465},[388,773,408],{"class":394},[388,775,411],{"class":394},[388,777,778],{"class":438}," 60000.00",[388,780,423],{"class":394},[388,782,783,785,787,789,791,793],{"class":390,"line":551},[388,784,462],{"class":394},[388,786,712],{"class":465},[388,788,408],{"class":394},[388,790,411],{"class":394},[388,792,778],{"class":438},[388,794,423],{"class":394},[388,796,797,799,801,803,805,808],{"class":390,"line":572},[388,798,462],{"class":394},[388,800,727],{"class":465},[388,802,408],{"class":394},[388,804,411],{"class":394},[388,806,807],{"class":438}," 12000.00",[388,809,423],{"class":394},[388,811,812,814,816,818,820],{"class":390,"line":578},[388,813,462],{"class":394},[388,815,743],{"class":465},[388,817,408],{"class":394},[388,819,411],{"class":394},[388,821,822],{"class":438}," 72000.00\n",[388,824,825],{"class":390,"line":597},[388,826,479],{"class":394},[388,828,829,831,833,835,837],{"class":390,"line":603},[388,830,401],{"class":394},[388,832,520],{"class":404},[388,834,408],{"class":394},[388,836,411],{"class":394},[388,838,527],{"class":394},[388,840,841],{"class":390,"line":609},[388,842,533],{"class":394},[388,844,846,848,850,852,854],{"class":390,"line":845},19,[388,847,539],{"class":394},[388,849,542],{"class":465},[388,851,408],{"class":394},[388,853,411],{"class":394},[388,855,456],{"class":394},[388,857,859,861,863,865,867,869,871,873],{"class":390,"line":858},20,[388,860,554],{"class":394},[388,862,557],{"class":438},[388,864,408],{"class":394},[388,866,411],{"class":394},[388,868,414],{"class":394},[388,870,566],{"class":417},[388,872,408],{"class":394},[388,874,423],{"class":394},[388,876,878,880,883,885,887,889,892,894],{"class":390,"line":877},21,[388,879,554],{"class":394},[388,881,882],{"class":438},"name",[388,884,408],{"class":394},[388,886,411],{"class":394},[388,888,414],{"class":394},[388,890,891],{"class":417},"Symantec Endpoint Protection",[388,893,408],{"class":394},[388,895,423],{"class":394},[388,897,899,901,904,906,908],{"class":390,"line":898},22,[388,900,554],{"class":394},[388,902,903],{"class":438},"vendor",[388,905,408],{"class":394},[388,907,411],{"class":394},[388,909,456],{"class":394},[388,911,913,916,919,921,923,925,928,930],{"class":390,"line":912},23,[388,914,915],{"class":394},"          \"",[388,917,557],{"class":918},"swJcz",[388,920,408],{"class":394},[388,922,411],{"class":394},[388,924,414],{"class":394},[388,926,927],{"class":417},"8a998787-052b-44fc-81b7-e351b1f26adc",[388,929,408],{"class":394},[388,931,423],{"class":394},[388,933,935,937,939,941,943,945,948],{"class":390,"line":934},24,[388,936,915],{"class":394},[388,938,882],{"class":918},[388,940,408],{"class":394},[388,942,411],{"class":394},[388,944,414],{"class":394},[388,946,947],{"class":417},"Broadcom",[388,949,569],{"class":394},[388,951,953],{"class":390,"line":952},25,[388,954,955],{"class":394},"        }\n",[388,957,959],{"class":390,"line":958},26,[388,960,575],{"class":394},[388,962,964,966,968,970,972],{"class":390,"line":963},27,[388,965,539],{"class":394},[388,967,583],{"class":465},[388,969,408],{"class":394},[388,971,411],{"class":394},[388,973,974],{"class":438}," 100\n",[388,976,978],{"class":390,"line":977},28,[388,979,600],{"class":394},[388,981,983],{"class":390,"line":982},29,[388,984,606],{"class":394},[388,986,988],{"class":390,"line":987},30,[388,989,612],{"class":394},[363,991,992,993,995,996,998,999,1001],{},"In this example, the output object contains all the data from the input object, but also includes additional calculated fields such as ",[385,994,712],{},", ",[385,997,727],{},", and ",[385,1000,743],{},", as well as extra details like product and vendor names.",[363,1003,1004],{},"Crucially, the output object can be sent back to an update endpoint without causing issues—any extra fields not needed for the update will be safely ignored.",[363,1006,1007],{},"**This structure and field naming should also be reflected at the entity layer were possible, ensuring consistent sorting, queries and filtering. Use embeddable entity objects when needed to achieve this. **",[1009,1010],"hr",{},[354,1012,1014,1015],{"id":1013},"principle-2-use-plural-nouns-for-resource-names","Principle 2: ",[359,1016,1017],{},"Use Plural Nouns for Resource Names",[363,1019,1020],{},[359,1021,1022],{},"Consistency",[363,1024,1025,1026,1029],{},"Always use plural nouns in API paths to represent collections of resources (e.g., ",[385,1027,1028],{},"\u002Fapi\u002Fv1\u002Fcars","). This is a widely accepted convention in RESTful API design, making it easier for developers to understand and predict the structure of your API.",[363,1031,1032,411],{},[359,1033,1034],{},"Resource Representation",[363,1036,1037],{},"Each API path should clearly represent a resource or a collection of resources. Naming should be intuitive and domain-specific, ensuring that paths are easy to navigate and self-explanatory for developers. For example:",[1039,1040,1041,1048],"ul",{},[1042,1043,1044,1047],"li",{},[385,1045,1046],{},"\u002Fapi\u002Fv1\u002Fusers"," – A collection of user resources.",[1042,1049,1050,1053],{},[385,1051,1052],{},"\u002Fapi\u002Fv1\u002Fproducts"," – A collection of product resources.",[363,1055,1056],{},[359,1057,1058],{},"Casing:",[363,1060,1061,1064,1065,1068,1069,1072],{},[359,1062,1063],{},"URL Paths",": Should always use ",[359,1066,1067],{},"lowercase"," and ",[359,1070,1071],{},"kebab-case"," (words separated by hyphens) for resource names that require multiple words.",[378,1074,1079],{"className":1075,"code":1077,"language":1078},[1076],"language-text","\u002Fapi\u002Fv1\u002Fuse-cases\n","text",[385,1080,1077],{"__ignoreMap":383},[363,1082,1083,1086,1087,1090],{},[359,1084,1085],{},"Query Parameters",": To maintain consistency with the Data Transfer Object (DTO) structure, query parameters should use ",[359,1088,1089],{},"CamelCase"," for multi-word parameters.",[378,1092,1095],{"className":1093,"code":1094,"language":1078},[1076],"\u002Fapi\u002Fv1\u002Fuse-cases?createdBy=carlo\n",[385,1096,1094],{"__ignoreMap":383},[363,1098,1099],{},"By following these conventions, your API will be more consistent, predictable, and user-friendly, enhancing the developer experience and reducing the likelihood of errors or misunderstandings in API usage.",[1009,1101],{},[354,1103,1105,1106],{"id":1104},"principle-3-avoid-deeply-nested-routes","Principle 3: ",[359,1107,1108],{},"Avoid Deeply Nested Routes",[363,1110,1111,1114],{},[359,1112,1113],{},"Flat Structure for Simplicity",": Deeply nested paths, such as:",[378,1116,1119],{"className":1117,"code":1118,"language":1078},[1076],"\u002Fapi\u002Fv1\u002Fmanufacturers\u002F\u003CmanufacturerId>\u002Fcars\n",[385,1120,1118],{"__ignoreMap":383},[363,1122,1123],{},"can become difficult to manage, especially as the complexity of relationships increases. Instead of creating deeply nested routes, opt for a flat structure and use query parameters to filter results by related entities.",[363,1125,1126,1129],{},[359,1127,1128],{},"Example",": Rather than using the nested route above, use:",[378,1131,1134],{"className":1132,"code":1133,"language":1078},[1076],"\u002Fapi\u002Fv1\u002Fcars?manufacturerId=\u003CmanufacturerId>\n",[385,1135,1133],{"__ignoreMap":383},[363,1137,1138],{},"This approach not only simplifies the structure but also makes the API more flexible and reusable. It allows you to reduce the number of unique endpoints, making maintenance easier while still enabling the ability to filter data based on relationships.",[363,1140,1141,1144],{},[359,1142,1143],{},"Performance Considerations",": Nested routes can imply complex database joins or hierarchical relationships that may slow down performance. By using a flat structure with query parameters, you can enable more efficient filtering and database querying, avoiding unnecessary complexity in both your API and the underlying database queries.",[1009,1146],{},[354,1148,1150,1151],{"id":1149},"principle-4-consistent-object-naming-input-output-entity","Principle 4: ",[359,1152,1153],{},"Consistent Object Naming (Input, Output, Entity)",[363,1155,1156],{},"Consistent naming conventions enhance code readability and maintainability. This principle outlines our standards for naming Data Transfer Objects (DTOs), entities, and embedded objects in our codebase.",[1158,1159,1161],"h4",{"id":1160},"input-dtos",[359,1162,1163],{},"Input DTOs",[363,1165,1166],{},"Data Transfer Objects responsible for accepting user input (used in updating or modifying actions) should be named using the following convention:",[378,1168,1171],{"className":1169,"code":1170,"language":1078},[1076],"\u003CobjectName>Input\n",[385,1172,1170],{"__ignoreMap":383},[363,1174,1175,1177,1178,1181,1182,1185],{},[359,1176,1128],{},": For an entity ",[385,1179,1180],{},"Vendor",", the input DTO should be named ",[385,1183,1184],{},"VendorInput",".",[1158,1187,1189],{"id":1188},"validation-on-input-dtos",[359,1190,1191],{},"Validation on Input DTOs",[363,1193,1194,1197],{},[359,1195,1196],{},"Mandatory Validation",": Input DTOs must have extensive validation annotations to ensure all input is correctly parsed and invalid data is rejected.",[363,1199,1200,1203],{},[359,1201,1202],{},"Complex Validation",": For validation that cannot be handled via annotations, perform checks during the conversion from DTO to entity.",[363,1205,1206,1209,1210,1213],{},[359,1207,1208],{},"Error Handling",": Use ",[385,1211,1212],{},"FieldErrorException"," to throw validation errors, specifying the relevant field name.",[378,1215,1218],{"className":1216,"code":1217,"language":1078},[1076],"FieldErrorException.throwWith(\n    entity.getClass(),\n    \"label\",\n    String.format(\"A rating with label '%s' already exists!\", entity.getLabel())\n);\n",[385,1219,1217],{"__ignoreMap":383},[1158,1221,1223],{"id":1222},"output-dtos",[359,1224,1225],{},"Output DTOs",[363,1227,1228],{},"Output DTOs (used for returning data to the user) should be named directly, without any suffix.",[363,1230,1231,1209,1233,1235,1236,1238],{},[359,1232,1128],{},[385,1234,1180],{}," rather than ",[385,1237,1184],{}," for output DTOs",[363,1240,1241],{},[359,1242,1243],{},"Entity Names",[363,1245,1246],{},"Entity names should simply follow the same name as the output DTO’s but with the word entity appended:",[378,1248,1251],{"className":1249,"code":1250,"language":1078},[1076],"\u003CobjectName>Entity\n",[385,1252,1250],{"__ignoreMap":383},[363,1254,1255,1257,1258,1260,1261,1185],{},[359,1256,370],{}," For a ",[385,1259,1180],{}," entity, the class name should be ",[385,1262,1263],{},"VendorEntity",[363,1265,1266],{},[359,1267,1268],{},"Embeddable Data Objects",[363,1270,1271],{},"When using embeddable data objects in hibernate these should be appended with the following:",[378,1273,1276],{"className":1274,"code":1275,"language":1078},[1076],"\u003CobjectName>Data\n",[385,1277,1275],{"__ignoreMap":383},[363,1279,1280,1282,1283,1185],{},[359,1281,370],{}," An embeddable address object should be named ",[385,1284,1285],{},"AddressData",[1009,1287],{},[354,1289,1291,1292],{"id":1290},"principle-5-field-naming-standard","Principle 5: ",[359,1293,1294],{},"Field Naming Standard",[363,1296,1297,1298,1301,1302,1305],{},"Field names should always start with the ",[359,1299,1300],{},"noun"," (what it is), followed by any ",[359,1303,1304],{},"modifiers",". This ensures that the output JSON can be easily viewed in alphabetical order, grouping related fields together.",[1039,1307,1308],{},[1042,1309,1310,1313],{},[359,1311,1312],{},"Rationale",": Unlike English, where descriptors come before the noun (e.g., \"beautiful fast red car\"), starting with the noun in code helps with sorting and readability.",[1315,1316,1317,1330],"table",{},[1318,1319,1320],"thead",{},[1321,1322,1323,1327],"tr",{},[1324,1325,1326],"th",{},"Correct Field Name",[1324,1328,1329],{},"Incorrect Field Name",[1331,1332,1333,1348,1360,1372],"tbody",{},[1321,1334,1335,1342],{},[1336,1337,1338,1339],"td",{},"✅",[385,1340,1341],{},"carColor",[1336,1343,1344,1345],{},"❌",[385,1346,1347],{},"colorCar",[1321,1349,1350,1355],{},[1336,1351,1338,1352],{},[385,1353,1354],{},"userAge",[1336,1356,1344,1357],{},[385,1358,1359],{},"ageUser",[1321,1361,1362,1367],{},[1336,1363,1338,1364],{},[385,1365,1366],{},"productPrice",[1336,1368,1344,1369],{},[385,1370,1371],{},"priceProduct",[1321,1373,1374,1379],{},[1336,1375,1338,1376],{},[385,1377,1378],{},"orderDate",[1336,1380,1344,1381],{},[385,1382,1383],{},"dateOrder",[363,1385,1386],{},[359,1387,1388],{},"Do not repeat the object name at field level",[363,1390,1391,1392],{},"When creating objects consider that the object name already represents what it is and repeating this at the field \u002F attribute level does not make sense e.g. consider a ",[359,1393,1394],{},"product object:",[1315,1396,1397,1405],{},[1318,1398,1399],{},[1321,1400,1401,1403],{},[1324,1402,1326],{},[1324,1404,1329],{},[1331,1406,1407,1418,1429],{},[1321,1408,1409,1413],{},[1336,1410,1338,1411],{},[385,1412,557],{},[1336,1414,1344,1415],{},[385,1416,1417],{},"productId",[1321,1419,1420,1424],{},[1336,1421,1338,1422],{},[385,1423,882],{},[1336,1425,1344,1426],{},[385,1427,1428],{},"productName",[1321,1430,1431,1436],{},[1336,1432,1338,1433],{},[385,1434,1435],{},"description",[1336,1437,1344,1438],{},[385,1439,1440],{},"productDescription",[363,1442,1443],{},"By adhering to this field naming standard, we promote consistency and improve the maintainability of our codebase.",[1009,1445],{},[354,1447,1449,1450],{"id":1448},"principle-6-handle-relationships-with-care","Principle 6: ",[359,1451,1452],{},"Handle Relationships with Care",[363,1454,1455],{},"Effectively managing object relationships is crucial for building efficient APIs and responsive frontends. This principle provides guidelines on handling parent-child relationships in Data Transfer Objects (DTOs) to include necessary information without overcomplicating data structures.",[363,1457,1458,1461],{},[359,1459,1460],{},"Include Essential Parent Information","\nFor many-to-one relationships (child to parent), include minimal essential details about parent objects in your DTOs. This enables the frontend to display necessary data with a single request.",[363,1463,1464,1467],{},[359,1465,1466],{},"Example: Vendor > Product > Feature","\nConsider a Feature object associated with a Product and a Vendor. The Feature DTO should include key details of its parent Product and Vendor:",[378,1469,1472],{"className":1470,"code":1471,"language":1078},[1076],"{\n  \"id\": \"258f4d05-534b-4bca-8c2d-63d88da5cb82\",\n  \"name\": \"SSL Interception\",\n  \"description\": \"This is an example description\",\n  \"product\": {\n    \"id\": \"0013c5e7-277c-442b-a375-9071ec853897\",\n    \"name\": \"ProxySG\",\n    \"vendor\": {\n      \"id\": \"fd8adaa7-65cd-4e0f-a7ac-4b6f4b24e4b4\",\n      \"name\": \"Broadcom\"\n    }\n  }\n}\n",[385,1473,1471],{"__ignoreMap":383},[1039,1475,1476,1482],{},[1042,1477,1478,1481],{},[359,1479,1480],{},"Benefit",": The frontend can display all necessary information without additional API calls.",[1042,1483,1484,1487,1488,1185],{},[359,1485,1486],{},"Alignment",": This follows ",[359,1489,1490],{},"Principle 1: What comes out must be a superset of what goes in",[354,1492,1494],{"id":1493},"limit-nesting-depth","Limit Nesting Depth",[363,1496,1497],{},"While including parent information is beneficial, limit the depth of nested relationships to maintain performance and clarity.",[1039,1499,1500,1511,1517],{},[1042,1501,1502,1505,1506,995,1508,1510],{},[359,1503,1504],{},"Provide Minimal Data",": Include only essential fields (e.g., ",[385,1507,557],{},[385,1509,882],{},").",[1042,1512,1513,1516],{},[359,1514,1515],{},"Avoid Over-Nesting",": Limit nesting to immediate parents unless deeper data is required.",[1042,1518,1519,1522],{},[359,1520,1521],{},"Consider UI Needs",": Include data necessary for the frontend",[354,1524,1526],{"id":1525},"handle-one-to-many-relationships-separately","Handle One-to-Many Relationships Separately",[363,1528,1529,1530,1533],{},"For ",[359,1531,1532],{},"one-to-many relationships"," (parent to multiple children), avoid embedding all child objects within the parent DTO.",[1039,1535,1536],{},[1042,1537,1538,1541,1542,1545,411],{},[359,1539,1540],{},"Use Separate Endpoints",": Frontend should fetch child data through dedicated, paginated endpoints.",[1543,1544],"br",{},[359,1546,1128],{},[378,1548,1551],{"className":1549,"code":1550,"language":1078},[1076],"GET \u002Fapi\u002Fv1\u002Fproducts?vendorId=\u003CvendorId>\n",[385,1552,1550],{"__ignoreMap":383},[1039,1554,1555,1569],{},[1042,1556,1557,1560,1561],{},[359,1558,1559],{},"Benefits",":\n",[1039,1562,1563,1566],{},[1042,1564,1565],{},"Reduces payload size and improves response times.",[1042,1567,1568],{},"Allows clients to control data volume via pagination.",[1042,1570,1571,1573,1574,1185],{},[359,1572,1486],{},": This aligns with ",[359,1575,1576],{},"Principle 3: Avoid Deeply Nested Routes",[1009,1578],{},[354,1580,1582,1583],{"id":1581},"principle-7-follow-crud-principles-for-public-apis","Principle 7: ",[359,1584,1585],{},"Follow CRUD Principles for Public API’s",[363,1587,1588],{},"Following CRUD principles ensures that your API aligns with well-known standards, making it easier for developers to understand and predict the behavior of your endpoints based on the HTTP methods used. Each method corresponds to a specific type of operation (Create, Read, Update, Delete), which provides consistency and clarity.",[363,1590,1591],{},"Here's a table that outlines the HTTP methods aligned with our CRUD operations :",[1315,1593,1594,1621],{},[1318,1595,1596],{},[1321,1597,1598,1603,1608,1611,1616],{},[1324,1599,1600],{},[359,1601,1602],{},"Method",[1324,1604,1605],{},[359,1606,1607],{},"Naming Convention",[1324,1609,1610],{},"**Response **",[1324,1612,1613],{},[359,1614,1615],{},"Example Path",[1324,1617,1618],{},[359,1619,1620],{},"Endpoint Description",[1331,1622,1623,1643,1660,1678,1695,1715,1732,1749],{},[1321,1624,1625,1628,1634,1637,1640],{},[1336,1626,1627],{},"GET",[1336,1629,1630,1631],{},"[resourceName]",[359,1632,1633],{},"Options",[1336,1635,1636],{},"Single",[1336,1638,1639],{},"\u002Fapi\u002Fv1\u002Fcontracts\u002Foptions",[1336,1641,1642],{},"Provides input options for the given resource.",[1321,1644,1645,1647,1652,1654,1657],{},[1336,1646,1627],{},[1336,1648,1630,1649],{},[359,1650,1651],{},"Summary",[1336,1653,1636],{},[1336,1655,1656],{},"\u002Fapi\u002Fv1\u002Fcontracts\u002Fsummary",[1336,1658,1659],{},"Provides a single summary of all resources of the given type.",[1321,1661,1662,1664,1669,1672,1675],{},[1336,1663,1627],{},[1336,1665,1630,1666],{},[359,1667,1668],{},"List",[1336,1670,1671],{},"Collection",[1336,1673,1674],{},"\u002Fapi\u002Fv1\u002Fcontracts",[1336,1676,1677],{},"Lists all records of the given resource, normally paginated.",[1321,1679,1680,1682,1687,1689,1692],{},[1336,1681,1627],{},[1336,1683,1630,1684],{},[359,1685,1686],{},"Get",[1336,1688,1636],{},[1336,1690,1691],{},"\u002Fapi\u002Fv1\u002Fcontracts\u002F\u003Cid>",[1336,1693,1694],{},"Gets a specific instance of the given object by id.",[1321,1696,1697,1700,1705,1707,1709],{},[1336,1698,1699],{},"POST",[1336,1701,1630,1702],{},[359,1703,1704],{},"Create",[1336,1706,1636],{},[1336,1708,1674],{},[1336,1710,1711,1714],{},[359,1712,1713],{},"Strictly creates"," a new instance of the given object.",[1321,1716,1717,1720,1725,1727,1729],{},[1336,1718,1719],{},"PUT",[1336,1721,1630,1722],{},[359,1723,1724],{},"Update",[1336,1726,1636],{},[1336,1728,1691],{},[1336,1730,1731],{},"Updates a specific instance of the given object by id.",[1321,1733,1734,1737,1742,1744,1746],{},[1336,1735,1736],{},"DELETE",[1336,1738,1630,1739],{},[359,1740,1741],{},"Delete",[1336,1743,1636],{},[1336,1745,1691],{},[1336,1747,1748],{},"Deletes a specific instance of the given object by id.",[1321,1750,1751,1754,1760,1762,1765],{},[1336,1752,1753],{},"PATCH",[1336,1755,1756,1757],{},"[functionName]",[359,1758,1759],{},"Action",[1336,1761,1636],{},[1336,1763,1764],{},"\u002Fapi\u002Fv1\u002Fcontracts\u002Fbulk-renew",[1336,1766,1767],{},"Perform an encapsulated modifying action. e.g. sending an email reminder that updates ‘lastNotifiedOn’",[363,1769,1770],{},"This structure promotes consistency, predictability, and clarity, making the API more user-friendly for developers consuming it.",[1009,1772],{},[354,1774,1776,1777],{"id":1775},"principle-8-global-scoped-queries","Principle 8: Global & ",[359,1778,1779],{},"Scoped Queries",[1781,1782,1783],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":383,"searchDepth":398,"depth":398,"links":1785},[1786,1790,1792,1793,1795,1797,1799,1800,1801,1803],{"id":356,"depth":398,"text":1787,"children":1788},"Principle 1 - What comes out must be a superset of what goes in",[1789],{"id":369,"depth":426,"text":370},{"id":1013,"depth":398,"text":1791},"Principle 2: Use Plural Nouns for Resource Names",{"id":1104,"depth":398,"text":1576},{"id":1149,"depth":398,"text":1794},"Principle 4: Consistent Object Naming (Input, Output, Entity)",{"id":1290,"depth":398,"text":1796},"Principle 5: Field Naming Standard",{"id":1448,"depth":398,"text":1798},"Principle 6: Handle Relationships with Care",{"id":1493,"depth":398,"text":1494},{"id":1525,"depth":398,"text":1526},{"id":1581,"depth":398,"text":1802},"Principle 7: Follow CRUD Principles for Public API’s",{"id":1775,"depth":398,"text":1804},"Principle 8: Global & Scoped Queries","This guide provides a set of guidelines for designing and implementing APIs in the back-end of ESProfiler","md",null,{},true,{"title":131,"description":1805},"aOamMo65wJh0wECzqMjgDGI9i7Bjyy_zqS5JBZrX3NQ",[1813,1815],{"title":122,"path":123,"stem":124,"description":1814,"children":-1},"Best practices on using agentic coding in your local development environment.",{"title":135,"path":136,"stem":137,"description":1816,"children":-1},"Step-by-step guide for backend developers on adding new prompts, modifying existing prompts across platform-api and api-cps, integrating with Langfuse and esp-prompts, Quartz reload scheduling, and coordinating Data\u002FAI team benchmarking.",1789726612613]