[{"data":1,"prerenderedAt":1930},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-concepts-architecture":442,"-hu-concepts-architecture-surround":1925},[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":220,"body":444,"description":1918,"extension":1919,"links":1920,"meta":1921,"navigation":1922,"path":221,"seo":1923,"stem":222,"__hash__":1924},"docs_hu\u002Fhu\u002F2.concepts\u002F1.architecture.md",{"type":445,"value":446,"toc":1904},"minimark",[447,477,482,493,824,830,835,849,958,969,973,976,1034,1048,1052,1073,1219,1234,1246,1250,1257,1556,1567,1571,1574,1620,1624,1627,1706,1710,1719,1723,1726,1834,1857,1861,1900],[448,449,450,451,455,456,460,461,464,465,472,473,476],"p",{},"A gpsystem nem egy monolit keretrendszer: ",[452,453,454],"strong",{},"12 önálló Go modul",", mindegyik külön ",[457,458,459],"code",{},"go get","-elhető és bármely Go programban használható, plusz egy vékony kit, ami ezeket összerakja egy futó service-szé. Minden modul önmagában is hasznos és önmagában is érthető; ez az oldal a térképet adja: mi hol van, mi mire épül, és milyen elv szerint áll össze az egész. A kit szerepe ebben az értelemben ",[452,462,463],{},"microservice chassis"," (",[466,467,471],"a",{"href":468,"rel":469},"https:\u002F\u002Fmicroservices.io\u002Fpatterns\u002Fmicroservice-chassis.html",[470],"nofollow","Richardson","): cross-cutting infrastruktúra (életciklus, HTTP-réteg, telemetria, hibamodell), amit library-ként importálsz. Nincs benne container és nincs facade, ami a részeket láthatatlanul összefűzné: ami összekapcsolódik, az a te ",[457,474,475],{},"main.go","-dban, explicit kóddal kapcsolódik össze.",[478,479,481],"h2",{"id":480},"modultérkép","Modultérkép",[448,483,484,485,488,489,492],{},"Minden modul saját repó, saját ",[457,486,487],{},"go.mod",", saját ",[457,490,491],{},"v0.1.0"," tag: egyikhez sem kell a kit, és egyikhez sem kell a listán szereplő másik modul, kivéve ahol jelezve van.",[494,495,496,515],"table",{},[497,498,499],"thead",{},[500,501,502,506,509,512],"tr",{},[503,504,505],"th",{},"Modul",[503,507,508],{},"Import-út",[503,510,511],{},"Mit ad",[503,513,514],{},"Docs-szekció",[516,517,518,537,559,582,618,636,654,678,702,729,753,793],"tbody",{},[500,519,520,525,530,533],{},[521,522,523],"td",{},[457,524,358],{},[521,526,527],{},[457,528,529],{},"github.com\u002Fgp-system\u002Ferrs",[521,531,532],{},"stackelhető hibák géppel olvasható kóddal és kliensbiztos üzenettel; nulla függőség",[521,534,535],{},[466,536,52],{"href":363},[500,538,539,543,548,555],{},[521,540,541],{},[457,542,374],{},[521,544,545],{},[457,546,547],{},"github.com\u002Fgp-system\u002Fenvconf",[521,549,550,551,554],{},"típusos konfiguráció env-változókból, ",[457,552,553],{},".env","-támogatással",[521,556,557],{},[466,558,52],{"href":379},[500,560,561,570,575,578],{},[521,562,563,565,566,569],{},[457,564,386],{}," (+",[457,567,568],{},"httperr\u002Fvalidate",")",[521,571,572],{},[457,573,574],{},"github.com\u002Fgp-system\u002Fhttperr",[521,576,577],{},"RFC 9457 problem+json hibaválaszok, egyetlen mappinggel, plusz struct-tag-alapú kérésvalidáció",[521,579,580],{},[466,581,52],{"href":392},[500,583,584,598,603,614],{},[521,585,586,565,588,591,592,591,595,569],{},[457,587,405],{},[457,589,590],{},"dbx\u002Fpg",", ",[457,593,594],{},"dbx\u002Fbunx",[457,596,597],{},"dbx\u002Fseed",[521,599,600],{},[457,601,602],{},"github.com\u002Fgp-system\u002Fdbx",[521,604,605,606,609,610,613],{},"az adatbázis-agnosztikus ",[457,607,608],{},"Config","\u002F",[457,611,612],{},"Transactor"," szerződés, pgx- és bun-alapú implementáció, seedelés",[521,615,616],{},[466,617,52],{"href":411},[500,619,620,624,629,632],{},[521,621,622],{},[457,623,431],{},[521,625,626],{},[457,627,628],{},"github.com\u002Fgp-system\u002Fpaginate",[521,630,631],{},"offset- és cursor-lapozás típusai és segédei",[521,633,634],{},[466,635,52],{"href":436},[500,637,638,642,647,650],{},[521,639,640],{},[457,641,46],{},[521,643,644],{},[457,645,646],{},"github.com\u002Fgp-system\u002Fqueue",[521,648,649],{},"asynq + Valkey: task-enqueue, opciók, event-envelope",[521,651,652],{},[466,653,52],{"href":53},[500,655,656,666,671,674],{},[521,657,658,565,660,591,663,569],{},[457,659,61],{},[457,661,662],{},"events\u002Foutbox",[457,664,665],{},"events\u002Fscheduler",[521,667,668],{},[457,669,670],{},"github.com\u002Fgp-system\u002Fevents",[521,672,673],{},"eventek listener-fan-outtal; tranzakciós outbox; cron\u002Fintervallum ütemezés leader electionnel",[521,675,676],{},[466,677,52],{"href":68},[500,679,680,690,695,698],{},[521,681,682,565,684,591,687,569],{},[457,683,82],{},[457,685,686],{},"auth\u002Frbac",[457,688,689],{},"auth\u002Fpolicy",[521,691,692],{},[457,693,694],{},"github.com\u002Fgp-system\u002Fauth",[521,696,697],{},"JWT kibocsátás és middleware, szerep-\u002Fpermission-ellenőrzés, kérésenkénti policy-k",[521,699,700],{},[466,701,52],{"href":89},[500,703,704,714,719,725],{},[521,705,706,565,708,591,711,569],{},[457,707,113],{},[457,709,710],{},"mail\u002Fsmtp",[457,712,713],{},"mail\u002Fmjml",[521,715,716],{},[457,717,718],{},"github.com\u002Fgp-system\u002Fmail",[521,720,721,724],{},[457,722,723],{},"Mailer"," interfész, üzenet-builder, MJML template-renderelés",[521,726,727],{},[466,728,52],{"href":119},[500,730,731,741,746,749],{},[521,732,733,565,735,591,738,569],{},[457,734,130],{},[457,736,737],{},"notify\u002Fbroadcast",[457,739,740],{},"notify\u002Fdatabase",[521,742,743],{},[457,744,745],{},"github.com\u002Fgp-system\u002Fnotify",[521,747,748],{},"egy címzetthez rendelt, több-csatornás értesítések (adatbázis, e-mail, élő broadcast)",[521,750,751],{},[466,752,52],{"href":136},[500,754,755,771,776,789],{},[521,756,757,565,759,591,762,591,765,591,768,569],{},[457,758,147],{},[457,760,761],{},"storage\u002Fmemory",[457,763,764],{},"storage\u002Flocal",[457,766,767],{},"storage\u002Fstoragetest",[457,769,770],{},"storage\u002Fdriver\u002Fs3",[521,772,773],{},[457,774,775],{},"github.com\u002Fgp-system\u002Fstorage",[521,777,778,779,609,782,609,785,788],{},"object storage egy ",[457,780,781],{},"Driver",[457,783,784],{},"Disk",[457,786,787],{},"Manager"," modell mögött, memória-, helyi lemez- és S3-kompatibilis driverekkel",[521,790,791],{},[466,792,52],{"href":153},[500,794,795,808,813,820],{},[521,796,797,565,799,591,802,591,805,569],{},[457,798,174],{},[457,800,801],{},"telemetry\u002Flogx",[457,803,804],{},"telemetry\u002Fotelx",[457,806,807],{},"telemetry\u002Fsentryx",[521,809,810],{},[457,811,812],{},"github.com\u002Fgp-system\u002Ftelemetry",[521,814,815,816,819],{},"a homlokzat: ",[457,817,818],{},"telemetry.Setup"," egy hívásban bootolja a logolást, az OpenTelemetryt és a Sentryt",[521,821,822],{},[466,823,52],{"href":180},[448,825,826,827,829],{},"A ",[457,828,770],{}," a lista egyetlen beágyazott Go modulja (behúzza az AWS SDK-t, és csak azoknak a projekteknek kell ezért fizetniük, amelyeknek tényleg kell S3); minden más fenti alcsomag a szülő modulján belül szállít.",[831,832,834],"h3",{"id":833},"kit-chassis","Kit chassis",[448,836,826,837,840,841,844,845,848],{},[457,838,839],{},"github.com\u002Fgp-system\u002Fgpsystem"," maga egy vékony, négy csomagos chassis, plusz a scaffolding CLI (",[457,842,843],{},"cmd\u002Fgpsystem",", lásd a ",[466,846,847],{"href":287},"CLI-referenciát","):",[494,850,851,864],{},[497,852,853],{},[500,854,855,858,860,862],{},[503,856,857],{},"Csomag",[503,859,508],{},[503,861,511],{},[503,863,514],{},[516,865,866,885,917,936],{},[500,867,868,873,878,881],{},[521,869,870],{},[457,871,872],{},"app",[521,874,875],{},[457,876,877],{},"github.com\u002Fgp-system\u002Fgpsystem\u002Fapp",[521,879,880],{},"a signal-vezérelt graceful-shutdown processz-életciklus, amin minden chassis ül",[521,882,883],{},[466,884,253],{"href":254},[500,886,887,892,897,912],{},[521,888,889],{},[457,890,891],{},"server",[521,893,894],{},[457,895,896],{},"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver",[521,898,899,900,591,903,591,906,591,909],{},"a chi-alapú HTTP engine: ",[457,901,902],{},"server.Config",[457,904,905],{},"server.Run",[457,907,908],{},"RegisterFunc",[457,910,911],{},"StrictValidator",[521,913,914],{},[466,915,916],{"href":259},"A server mag",[500,918,919,924,929,932],{},[521,920,921],{},[457,922,923],{},"worker",[521,925,926],{},[457,927,928],{},"github.com\u002Fgp-system\u002Fgpsystem\u002Fworker",[521,930,931],{},"a háttérfeldolgozó chassis: asynq szerver + outbox relay + ütemező egy binárisban",[521,933,934],{},[466,935,263],{"href":264},[500,937,938,943,948,954],{},[521,939,940],{},[457,941,942],{},"realtime",[521,944,945],{},[457,946,947],{},"github.com\u002Fgp-system\u002Fgpsystem\u002Frealtime",[521,949,950,951],{},"a WebSocket\u002FSSE gateway, ami élőben pusholja az értesítéseket a kapcsolódó klienseknek, ",[457,952,953],{},"TopicAuth",[521,955,956],{},[466,957,268],{"href":269},[448,959,960,961,964,965,968],{},"A generátorok és a sablonok a kit ",[457,962,963],{},"internal\u002F","-jában élnek. A fogyasztó projektek csak a kimenetüket látják, plusz a ",[466,966,967],{"href":234},"TypeSpec→OpenAPI→szerverkód pipeline-t",".",[478,970,972],{"id":971},"rétegződés-minden-önálló-a-kit-felül","Rétegződés: minden önálló, a kit felül",[448,974,975],{},"A 12 modul és a kit szigorú rétegződést alkot, nem egy összegubancolódott hálót:",[977,978,979,1005,1019],"ul",{},[980,981,982,988,989,591,991,591,993,591,995,591,997,591,999,1001,1002,1004],"li",{},[452,983,984,985,987],{},"Az ",[457,986,358],{}," van legalul",", nulla 3rd-party függőséggel. A listán semmi nem függ a kittől, de több modul (",[457,990,386],{},[457,992,405],{},[457,994,82],{},[457,996,61],{},[457,998,113],{},[457,1000,130],{},") saját hibaértékeihez az ",[457,1003,358],{},"-re épít, ugyanúgy, ahogy bármelyik saját csomagod is tehetné.",[980,1006,1007,1010,1011,1014,1015,1018],{},[452,1008,1009],{},"Minden modul önállóan is működik",", bármilyen Go programban, kit nélkül is: az ",[457,1012,1013],{},"import \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\""," egy CLI-eszközben, egy Lambdában vagy egy sima ",[457,1016,1017],{},"net\u002Fhttp"," service-ben pontosan azt a modul-lábnyomot húzza be, semmit a másik 11-ből.",[980,1020,1021,1024,1025,1027,1028,1030,1031,1033],{},[452,1022,1023],{},"A kit ezekre épít fel."," A ",[457,1026,891],{},", a ",[457,1029,923],{}," és a ",[457,1032,942],{}," egy kiválasztott modul-részhalmazt drótoz be egy futtatható processzbe (config-kompozíció, életciklus, routing), és a CLI generálja a wiring-kódot, így ritkán kell kézzel megírnod. A kit használata kényelmi szempont, sosem kötelezettség: bármely modul-részhalmazt közvetlenül is átvehetsz a kit teljes kihagyásával, vagy indulhatsz a kittel, és ott lépsz le egy modul saját API-jára, ahol a generált wiring nem illik.",[448,1035,1036,1037,1030,1040,1043,1044,1047],{},"Ezért indulhat egyszerre a ",[466,1038,1039],{"href":26},"telepítési útmutató",[466,1041,1042],{"href":41},"shop mintaalkalmazás"," is a ",[457,1045,1046],{},"go get github.com\u002Fgp-system\u002F\u003Cmodul>@latest","-től: nincs privát lépés, nincs replace-direktíva, nincs szükség monorepo-checkoutra semmihez.",[478,1049,1051],{"id":1050},"egy-service-életciklusa","Egy service életciklusa",[448,1053,826,1054,1056,1057,1059,1060,1065,1066,1068,1069,1072],{},[457,1055,891],{}," csomag ",[457,1058,902],{},"-ja a HTTP-réteg beállításait hordozza (timeoutok, CORS, body-limit); maga a processz-életciklus az ",[466,1061,1062,1064],{"href":254},[457,1063,872],{}," csomagban"," él, és a ",[457,1067,905],{}," az ",[457,1070,1071],{},"app.Run","-ra delegál. A lépéssor minden gpsystem HTTP-processzben ugyanaz:",[1074,1075,1077,1082,1116,1120,1139,1143,1152,1156,1170,1174,1177,1208],"steps",{"level":1076},"4",[1078,1079,1081],"h4",{"id":1080},"telemetria-bootstrap","Telemetria bootstrap",[448,1083,826,1084,1086,1087,1089,1090,1093,1094,1096,1097,1100,1101,1104,1105,1107,1108,1111,1112,1115],{},[457,1085,818],{}," egy hívásban bootolja az observabilityt: először a Sentryt (",[457,1088,807],{},", ha van ",[457,1091,1092],{},"SENTRY_DSN","), aztán az OTel SDK-t (",[457,1095,804],{},": resource, OTLP exporterek a standard ",[457,1098,1099],{},"OTEL_*"," env-változók szerint, W3C propagáció), végül a default ",[457,1102,1103],{},"slog"," loggert (",[457,1106,801],{},": OTLP bridge + konzol handler + Sentry handler egy fanoutban). ",[457,1109,1110],{},"OTEL_DEV_MODE=true"," mellett exporterek nélkül, olvasható konzolloggal fut. Az egész lépés kihagyható a ",[457,1113,1114],{},"WithoutTelemetry()"," opcióval.",[1078,1117,1119],{"id":1118},"app-router-felépítése","App \u002F router felépítése",[448,1121,826,1122,1124,1125,1127,1128,1130,1131,1134,1135,1138],{},[457,1123,905],{}," a kit alapértelmezéseivel épül fel: a router maga írja az RFC 9457 Problemet panicre, 404-re és 405-re (a ",[457,1126,386],{},"-en keresztül); az elkapott panic ",[457,1129,358],{}," hibává válik, amelynek stackje a panic helyére mutat; a kérésvalidáció a generált strict pipeline-ban fut (",[457,1132,1133],{},"server.StrictValidator","); majd az OTel HTTP middleware, kérésenkénti Sentry hub, CORS és body-limit, végül a ",[457,1136,1137],{},"WithMiddleware(...)","-rel átadott extrák.",[1078,1140,1142],{"id":1141},"route-regisztráció","Route-regisztráció",[448,1144,826,1145,1147,1148,1151],{},[457,1146,908],{}," callbacked mountolja a modulokat: ",[457,1149,1150],{},"chi.Router","-t kapsz, és a natív chi API-val dolgozol: groupok, route-ok, middleware.",[1078,1153,1155],{"id":1154},"listen-signal-kezelés","Listen + signal-kezelés",[448,1157,1158,1159,1162,1163,609,1166,1169],{},"A listen goroutine-ban fut; a ",[457,1160,1161],{},"signal.NotifyContext"," figyeli a ",[457,1164,1165],{},"SIGINT",[457,1167,1168],{},"SIGTERM","-et. A szülő context cancelje is shutdownt vált ki, ami tesztekben hasznos.",[1078,1171,1173],{"id":1172},"graceful-shutdown","Graceful shutdown",[448,1175,1176],{},"Signalra, szigorú sorrendben:",[1178,1179,1180,1190,1201],"ol",{},[980,1181,1182,1183,1186,1187],{},"shutdown a ",[457,1184,1185],{},"ShutdownTimeout","-tal: nincs új kérés, ",[452,1188,1189],{},"az in-flight kérések lefutnak",[980,1191,1192,1193,1196,1197,1200],{},"a ",[457,1194,1195],{},"WithCloser"," closerek ",[452,1198,1199],{},"LIFO"," sorrendben futnak (amit utoljára nyitottál, az záródik először)",[980,1202,1203,1204,1207],{},"a telemetria ",[452,1205,1206],{},"utolsóként"," flushol, így a closerek spanjei is exportálódnak",[448,1209,1210,1211,1214,1215,1218],{},"Második signal azonnal öli a processzt. Tiszta leállásnál a ",[457,1212,1213],{},"Run"," ",[457,1216,1217],{},"nil","-t ad vissza.",[448,1220,826,1221,464,1224,1227,1228,1230,1231,1233],{},[466,1222,1223],{"href":264},"worker chassis",[457,1225,1226],{},"worker.Run",") pontosan ugyanerre az ",[457,1229,1071],{},"-ra épül: HTTP helyett egy asynq szervert, az outbox relay-t és az ütemező futtatót állítja le ugyanebben a rendben. A részletes belső működést az ",[466,1232,253],{"href":254}," oldal írja le.",[1235,1236,1237,1238,1241,1242,1245],"tip",{},"Tesztekhez a ",[457,1239,1240],{},"server.New(cfg, opts...)"," futtatás nélkül adja vissza a konfigurált ",[457,1243,1244],{},"*chi.Mux","-ot.",[478,1247,1249],{"id":1248},"centralizál-nem-absztrahál","Centralizál, nem absztrahál",[448,1251,1252,1253,1256],{},"A kit tervezési elve: a külső függőségekhez való hozzáférés ",[452,1254,1255],{},"egy-egy csomagban összpontosul, de a típusaik szabadon átfolynak a publikus API-n",". Nincs \"gpsystem router-interfész\", nincs \"gpsystem query-absztrakció\". A szignatúrák nyíltan a 3rd-party típusokat hordozzák:",[1258,1259,1264],"pre",{"className":1260,"code":1261,"language":1262,"meta":1263,"style":1263},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F server: a RegisterFunc chi.Router-t kap\nfunc Run(ctx context.Context, cfg server.Config, register server.RegisterFunc, opts ...Option) error\n\n\u002F\u002F dbx\u002Fpg: nyers pgxpool.Pool-t és pgx típusokat ad\nfunc MustNewPool(ctx context.Context, cfg dbx.Config) *pgxpool.Pool\nfunc (d *DB) Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)\n\n\u002F\u002F dbx\u002Fbunx: *bun.DB-t ad ugyanarra a poolra\nfunc Open(pool *pgxpool.Pool) *bun.DB\n\n\u002F\u002F worker: az escape hatch nyers asynq-ot ad\nfunc WithMux(fn func(mux *asynq.ServeMux)) Option\n","go","",[457,1265,1266,1275,1343,1350,1356,1398,1466,1471,1477,1510,1515,1521],{"__ignoreMap":1263},[1267,1268,1271],"span",{"class":1269,"line":1270},"line",1,[1267,1272,1274],{"class":1273},"sHwdD","\u002F\u002F server: a RegisterFunc chi.Router-t kap\n",[1267,1276,1278,1282,1286,1289,1293,1297,1299,1302,1305,1308,1311,1313,1315,1317,1320,1322,1324,1326,1328,1331,1334,1337,1339],{"class":1269,"line":1277},2,[1267,1279,1281],{"class":1280},"sMK4o","func",[1267,1283,1285],{"class":1284},"s2Zo4"," Run",[1267,1287,1288],{"class":1280},"(",[1267,1290,1292],{"class":1291},"sHdIc","ctx",[1267,1294,1296],{"class":1295},"sBMFI"," context",[1267,1298,968],{"class":1280},[1267,1300,1301],{"class":1295},"Context",[1267,1303,1304],{"class":1280},",",[1267,1306,1307],{"class":1291}," cfg",[1267,1309,1310],{"class":1295}," server",[1267,1312,968],{"class":1280},[1267,1314,608],{"class":1295},[1267,1316,1304],{"class":1280},[1267,1318,1319],{"class":1291}," register",[1267,1321,1310],{"class":1295},[1267,1323,968],{"class":1280},[1267,1325,908],{"class":1295},[1267,1327,1304],{"class":1280},[1267,1329,1330],{"class":1291}," opts",[1267,1332,1333],{"class":1280}," ...",[1267,1335,1336],{"class":1295},"Option",[1267,1338,569],{"class":1280},[1267,1340,1342],{"class":1341},"spNyl"," error\n",[1267,1344,1346],{"class":1269,"line":1345},3,[1267,1347,1349],{"emptyLinePlaceholder":1348},true,"\n",[1267,1351,1353],{"class":1269,"line":1352},4,[1267,1354,1355],{"class":1273},"\u002F\u002F dbx\u002Fpg: nyers pgxpool.Pool-t és pgx típusokat ad\n",[1267,1357,1359,1361,1364,1366,1368,1370,1372,1374,1376,1378,1381,1383,1385,1387,1390,1393,1395],{"class":1269,"line":1358},5,[1267,1360,1281],{"class":1280},[1267,1362,1363],{"class":1284}," MustNewPool",[1267,1365,1288],{"class":1280},[1267,1367,1292],{"class":1291},[1267,1369,1296],{"class":1295},[1267,1371,968],{"class":1280},[1267,1373,1301],{"class":1295},[1267,1375,1304],{"class":1280},[1267,1377,1307],{"class":1291},[1267,1379,1380],{"class":1295}," dbx",[1267,1382,968],{"class":1280},[1267,1384,608],{"class":1295},[1267,1386,569],{"class":1280},[1267,1388,1389],{"class":1280}," *",[1267,1391,1392],{"class":1295},"pgxpool",[1267,1394,968],{"class":1280},[1267,1396,1397],{"class":1295},"Pool\n",[1267,1399,1401,1403,1405,1408,1411,1414,1416,1419,1421,1423,1425,1427,1429,1431,1434,1437,1439,1442,1444,1447,1449,1451,1453,1455,1458,1460,1463],{"class":1269,"line":1400},6,[1267,1402,1281],{"class":1280},[1267,1404,464],{"class":1280},[1267,1406,1407],{"class":1291},"d ",[1267,1409,1410],{"class":1280},"*",[1267,1412,1413],{"class":1295},"DB",[1267,1415,569],{"class":1280},[1267,1417,1418],{"class":1284}," Query",[1267,1420,1288],{"class":1280},[1267,1422,1292],{"class":1291},[1267,1424,1296],{"class":1295},[1267,1426,968],{"class":1280},[1267,1428,1301],{"class":1295},[1267,1430,1304],{"class":1280},[1267,1432,1433],{"class":1291}," sql",[1267,1435,1436],{"class":1341}," string",[1267,1438,1304],{"class":1280},[1267,1440,1441],{"class":1291}," args",[1267,1443,1333],{"class":1280},[1267,1445,1446],{"class":1295},"any",[1267,1448,569],{"class":1280},[1267,1450,464],{"class":1280},[1267,1452,414],{"class":1295},[1267,1454,968],{"class":1280},[1267,1456,1457],{"class":1295},"Rows",[1267,1459,1304],{"class":1280},[1267,1461,1462],{"class":1341}," error",[1267,1464,1465],{"class":1280},")\n",[1267,1467,1469],{"class":1269,"line":1468},7,[1267,1470,1349],{"emptyLinePlaceholder":1348},[1267,1472,1474],{"class":1269,"line":1473},8,[1267,1475,1476],{"class":1273},"\u002F\u002F dbx\u002Fbunx: *bun.DB-t ad ugyanarra a poolra\n",[1267,1478,1480,1482,1485,1487,1490,1492,1494,1496,1499,1501,1503,1505,1507],{"class":1269,"line":1479},9,[1267,1481,1281],{"class":1280},[1267,1483,1484],{"class":1284}," Open",[1267,1486,1288],{"class":1280},[1267,1488,1489],{"class":1291},"pool",[1267,1491,1389],{"class":1280},[1267,1493,1392],{"class":1295},[1267,1495,968],{"class":1280},[1267,1497,1498],{"class":1295},"Pool",[1267,1500,569],{"class":1280},[1267,1502,1389],{"class":1280},[1267,1504,418],{"class":1295},[1267,1506,968],{"class":1280},[1267,1508,1509],{"class":1295},"DB\n",[1267,1511,1513],{"class":1269,"line":1512},10,[1267,1514,1349],{"emptyLinePlaceholder":1348},[1267,1516,1518],{"class":1269,"line":1517},11,[1267,1519,1520],{"class":1273},"\u002F\u002F worker: az escape hatch nyers asynq-ot ad\n",[1267,1522,1524,1526,1529,1531,1534,1537,1540,1542,1545,1547,1550,1553],{"class":1269,"line":1523},12,[1267,1525,1281],{"class":1280},[1267,1527,1528],{"class":1284}," WithMux",[1267,1530,1288],{"class":1280},[1267,1532,1533],{"class":1291},"fn",[1267,1535,1536],{"class":1280}," func(",[1267,1538,1539],{"class":1291},"mux",[1267,1541,1389],{"class":1280},[1267,1543,1544],{"class":1295},"asynq",[1267,1546,968],{"class":1280},[1267,1548,1549],{"class":1295},"ServeMux",[1267,1551,1552],{"class":1280},"))",[1267,1554,1555],{"class":1295}," Option\n",[448,1557,1558,1559,464,1562,1566],{},"A chi-, pgx-, bun- és asynq-dokumentáció, a Stack Overflow-válaszok és az upstream példakódok nálad is egy az egyben érvényesek. Nem egy kit-specifikus wrapper-API-t kell megtanulnod, hanem a Go-ökoszisztéma bevett library-jeit, egy helyen összecsiszolva. A generált projekt ebben az értelemben egy ",[452,1560,1561],{},"service template",[466,1563,471],{"href":1564,"rel":1565},"https:\u002F\u002Fmicroservices.io\u002Fpatterns\u002Fservice-template.html",[470],"): futtatható vázkód, amit megkapsz és onnantól a tiéd, nem egy futásidejű réteg, ami az app fölött él.",[831,1568,1570],{"id":1569},"a-három-kimondott-kivétel","A három kimondott kivétel",[448,1572,1573],{},"Három helyen egy-egy modul mégis interfész mögé rejti a függőséget, mindháromszor konkrét okkal:",[977,1575,1576,1595,1611],{},[980,1577,826,1578,1214,1582,609,1584,609,1586,1588,1589,1591,1592,1594],{},[466,1579,1580],{"href":153},[457,1581,147],{},[457,1583,781],{},[457,1585,784],{},[457,1587,787],{}," modellje elrejti a konkrét backendet: egy fájlfeltöltéshez ne kelljen az app-kódodnak az AWS SDK-t importálnia, és a backend konfigurációval cserélhető. Ez a modul mutatja meg legjobban, hogy az absztrakció megdolgozik a keretéért: nem elméleti varrat, valóban több valódi driver áll mögötte (memóriabeli unit tesztekhez, helyi lemez egy egy-node-os telepítéshez, S3-kompatibilis production-höz), mind ugyanazt a ",[457,1590,781],{}," szerződést teljesíti, és a ",[457,1593,767],{}," ugyanazt a konformancia-suite-ot futtatja le mindegyiken.",[980,1596,826,1597,1601,1602,1604,1605,1607,1608,1610],{},[466,1598,1599],{"href":194},[457,1600,807],{}," becsomagolja a sentry-go-t: a Sentry env-ből kapcsolható (",[457,1603,1092],{}," üresen = teljesen kikapcsolva, minden hook no-op), és a ",[457,1606,174],{}," homlokzaton kívül senki nem importálja: aki csak a ",[457,1609,804],{},"-et használja (pl. egy CLI vagy migrációs tool), annak a binárisába a sentry-go be sem linkelődik.",[980,1612,826,1613,1214,1617,1619],{},[466,1614,1615],{"href":119},[457,1616,113],{},[457,1618,723],{}," interfésze mögött él a go-mail és az mjml-go, így tesztben memória-mailerre cserélhető.",[831,1621,1623],{"id":1622},"cserélhető-és-elhagyható-részek","Cserélhető és elhagyható részek",[448,1625,1626],{},"A centralizálás másik oldala, hogy a részek nem tapadnak össze:",[977,1628,1629,1646,1658,1669,1690],{},[980,1630,1631,1638,1639,1642,1643,1645],{},[452,1632,826,1633,609,1635,1637],{},[457,1634,405],{},[457,1636,590],{}," a kit nélkül is használható",": egy CLI-eszköz, egy Lambda vagy a ",[457,1640,1641],{},"cmd\u002Fmigrate"," bináris ugyanazzal a poollal és transactorral dolgozik, HTTP-réteg és ",[457,1644,891],{},"-import nélkül.",[980,1647,1648,1651,1652,1654,1655,1657],{},[452,1649,1650],{},"A Sentry teljesen elhagyható",": üres ",[457,1653,1092],{}," mellett a ",[457,1656,807],{}," integráció halott kód.",[980,1659,1660,464,1663,1665,1666,1668],{},[452,1661,1662],{},"Az OTel dev módban exporterek nélkül fut",[457,1664,1110],{},"), vagy teljesen kihagyható a ",[457,1667,1114],{},"-vel.",[980,1670,1671,1674,1675,609,1677,609,1679,1681,1682,1685,1686,1689],{},[452,1672,1673],{},"Az üzleti kód független a transporttól",": a handler, a service és a repository kód generált interfészekre és ",[457,1676,405],{},[457,1678,82],{},[457,1680,61],{}," típusokra épül, sosem közvetlenül a ",[457,1683,1684],{},"chi","-re; csak az entrypoint és a ",[457,1687,1688],{},"register.go"," ér hozzá a HTTP-réteghez.",[980,1691,1692,1695,1696,1698,1699,1701,1702,1705],{},[452,1693,1694],{},"A DB-implementáció importtal dől el",": a repository ",[457,1697,590],{},"-t (SQL) vagy ",[457,1700,594],{},"-ot (query builder) importál, a ",[457,1703,1704],{},"dbx.Transactor"," interfész és a contextben utazó tranzakció közös.",[831,1707,1709],{"id":1708},"hol-a-határ","Hol a határ",[448,1711,1712,1713,1718],{},"A kit nem vezet be néhány dolgot, ami átbillentené framework felé (",[466,1714,1717],{"href":1715,"rel":1716},"https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FInversionOfControl.html",[470],"Fowler: Inversion of Control","): nincs Module-interfész, amit egy bootstrap felfedez és sorba rendez; nincs kit-tulajdonú lifecycle-hook a business-kódban; nincs futásidejű DI-konténer, ami feloldja a függőségi gráfot helyetted. Ha ezek közül bármelyik megjelenne, a becsületes elnevezés innentől \"framework\" lenne, nem \"toolkit\".",[478,1720,1722],{"id":1721},"közös-kód-egy-döntési-létra","Közös kód: egy döntési létra",[448,1724,1725],{},"Minden projektben előbb-utóbb szükség lesz olyan kódra, amit több surface vagy több modul is használ. Hogy hova kerüljön, attól függ, mennyire széles körben osztott. Ez egy döntési létra, nem egyetlen szabály:",[1074,1727,1728,1732,1739,1743,1754,1758,1783,1787,1827,1831],{"level":1076},[1078,1729,1731],{"id":1730},"surface-lokális","Surface-lokális",[448,1733,1734,1735,1738],{},"Egy surface használja → marad a surface ",[457,1736,1737],{},"service"," csomagjában. Ne emeld ki csak azért, mert újrahasznosíthatónak tűnik. Akkor emeld ki, amikor tényleg megjelenik a második hívó.",[1078,1740,1742],{"id":1741},"modul-core","Modul-core",[448,1744,1745,1746,1749,1750,1753],{},"Egy modul több surface-e használja az üzleti szabályt vagy entitást → a modul generált ",[457,1747,1748],{},"core\u002F"," csomagjába kerül. Ez a megosztott szabályok alapértelmezett, generált helye: minden modul az első surface-ével együtt kapja, a surface-service-ek ide delegálnak. A perzisztencia párja a modul-szintű ",[457,1751,1752],{},"repository\u002F",": modulonként egyetlen perzisztencia-réteg, minden surface számára közösen.",[1078,1755,1757],{"id":1756},"modul-szint","Modul-szint",[448,1759,1760,1761,609,1764,1767,1768,1771,1772,1775,1776,1779,1780,1782],{},"Nem üzleti szabály, hanem a modul által termelt tartalom, amit a ",[457,1762,1763],{},"jobs",[457,1765,1766],{},"listeners"," egységek vagy több surface használ → egy névvel ellátott sibling csomag az ",[457,1769,1770],{},"internal\u002Fmodules\u002F\u003Cmodul>\u002F"," alatt, pl. ",[457,1773,1774],{},"internal\u002Fmodules\u002Fcontact\u002Fmail\u002F",". Soha ne ",[457,1777,1778],{},"shared\u002F"," legyen a neve: nevezd el aszerint, amit nyújt, ugyanaz a szabály, ami bármely Go csomagra vonatkozik (lásd ",[466,1781,238],{"href":239},").",[1078,1784,1786],{"id":1785},"app-szint","App-szint",[448,1788,1789,1790,1793,1794,1797,1798,1801,1802,1805,1806,1809,1810,1813,1814,591,1817,591,1820,591,1823,1826],{},"Két vagy több modul használja, vagy maga a ",[457,1791,1792],{},"cmd\u002F*"," wiring → ",[457,1795,1796],{},"internal\u002Fplatform\u002F\u003Cnév>\u002F",". Ez az egyetlen app-szintű közös hely, amivel egy generált projekt rendelkezik; nincs ",[457,1799,1800],{},"pkg\u002F"," és nincs ",[457,1803,1804],{},"internal\u002Fpkg\u002F"," (lásd ",[466,1807,35],{"href":1808},"\u002Fhu\u002Fgetting-started\u002Fproject-structure#hova-ker%C3%BClj%C3%B6n-a-k%C3%B6z%C3%B6s-k%C3%B3d","). Az ",[457,1811,1812],{},"internal\u002Fplatform"," tartalmazhat: env-config kompozíciót, infrastruktúra-adaptereket és gyárfüggvényeket, framework-glue-t, kis, technikai jellegű, keresztmetsző segédeszközöket (kérés-nyelv, kérés-ID). NEM tartalmazhat: üzleti entitásokat, üzleti szabályokat, vagy modul-specifikus sablonokat és payloadokat; ez a tartalom a modul szintjein marad, lejjebb a létrán. Mint minden más szinten, itt is érvényes az elnevezési szabály: ",[457,1815,1816],{},"util",[457,1818,1819],{},"common",[457,1821,1822],{},"helpers",[457,1824,1825],{},"shared"," tilos.",[1078,1828,1830],{"id":1829},"kit-szint","Kit-szint",[448,1832,1833],{},"Projekt-agnosztikus, és tényleg kell egy második projektnek → promóció egy önálló modulba (vagy, ha chassis-specifikus wiringről van szó, a gpsystem kitbe).",[448,1835,1836,1837,609,1839,1841,1842,1844,1845,1848,1849,1852,1853,1856],{},"A teljes létra egy kidolgozott példán: a ",[457,1838,113],{},[457,1840,710],{}," modulok a transzport (modul-szintű abban az értelemben, hogy minden projektnek kell egy SMTP-kliens, de önálló: nulla projekt-specifikus tudást hordoznak). Egy modul címzettlistája és e-mail sablonjai üzleti tartalom (modul-szint a projektben: ",[457,1843,1774],{},"). Az összerakott ",[457,1846,1847],{},"MAIL_*"," config az ",[457,1850,1851],{},"internal\u002Fplatform\u002Fconfig","-ban él. Lásd a ",[466,1854,1855],{"href":119},"Mail"," oldal teljes példáját.",[478,1858,1860],{"id":1859},"merre-tovább","Merre tovább",[977,1862,1863,1868,1875,1885,1890,1895],{},[980,1864,826,1865,1867],{},[466,1866,1042],{"href":41}," megmutatja, hogyan áll össze mindebből egy projekt: belépési pontokkal, workerrel, eventekkel.",[980,1869,984,1870,1068,1872,1874],{},[466,1871,253],{"href":254},[457,1873,1071],{}," belsejét nyitja fel.",[980,1876,826,1877,1068,1879,1881,1882,1884],{},[466,1878,224],{"href":225},[457,1880,358],{}," → ",[457,1883,386],{}," láncot követi végig.",[980,1886,826,1887,1889],{},[466,1888,233],{"href":234}," a TypeSpec-től a generált szerverkódig visz.",[980,1891,826,1892,1894],{},[466,1893,238],{"href":239}," a fenti modulokban visszatérő tervezési mintákat gyűjti egy katalógusba, kódpéldával és külső forrással.",[980,1896,826,1897,1899],{},[466,1898,209],{"href":210}," minden mögöttes library-t felsorol verzióval és hivatalos dokumentációval.",[1901,1902,1903],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":1263,"searchDepth":1277,"depth":1277,"links":1905},[1906,1909,1910,1911,1916,1917],{"id":480,"depth":1277,"text":481,"children":1907},[1908],{"id":833,"depth":1345,"text":834},{"id":971,"depth":1277,"text":972},{"id":1050,"depth":1277,"text":1051},{"id":1248,"depth":1277,"text":1249,"children":1912},[1913,1914,1915],{"id":1569,"depth":1345,"text":1570},{"id":1622,"depth":1345,"text":1623},{"id":1708,"depth":1345,"text":1709},{"id":1721,"depth":1277,"text":1722},{"id":1859,"depth":1277,"text":1860},"A modultérkép, egy service életciklusa, és az elv, ami az egészet összetartja.","md",null,{},{"icon":47},{"title":220,"description":1918},"QAQ_uz-RCuy8xsw7_Y09iQ-U7t_t9mNaVdlkj_dxN0s",[1926,1928],{"title":209,"path":210,"stem":211,"description":1927,"icon":212,"children":-1},"Minden mögöttes library verzióval, szereppel és hivatalos dokumentációval, modulonként csoportosítva.",{"title":224,"path":225,"stem":226,"description":1929,"icon":227,"children":-1},"RFC 9457 problem details mindenhol, alatta errs hibák stackkel, kóddal és kliensbiztos üzenettel.",1785445877220]