[{"data":1,"prerenderedAt":1111},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-cli-add-surface":442,"-hu-cli-add-surface-surround":1106},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":330,"body":444,"description":1099,"extension":1100,"links":1101,"meta":1102,"navigation":1103,"path":331,"seo":1104,"stem":332,"__hash__":1105},"docs_hu\u002Fhu\u002F4.cli\u002F4.add-surface.md",{"type":445,"value":446,"toc":1092},"minimark",[447,460,532,550,593,599,604,669,701,743,751,788,867,905,928,932,950,1009,1037,1041,1075,1088],[448,449,450,451,455,456,459],"p",{},"Ezt akkor futtasd, amikor egy modulnak a meglévő mellé egy második HTTP-felületre van szüksége, például egy ",[452,453,454],"code",{},"admin"," surface-re a publikus ",[452,457,458],{},"api"," mellett.",[461,462,467],"pre",{"className":463,"code":464,"language":465,"meta":466,"style":466},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem add surface \u003Cmodul> \u003Csurface> [--db \u003Cnév>]\n","sh","",[452,468,469],{"__ignoreMap":466},[470,471,474,478,482,485,488,491,495,498,502,505,507,510,513,515,518,521,524,527,529],"span",{"class":472,"line":473},"line",1,[470,475,477],{"class":476},"sBMFI","go",[470,479,481],{"class":480},"sfazB"," tool",[470,483,484],{"class":480}," gpsystem",[470,486,487],{"class":480}," add",[470,489,490],{"class":480}," surface",[470,492,494],{"class":493},"sMK4o"," \u003C",[470,496,497],{"class":480},"modu",[470,499,501],{"class":500},"sTEyZ","l",[470,503,504],{"class":493},">",[470,506,494],{"class":493},[470,508,509],{"class":480},"surfac",[470,511,512],{"class":500},"e",[470,514,504],{"class":493},[470,516,517],{"class":500}," [--db ",[470,519,520],{"class":493},"\u003C",[470,522,523],{"class":480},"né",[470,525,526],{"class":500},"v",[470,528,504],{"class":493},[470,530,531],{"class":480},"]\n",[448,533,534,535,537,538,540,541,544,545,549],{},"A surface-ök párhuzamos, célközönségenkénti felületkötegek egy modulon belül, például egy publikus ",[452,536,458],{}," egy ",[452,539,454],{}," vagy ",[452,542,543],{},"backoffice"," felület mellett (lásd ",[546,547,35],"a",{"href":548},"\u002Fhu\u002Fgetting-started\u002Fproject-structure#mi-%C3%A9lhet-egy-modulon-bel%C3%BCl","). A surface neve szabad (kisbetűk és számjegyek, betűvel kezdve); minden surface ugyanabból a minimális sablonból generálódik. Mindegyik saját TypeSpec service-t, generált csomagot, handlert és base path-t kap:",[551,552,553,566],"table",{},[554,555,556],"thead",{},[557,558,559,563],"tr",{},[560,561,562],"th",{},"Surface",[560,564,565],{},"Base path",[567,568,569,581],"tbody",{},[557,570,571,576],{},[572,573,574],"td",{},[452,575,458],{},[572,577,578],{},[452,579,580],{},"\u002Fapi\u002Fv1\u002F\u003Cmodul>",[557,582,583,588],{},[572,584,585,586],{},"bármely más név, pl. ",[452,587,454],{},[572,589,590],{},[452,591,592],{},"\u002Fapi\u002Fv1\u002F\u003Csurface>\u002F\u003Cmodul>",[448,594,595,596,598],{},"A név nem hordoz viselkedést: az ",[452,597,458],{}," csak annyiban különleges, hogy a modul gyökerére mountolódik, minden más surface a saját prefixe alá kerül, így a testvér-surface-ök sosem ütköznek.",[600,601,603],"h2",{"id":602},"mit-generál","Mit generál",[448,605,606,607,610,611,614,615,618,619,622,623,626,627,630,631,634,635,638,639,642,643,646,647,650,651,654,655,659,660,665,666,668],{},"Minimális vázat: a kontraktust (",[452,608,609],{},"spec\u002Ftypespec\u002Fmodules\u002F\u003Cmodul>\u002F\u003Csurface>.tsp"," + ",[452,612,613],{},"models\u002F\u003Csurface>.tsp","), az oapi-codegen konfigot (",[452,616,617],{},"api\u002Foapi-codegen\u002F\u003Cmodul>-\u003Csurface>.yaml","), egy a generált szigorú interfészre kötött handlert (a minta ",[452,620,621],{},"List"," egy minimális ",[452,624,625],{},"service\u002F"," varratot hív, és a hibát ",[452,628,629],{},"errs.Wrap","-pel csomagolja, így a surface-hibák első naptól stacket hordoznak), egy ",[452,632,633],{},"policy\u002F"," csomagot a ",[452,636,637],{},"@permission","\u002F",[452,640,641],{},"@policy"," tagek érvényesítéséhez bekötött registry-stubbal, valamint egy üresen tartott ",[452,644,645],{},"http\u002Fmapper\u002F"," mappát (",[452,648,649],{},".gitkeep",") a saját kódodnak. A generált fájlok nem hordoznak magyarázó kommentet, csak a ",[452,652,653],{},"gpsystem:*"," anchorokat, amelyekbe a generátor injektál. A generátor nem köt be autentikációt vagy migrációt: a kit ",[546,656,657],{"href":89},[452,658,82],{}," és ",[546,661,662],{"href":94},[452,663,664],{},"rbac"," csomagjai rendelkezésre állnak, ha kellenek; a policy-król lásd a ",[546,667,98],{"href":99}," oldalt.",[448,670,671,672,676,677,610,680,683,684,687,688,691,692,695,696,700],{},"A modul ",[673,674,675],"strong",{},"első"," surface-e mellé a parancs a modul-szintű közös vázakat is odabélyegzi: a ",[452,678,679],{},"core\u002Fcore.go",[452,681,682],{},"core\u002Ferrors.go"," fájlokat (utóbbi egy ",[452,685,686],{},"ErrNotFound"," ",[452,689,690],{},"errs.Define"," példával) és a ",[452,693,694],{},"repository\u002Fdoc.go","-t. A későbbi surface-ök ezeket kihagyják, a már meglévő közös magot használják. Egy még közös mag nélküli modulhoz az ",[546,697,698],{"href":336},[452,699,335],{}," adja ugyanezeket a vázakat.",[448,702,703,704,707,708,711,712,715,716,719,720,687,723,726,727,730,731,734,735,738,739,742],{},"A bekötés anchor-beszúrásokkal történik: a ",[452,705,706],{},"register.go"," file-szintű ",[452,709,710],{},"gpsystem:surfaces"," anchorán egy exportált ",[452,713,714],{},"Register\u003CSurface>(router, deps)"," függvény jön létre (pl. ",[452,717,718],{},"RegisterAdmin","), a ",[452,721,722],{},"cmd\u002F\u003Cmodul>\u002Fmain.go",[452,724,725],{},"gpsystem:registrations"," anchorán pedig a hozzá tartozó ",[452,728,729],{},"\u003Cmodul>.Register\u003CSurface>(api, deps)"," hívás. Így minden surface külön függvényben él: surface-enkénti middleware-t (pl. admin JWT: ",[452,732,733],{},"adminGroup.Use(server.AuthMiddleware(deps.Auth), server.RequireRole(\"admin\"))","; lásd ",[546,736,737],{"href":89},"autentikáció",") az adott ",[452,740,741],{},"Register\u003CSurface>"," függvénybe tehetsz anélkül, hogy a többi surface-t érintenéd.",[600,744,746,659,748,750],{"id":745},"permission-és-policy-a-kontraktusban",[452,747,637],{},[452,749,641],{}," a kontraktusban",[448,752,753,754,757,758,761,762,765,766,769,770,773,774,761,777,780,781,761,784,787],{},"A generált ",[452,755,756],{},"\u003Csurface>.tsp"," műveletei a ",[452,759,760],{},"@permission(\"...\")"," \u002F ",[452,763,764],{},"@policy(\"...\")"," dekorátorokkal jelölhetők meg: a dekorátor-library-t (",[452,767,768],{},"spec\u002Ftypespec\u002Flib\u002Fpolicy.tsp",") a projekt-scaffold hozta, a ",[452,771,772],{},"main.tsp"," már importálja. A tagek ",[452,775,776],{},"x-permission",[452,778,779],{},"x-policy"," extensionként jutnak az OpenAPI-ba, majd a generált ",[452,782,783],{},"PermissionByOperation",[452,785,786],{},"PolicyByOperation"," mapekbe:",[461,789,793],{"className":790,"code":791,"language":792,"meta":466,"style":466},"language-tsp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@post\n@route(\"\u002Forders\")\n@operationId(\"PlaceOrder\")\n@permission(\"orders.place\")\n@policy(\"orders.place\")\nplaceOrder(@body body: PlaceOrderInput): Order | Unauthorized | Forbidden;\n","tsp",[452,794,795,801,816,829,841,852],{"__ignoreMap":466},[470,796,797],{"class":472,"line":473},[470,798,800],{"class":799},"swJcz","@post\n",[470,802,804,807,810,813],{"class":472,"line":803},2,[470,805,806],{"class":799},"@route",[470,808,809],{"class":493},"(",[470,811,812],{"class":480},"\"\u002Forders\"",[470,814,815],{"class":493},")\n",[470,817,819,822,824,827],{"class":472,"line":818},3,[470,820,821],{"class":799},"@operationId",[470,823,809],{"class":493},[470,825,826],{"class":480},"\"PlaceOrder\"",[470,828,815],{"class":493},[470,830,832,834,836,839],{"class":472,"line":831},4,[470,833,637],{"class":799},[470,835,809],{"class":493},[470,837,838],{"class":480},"\"orders.place\"",[470,840,815],{"class":493},[470,842,844,846,848,850],{"class":472,"line":843},5,[470,845,641],{"class":799},[470,847,809],{"class":493},[470,849,838],{"class":480},[470,851,815],{"class":493},[470,853,855,858,861,864],{"class":472,"line":854},6,[470,856,857],{"class":500},"placeOrder(",[470,859,860],{"class":799},"@body",[470,862,863],{"class":500}," body: PlaceOrderInput): Order | Unauthorized | Forbidden",[470,865,866],{"class":493},";\n",[448,868,869,870,872,873,876,877,880,881,883,884,887,888,893,894,897,898,901,902,904],{},"A kikényszerítés oldala is scaffoldolt: a ",[452,871,633],{}," csomag registry-stubja (",[452,874,875],{},"policy.New()",", benne a ",[452,878,879],{},"gpsystem:policies"," anchor) a ",[452,882,741],{}," függvényben már be van fűzve a generált strict-middleware-be (",[452,885,886],{},"policy.Enforcer",", az önálló ",[546,889,890],{"href":99},[452,891,892],{},"auth\u002Fpolicy"," modulból). Egy művelet levédéséhez így két lépés elég: tag a ",[452,895,896],{},".tsp","-ben, és egy ",[452,899,900],{},"reg.Register(\"...\", ...)"," hívás az anchornál; a megjelölt, de nem regisztrált policy fail-closed hibázik. A teljes szemantika: ",[546,903,98],{"href":99},".",[906,907,908,909,610,912,914,915,610,918,920,921,761,924,927],"warning",{},"A namespace (és így a kibocsátott spec-fájlnév) a modul + surface nevek összefűzése: a ",[452,910,911],{},"news",[452,913,454],{}," és a ",[452,916,917],{},"newsadmin",[452,919,458],{}," egyaránt ",[452,922,923],{},"Shop.NewsAdmin.yaml",[452,925,926],{},"Shop.Newsadmin.yaml"," fájlt ad, ami case-insensitive fájlrendszeren ütközik. Olyan neveket válassz, amelyeknél az összefűzések különbözőek maradnak.",[600,929,931],{"id":930},"repository-bekötése-nevesített-kapcsolathoz","Repository bekötése nevesített kapcsolathoz",[448,933,934,935,938,939,942,943,945,946,949],{},"Alapesetben a modul közös ",[452,936,937],{},"repository\u002F","-ja flat, a projekt default adatbázis-kapcsolatához kötve. A ",[452,940,941],{},"--db \u003Cnév>"," egy korábban ",[452,944,290],{},"-vel hozzáadott ",[546,947,948],{"href":291},"nevesített kapcsolathoz"," köti, és a repository-vázat kapcsolatnév szerinti almappaként rendereli:",[461,951,953],{"className":463,"code":952,"language":465,"meta":466,"style":466},"go tool gpsystem add db news analytics --connector bun\ngo tool gpsystem add surface news reports --db analytics\n# -> internal\u002Fmodules\u002Fnews\u002Frepository\u002Fanalytics\u002Fdoc.go\n",[452,954,955,980,1003],{"__ignoreMap":466},[470,956,957,959,961,963,965,968,971,974,977],{"class":472,"line":473},[470,958,477],{"class":476},[470,960,481],{"class":480},[470,962,484],{"class":480},[470,964,487],{"class":480},[470,966,967],{"class":480}," db",[470,969,970],{"class":480}," news",[470,972,973],{"class":480}," analytics",[470,975,976],{"class":480}," --connector",[470,978,979],{"class":480}," bun\n",[470,981,982,984,986,988,990,992,994,997,1000],{"class":472,"line":803},[470,983,477],{"class":476},[470,985,481],{"class":480},[470,987,484],{"class":480},[470,989,487],{"class":480},[470,991,490],{"class":480},[470,993,970],{"class":480},[470,995,996],{"class":480}," reports",[470,998,999],{"class":480}," --db",[470,1001,1002],{"class":480}," analytics\n",[470,1004,1005],{"class":472,"line":818},[470,1006,1008],{"class":1007},"sHwdD","# -> internal\u002Fmodules\u002Fnews\u002Frepository\u002Fanalytics\u002Fdoc.go\n",[448,1010,1011,1012,1015,1016,1018,1019,761,1022,1025,1026,1029,1030,1033,1034,1036],{},"A ",[452,1013,1014],{},"\u003Cnév>","-nek már léteznie kell a modulon (előbb ",[452,1017,290],{},"); ha nem, a parancs azonnal hibázik, és felsorolja a modul elérhető kapcsolatait. A ",[452,1020,1021],{},"\u003CNév>DB",[452,1023,1024],{},"\u003CNév>Transactor"," mezők, amelyeket a kapcsolat a ",[452,1027,1028],{},"Dependencies","-hez adott, már megvannak; csak a repository mappa változik. A ",[452,1031,1032],{},"--db"," nélküli surface-ök nem érintettek, a modul megtartja a flat ",[452,1035,937],{}," elrendezést.",[600,1038,1040],{"id":1039},"generálás-után","Generálás után",[461,1042,1044],{"className":463,"code":1043,"language":465,"meta":466,"style":466},"mise run generate\ngo run .\u002Fcmd\u002F\u003Cmodul>\n",[452,1045,1046,1057],{"__ignoreMap":466},[470,1047,1048,1051,1054],{"class":472,"line":473},[470,1049,1050],{"class":476},"mise",[470,1052,1053],{"class":480}," run",[470,1055,1056],{"class":480}," generate\n",[470,1058,1059,1061,1063,1066,1068,1070,1072],{"class":472,"line":803},[470,1060,477],{"class":476},[470,1062,1053],{"class":480},[470,1064,1065],{"class":480}," .\u002Fcmd\u002F",[470,1067,520],{"class":493},[470,1069,497],{"class":480},[470,1071,501],{"class":500},[470,1073,1074],{"class":493},">\n",[448,1076,1077,1078,1080,1081,1084,1085,1087],{},"Az új surface azonnal bootol és kiszolgál; az implementációhoz töltsd fel a ",[452,1079,625],{}," varratot (a közös szabályokat a modul ",[452,1082,1083],{},"core\u002F"," csomagjába téve, ahonnan minden surface hívhatja), és adj vissza valódi adatot: a handler már hívja a service-t és ",[452,1086,358],{},"-szel csomagolja a hibáit.",[1089,1090,1091],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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}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}",{"title":466,"searchDepth":803,"depth":803,"links":1093},[1094,1095,1097,1098],{"id":602,"depth":803,"text":603},{"id":745,"depth":803,"text":1096},"@permission és @policy a kontraktusban",{"id":930,"depth":803,"text":931},{"id":1039,"depth":803,"text":1040},"Újabb surface (párhuzamos HTTP felületköteg) hozzáadása meglévő modulhoz, tetszőleges néven.","md",null,{},{"icon":333},{"title":330,"description":1099},"aN261jyHlQPuETxvvfLmN6bnWYC11HJDSCL0IJ3kOyE",[1107,1109],{"title":325,"path":326,"stem":327,"description":1108,"icon":328,"children":-1},"Modul generálása (belépési pont, első surface, kontraktus) a projektbe.",{"title":335,"path":336,"stem":337,"description":1110,"icon":244,"children":-1},"A közös core\u002F és a modul-szintű repository\u002F vázak hozzáadása egy olyan modulhoz, amelyben még nincsenek meg.",1785445885789]