[{"data":1,"prerenderedAt":361},["ShallowReactive",2],{"term-s\u002Fservice-layer":3,"related-s\u002Fservice-layer":346},{"id":4,"title":5,"acronym":6,"body":7,"category":327,"description":328,"difficulty":329,"extension":330,"letter":331,"meta":332,"navigation":333,"path":334,"related":335,"seo":340,"sitemap":341,"stem":344,"subcategory":6,"__hash__":345},"terms\u002Fterms\u002Fs\u002Fservice-layer.md","Service Layer",null,{"type":8,"value":9,"toc":321},"minimark",[10,15,19,23,26,30,310,314,317],[11,12,14],"h2",{"id":13},"eli5-the-vibe-check","ELI5 — The Vibe Check",[16,17,18],"p",{},"Service Layer is the middle manager of your app. Controllers receive HTTP requests and hand off to services. Services contain all the actual business logic. Repositories deal with the database. Services are the brain that orchestrates it all without getting their hands dirty.",[11,20,22],{"id":21},"real-talk","Real Talk",[16,24,25],{},"The Service Layer defines an application's boundary with a set of available operations from the perspective of interfacing client layers. It encapsulates business logic, controls transactions, and coordinates domain objects and repositories. Sits between controllers and repositories.",[11,27,29],{"id":28},"show-me-the-code","Show Me The Code",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Controller delegates to service\nclass UserController {\n  async createUser(req, res) {\n    const user = await this.userService.createUser(req.body);\n    res.json(user);\n  }\n}\n\u002F\u002F Service contains business logic\nclass UserService {\n  async createUser(data: CreateUserDto) {\n    await this.validator.validate(data);\n    const user = new User(data);\n    await this.emailService.sendWelcome(user);\n    return this.userRepository.save(user);\n  }\n}\n","typescript","",[38,39,40,49,64,92,136,156,162,168,174,184,206,230,253,276,300,305],"code",{"__ignoreMap":36},[41,42,45],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sHwdD","\u002F\u002F Controller delegates to service\n",[41,50,52,56,60],{"class":43,"line":51},2,[41,53,55],{"class":54},"spNyl","class",[41,57,59],{"class":58},"sBMFI"," UserController",[41,61,63],{"class":62},"sMK4o"," {\n",[41,65,67,70,74,77,81,84,87,90],{"class":43,"line":66},3,[41,68,69],{"class":54},"  async",[41,71,73],{"class":72},"swJcz"," createUser",[41,75,76],{"class":62},"(",[41,78,80],{"class":79},"sHdIc","req",[41,82,83],{"class":62},",",[41,85,86],{"class":79}," res",[41,88,89],{"class":62},")",[41,91,63],{"class":62},[41,93,95,98,102,105,109,112,115,118,122,124,126,128,131,133],{"class":43,"line":94},4,[41,96,97],{"class":54},"    const",[41,99,101],{"class":100},"sTEyZ"," user",[41,103,104],{"class":62}," =",[41,106,108],{"class":107},"s7zQu"," await",[41,110,111],{"class":62}," this.",[41,113,114],{"class":100},"userService",[41,116,117],{"class":62},".",[41,119,121],{"class":120},"s2Zo4","createUser",[41,123,76],{"class":72},[41,125,80],{"class":100},[41,127,117],{"class":62},[41,129,130],{"class":100},"body",[41,132,89],{"class":72},[41,134,135],{"class":62},";\n",[41,137,139,142,144,147,149,152,154],{"class":43,"line":138},5,[41,140,141],{"class":100},"    res",[41,143,117],{"class":62},[41,145,146],{"class":120},"json",[41,148,76],{"class":72},[41,150,151],{"class":100},"user",[41,153,89],{"class":72},[41,155,135],{"class":62},[41,157,159],{"class":43,"line":158},6,[41,160,161],{"class":62},"  }\n",[41,163,165],{"class":43,"line":164},7,[41,166,167],{"class":62},"}\n",[41,169,171],{"class":43,"line":170},8,[41,172,173],{"class":47},"\u002F\u002F Service contains business logic\n",[41,175,177,179,182],{"class":43,"line":176},9,[41,178,55],{"class":54},[41,180,181],{"class":58}," UserService",[41,183,63],{"class":62},[41,185,187,189,191,193,196,199,202,204],{"class":43,"line":186},10,[41,188,69],{"class":54},[41,190,73],{"class":72},[41,192,76],{"class":62},[41,194,195],{"class":79},"data",[41,197,198],{"class":62},":",[41,200,201],{"class":58}," CreateUserDto",[41,203,89],{"class":62},[41,205,63],{"class":62},[41,207,209,212,214,217,219,222,224,226,228],{"class":43,"line":208},11,[41,210,211],{"class":107},"    await",[41,213,111],{"class":62},[41,215,216],{"class":100},"validator",[41,218,117],{"class":62},[41,220,221],{"class":120},"validate",[41,223,76],{"class":72},[41,225,195],{"class":100},[41,227,89],{"class":72},[41,229,135],{"class":62},[41,231,233,235,237,239,242,245,247,249,251],{"class":43,"line":232},12,[41,234,97],{"class":54},[41,236,101],{"class":100},[41,238,104],{"class":62},[41,240,241],{"class":62}," new",[41,243,244],{"class":120}," User",[41,246,76],{"class":72},[41,248,195],{"class":100},[41,250,89],{"class":72},[41,252,135],{"class":62},[41,254,256,258,260,263,265,268,270,272,274],{"class":43,"line":255},13,[41,257,211],{"class":107},[41,259,111],{"class":62},[41,261,262],{"class":100},"emailService",[41,264,117],{"class":62},[41,266,267],{"class":120},"sendWelcome",[41,269,76],{"class":72},[41,271,151],{"class":100},[41,273,89],{"class":72},[41,275,135],{"class":62},[41,277,279,282,284,287,289,292,294,296,298],{"class":43,"line":278},14,[41,280,281],{"class":107},"    return",[41,283,111],{"class":62},[41,285,286],{"class":100},"userRepository",[41,288,117],{"class":62},[41,290,291],{"class":120},"save",[41,293,76],{"class":72},[41,295,151],{"class":100},[41,297,89],{"class":72},[41,299,135],{"class":62},[41,301,303],{"class":43,"line":302},15,[41,304,161],{"class":62},[41,306,308],{"class":43,"line":307},16,[41,309,167],{"class":62},[11,311,313],{"id":312},"when-youll-hear-this","When You'll Hear This",[16,315,316],{},"\"Put that logic in the service layer, not the controller.\" \u002F \"The service layer is the heart of your application's business rules.\"",[318,319,320],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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);}",{"title":36,"searchDepth":51,"depth":51,"links":322},[323,324,325,326],{"id":13,"depth":51,"text":14},{"id":21,"depth":51,"text":22},{"id":28,"depth":51,"text":29},{"id":312,"depth":51,"text":313},"architecture","Service Layer is the middle manager of your app. Controllers receive HTTP requests and hand off to services.","intermediate","md","s",{},true,"\u002Fterms\u002Fs\u002Fservice-layer",[336,337,338,339],"Repository Pattern","MVC","Clean Architecture","Separation of Concerns",{"title":5,"description":328},{"changefreq":342,"priority":343},"weekly",0.7,"terms\u002Fs\u002Fservice-layer","0iiCgx5UB5rBtiu7bcK5-RLYi6wf4SHVvH7gkgAVlMc",[347,351,355,358],{"title":338,"path":348,"acronym":6,"category":327,"difficulty":349,"description":350},"\u002Fterms\u002Fc\u002Fclean-architecture","advanced","Clean Architecture is like an onion with strict rules: the inner layers (your core business logic) have absolutely no idea the outer layers (databases, API...",{"title":337,"path":352,"acronym":337,"category":327,"difficulty":353,"description":354},"\u002Fterms\u002Fm\u002Fmvc","beginner","MVC is like a restaurant: the Model is the kitchen (data and logic), the View is the plate of food (what the user sees), and the Controller is the waiter (...",{"title":336,"path":356,"acronym":6,"category":327,"difficulty":329,"description":357},"\u002Fterms\u002Fr\u002Frepository-pattern","Repository Pattern puts a layer between your business logic and your database, so your business code never writes SQL directly.",{"title":339,"path":359,"acronym":6,"category":327,"difficulty":353,"description":360},"\u002Fterms\u002Fs\u002Fseparation-of-concerns","Separation of Concerns means different parts of your code should handle different concerns and not step on each other's toes.",1776518312610]