[{"data":1,"prerenderedAt":8337},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-getting-started-sample-app":442,"-hu-getting-started-sample-app-surround":8332},[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":40,"body":444,"description":8325,"extension":8326,"links":8327,"meta":8328,"navigation":8329,"path":41,"seo":8330,"stem":42,"__hash__":8331},"docs_hu\u002Fhu\u002F1.getting-started\u002F7.sample-app.md",{"type":445,"value":446,"toc":8319},"minimark",[447,456,461,541,545,548,773,777,826,8131,8165,8169,8176,8308,8315],[448,449,450,451,455],"p",{},"A dokumentáció példái egyetlen összefüggő projektből jönnek: a ",[452,453,454],"strong",{},"shop"," egy webshop-backend, két surface-szel, worker binárissal, eseményekkel és ütemezett jobbal. Nem kell megépítened ahhoz, hogy a dokumentációt olvasd, de minden oldal ennek a projektnek a fájljaira hivatkozik, így a részletek egy koherens egésszé állnak össze.",[457,458,460],"h2",{"id":459},"mit-modellez","Mit modellez",[462,463,464,484,502,515,528],"ul",{},[465,466,467,474,475,479,480,483],"li",{},[452,468,469,473],{},[470,471,472],"code",{},"api"," surface"," (publikus): terméklistázás ",[476,477,478],"a",{"href":436},"cursor-lapozással",", rendelésfeladás (",[470,481,482],{},"PlaceOrder","), validációval, policy-ellenőrzéssel és tranzakcióval.",[465,485,486,491,492,495,496,501],{},[452,487,488,473],{},[470,489,490],{},"admin",": termék CRUD és képfeltöltés ",[476,493,494],{"href":153},"object storage-ba",", ",[476,497,498],{"href":94},[470,499,500],{},"RequireRole(\"admin\")"," mögött.",[465,503,504,510,511,514],{},[452,505,506,509],{},[470,507,508],{},"orderPlaced"," event",": a rendelésfeladás tranzakciójából, ",[476,512,513],{"href":73},"outboxon"," keresztül kerül a queue-ba.",[465,516,517,523,524,527],{},[452,518,519,522],{},[470,520,521],{},"sendOrderConfirmation"," listener",": a workerben fut, ",[476,525,526],{"href":119},"MJML e-mailt"," küld.",[465,529,530,536,537,540],{},[452,531,532,535],{},[470,533,534],{},"nightlySalesReport"," job",": minden hajnalban fut, ",[476,538,539],{"href":78},"replika-biztosan",".",[457,542,544],{"id":543},"hogyan-generálódik","Hogyan generálódik",[448,546,547],{},"A teljes vázat a CLI adja: pontosan ezekkel a parancsokkal:",[549,550,555],"pre",{"className":551,"code":552,"language":553,"meta":554,"style":554},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem new project shop --module-path github.com\u002Facme\u002Fshop \\\n  --dir .\u002Fshop                    # --db bun is választható\ncd shop\n\ngo tool gpsystem new module shop                 # api surface, alapértelmezésben\ngo tool gpsystem add surface shop admin\ngo tool gpsystem add event shop orderPlaced\ngo tool gpsystem add listener shop orderPlaced sendOrderConfirmation --queue mail\ngo tool gpsystem add job shop nightlySalesReport --cron \"0 3 * * *\"\ngo tool gpsystem new migration create_products_and_orders\n\nmise run generate                                # tsp → OpenAPI → szerverkód → build\n","sh","",[470,556,557,592,605,615,622,641,660,678,705,736,753,758],{"__ignoreMap":554},[558,559,562,566,570,573,576,579,582,585,588],"span",{"class":560,"line":561},"line",1,[558,563,565],{"class":564},"sBMFI","go",[558,567,569],{"class":568},"sfazB"," tool",[558,571,572],{"class":568}," gpsystem",[558,574,575],{"class":568}," new",[558,577,578],{"class":568}," project",[558,580,581],{"class":568}," shop",[558,583,584],{"class":568}," --module-path",[558,586,587],{"class":568}," github.com\u002Facme\u002Fshop",[558,589,591],{"class":590},"sTEyZ"," \\\n",[558,593,595,598,601],{"class":560,"line":594},2,[558,596,597],{"class":568},"  --dir",[558,599,600],{"class":568}," .\u002Fshop",[558,602,604],{"class":603},"sHwdD","                    # --db bun is választható\n",[558,606,608,612],{"class":560,"line":607},3,[558,609,611],{"class":610},"s2Zo4","cd",[558,613,614],{"class":568}," shop\n",[558,616,618],{"class":560,"line":617},4,[558,619,621],{"emptyLinePlaceholder":620},true,"\n",[558,623,625,627,629,631,633,636,638],{"class":560,"line":624},5,[558,626,565],{"class":564},[558,628,569],{"class":568},[558,630,572],{"class":568},[558,632,575],{"class":568},[558,634,635],{"class":568}," module",[558,637,581],{"class":568},[558,639,640],{"class":603},"                 # api surface, alapértelmezésben\n",[558,642,644,646,648,650,653,655,657],{"class":560,"line":643},6,[558,645,565],{"class":564},[558,647,569],{"class":568},[558,649,572],{"class":568},[558,651,652],{"class":568}," add",[558,654,473],{"class":568},[558,656,581],{"class":568},[558,658,659],{"class":568}," admin\n",[558,661,663,665,667,669,671,673,675],{"class":560,"line":662},7,[558,664,565],{"class":564},[558,666,569],{"class":568},[558,668,572],{"class":568},[558,670,652],{"class":568},[558,672,509],{"class":568},[558,674,581],{"class":568},[558,676,677],{"class":568}," orderPlaced\n",[558,679,681,683,685,687,689,691,693,696,699,702],{"class":560,"line":680},8,[558,682,565],{"class":564},[558,684,569],{"class":568},[558,686,572],{"class":568},[558,688,652],{"class":568},[558,690,522],{"class":568},[558,692,581],{"class":568},[558,694,695],{"class":568}," orderPlaced",[558,697,698],{"class":568}," sendOrderConfirmation",[558,700,701],{"class":568}," --queue",[558,703,704],{"class":568}," mail\n",[558,706,708,710,712,714,716,718,720,723,726,730,733],{"class":560,"line":707},9,[558,709,565],{"class":564},[558,711,569],{"class":568},[558,713,572],{"class":568},[558,715,652],{"class":568},[558,717,535],{"class":568},[558,719,581],{"class":568},[558,721,722],{"class":568}," nightlySalesReport",[558,724,725],{"class":568}," --cron",[558,727,729],{"class":728},"sMK4o"," \"",[558,731,732],{"class":568},"0 3 * * *",[558,734,735],{"class":728},"\"\n",[558,737,739,741,743,745,747,750],{"class":560,"line":738},10,[558,740,565],{"class":564},[558,742,569],{"class":568},[558,744,572],{"class":568},[558,746,575],{"class":568},[558,748,749],{"class":568}," migration",[558,751,752],{"class":568}," create_products_and_orders\n",[558,754,756],{"class":560,"line":755},11,[558,757,621],{"emptyLinePlaceholder":620},[558,759,761,764,767,770],{"class":560,"line":760},12,[558,762,763],{"class":564},"mise",[558,765,766],{"class":568}," run",[558,768,769],{"class":568}," generate",[558,771,772],{"class":603},"                                # tsp → OpenAPI → szerverkód → build\n",[457,774,776],{"id":775},"a-projekt-alakja","A projekt alakja",[448,778,779,780,782,783,786,787,789,790,793,794,796,797,800,801,804,805,807,808,811,812,815,816,818,819,818,822,825],{},"Az alábbi fa minden fájlja pontosan az, amit a generátor + a saját üzleti logikád előállít, kattints végig rajta. Az ",[470,781,472],{}," surface a modul gyökerére mountolódik (",[470,784,785],{},"\u002Fapi\u002Fv1\u002Fshop\u002F...","), az ",[470,788,490],{}," a saját prefixe alá (",[470,791,792],{},"\u002Fapi\u002Fv1\u002Fadmin\u002Fshop\u002F...","), lásd ",[476,795,330],{"href":331},". A közös rendelési szabály a modul ",[470,798,799],{},"core\u002F"," csomagjában él, a perzisztencia a modul-szintű ",[470,802,803],{},"repository\u002F","-ban; az ",[470,806,472],{}," surface ",[470,809,810],{},"service\u002F","-e vékony varrat ezek fölött. A generált ",[470,813,814],{},"\u002F\u002F gpsystem:*"," anchor-kommenteket az olvashatóság kedvéért többnyire elhagytuk; a saját projektedben hagyd őket a helyükön: a későbbi ",[470,817,330],{}," \u002F ",[470,820,821],{},"add event",[470,823,824],{},"add listener"," hívások ezekhez a pontokhoz illesztenek.",[827,828,831,1446,2032,3074,3231,3365,3468,3835,4027,4506,5098,5697,6372,7442,7589,7871],"code-tree",{":expand-all":829,"default-value":830},"true","cmd\u002Fshop\u002Fmain.go",[549,832,835],{"className":833,"code":834,"filename":830,"language":565,"meta":554,"style":554},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgo-chi\u002Fchi\u002Fv5\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Fenvconf\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig\"\n)\n\nfunc main() {\n    cfg := envconf.MustLoad[config.Config]()\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, cfg.DB)\n\n    err := server.Run(ctx, cfg.Server, func(r chi.Router) error {\n        api := chi.NewRouter()\n        deps := shop.Dependencies{\n            DB:         pg.NewDB(pool),\n            Transactor: pg.NewTransactor(pool),\n            Dispatcher: outbox.NewDispatcher(outbox.NewStore(pg.NewDB(pool))),\n        }\n        shop.RegisterApi(api, deps)\n        shop.RegisterAdmin(api, deps)\n        r.Mount(\"\u002Fapi\u002Fv1\", api)\n        return nil\n    }, server.WithCloser(\"pgxpool\", func(context.Context) error {\n        pool.Close()\n        return nil\n    }))\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n",[470,836,837,845,849,858,868,877,881,890,894,903,912,921,930,935,945,955,961,966,981,1012,1031,1066,1071,1126,1143,1161,1186,1207,1249,1255,1277,1297,1325,1334,1373,1386,1393,1399,1416,1434,1440],{"__ignoreMap":554},[558,838,839,842],{"class":560,"line":561},[558,840,841],{"class":728},"package",[558,843,844],{"class":564}," main\n",[558,846,847],{"class":560,"line":594},[558,848,621],{"emptyLinePlaceholder":620},[558,850,851,855],{"class":560,"line":607},[558,852,854],{"class":853},"s7zQu","import",[558,856,857],{"class":728}," (\n",[558,859,860,863,866],{"class":560,"line":617},[558,861,862],{"class":728},"    \"",[558,864,865],{"class":564},"context",[558,867,735],{"class":728},[558,869,870,872,875],{"class":560,"line":624},[558,871,862],{"class":728},[558,873,874],{"class":564},"log",[558,876,735],{"class":728},[558,878,879],{"class":560,"line":643},[558,880,621],{"emptyLinePlaceholder":620},[558,882,883,885,888],{"class":560,"line":662},[558,884,862],{"class":728},[558,886,887],{"class":564},"github.com\u002Fgo-chi\u002Fchi\u002Fv5",[558,889,735],{"class":728},[558,891,892],{"class":560,"line":680},[558,893,621],{"emptyLinePlaceholder":620},[558,895,896,898,901],{"class":560,"line":707},[558,897,862],{"class":728},[558,899,900],{"class":564},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[558,902,735],{"class":728},[558,904,905,907,910],{"class":560,"line":738},[558,906,862],{"class":728},[558,908,909],{"class":564},"github.com\u002Fgp-system\u002Fenvconf",[558,911,735],{"class":728},[558,913,914,916,919],{"class":560,"line":755},[558,915,862],{"class":728},[558,917,918],{"class":564},"github.com\u002Fgp-system\u002Fevents\u002Foutbox",[558,920,735],{"class":728},[558,922,923,925,928],{"class":560,"line":760},[558,924,862],{"class":728},[558,926,927],{"class":564},"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver",[558,929,735],{"class":728},[558,931,933],{"class":560,"line":932},13,[558,934,621],{"emptyLinePlaceholder":620},[558,936,938,940,943],{"class":560,"line":937},14,[558,939,862],{"class":728},[558,941,942],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[558,944,735],{"class":728},[558,946,948,950,953],{"class":560,"line":947},15,[558,949,862],{"class":728},[558,951,952],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig",[558,954,735],{"class":728},[558,956,958],{"class":560,"line":957},16,[558,959,960],{"class":728},")\n",[558,962,964],{"class":560,"line":963},17,[558,965,621],{"emptyLinePlaceholder":620},[558,967,969,972,975,978],{"class":560,"line":968},18,[558,970,971],{"class":728},"func",[558,973,974],{"class":610}," main",[558,976,977],{"class":728},"()",[558,979,980],{"class":728}," {\n",[558,982,984,987,990,993,995,998,1001,1004,1006,1009],{"class":560,"line":983},19,[558,985,986],{"class":590},"    cfg ",[558,988,989],{"class":728},":=",[558,991,992],{"class":590}," envconf",[558,994,540],{"class":728},[558,996,997],{"class":610},"MustLoad",[558,999,1000],{"class":728},"[",[558,1002,1003],{"class":564},"config",[558,1005,540],{"class":728},[558,1007,1008],{"class":564},"Config",[558,1010,1011],{"class":728},"]()\n",[558,1013,1015,1018,1020,1023,1025,1028],{"class":560,"line":1014},20,[558,1016,1017],{"class":590},"    ctx ",[558,1019,989],{"class":728},[558,1021,1022],{"class":590}," context",[558,1024,540],{"class":728},[558,1026,1027],{"class":610},"Background",[558,1029,1030],{"class":728},"()\n",[558,1032,1034,1037,1039,1042,1044,1047,1050,1053,1056,1059,1061,1064],{"class":560,"line":1033},21,[558,1035,1036],{"class":590},"    pool ",[558,1038,989],{"class":728},[558,1040,1041],{"class":590}," pg",[558,1043,540],{"class":728},[558,1045,1046],{"class":610},"MustNewPool",[558,1048,1049],{"class":728},"(",[558,1051,1052],{"class":590},"ctx",[558,1054,1055],{"class":728},",",[558,1057,1058],{"class":590}," cfg",[558,1060,540],{"class":728},[558,1062,1063],{"class":590},"DB",[558,1065,960],{"class":728},[558,1067,1069],{"class":560,"line":1068},22,[558,1070,621],{"emptyLinePlaceholder":620},[558,1072,1074,1077,1079,1082,1084,1087,1089,1091,1093,1095,1097,1100,1102,1105,1109,1112,1114,1117,1120,1124],{"class":560,"line":1073},23,[558,1075,1076],{"class":590},"    err ",[558,1078,989],{"class":728},[558,1080,1081],{"class":590}," server",[558,1083,540],{"class":728},[558,1085,1086],{"class":610},"Run",[558,1088,1049],{"class":728},[558,1090,1052],{"class":590},[558,1092,1055],{"class":728},[558,1094,1058],{"class":590},[558,1096,540],{"class":728},[558,1098,1099],{"class":590},"Server",[558,1101,1055],{"class":728},[558,1103,1104],{"class":728}," func(",[558,1106,1108],{"class":1107},"sHdIc","r",[558,1110,1111],{"class":564}," chi",[558,1113,540],{"class":728},[558,1115,1116],{"class":564},"Router",[558,1118,1119],{"class":728},")",[558,1121,1123],{"class":1122},"spNyl"," error",[558,1125,980],{"class":728},[558,1127,1129,1132,1134,1136,1138,1141],{"class":560,"line":1128},24,[558,1130,1131],{"class":590},"        api ",[558,1133,989],{"class":728},[558,1135,1111],{"class":590},[558,1137,540],{"class":728},[558,1139,1140],{"class":610},"NewRouter",[558,1142,1030],{"class":728},[558,1144,1146,1149,1151,1153,1155,1158],{"class":560,"line":1145},25,[558,1147,1148],{"class":590},"        deps ",[558,1150,989],{"class":728},[558,1152,581],{"class":564},[558,1154,540],{"class":728},[558,1156,1157],{"class":564},"Dependencies",[558,1159,1160],{"class":728},"{\n",[558,1162,1164,1167,1170,1173,1175,1178,1180,1183],{"class":560,"line":1163},26,[558,1165,1166],{"class":590},"            DB",[558,1168,1169],{"class":728},":",[558,1171,1172],{"class":590},"         pg",[558,1174,540],{"class":728},[558,1176,1177],{"class":610},"NewDB",[558,1179,1049],{"class":728},[558,1181,1182],{"class":590},"pool",[558,1184,1185],{"class":728},"),\n",[558,1187,1189,1192,1194,1196,1198,1201,1203,1205],{"class":560,"line":1188},27,[558,1190,1191],{"class":590},"            Transactor",[558,1193,1169],{"class":728},[558,1195,1041],{"class":590},[558,1197,540],{"class":728},[558,1199,1200],{"class":610},"NewTransactor",[558,1202,1049],{"class":728},[558,1204,1182],{"class":590},[558,1206,1185],{"class":728},[558,1208,1210,1213,1215,1218,1220,1223,1225,1228,1230,1233,1235,1238,1240,1242,1244,1246],{"class":560,"line":1209},28,[558,1211,1212],{"class":590},"            Dispatcher",[558,1214,1169],{"class":728},[558,1216,1217],{"class":590}," outbox",[558,1219,540],{"class":728},[558,1221,1222],{"class":610},"NewDispatcher",[558,1224,1049],{"class":728},[558,1226,1227],{"class":590},"outbox",[558,1229,540],{"class":728},[558,1231,1232],{"class":610},"NewStore",[558,1234,1049],{"class":728},[558,1236,1237],{"class":590},"pg",[558,1239,540],{"class":728},[558,1241,1177],{"class":610},[558,1243,1049],{"class":728},[558,1245,1182],{"class":590},[558,1247,1248],{"class":728},"))),\n",[558,1250,1252],{"class":560,"line":1251},29,[558,1253,1254],{"class":728},"        }\n",[558,1256,1258,1261,1263,1266,1268,1270,1272,1275],{"class":560,"line":1257},30,[558,1259,1260],{"class":590},"        shop",[558,1262,540],{"class":728},[558,1264,1265],{"class":610},"RegisterApi",[558,1267,1049],{"class":728},[558,1269,472],{"class":590},[558,1271,1055],{"class":728},[558,1273,1274],{"class":590}," deps",[558,1276,960],{"class":728},[558,1278,1280,1282,1284,1287,1289,1291,1293,1295],{"class":560,"line":1279},31,[558,1281,1260],{"class":590},[558,1283,540],{"class":728},[558,1285,1286],{"class":610},"RegisterAdmin",[558,1288,1049],{"class":728},[558,1290,472],{"class":590},[558,1292,1055],{"class":728},[558,1294,1274],{"class":590},[558,1296,960],{"class":728},[558,1298,1300,1303,1305,1308,1310,1313,1316,1318,1320,1323],{"class":560,"line":1299},32,[558,1301,1302],{"class":590},"        r",[558,1304,540],{"class":728},[558,1306,1307],{"class":610},"Mount",[558,1309,1049],{"class":728},[558,1311,1312],{"class":728},"\"",[558,1314,1315],{"class":568},"\u002Fapi\u002Fv1",[558,1317,1312],{"class":728},[558,1319,1055],{"class":728},[558,1321,1322],{"class":590}," api",[558,1324,960],{"class":728},[558,1326,1328,1331],{"class":560,"line":1327},33,[558,1329,1330],{"class":853},"        return",[558,1332,1333],{"class":728}," nil\n",[558,1335,1337,1340,1342,1344,1347,1349,1351,1354,1356,1358,1360,1362,1364,1367,1369,1371],{"class":560,"line":1336},34,[558,1338,1339],{"class":728},"    },",[558,1341,1081],{"class":590},[558,1343,540],{"class":728},[558,1345,1346],{"class":610},"WithCloser",[558,1348,1049],{"class":728},[558,1350,1312],{"class":728},[558,1352,1353],{"class":568},"pgxpool",[558,1355,1312],{"class":728},[558,1357,1055],{"class":728},[558,1359,1104],{"class":728},[558,1361,865],{"class":564},[558,1363,540],{"class":728},[558,1365,1366],{"class":564},"Context",[558,1368,1119],{"class":728},[558,1370,1123],{"class":1122},[558,1372,980],{"class":728},[558,1374,1376,1379,1381,1384],{"class":560,"line":1375},35,[558,1377,1378],{"class":590},"        pool",[558,1380,540],{"class":728},[558,1382,1383],{"class":610},"Close",[558,1385,1030],{"class":728},[558,1387,1389,1391],{"class":560,"line":1388},36,[558,1390,1330],{"class":853},[558,1392,1333],{"class":728},[558,1394,1396],{"class":560,"line":1395},37,[558,1397,1398],{"class":728},"    }))\n",[558,1400,1402,1405,1408,1411,1414],{"class":560,"line":1401},38,[558,1403,1404],{"class":853},"    if",[558,1406,1407],{"class":590}," err ",[558,1409,1410],{"class":728},"!=",[558,1412,1413],{"class":728}," nil",[558,1415,980],{"class":728},[558,1417,1419,1422,1424,1427,1429,1432],{"class":560,"line":1418},39,[558,1420,1421],{"class":590},"        log",[558,1423,540],{"class":728},[558,1425,1426],{"class":610},"Fatal",[558,1428,1049],{"class":728},[558,1430,1431],{"class":590},"err",[558,1433,960],{"class":728},[558,1435,1437],{"class":560,"line":1436},40,[558,1438,1439],{"class":728},"    }\n",[558,1441,1443],{"class":560,"line":1442},41,[558,1444,1445],{"class":728},"}\n",[549,1447,1450],{"className":833,"code":1448,"filename":1449,"language":565,"meta":554,"style":554},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Fenvconf\"\n    \"github.com\u002Fgp-system\u002Fevents\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Fscheduler\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fworker\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    shopjobs \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fjobs\"\n    shoplisteners \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Flisteners\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig\"\n)\n\nfunc main() {\n    cfg := envconf.MustLoad[config.Config]()\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, cfg.DB)\n    relay := outbox.MustNewRelay(ctx, cfg.Outbox, pool, cfg.Worker.Valkey)\n\n    err := worker.Run(ctx, cfg.Worker, func(reg *events.Registry, sched *scheduler.Schedule) error {\n        shopDeps := shop.Dependencies{\n            DB:         pg.NewDB(pool),\n            Transactor: pg.NewTransactor(pool),\n            Dispatcher: outbox.NewDispatcher(outbox.NewStore(pg.NewDB(pool))),\n        }\n        shoplisteners.Register(reg, shopDeps)\n        shopjobs.Register(sched, shopDeps)\n        return nil\n    },\n        worker.WithOutboxRelay(relay),\n        worker.WithCloser(\"pgxpool\", func(context.Context) error {\n            pool.Close()\n            return nil\n        }),\n    )\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n","cmd\u002Fworker\u002Fmain.go",[470,1451,1452,1458,1462,1468,1476,1484,1488,1496,1504,1513,1521,1530,1539,1543,1551,1563,1575,1583,1587,1591,1601,1623,1637,1663,1709,1713,1776,1791,1809,1827,1861,1865,1886,1906,1912,1917,1934,1966,1977,1984,1989,1994,2007,2022,2027],{"__ignoreMap":554},[558,1453,1454,1456],{"class":560,"line":561},[558,1455,841],{"class":728},[558,1457,844],{"class":564},[558,1459,1460],{"class":560,"line":594},[558,1461,621],{"emptyLinePlaceholder":620},[558,1463,1464,1466],{"class":560,"line":607},[558,1465,854],{"class":853},[558,1467,857],{"class":728},[558,1469,1470,1472,1474],{"class":560,"line":617},[558,1471,862],{"class":728},[558,1473,865],{"class":564},[558,1475,735],{"class":728},[558,1477,1478,1480,1482],{"class":560,"line":624},[558,1479,862],{"class":728},[558,1481,874],{"class":564},[558,1483,735],{"class":728},[558,1485,1486],{"class":560,"line":643},[558,1487,621],{"emptyLinePlaceholder":620},[558,1489,1490,1492,1494],{"class":560,"line":662},[558,1491,862],{"class":728},[558,1493,900],{"class":564},[558,1495,735],{"class":728},[558,1497,1498,1500,1502],{"class":560,"line":680},[558,1499,862],{"class":728},[558,1501,909],{"class":564},[558,1503,735],{"class":728},[558,1505,1506,1508,1511],{"class":560,"line":707},[558,1507,862],{"class":728},[558,1509,1510],{"class":564},"github.com\u002Fgp-system\u002Fevents",[558,1512,735],{"class":728},[558,1514,1515,1517,1519],{"class":560,"line":738},[558,1516,862],{"class":728},[558,1518,918],{"class":564},[558,1520,735],{"class":728},[558,1522,1523,1525,1528],{"class":560,"line":755},[558,1524,862],{"class":728},[558,1526,1527],{"class":564},"github.com\u002Fgp-system\u002Fevents\u002Fscheduler",[558,1529,735],{"class":728},[558,1531,1532,1534,1537],{"class":560,"line":760},[558,1533,862],{"class":728},[558,1535,1536],{"class":564},"github.com\u002Fgp-system\u002Fgpsystem\u002Fworker",[558,1538,735],{"class":728},[558,1540,1541],{"class":560,"line":932},[558,1542,621],{"emptyLinePlaceholder":620},[558,1544,1545,1547,1549],{"class":560,"line":937},[558,1546,862],{"class":728},[558,1548,942],{"class":564},[558,1550,735],{"class":728},[558,1552,1553,1556,1558,1561],{"class":560,"line":947},[558,1554,1555],{"class":590},"    shopjobs ",[558,1557,1312],{"class":728},[558,1559,1560],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fjobs",[558,1562,735],{"class":728},[558,1564,1565,1568,1570,1573],{"class":560,"line":957},[558,1566,1567],{"class":590},"    shoplisteners ",[558,1569,1312],{"class":728},[558,1571,1572],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Flisteners",[558,1574,735],{"class":728},[558,1576,1577,1579,1581],{"class":560,"line":963},[558,1578,862],{"class":728},[558,1580,952],{"class":564},[558,1582,735],{"class":728},[558,1584,1585],{"class":560,"line":968},[558,1586,960],{"class":728},[558,1588,1589],{"class":560,"line":983},[558,1590,621],{"emptyLinePlaceholder":620},[558,1592,1593,1595,1597,1599],{"class":560,"line":1014},[558,1594,971],{"class":728},[558,1596,974],{"class":610},[558,1598,977],{"class":728},[558,1600,980],{"class":728},[558,1602,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621],{"class":560,"line":1033},[558,1604,986],{"class":590},[558,1606,989],{"class":728},[558,1608,992],{"class":590},[558,1610,540],{"class":728},[558,1612,997],{"class":610},[558,1614,1000],{"class":728},[558,1616,1003],{"class":564},[558,1618,540],{"class":728},[558,1620,1008],{"class":564},[558,1622,1011],{"class":728},[558,1624,1625,1627,1629,1631,1633,1635],{"class":560,"line":1068},[558,1626,1017],{"class":590},[558,1628,989],{"class":728},[558,1630,1022],{"class":590},[558,1632,540],{"class":728},[558,1634,1027],{"class":610},[558,1636,1030],{"class":728},[558,1638,1639,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661],{"class":560,"line":1073},[558,1640,1036],{"class":590},[558,1642,989],{"class":728},[558,1644,1041],{"class":590},[558,1646,540],{"class":728},[558,1648,1046],{"class":610},[558,1650,1049],{"class":728},[558,1652,1052],{"class":590},[558,1654,1055],{"class":728},[558,1656,1058],{"class":590},[558,1658,540],{"class":728},[558,1660,1063],{"class":590},[558,1662,960],{"class":728},[558,1664,1665,1668,1670,1672,1674,1677,1679,1681,1683,1685,1687,1689,1691,1694,1696,1698,1700,1702,1704,1707],{"class":560,"line":1128},[558,1666,1667],{"class":590},"    relay ",[558,1669,989],{"class":728},[558,1671,1217],{"class":590},[558,1673,540],{"class":728},[558,1675,1676],{"class":610},"MustNewRelay",[558,1678,1049],{"class":728},[558,1680,1052],{"class":590},[558,1682,1055],{"class":728},[558,1684,1058],{"class":590},[558,1686,540],{"class":728},[558,1688,72],{"class":590},[558,1690,1055],{"class":728},[558,1692,1693],{"class":590}," pool",[558,1695,1055],{"class":728},[558,1697,1058],{"class":590},[558,1699,540],{"class":728},[558,1701,263],{"class":590},[558,1703,540],{"class":728},[558,1705,1706],{"class":590},"Valkey",[558,1708,960],{"class":728},[558,1710,1711],{"class":560,"line":1145},[558,1712,621],{"emptyLinePlaceholder":620},[558,1714,1715,1717,1719,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1745,1748,1750,1752,1755,1757,1760,1762,1765,1767,1770,1772,1774],{"class":560,"line":1163},[558,1716,1076],{"class":590},[558,1718,989],{"class":728},[558,1720,1721],{"class":590}," worker",[558,1723,540],{"class":728},[558,1725,1086],{"class":610},[558,1727,1049],{"class":728},[558,1729,1052],{"class":590},[558,1731,1055],{"class":728},[558,1733,1058],{"class":590},[558,1735,540],{"class":728},[558,1737,263],{"class":590},[558,1739,1055],{"class":728},[558,1741,1104],{"class":728},[558,1743,1744],{"class":1107},"reg",[558,1746,1747],{"class":728}," *",[558,1749,61],{"class":564},[558,1751,540],{"class":728},[558,1753,1754],{"class":564},"Registry",[558,1756,1055],{"class":728},[558,1758,1759],{"class":1107}," sched",[558,1761,1747],{"class":728},[558,1763,1764],{"class":564},"scheduler",[558,1766,540],{"class":728},[558,1768,1769],{"class":564},"Schedule",[558,1771,1119],{"class":728},[558,1773,1123],{"class":1122},[558,1775,980],{"class":728},[558,1777,1778,1781,1783,1785,1787,1789],{"class":560,"line":1188},[558,1779,1780],{"class":590},"        shopDeps ",[558,1782,989],{"class":728},[558,1784,581],{"class":564},[558,1786,540],{"class":728},[558,1788,1157],{"class":564},[558,1790,1160],{"class":728},[558,1792,1793,1795,1797,1799,1801,1803,1805,1807],{"class":560,"line":1209},[558,1794,1166],{"class":590},[558,1796,1169],{"class":728},[558,1798,1172],{"class":590},[558,1800,540],{"class":728},[558,1802,1177],{"class":610},[558,1804,1049],{"class":728},[558,1806,1182],{"class":590},[558,1808,1185],{"class":728},[558,1810,1811,1813,1815,1817,1819,1821,1823,1825],{"class":560,"line":1251},[558,1812,1191],{"class":590},[558,1814,1169],{"class":728},[558,1816,1041],{"class":590},[558,1818,540],{"class":728},[558,1820,1200],{"class":610},[558,1822,1049],{"class":728},[558,1824,1182],{"class":590},[558,1826,1185],{"class":728},[558,1828,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859],{"class":560,"line":1257},[558,1830,1212],{"class":590},[558,1832,1169],{"class":728},[558,1834,1217],{"class":590},[558,1836,540],{"class":728},[558,1838,1222],{"class":610},[558,1840,1049],{"class":728},[558,1842,1227],{"class":590},[558,1844,540],{"class":728},[558,1846,1232],{"class":610},[558,1848,1049],{"class":728},[558,1850,1237],{"class":590},[558,1852,540],{"class":728},[558,1854,1177],{"class":610},[558,1856,1049],{"class":728},[558,1858,1182],{"class":590},[558,1860,1248],{"class":728},[558,1862,1863],{"class":560,"line":1279},[558,1864,1254],{"class":728},[558,1866,1867,1870,1872,1875,1877,1879,1881,1884],{"class":560,"line":1299},[558,1868,1869],{"class":590},"        shoplisteners",[558,1871,540],{"class":728},[558,1873,1874],{"class":610},"Register",[558,1876,1049],{"class":728},[558,1878,1744],{"class":590},[558,1880,1055],{"class":728},[558,1882,1883],{"class":590}," shopDeps",[558,1885,960],{"class":728},[558,1887,1888,1891,1893,1895,1897,1900,1902,1904],{"class":560,"line":1327},[558,1889,1890],{"class":590},"        shopjobs",[558,1892,540],{"class":728},[558,1894,1874],{"class":610},[558,1896,1049],{"class":728},[558,1898,1899],{"class":590},"sched",[558,1901,1055],{"class":728},[558,1903,1883],{"class":590},[558,1905,960],{"class":728},[558,1907,1908,1910],{"class":560,"line":1336},[558,1909,1330],{"class":853},[558,1911,1333],{"class":728},[558,1913,1914],{"class":560,"line":1375},[558,1915,1916],{"class":728},"    },\n",[558,1918,1919,1922,1924,1927,1929,1932],{"class":560,"line":1388},[558,1920,1921],{"class":590},"        worker",[558,1923,540],{"class":728},[558,1925,1926],{"class":610},"WithOutboxRelay",[558,1928,1049],{"class":728},[558,1930,1931],{"class":590},"relay",[558,1933,1185],{"class":728},[558,1935,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":560,"line":1395},[558,1937,1921],{"class":590},[558,1939,540],{"class":728},[558,1941,1346],{"class":610},[558,1943,1049],{"class":728},[558,1945,1312],{"class":728},[558,1947,1353],{"class":568},[558,1949,1312],{"class":728},[558,1951,1055],{"class":728},[558,1953,1104],{"class":728},[558,1955,865],{"class":564},[558,1957,540],{"class":728},[558,1959,1366],{"class":564},[558,1961,1119],{"class":728},[558,1963,1123],{"class":1122},[558,1965,980],{"class":728},[558,1967,1968,1971,1973,1975],{"class":560,"line":1401},[558,1969,1970],{"class":590},"            pool",[558,1972,540],{"class":728},[558,1974,1383],{"class":610},[558,1976,1030],{"class":728},[558,1978,1979,1982],{"class":560,"line":1418},[558,1980,1981],{"class":853},"            return",[558,1983,1333],{"class":728},[558,1985,1986],{"class":560,"line":1436},[558,1987,1988],{"class":728},"        }),\n",[558,1990,1991],{"class":560,"line":1442},[558,1992,1993],{"class":728},"    )\n",[558,1995,1997,1999,2001,2003,2005],{"class":560,"line":1996},42,[558,1998,1404],{"class":853},[558,2000,1407],{"class":590},[558,2002,1410],{"class":728},[558,2004,1413],{"class":728},[558,2006,980],{"class":728},[558,2008,2010,2012,2014,2016,2018,2020],{"class":560,"line":2009},43,[558,2011,1421],{"class":590},[558,2013,540],{"class":728},[558,2015,1426],{"class":610},[558,2017,1049],{"class":728},[558,2019,1431],{"class":590},[558,2021,960],{"class":728},[558,2023,2025],{"class":560,"line":2024},44,[558,2026,1439],{"class":728},[558,2028,2030],{"class":560,"line":2029},45,[558,2031,1445],{"class":728},[549,2033,2036],{"className":833,"code":2034,"filename":2035,"language":565,"meta":554,"style":554},"package shop\n\nimport (\n    \"github.com\u002Fgo-chi\u002Fchi\u002Fv5\"\n\n    \"github.com\u002Fgp-system\u002Fauth\"\n    kitpolicy \"github.com\u002Fgp-system\u002Fauth\u002Fpolicy\"\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Fevents\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver\"\n    \"github.com\u002Fgp-system\u002Fhttperr\"\n\n    adminhttp \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fhttp\"\n    shopadmingen \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fhttp\u002Fgen\"\n    adminpolicy \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fpolicy\"\n    adminservice \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fservice\"\n    apihttp \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\"\n    shopapigen \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fgen\"\n    apipolicy \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fpolicy\"\n    apiservice \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\"\n    \u002F\u002F gpsystem:imports\n)\n\ntype Dependencies struct {\n    DB         *pg.DB\n    Transactor dbx.Transactor\n    Dispatcher events.Dispatcher\n    Auth       auth.Config \u002F\u002F JWT_SECRET, JWT_ISSUER, ... a platform configból\n    \u002F\u002F gpsystem:dependencies\n}\n\nfunc RegisterApi(router chi.Router, deps Dependencies) {\n    apiSvc := apiservice.New(deps)\n    apiHandler := apihttp.New(apiSvc)\n    apiPolicies := apipolicy.New(apiSvc.Orders())\n    router.Route(\"\u002Fshop\", func(r chi.Router) {\n        shopapigen.HandlerWithOptions(shopapigen.NewStrictHandlerWithOptions(\n            apiHandler,\n            []shopapigen.StrictMiddlewareFunc{\n                server.StrictValidator[shopapigen.StrictHandlerFunc](nil),\n                \u002F\u002F Az utolsó a legkülső: az authorizáció a validáció előtt fut.\n                kitpolicy.Enforcer[shopapigen.StrictHandlerFunc](apiPolicies, shopapigen.PermissionByOperation, shopapigen.PolicyByOperation),\n            },\n            shopapigen.StrictHTTPServerOptions{\n                RequestErrorHandlerFunc:  httperr.WriteBadRequest,\n                ResponseErrorHandlerFunc: server.WriteError,\n            },\n        ), shopapigen.ChiServerOptions{\n            BaseRouter:       r,\n            ErrorHandlerFunc: httperr.WriteBadRequest,\n        })\n    })\n}\n\nfunc RegisterAdmin(router chi.Router, deps Dependencies) {\n    adminSvc := adminservice.New(deps)\n    adminHandler := adminhttp.New(adminSvc)\n    adminPolicies := adminpolicy.New()\n    router.Route(\"\u002Fadmin\u002Fshop\", func(r chi.Router) {\n        r.Use(server.AuthMiddleware(deps.Auth), server.RequireRole(\"admin\"))\n        shopadmingen.HandlerWithOptions(shopadmingen.NewStrictHandlerWithOptions(\n            adminHandler,\n            []shopadmingen.StrictMiddlewareFunc{\n                server.StrictValidator[shopadmingen.StrictHandlerFunc](nil),\n                kitpolicy.Enforcer[shopadmingen.StrictHandlerFunc](adminPolicies, shopadmingen.PermissionByOperation, shopadmingen.PolicyByOperation),\n            },\n            shopadmingen.StrictHTTPServerOptions{\n                RequestErrorHandlerFunc:  httperr.WriteBadRequest,\n                ResponseErrorHandlerFunc: server.WriteError,\n            },\n        ), shopadmingen.ChiServerOptions{\n            BaseRouter:       r,\n            ErrorHandlerFunc: httperr.WriteBadRequest,\n        })\n    })\n}\n","internal\u002Fmodules\u002Fshop\u002Fregister.go",[470,2037,2038,2044,2048,2054,2062,2066,2075,2087,2096,2104,2112,2120,2129,2133,2145,2157,2169,2181,2193,2205,2217,2229,2234,2238,2242,2255,2270,2282,2294,2308,2313,2317,2321,2349,2371,2392,2418,2453,2476,2484,2498,2520,2525,2570,2575,2587,2605,2622,2627,2642,2655,2672,2678,2684,2689,2694,2722,2743,2765,2782,2816,2866,2887,2895,2908,2927,2968,2973,2985,3000,3015,3020,3033,3044,3059,3064,3069],{"__ignoreMap":554},[558,2039,2040,2042],{"class":560,"line":561},[558,2041,841],{"class":728},[558,2043,614],{"class":564},[558,2045,2046],{"class":560,"line":594},[558,2047,621],{"emptyLinePlaceholder":620},[558,2049,2050,2052],{"class":560,"line":607},[558,2051,854],{"class":853},[558,2053,857],{"class":728},[558,2055,2056,2058,2060],{"class":560,"line":617},[558,2057,862],{"class":728},[558,2059,887],{"class":564},[558,2061,735],{"class":728},[558,2063,2064],{"class":560,"line":624},[558,2065,621],{"emptyLinePlaceholder":620},[558,2067,2068,2070,2073],{"class":560,"line":643},[558,2069,862],{"class":728},[558,2071,2072],{"class":564},"github.com\u002Fgp-system\u002Fauth",[558,2074,735],{"class":728},[558,2076,2077,2080,2082,2085],{"class":560,"line":662},[558,2078,2079],{"class":590},"    kitpolicy ",[558,2081,1312],{"class":728},[558,2083,2084],{"class":564},"github.com\u002Fgp-system\u002Fauth\u002Fpolicy",[558,2086,735],{"class":728},[558,2088,2089,2091,2094],{"class":560,"line":680},[558,2090,862],{"class":728},[558,2092,2093],{"class":564},"github.com\u002Fgp-system\u002Fdbx",[558,2095,735],{"class":728},[558,2097,2098,2100,2102],{"class":560,"line":707},[558,2099,862],{"class":728},[558,2101,900],{"class":564},[558,2103,735],{"class":728},[558,2105,2106,2108,2110],{"class":560,"line":738},[558,2107,862],{"class":728},[558,2109,1510],{"class":564},[558,2111,735],{"class":728},[558,2113,2114,2116,2118],{"class":560,"line":755},[558,2115,862],{"class":728},[558,2117,927],{"class":564},[558,2119,735],{"class":728},[558,2121,2122,2124,2127],{"class":560,"line":760},[558,2123,862],{"class":728},[558,2125,2126],{"class":564},"github.com\u002Fgp-system\u002Fhttperr",[558,2128,735],{"class":728},[558,2130,2131],{"class":560,"line":932},[558,2132,621],{"emptyLinePlaceholder":620},[558,2134,2135,2138,2140,2143],{"class":560,"line":937},[558,2136,2137],{"class":590},"    adminhttp ",[558,2139,1312],{"class":728},[558,2141,2142],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fhttp",[558,2144,735],{"class":728},[558,2146,2147,2150,2152,2155],{"class":560,"line":947},[558,2148,2149],{"class":590},"    shopadmingen ",[558,2151,1312],{"class":728},[558,2153,2154],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fhttp\u002Fgen",[558,2156,735],{"class":728},[558,2158,2159,2162,2164,2167],{"class":560,"line":957},[558,2160,2161],{"class":590},"    adminpolicy ",[558,2163,1312],{"class":728},[558,2165,2166],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fpolicy",[558,2168,735],{"class":728},[558,2170,2171,2174,2176,2179],{"class":560,"line":963},[558,2172,2173],{"class":590},"    adminservice ",[558,2175,1312],{"class":728},[558,2177,2178],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fservice",[558,2180,735],{"class":728},[558,2182,2183,2186,2188,2191],{"class":560,"line":968},[558,2184,2185],{"class":590},"    apihttp ",[558,2187,1312],{"class":728},[558,2189,2190],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp",[558,2192,735],{"class":728},[558,2194,2195,2198,2200,2203],{"class":560,"line":983},[558,2196,2197],{"class":590},"    shopapigen ",[558,2199,1312],{"class":728},[558,2201,2202],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fgen",[558,2204,735],{"class":728},[558,2206,2207,2210,2212,2215],{"class":560,"line":1014},[558,2208,2209],{"class":590},"    apipolicy ",[558,2211,1312],{"class":728},[558,2213,2214],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fpolicy",[558,2216,735],{"class":728},[558,2218,2219,2222,2224,2227],{"class":560,"line":1033},[558,2220,2221],{"class":590},"    apiservice ",[558,2223,1312],{"class":728},[558,2225,2226],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice",[558,2228,735],{"class":728},[558,2230,2231],{"class":560,"line":1068},[558,2232,2233],{"class":603},"    \u002F\u002F gpsystem:imports\n",[558,2235,2236],{"class":560,"line":1073},[558,2237,960],{"class":728},[558,2239,2240],{"class":560,"line":1128},[558,2241,621],{"emptyLinePlaceholder":620},[558,2243,2244,2247,2250,2253],{"class":560,"line":1145},[558,2245,2246],{"class":728},"type",[558,2248,2249],{"class":564}," Dependencies",[558,2251,2252],{"class":728}," struct",[558,2254,980],{"class":728},[558,2256,2257,2260,2263,2265,2267],{"class":560,"line":1163},[558,2258,2259],{"class":590},"    DB         ",[558,2261,2262],{"class":728},"*",[558,2264,1237],{"class":564},[558,2266,540],{"class":728},[558,2268,2269],{"class":564},"DB\n",[558,2271,2272,2275,2277,2279],{"class":560,"line":1188},[558,2273,2274],{"class":590},"    Transactor ",[558,2276,405],{"class":564},[558,2278,540],{"class":728},[558,2280,2281],{"class":564},"Transactor\n",[558,2283,2284,2287,2289,2291],{"class":560,"line":1209},[558,2285,2286],{"class":590},"    Dispatcher ",[558,2288,61],{"class":564},[558,2290,540],{"class":728},[558,2292,2293],{"class":564},"Dispatcher\n",[558,2295,2296,2299,2301,2303,2305],{"class":560,"line":1251},[558,2297,2298],{"class":590},"    Auth       ",[558,2300,82],{"class":564},[558,2302,540],{"class":728},[558,2304,1008],{"class":564},[558,2306,2307],{"class":603}," \u002F\u002F JWT_SECRET, JWT_ISSUER, ... a platform configból\n",[558,2309,2310],{"class":560,"line":1257},[558,2311,2312],{"class":603},"    \u002F\u002F gpsystem:dependencies\n",[558,2314,2315],{"class":560,"line":1279},[558,2316,1445],{"class":728},[558,2318,2319],{"class":560,"line":1299},[558,2320,621],{"emptyLinePlaceholder":620},[558,2322,2323,2325,2328,2330,2333,2335,2337,2339,2341,2343,2345,2347],{"class":560,"line":1327},[558,2324,971],{"class":728},[558,2326,2327],{"class":610}," RegisterApi",[558,2329,1049],{"class":728},[558,2331,2332],{"class":1107},"router",[558,2334,1111],{"class":564},[558,2336,540],{"class":728},[558,2338,1116],{"class":564},[558,2340,1055],{"class":728},[558,2342,1274],{"class":1107},[558,2344,2249],{"class":564},[558,2346,1119],{"class":728},[558,2348,980],{"class":728},[558,2350,2351,2354,2356,2359,2361,2364,2366,2369],{"class":560,"line":1336},[558,2352,2353],{"class":590},"    apiSvc ",[558,2355,989],{"class":728},[558,2357,2358],{"class":590}," apiservice",[558,2360,540],{"class":728},[558,2362,2363],{"class":610},"New",[558,2365,1049],{"class":728},[558,2367,2368],{"class":590},"deps",[558,2370,960],{"class":728},[558,2372,2373,2376,2378,2381,2383,2385,2387,2390],{"class":560,"line":1375},[558,2374,2375],{"class":590},"    apiHandler ",[558,2377,989],{"class":728},[558,2379,2380],{"class":590}," apihttp",[558,2382,540],{"class":728},[558,2384,2363],{"class":610},[558,2386,1049],{"class":728},[558,2388,2389],{"class":590},"apiSvc",[558,2391,960],{"class":728},[558,2393,2394,2397,2399,2402,2404,2406,2408,2410,2412,2415],{"class":560,"line":1388},[558,2395,2396],{"class":590},"    apiPolicies ",[558,2398,989],{"class":728},[558,2400,2401],{"class":590}," apipolicy",[558,2403,540],{"class":728},[558,2405,2363],{"class":610},[558,2407,1049],{"class":728},[558,2409,2389],{"class":590},[558,2411,540],{"class":728},[558,2413,2414],{"class":610},"Orders",[558,2416,2417],{"class":728},"())\n",[558,2419,2420,2423,2425,2428,2430,2432,2435,2437,2439,2441,2443,2445,2447,2449,2451],{"class":560,"line":1395},[558,2421,2422],{"class":590},"    router",[558,2424,540],{"class":728},[558,2426,2427],{"class":610},"Route",[558,2429,1049],{"class":728},[558,2431,1312],{"class":728},[558,2433,2434],{"class":568},"\u002Fshop",[558,2436,1312],{"class":728},[558,2438,1055],{"class":728},[558,2440,1104],{"class":728},[558,2442,1108],{"class":1107},[558,2444,1111],{"class":564},[558,2446,540],{"class":728},[558,2448,1116],{"class":564},[558,2450,1119],{"class":728},[558,2452,980],{"class":728},[558,2454,2455,2458,2460,2463,2465,2468,2470,2473],{"class":560,"line":1401},[558,2456,2457],{"class":590},"        shopapigen",[558,2459,540],{"class":728},[558,2461,2462],{"class":610},"HandlerWithOptions",[558,2464,1049],{"class":728},[558,2466,2467],{"class":590},"shopapigen",[558,2469,540],{"class":728},[558,2471,2472],{"class":610},"NewStrictHandlerWithOptions",[558,2474,2475],{"class":728},"(\n",[558,2477,2478,2481],{"class":560,"line":1418},[558,2479,2480],{"class":590},"            apiHandler",[558,2482,2483],{"class":728},",\n",[558,2485,2486,2489,2491,2493,2496],{"class":560,"line":1436},[558,2487,2488],{"class":728},"            []",[558,2490,2467],{"class":564},[558,2492,540],{"class":728},[558,2494,2495],{"class":564},"StrictMiddlewareFunc",[558,2497,1160],{"class":728},[558,2499,2500,2503,2505,2508,2510,2512,2514,2517],{"class":560,"line":1442},[558,2501,2502],{"class":590},"                server",[558,2504,540],{"class":728},[558,2506,2507],{"class":610},"StrictValidator",[558,2509,1000],{"class":728},[558,2511,2467],{"class":564},[558,2513,540],{"class":728},[558,2515,2516],{"class":564},"StrictHandlerFunc",[558,2518,2519],{"class":728},"](nil),\n",[558,2521,2522],{"class":560,"line":1996},[558,2523,2524],{"class":603},"                \u002F\u002F Az utolsó a legkülső: az authorizáció a validáció előtt fut.\n",[558,2526,2527,2530,2532,2535,2537,2539,2541,2543,2546,2549,2551,2554,2556,2559,2561,2563,2565,2568],{"class":560,"line":2009},[558,2528,2529],{"class":590},"                kitpolicy",[558,2531,540],{"class":728},[558,2533,2534],{"class":610},"Enforcer",[558,2536,1000],{"class":728},[558,2538,2467],{"class":564},[558,2540,540],{"class":728},[558,2542,2516],{"class":564},[558,2544,2545],{"class":728},"](",[558,2547,2548],{"class":590},"apiPolicies",[558,2550,1055],{"class":728},[558,2552,2553],{"class":590}," shopapigen",[558,2555,540],{"class":728},[558,2557,2558],{"class":590},"PermissionByOperation",[558,2560,1055],{"class":728},[558,2562,2553],{"class":590},[558,2564,540],{"class":728},[558,2566,2567],{"class":590},"PolicyByOperation",[558,2569,1185],{"class":728},[558,2571,2572],{"class":560,"line":2024},[558,2573,2574],{"class":728},"            },\n",[558,2576,2577,2580,2582,2585],{"class":560,"line":2029},[558,2578,2579],{"class":564},"            shopapigen",[558,2581,540],{"class":728},[558,2583,2584],{"class":564},"StrictHTTPServerOptions",[558,2586,1160],{"class":728},[558,2588,2590,2593,2595,2598,2600,2603],{"class":560,"line":2589},46,[558,2591,2592],{"class":590},"                RequestErrorHandlerFunc",[558,2594,1169],{"class":728},[558,2596,2597],{"class":590},"  httperr",[558,2599,540],{"class":728},[558,2601,2602],{"class":590},"WriteBadRequest",[558,2604,2483],{"class":728},[558,2606,2608,2611,2613,2615,2617,2620],{"class":560,"line":2607},47,[558,2609,2610],{"class":590},"                ResponseErrorHandlerFunc",[558,2612,1169],{"class":728},[558,2614,1081],{"class":590},[558,2616,540],{"class":728},[558,2618,2619],{"class":590},"WriteError",[558,2621,2483],{"class":728},[558,2623,2625],{"class":560,"line":2624},48,[558,2626,2574],{"class":728},[558,2628,2630,2633,2635,2637,2640],{"class":560,"line":2629},49,[558,2631,2632],{"class":728},"        ),",[558,2634,2553],{"class":564},[558,2636,540],{"class":728},[558,2638,2639],{"class":564},"ChiServerOptions",[558,2641,1160],{"class":728},[558,2643,2645,2648,2650,2653],{"class":560,"line":2644},50,[558,2646,2647],{"class":590},"            BaseRouter",[558,2649,1169],{"class":728},[558,2651,2652],{"class":590},"       r",[558,2654,2483],{"class":728},[558,2656,2658,2661,2663,2666,2668,2670],{"class":560,"line":2657},51,[558,2659,2660],{"class":590},"            ErrorHandlerFunc",[558,2662,1169],{"class":728},[558,2664,2665],{"class":590}," httperr",[558,2667,540],{"class":728},[558,2669,2602],{"class":590},[558,2671,2483],{"class":728},[558,2673,2675],{"class":560,"line":2674},52,[558,2676,2677],{"class":728},"        })\n",[558,2679,2681],{"class":560,"line":2680},53,[558,2682,2683],{"class":728},"    })\n",[558,2685,2687],{"class":560,"line":2686},54,[558,2688,1445],{"class":728},[558,2690,2692],{"class":560,"line":2691},55,[558,2693,621],{"emptyLinePlaceholder":620},[558,2695,2697,2699,2702,2704,2706,2708,2710,2712,2714,2716,2718,2720],{"class":560,"line":2696},56,[558,2698,971],{"class":728},[558,2700,2701],{"class":610}," RegisterAdmin",[558,2703,1049],{"class":728},[558,2705,2332],{"class":1107},[558,2707,1111],{"class":564},[558,2709,540],{"class":728},[558,2711,1116],{"class":564},[558,2713,1055],{"class":728},[558,2715,1274],{"class":1107},[558,2717,2249],{"class":564},[558,2719,1119],{"class":728},[558,2721,980],{"class":728},[558,2723,2725,2728,2730,2733,2735,2737,2739,2741],{"class":560,"line":2724},57,[558,2726,2727],{"class":590},"    adminSvc ",[558,2729,989],{"class":728},[558,2731,2732],{"class":590}," adminservice",[558,2734,540],{"class":728},[558,2736,2363],{"class":610},[558,2738,1049],{"class":728},[558,2740,2368],{"class":590},[558,2742,960],{"class":728},[558,2744,2746,2749,2751,2754,2756,2758,2760,2763],{"class":560,"line":2745},58,[558,2747,2748],{"class":590},"    adminHandler ",[558,2750,989],{"class":728},[558,2752,2753],{"class":590}," adminhttp",[558,2755,540],{"class":728},[558,2757,2363],{"class":610},[558,2759,1049],{"class":728},[558,2761,2762],{"class":590},"adminSvc",[558,2764,960],{"class":728},[558,2766,2768,2771,2773,2776,2778,2780],{"class":560,"line":2767},59,[558,2769,2770],{"class":590},"    adminPolicies ",[558,2772,989],{"class":728},[558,2774,2775],{"class":590}," adminpolicy",[558,2777,540],{"class":728},[558,2779,2363],{"class":610},[558,2781,1030],{"class":728},[558,2783,2785,2787,2789,2791,2793,2795,2798,2800,2802,2804,2806,2808,2810,2812,2814],{"class":560,"line":2784},60,[558,2786,2422],{"class":590},[558,2788,540],{"class":728},[558,2790,2427],{"class":610},[558,2792,1049],{"class":728},[558,2794,1312],{"class":728},[558,2796,2797],{"class":568},"\u002Fadmin\u002Fshop",[558,2799,1312],{"class":728},[558,2801,1055],{"class":728},[558,2803,1104],{"class":728},[558,2805,1108],{"class":1107},[558,2807,1111],{"class":564},[558,2809,540],{"class":728},[558,2811,1116],{"class":564},[558,2813,1119],{"class":728},[558,2815,980],{"class":728},[558,2817,2819,2821,2823,2826,2828,2831,2833,2836,2838,2840,2842,2845,2848,2850,2852,2855,2857,2859,2861,2863],{"class":560,"line":2818},61,[558,2820,1302],{"class":590},[558,2822,540],{"class":728},[558,2824,2825],{"class":610},"Use",[558,2827,1049],{"class":728},[558,2829,2830],{"class":590},"server",[558,2832,540],{"class":728},[558,2834,2835],{"class":610},"AuthMiddleware",[558,2837,1049],{"class":728},[558,2839,2368],{"class":590},[558,2841,540],{"class":728},[558,2843,2844],{"class":590},"Auth",[558,2846,2847],{"class":728},"),",[558,2849,1081],{"class":590},[558,2851,540],{"class":728},[558,2853,2854],{"class":610},"RequireRole",[558,2856,1049],{"class":728},[558,2858,1312],{"class":728},[558,2860,490],{"class":568},[558,2862,1312],{"class":728},[558,2864,2865],{"class":728},"))\n",[558,2867,2869,2872,2874,2876,2878,2881,2883,2885],{"class":560,"line":2868},62,[558,2870,2871],{"class":590},"        shopadmingen",[558,2873,540],{"class":728},[558,2875,2462],{"class":610},[558,2877,1049],{"class":728},[558,2879,2880],{"class":590},"shopadmingen",[558,2882,540],{"class":728},[558,2884,2472],{"class":610},[558,2886,2475],{"class":728},[558,2888,2890,2893],{"class":560,"line":2889},63,[558,2891,2892],{"class":590},"            adminHandler",[558,2894,2483],{"class":728},[558,2896,2898,2900,2902,2904,2906],{"class":560,"line":2897},64,[558,2899,2488],{"class":728},[558,2901,2880],{"class":564},[558,2903,540],{"class":728},[558,2905,2495],{"class":564},[558,2907,1160],{"class":728},[558,2909,2911,2913,2915,2917,2919,2921,2923,2925],{"class":560,"line":2910},65,[558,2912,2502],{"class":590},[558,2914,540],{"class":728},[558,2916,2507],{"class":610},[558,2918,1000],{"class":728},[558,2920,2880],{"class":564},[558,2922,540],{"class":728},[558,2924,2516],{"class":564},[558,2926,2519],{"class":728},[558,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2949,2951,2954,2956,2958,2960,2962,2964,2966],{"class":560,"line":2929},66,[558,2931,2529],{"class":590},[558,2933,540],{"class":728},[558,2935,2534],{"class":610},[558,2937,1000],{"class":728},[558,2939,2880],{"class":564},[558,2941,540],{"class":728},[558,2943,2516],{"class":564},[558,2945,2545],{"class":728},[558,2947,2948],{"class":590},"adminPolicies",[558,2950,1055],{"class":728},[558,2952,2953],{"class":590}," shopadmingen",[558,2955,540],{"class":728},[558,2957,2558],{"class":590},[558,2959,1055],{"class":728},[558,2961,2953],{"class":590},[558,2963,540],{"class":728},[558,2965,2567],{"class":590},[558,2967,1185],{"class":728},[558,2969,2971],{"class":560,"line":2970},67,[558,2972,2574],{"class":728},[558,2974,2976,2979,2981,2983],{"class":560,"line":2975},68,[558,2977,2978],{"class":564},"            shopadmingen",[558,2980,540],{"class":728},[558,2982,2584],{"class":564},[558,2984,1160],{"class":728},[558,2986,2988,2990,2992,2994,2996,2998],{"class":560,"line":2987},69,[558,2989,2592],{"class":590},[558,2991,1169],{"class":728},[558,2993,2597],{"class":590},[558,2995,540],{"class":728},[558,2997,2602],{"class":590},[558,2999,2483],{"class":728},[558,3001,3003,3005,3007,3009,3011,3013],{"class":560,"line":3002},70,[558,3004,2610],{"class":590},[558,3006,1169],{"class":728},[558,3008,1081],{"class":590},[558,3010,540],{"class":728},[558,3012,2619],{"class":590},[558,3014,2483],{"class":728},[558,3016,3018],{"class":560,"line":3017},71,[558,3019,2574],{"class":728},[558,3021,3023,3025,3027,3029,3031],{"class":560,"line":3022},72,[558,3024,2632],{"class":728},[558,3026,2953],{"class":564},[558,3028,540],{"class":728},[558,3030,2639],{"class":564},[558,3032,1160],{"class":728},[558,3034,3036,3038,3040,3042],{"class":560,"line":3035},73,[558,3037,2647],{"class":590},[558,3039,1169],{"class":728},[558,3041,2652],{"class":590},[558,3043,2483],{"class":728},[558,3045,3047,3049,3051,3053,3055,3057],{"class":560,"line":3046},74,[558,3048,2660],{"class":590},[558,3050,1169],{"class":728},[558,3052,2665],{"class":590},[558,3054,540],{"class":728},[558,3056,2602],{"class":590},[558,3058,2483],{"class":728},[558,3060,3062],{"class":560,"line":3061},75,[558,3063,2677],{"class":728},[558,3065,3067],{"class":560,"line":3066},76,[558,3068,2683],{"class":728},[558,3070,3072],{"class":560,"line":3071},77,[558,3073,1445],{"class":728},[549,3075,3078],{"className":833,"code":3076,"filename":3077,"language":565,"meta":554,"style":554},"package listeners\n\nimport (\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n\n    \"github.com\u002Fgp-system\u002Fevents\"\n    \"github.com\u002Fgp-system\u002Fqueue\"\n    \u002F\u002F gpsystem:worker-imports\n)\n\nfunc Register(reg *events.Registry, deps shop.Dependencies) {\n    events.Listen(reg, \"sendOrderConfirmation\", sendOrderConfirmation(deps), queue.OnQueue(\"mail\"))\n    \u002F\u002F gpsystem:listeners\n}\n","internal\u002Fmodules\u002Fshop\u002Flisteners\u002Fregister.go",[470,3079,3080,3087,3091,3097,3105,3109,3117,3126,3131,3135,3139,3172,3222,3227],{"__ignoreMap":554},[558,3081,3082,3084],{"class":560,"line":561},[558,3083,841],{"class":728},[558,3085,3086],{"class":564}," listeners\n",[558,3088,3089],{"class":560,"line":594},[558,3090,621],{"emptyLinePlaceholder":620},[558,3092,3093,3095],{"class":560,"line":607},[558,3094,854],{"class":853},[558,3096,857],{"class":728},[558,3098,3099,3101,3103],{"class":560,"line":617},[558,3100,862],{"class":728},[558,3102,942],{"class":564},[558,3104,735],{"class":728},[558,3106,3107],{"class":560,"line":624},[558,3108,621],{"emptyLinePlaceholder":620},[558,3110,3111,3113,3115],{"class":560,"line":643},[558,3112,862],{"class":728},[558,3114,1510],{"class":564},[558,3116,735],{"class":728},[558,3118,3119,3121,3124],{"class":560,"line":662},[558,3120,862],{"class":728},[558,3122,3123],{"class":564},"github.com\u002Fgp-system\u002Fqueue",[558,3125,735],{"class":728},[558,3127,3128],{"class":560,"line":680},[558,3129,3130],{"class":603},"    \u002F\u002F gpsystem:worker-imports\n",[558,3132,3133],{"class":560,"line":707},[558,3134,960],{"class":728},[558,3136,3137],{"class":560,"line":738},[558,3138,621],{"emptyLinePlaceholder":620},[558,3140,3141,3143,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170],{"class":560,"line":755},[558,3142,971],{"class":728},[558,3144,3145],{"class":610}," Register",[558,3147,1049],{"class":728},[558,3149,1744],{"class":1107},[558,3151,1747],{"class":728},[558,3153,61],{"class":564},[558,3155,540],{"class":728},[558,3157,1754],{"class":564},[558,3159,1055],{"class":728},[558,3161,1274],{"class":1107},[558,3163,581],{"class":564},[558,3165,540],{"class":728},[558,3167,1157],{"class":564},[558,3169,1119],{"class":728},[558,3171,980],{"class":728},[558,3173,3174,3177,3179,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3207,3209,3212,3214,3216,3218,3220],{"class":560,"line":760},[558,3175,3176],{"class":590},"    events",[558,3178,540],{"class":728},[558,3180,3181],{"class":610},"Listen",[558,3183,1049],{"class":728},[558,3185,1744],{"class":590},[558,3187,1055],{"class":728},[558,3189,729],{"class":728},[558,3191,521],{"class":568},[558,3193,1312],{"class":728},[558,3195,1055],{"class":728},[558,3197,698],{"class":610},[558,3199,1049],{"class":728},[558,3201,2368],{"class":590},[558,3203,2847],{"class":728},[558,3205,3206],{"class":590}," queue",[558,3208,540],{"class":728},[558,3210,3211],{"class":610},"OnQueue",[558,3213,1049],{"class":728},[558,3215,1312],{"class":728},[558,3217,113],{"class":568},[558,3219,1312],{"class":728},[558,3221,2865],{"class":728},[558,3223,3224],{"class":560,"line":932},[558,3225,3226],{"class":603},"    \u002F\u002F gpsystem:listeners\n",[558,3228,3229],{"class":560,"line":937},[558,3230,1445],{"class":728},[549,3232,3235],{"className":833,"code":3233,"filename":3234,"language":565,"meta":554,"style":554},"package jobs\n\nimport (\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n\n    \"github.com\u002Fgp-system\u002Fevents\u002Fscheduler\"\n    \u002F\u002F gpsystem:job-imports\n)\n\nfunc Register(sched *scheduler.Schedule, deps shop.Dependencies) {\n    sched.Job(\"shop.nightlySalesReport\", \"0 3 * * *\", nightlySalesReport(deps))\n    \u002F\u002F gpsystem:jobs\n}\n","internal\u002Fmodules\u002Fshop\u002Fjobs\u002Fregister.go",[470,3236,3237,3244,3248,3254,3262,3266,3274,3279,3283,3287,3319,3356,3361],{"__ignoreMap":554},[558,3238,3239,3241],{"class":560,"line":561},[558,3240,841],{"class":728},[558,3242,3243],{"class":564}," jobs\n",[558,3245,3246],{"class":560,"line":594},[558,3247,621],{"emptyLinePlaceholder":620},[558,3249,3250,3252],{"class":560,"line":607},[558,3251,854],{"class":853},[558,3253,857],{"class":728},[558,3255,3256,3258,3260],{"class":560,"line":617},[558,3257,862],{"class":728},[558,3259,942],{"class":564},[558,3261,735],{"class":728},[558,3263,3264],{"class":560,"line":624},[558,3265,621],{"emptyLinePlaceholder":620},[558,3267,3268,3270,3272],{"class":560,"line":643},[558,3269,862],{"class":728},[558,3271,1527],{"class":564},[558,3273,735],{"class":728},[558,3275,3276],{"class":560,"line":662},[558,3277,3278],{"class":603},"    \u002F\u002F gpsystem:job-imports\n",[558,3280,3281],{"class":560,"line":680},[558,3282,960],{"class":728},[558,3284,3285],{"class":560,"line":707},[558,3286,621],{"emptyLinePlaceholder":620},[558,3288,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315,3317],{"class":560,"line":738},[558,3290,971],{"class":728},[558,3292,3145],{"class":610},[558,3294,1049],{"class":728},[558,3296,1899],{"class":1107},[558,3298,1747],{"class":728},[558,3300,1764],{"class":564},[558,3302,540],{"class":728},[558,3304,1769],{"class":564},[558,3306,1055],{"class":728},[558,3308,1274],{"class":1107},[558,3310,581],{"class":564},[558,3312,540],{"class":728},[558,3314,1157],{"class":564},[558,3316,1119],{"class":728},[558,3318,980],{"class":728},[558,3320,3321,3324,3326,3329,3331,3333,3336,3338,3340,3342,3344,3346,3348,3350,3352,3354],{"class":560,"line":755},[558,3322,3323],{"class":590},"    sched",[558,3325,540],{"class":728},[558,3327,3328],{"class":610},"Job",[558,3330,1049],{"class":728},[558,3332,1312],{"class":728},[558,3334,3335],{"class":568},"shop.nightlySalesReport",[558,3337,1312],{"class":728},[558,3339,1055],{"class":728},[558,3341,729],{"class":728},[558,3343,732],{"class":568},[558,3345,1312],{"class":728},[558,3347,1055],{"class":728},[558,3349,722],{"class":610},[558,3351,1049],{"class":728},[558,3353,2368],{"class":590},[558,3355,2865],{"class":728},[558,3357,3358],{"class":560,"line":760},[558,3359,3360],{"class":603},"    \u002F\u002F gpsystem:jobs\n",[558,3362,3363],{"class":560,"line":932},[558,3364,1445],{"class":728},[549,3366,3369],{"className":833,"code":3367,"filename":3368,"language":565,"meta":554,"style":554},"package events\n\ntype OrderPlaced struct {\n    OrderID string `json:\"orderId\"`\n    Email   string `json:\"email\"`\n}\n\nfunc (OrderPlaced) EventName() string { return \"shop.orderPlaced\" }\n","internal\u002Fmodules\u002Fshop\u002Fevents\u002Forder_placed.go",[470,3370,3371,3378,3382,3393,3410,3424,3428,3432],{"__ignoreMap":554},[558,3372,3373,3375],{"class":560,"line":561},[558,3374,841],{"class":728},[558,3376,3377],{"class":564}," events\n",[558,3379,3380],{"class":560,"line":594},[558,3381,621],{"emptyLinePlaceholder":620},[558,3383,3384,3386,3389,3391],{"class":560,"line":607},[558,3385,2246],{"class":728},[558,3387,3388],{"class":564}," OrderPlaced",[558,3390,2252],{"class":728},[558,3392,980],{"class":728},[558,3394,3395,3398,3401,3404,3407],{"class":560,"line":617},[558,3396,3397],{"class":590},"    OrderID ",[558,3399,3400],{"class":1122},"string",[558,3402,3403],{"class":728}," `",[558,3405,3406],{"class":568},"json:\"orderId\"",[558,3408,3409],{"class":728},"`\n",[558,3411,3412,3415,3417,3419,3422],{"class":560,"line":624},[558,3413,3414],{"class":590},"    Email   ",[558,3416,3400],{"class":1122},[558,3418,3403],{"class":728},[558,3420,3421],{"class":568},"json:\"email\"",[558,3423,3409],{"class":728},[558,3425,3426],{"class":560,"line":643},[558,3427,1445],{"class":728},[558,3429,3430],{"class":560,"line":662},[558,3431,621],{"emptyLinePlaceholder":620},[558,3433,3434,3436,3439,3442,3444,3447,3449,3452,3455,3458,3460,3463,3465],{"class":560,"line":680},[558,3435,971],{"class":728},[558,3437,3438],{"class":728}," (",[558,3440,3441],{"class":564},"OrderPlaced",[558,3443,1119],{"class":728},[558,3445,3446],{"class":610}," EventName",[558,3448,977],{"class":728},[558,3450,3451],{"class":1122}," string",[558,3453,3454],{"class":728}," {",[558,3456,3457],{"class":853}," return",[558,3459,729],{"class":728},[558,3461,3462],{"class":568},"shop.orderPlaced",[558,3464,1312],{"class":728},[558,3466,3467],{"class":728}," }\n",[549,3469,3472],{"className":833,"code":3470,"filename":3471,"language":565,"meta":554,"style":554},"package listeners\n\nimport (\n    \"context\"\n    \"embed\"\n\n    \"github.com\u002Fgp-system\u002Fmail\"\n    \"github.com\u002Fgp-system\u002Fmail\u002Fmjml\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    shopevents \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fevents\"\n)\n\n\u002F\u002Fgo:embed templates\nvar templates embed.FS\n\nfunc sendOrderConfirmation(deps shop.Dependencies) func(context.Context, shopevents.OrderPlaced) error {\n    return func(ctx context.Context, ev shopevents.OrderPlaced) error {\n        msg := mail.NewMessage().\n            WithTo(ev.Email).\n            WithSubject(\"Your order confirmation, order \"+ev.OrderID).\n            WithBody(mjml.Template(templates, \"templates\u002Forder_confirmation.mjml.tmpl\",\n                map[string]any{\"OrderID\": ev.OrderID}).\n                WithTextTemplate(\"templates\u002Forder_confirmation.txt.tmpl\"))\n        return deps.Mailer.Send(ctx, msg)\n    }\n}\n","internal\u002Fmodules\u002Fshop\u002Flisteners\u002Fsend_order_confirmation.go",[470,3473,3474,3480,3484,3490,3498,3507,3511,3520,3529,3533,3541,3553,3557,3561,3566,3581,3585,3626,3658,3676,3694,3720,3751,3784,3800,3827,3831],{"__ignoreMap":554},[558,3475,3476,3478],{"class":560,"line":561},[558,3477,841],{"class":728},[558,3479,3086],{"class":564},[558,3481,3482],{"class":560,"line":594},[558,3483,621],{"emptyLinePlaceholder":620},[558,3485,3486,3488],{"class":560,"line":607},[558,3487,854],{"class":853},[558,3489,857],{"class":728},[558,3491,3492,3494,3496],{"class":560,"line":617},[558,3493,862],{"class":728},[558,3495,865],{"class":564},[558,3497,735],{"class":728},[558,3499,3500,3502,3505],{"class":560,"line":624},[558,3501,862],{"class":728},[558,3503,3504],{"class":564},"embed",[558,3506,735],{"class":728},[558,3508,3509],{"class":560,"line":643},[558,3510,621],{"emptyLinePlaceholder":620},[558,3512,3513,3515,3518],{"class":560,"line":662},[558,3514,862],{"class":728},[558,3516,3517],{"class":564},"github.com\u002Fgp-system\u002Fmail",[558,3519,735],{"class":728},[558,3521,3522,3524,3527],{"class":560,"line":680},[558,3523,862],{"class":728},[558,3525,3526],{"class":564},"github.com\u002Fgp-system\u002Fmail\u002Fmjml",[558,3528,735],{"class":728},[558,3530,3531],{"class":560,"line":707},[558,3532,621],{"emptyLinePlaceholder":620},[558,3534,3535,3537,3539],{"class":560,"line":738},[558,3536,862],{"class":728},[558,3538,942],{"class":564},[558,3540,735],{"class":728},[558,3542,3543,3546,3548,3551],{"class":560,"line":755},[558,3544,3545],{"class":590},"    shopevents ",[558,3547,1312],{"class":728},[558,3549,3550],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fevents",[558,3552,735],{"class":728},[558,3554,3555],{"class":560,"line":760},[558,3556,960],{"class":728},[558,3558,3559],{"class":560,"line":932},[558,3560,621],{"emptyLinePlaceholder":620},[558,3562,3563],{"class":560,"line":937},[558,3564,3565],{"class":603},"\u002F\u002Fgo:embed templates\n",[558,3567,3568,3571,3574,3576,3578],{"class":560,"line":947},[558,3569,3570],{"class":728},"var",[558,3572,3573],{"class":590}," templates ",[558,3575,3504],{"class":564},[558,3577,540],{"class":728},[558,3579,3580],{"class":564},"FS\n",[558,3582,3583],{"class":560,"line":957},[558,3584,621],{"emptyLinePlaceholder":620},[558,3586,3587,3589,3591,3593,3595,3597,3599,3601,3603,3605,3607,3609,3611,3613,3616,3618,3620,3622,3624],{"class":560,"line":963},[558,3588,971],{"class":728},[558,3590,698],{"class":610},[558,3592,1049],{"class":728},[558,3594,2368],{"class":1107},[558,3596,581],{"class":564},[558,3598,540],{"class":728},[558,3600,1157],{"class":564},[558,3602,1119],{"class":728},[558,3604,1104],{"class":728},[558,3606,865],{"class":564},[558,3608,540],{"class":728},[558,3610,1366],{"class":564},[558,3612,1055],{"class":728},[558,3614,3615],{"class":564}," shopevents",[558,3617,540],{"class":728},[558,3619,3441],{"class":564},[558,3621,1119],{"class":728},[558,3623,1123],{"class":1122},[558,3625,980],{"class":728},[558,3627,3628,3631,3633,3635,3637,3639,3641,3643,3646,3648,3650,3652,3654,3656],{"class":560,"line":968},[558,3629,3630],{"class":853},"    return",[558,3632,1104],{"class":728},[558,3634,1052],{"class":1107},[558,3636,1022],{"class":564},[558,3638,540],{"class":728},[558,3640,1366],{"class":564},[558,3642,1055],{"class":728},[558,3644,3645],{"class":1107}," ev",[558,3647,3615],{"class":564},[558,3649,540],{"class":728},[558,3651,3441],{"class":564},[558,3653,1119],{"class":728},[558,3655,1123],{"class":1122},[558,3657,980],{"class":728},[558,3659,3660,3663,3665,3668,3670,3673],{"class":560,"line":983},[558,3661,3662],{"class":590},"        msg ",[558,3664,989],{"class":728},[558,3666,3667],{"class":590}," mail",[558,3669,540],{"class":728},[558,3671,3672],{"class":610},"NewMessage",[558,3674,3675],{"class":728},"().\n",[558,3677,3678,3681,3683,3686,3688,3691],{"class":560,"line":1014},[558,3679,3680],{"class":610},"            WithTo",[558,3682,1049],{"class":728},[558,3684,3685],{"class":590},"ev",[558,3687,540],{"class":728},[558,3689,3690],{"class":590},"Email",[558,3692,3693],{"class":728},").\n",[558,3695,3696,3699,3701,3703,3706,3708,3711,3713,3715,3718],{"class":560,"line":1033},[558,3697,3698],{"class":610},"            WithSubject",[558,3700,1049],{"class":728},[558,3702,1312],{"class":728},[558,3704,3705],{"class":568},"Your order confirmation, order ",[558,3707,1312],{"class":728},[558,3709,3710],{"class":728},"+",[558,3712,3685],{"class":590},[558,3714,540],{"class":728},[558,3716,3717],{"class":590},"OrderID",[558,3719,3693],{"class":728},[558,3721,3722,3725,3727,3730,3732,3735,3737,3740,3742,3744,3747,3749],{"class":560,"line":1068},[558,3723,3724],{"class":610},"            WithBody",[558,3726,1049],{"class":728},[558,3728,3729],{"class":590},"mjml",[558,3731,540],{"class":728},[558,3733,3734],{"class":610},"Template",[558,3736,1049],{"class":728},[558,3738,3739],{"class":590},"templates",[558,3741,1055],{"class":728},[558,3743,729],{"class":728},[558,3745,3746],{"class":568},"templates\u002Forder_confirmation.mjml.tmpl",[558,3748,1312],{"class":728},[558,3750,2483],{"class":728},[558,3752,3753,3756,3758,3761,3764,3767,3769,3771,3773,3775,3777,3779,3781],{"class":560,"line":1073},[558,3754,3755],{"class":728},"                map[",[558,3757,3400],{"class":1122},[558,3759,3760],{"class":728},"]",[558,3762,3763],{"class":564},"any",[558,3765,3766],{"class":728},"{",[558,3768,1312],{"class":728},[558,3770,3717],{"class":568},[558,3772,1312],{"class":728},[558,3774,1169],{"class":728},[558,3776,3645],{"class":590},[558,3778,540],{"class":728},[558,3780,3717],{"class":590},[558,3782,3783],{"class":728},"}).\n",[558,3785,3786,3789,3791,3793,3796,3798],{"class":560,"line":1128},[558,3787,3788],{"class":610},"                WithTextTemplate",[558,3790,1049],{"class":728},[558,3792,1312],{"class":728},[558,3794,3795],{"class":568},"templates\u002Forder_confirmation.txt.tmpl",[558,3797,1312],{"class":728},[558,3799,2865],{"class":728},[558,3801,3802,3804,3806,3808,3811,3813,3816,3818,3820,3822,3825],{"class":560,"line":1145},[558,3803,1330],{"class":853},[558,3805,1274],{"class":590},[558,3807,540],{"class":728},[558,3809,3810],{"class":590},"Mailer",[558,3812,540],{"class":728},[558,3814,3815],{"class":610},"Send",[558,3817,1049],{"class":728},[558,3819,1052],{"class":590},[558,3821,1055],{"class":728},[558,3823,3824],{"class":590}," msg",[558,3826,960],{"class":728},[558,3828,3829],{"class":560,"line":1163},[558,3830,1439],{"class":728},[558,3832,3833],{"class":560,"line":1188},[558,3834,1445],{"class":728},[549,3836,3839],{"className":833,"code":3837,"filename":3838,"language":565,"meta":554,"style":554},"package jobs\n\nimport (\n    \"context\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n)\n\nfunc nightlySalesReport(deps shop.Dependencies) func(context.Context) error {\n    return func(ctx context.Context) error {\n        report, err := buildSalesReport(ctx, deps.DB)\n        if err != nil {\n            return err\n        }\n        return deps.Mailer.Send(ctx, salesReportMessage(report))\n    }\n}\n","internal\u002Fmodules\u002Fshop\u002Fjobs\u002Fnightly_sales_report.go",[470,3840,3841,3847,3851,3857,3865,3869,3877,3881,3885,3917,3937,3965,3978,3985,3989,4019,4023],{"__ignoreMap":554},[558,3842,3843,3845],{"class":560,"line":561},[558,3844,841],{"class":728},[558,3846,3243],{"class":564},[558,3848,3849],{"class":560,"line":594},[558,3850,621],{"emptyLinePlaceholder":620},[558,3852,3853,3855],{"class":560,"line":607},[558,3854,854],{"class":853},[558,3856,857],{"class":728},[558,3858,3859,3861,3863],{"class":560,"line":617},[558,3860,862],{"class":728},[558,3862,865],{"class":564},[558,3864,735],{"class":728},[558,3866,3867],{"class":560,"line":624},[558,3868,621],{"emptyLinePlaceholder":620},[558,3870,3871,3873,3875],{"class":560,"line":643},[558,3872,862],{"class":728},[558,3874,942],{"class":564},[558,3876,735],{"class":728},[558,3878,3879],{"class":560,"line":662},[558,3880,960],{"class":728},[558,3882,3883],{"class":560,"line":680},[558,3884,621],{"emptyLinePlaceholder":620},[558,3886,3887,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909,3911,3913,3915],{"class":560,"line":707},[558,3888,971],{"class":728},[558,3890,722],{"class":610},[558,3892,1049],{"class":728},[558,3894,2368],{"class":1107},[558,3896,581],{"class":564},[558,3898,540],{"class":728},[558,3900,1157],{"class":564},[558,3902,1119],{"class":728},[558,3904,1104],{"class":728},[558,3906,865],{"class":564},[558,3908,540],{"class":728},[558,3910,1366],{"class":564},[558,3912,1119],{"class":728},[558,3914,1123],{"class":1122},[558,3916,980],{"class":728},[558,3918,3919,3921,3923,3925,3927,3929,3931,3933,3935],{"class":560,"line":738},[558,3920,3630],{"class":853},[558,3922,1104],{"class":728},[558,3924,1052],{"class":1107},[558,3926,1022],{"class":564},[558,3928,540],{"class":728},[558,3930,1366],{"class":564},[558,3932,1119],{"class":728},[558,3934,1123],{"class":1122},[558,3936,980],{"class":728},[558,3938,3939,3942,3944,3946,3948,3951,3953,3955,3957,3959,3961,3963],{"class":560,"line":755},[558,3940,3941],{"class":590},"        report",[558,3943,1055],{"class":728},[558,3945,1407],{"class":590},[558,3947,989],{"class":728},[558,3949,3950],{"class":610}," buildSalesReport",[558,3952,1049],{"class":728},[558,3954,1052],{"class":590},[558,3956,1055],{"class":728},[558,3958,1274],{"class":590},[558,3960,540],{"class":728},[558,3962,1063],{"class":590},[558,3964,960],{"class":728},[558,3966,3967,3970,3972,3974,3976],{"class":560,"line":760},[558,3968,3969],{"class":853},"        if",[558,3971,1407],{"class":590},[558,3973,1410],{"class":728},[558,3975,1413],{"class":728},[558,3977,980],{"class":728},[558,3979,3980,3982],{"class":560,"line":932},[558,3981,1981],{"class":853},[558,3983,3984],{"class":590}," err\n",[558,3986,3987],{"class":560,"line":937},[558,3988,1254],{"class":728},[558,3990,3991,3993,3995,3997,3999,4001,4003,4005,4007,4009,4012,4014,4017],{"class":560,"line":947},[558,3992,1330],{"class":853},[558,3994,1274],{"class":590},[558,3996,540],{"class":728},[558,3998,3810],{"class":590},[558,4000,540],{"class":728},[558,4002,3815],{"class":610},[558,4004,1049],{"class":728},[558,4006,1052],{"class":590},[558,4008,1055],{"class":728},[558,4010,4011],{"class":610}," salesReportMessage",[558,4013,1049],{"class":728},[558,4015,4016],{"class":590},"report",[558,4018,2865],{"class":728},[558,4020,4021],{"class":560,"line":957},[558,4022,1439],{"class":728},[558,4024,4025],{"class":560,"line":963},[558,4026,1445],{"class":728},[549,4028,4031],{"className":833,"code":4029,"filename":4030,"language":565,"meta":554,"style":554},"package http\n\nimport (\n    \"context\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fgen\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\"\n)\n\ntype Handler struct {\n    svc *service.Service\n}\n\nfunc New(svc *service.Service) *Handler {\n    return &Handler{svc: svc}\n}\n\nfunc (h *Handler) PlaceOrder(ctx context.Context, req gen.PlaceOrderRequest) (gen.PlaceOrderResponse, error) {\n    if err := h.svc.PlaceOrder(ctx, toPlaceOrder(req)); err != nil {\n        return nil, err\n    }\n    return gen.PlaceOrder201Response{}, nil\n}\n\nfunc (h *Handler) ListProducts(ctx context.Context, req gen.ListProductsRequest) (gen.ListProductsResponse, error) {\n    page, err := h.svc.ListProducts(ctx, req.Params.Cursor, req.Params.Limit)\n    if err != nil {\n        return nil, service.ErrListProducts.Wrap(err, \"api: list products\")\n    }\n    return gen.ListProducts200JSONResponse(page), nil\n}\n","internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fhandler.go",[470,4032,4033,4040,4044,4050,4058,4062,4070,4078,4082,4086,4097,4112,4116,4120,4150,4170,4174,4178,4239,4283,4292,4296,4312,4316,4320,4377,4432,4444,4478,4482,4502],{"__ignoreMap":554},[558,4034,4035,4037],{"class":560,"line":561},[558,4036,841],{"class":728},[558,4038,4039],{"class":564}," http\n",[558,4041,4042],{"class":560,"line":594},[558,4043,621],{"emptyLinePlaceholder":620},[558,4045,4046,4048],{"class":560,"line":607},[558,4047,854],{"class":853},[558,4049,857],{"class":728},[558,4051,4052,4054,4056],{"class":560,"line":617},[558,4053,862],{"class":728},[558,4055,865],{"class":564},[558,4057,735],{"class":728},[558,4059,4060],{"class":560,"line":624},[558,4061,621],{"emptyLinePlaceholder":620},[558,4063,4064,4066,4068],{"class":560,"line":643},[558,4065,862],{"class":728},[558,4067,2202],{"class":564},[558,4069,735],{"class":728},[558,4071,4072,4074,4076],{"class":560,"line":662},[558,4073,862],{"class":728},[558,4075,2226],{"class":564},[558,4077,735],{"class":728},[558,4079,4080],{"class":560,"line":680},[558,4081,960],{"class":728},[558,4083,4084],{"class":560,"line":707},[558,4085,621],{"emptyLinePlaceholder":620},[558,4087,4088,4090,4093,4095],{"class":560,"line":738},[558,4089,2246],{"class":728},[558,4091,4092],{"class":564}," Handler",[558,4094,2252],{"class":728},[558,4096,980],{"class":728},[558,4098,4099,4102,4104,4107,4109],{"class":560,"line":755},[558,4100,4101],{"class":590},"    svc ",[558,4103,2262],{"class":728},[558,4105,4106],{"class":564},"service",[558,4108,540],{"class":728},[558,4110,4111],{"class":564},"Service\n",[558,4113,4114],{"class":560,"line":760},[558,4115,1445],{"class":728},[558,4117,4118],{"class":560,"line":932},[558,4119,621],{"emptyLinePlaceholder":620},[558,4121,4122,4124,4127,4129,4132,4134,4136,4138,4141,4143,4145,4148],{"class":560,"line":937},[558,4123,971],{"class":728},[558,4125,4126],{"class":610}," New",[558,4128,1049],{"class":728},[558,4130,4131],{"class":1107},"svc",[558,4133,1747],{"class":728},[558,4135,4106],{"class":564},[558,4137,540],{"class":728},[558,4139,4140],{"class":564},"Service",[558,4142,1119],{"class":728},[558,4144,1747],{"class":728},[558,4146,4147],{"class":564},"Handler",[558,4149,980],{"class":728},[558,4151,4152,4154,4157,4159,4161,4163,4165,4168],{"class":560,"line":947},[558,4153,3630],{"class":853},[558,4155,4156],{"class":728}," &",[558,4158,4147],{"class":564},[558,4160,3766],{"class":728},[558,4162,4131],{"class":590},[558,4164,1169],{"class":728},[558,4166,4167],{"class":590}," svc",[558,4169,1445],{"class":728},[558,4171,4172],{"class":560,"line":957},[558,4173,1445],{"class":728},[558,4175,4176],{"class":560,"line":963},[558,4177,621],{"emptyLinePlaceholder":620},[558,4179,4180,4182,4184,4187,4189,4191,4193,4196,4198,4200,4202,4204,4206,4208,4211,4214,4216,4219,4221,4223,4226,4228,4231,4233,4235,4237],{"class":560,"line":968},[558,4181,971],{"class":728},[558,4183,3438],{"class":728},[558,4185,4186],{"class":1107},"h ",[558,4188,2262],{"class":728},[558,4190,4147],{"class":564},[558,4192,1119],{"class":728},[558,4194,4195],{"class":610}," PlaceOrder",[558,4197,1049],{"class":728},[558,4199,1052],{"class":1107},[558,4201,1022],{"class":564},[558,4203,540],{"class":728},[558,4205,1366],{"class":564},[558,4207,1055],{"class":728},[558,4209,4210],{"class":1107}," req",[558,4212,4213],{"class":564}," gen",[558,4215,540],{"class":728},[558,4217,4218],{"class":564},"PlaceOrderRequest",[558,4220,1119],{"class":728},[558,4222,3438],{"class":728},[558,4224,4225],{"class":564},"gen",[558,4227,540],{"class":728},[558,4229,4230],{"class":564},"PlaceOrderResponse",[558,4232,1055],{"class":728},[558,4234,1123],{"class":1122},[558,4236,1119],{"class":728},[558,4238,980],{"class":728},[558,4240,4241,4243,4245,4247,4250,4252,4254,4256,4258,4260,4262,4264,4267,4269,4272,4275,4277,4279,4281],{"class":560,"line":983},[558,4242,1404],{"class":853},[558,4244,1407],{"class":590},[558,4246,989],{"class":728},[558,4248,4249],{"class":590}," h",[558,4251,540],{"class":728},[558,4253,4131],{"class":590},[558,4255,540],{"class":728},[558,4257,482],{"class":610},[558,4259,1049],{"class":728},[558,4261,1052],{"class":590},[558,4263,1055],{"class":728},[558,4265,4266],{"class":610}," toPlaceOrder",[558,4268,1049],{"class":728},[558,4270,4271],{"class":590},"req",[558,4273,4274],{"class":728},"));",[558,4276,1407],{"class":590},[558,4278,1410],{"class":728},[558,4280,1413],{"class":728},[558,4282,980],{"class":728},[558,4284,4285,4287,4290],{"class":560,"line":1014},[558,4286,1330],{"class":853},[558,4288,4289],{"class":728}," nil,",[558,4291,3984],{"class":590},[558,4293,4294],{"class":560,"line":1033},[558,4295,1439],{"class":728},[558,4297,4298,4300,4302,4304,4307,4310],{"class":560,"line":1068},[558,4299,3630],{"class":853},[558,4301,4213],{"class":564},[558,4303,540],{"class":728},[558,4305,4306],{"class":564},"PlaceOrder201Response",[558,4308,4309],{"class":728},"{},",[558,4311,1333],{"class":728},[558,4313,4314],{"class":560,"line":1073},[558,4315,1445],{"class":728},[558,4317,4318],{"class":560,"line":1128},[558,4319,621],{"emptyLinePlaceholder":620},[558,4321,4322,4324,4326,4328,4330,4332,4334,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4358,4360,4362,4364,4366,4369,4371,4373,4375],{"class":560,"line":1145},[558,4323,971],{"class":728},[558,4325,3438],{"class":728},[558,4327,4186],{"class":1107},[558,4329,2262],{"class":728},[558,4331,4147],{"class":564},[558,4333,1119],{"class":728},[558,4335,4336],{"class":610}," ListProducts",[558,4338,1049],{"class":728},[558,4340,1052],{"class":1107},[558,4342,1022],{"class":564},[558,4344,540],{"class":728},[558,4346,1366],{"class":564},[558,4348,1055],{"class":728},[558,4350,4210],{"class":1107},[558,4352,4213],{"class":564},[558,4354,540],{"class":728},[558,4356,4357],{"class":564},"ListProductsRequest",[558,4359,1119],{"class":728},[558,4361,3438],{"class":728},[558,4363,4225],{"class":564},[558,4365,540],{"class":728},[558,4367,4368],{"class":564},"ListProductsResponse",[558,4370,1055],{"class":728},[558,4372,1123],{"class":1122},[558,4374,1119],{"class":728},[558,4376,980],{"class":728},[558,4378,4379,4382,4384,4386,4388,4390,4392,4394,4396,4399,4401,4403,4405,4407,4409,4412,4414,4417,4419,4421,4423,4425,4427,4430],{"class":560,"line":1163},[558,4380,4381],{"class":590},"    page",[558,4383,1055],{"class":728},[558,4385,1407],{"class":590},[558,4387,989],{"class":728},[558,4389,4249],{"class":590},[558,4391,540],{"class":728},[558,4393,4131],{"class":590},[558,4395,540],{"class":728},[558,4397,4398],{"class":610},"ListProducts",[558,4400,1049],{"class":728},[558,4402,1052],{"class":590},[558,4404,1055],{"class":728},[558,4406,4210],{"class":590},[558,4408,540],{"class":728},[558,4410,4411],{"class":590},"Params",[558,4413,540],{"class":728},[558,4415,4416],{"class":590},"Cursor",[558,4418,1055],{"class":728},[558,4420,4210],{"class":590},[558,4422,540],{"class":728},[558,4424,4411],{"class":590},[558,4426,540],{"class":728},[558,4428,4429],{"class":590},"Limit",[558,4431,960],{"class":728},[558,4433,4434,4436,4438,4440,4442],{"class":560,"line":1188},[558,4435,1404],{"class":853},[558,4437,1407],{"class":590},[558,4439,1410],{"class":728},[558,4441,1413],{"class":728},[558,4443,980],{"class":728},[558,4445,4446,4448,4450,4453,4455,4458,4460,4463,4465,4467,4469,4471,4474,4476],{"class":560,"line":1209},[558,4447,1330],{"class":853},[558,4449,4289],{"class":728},[558,4451,4452],{"class":590}," service",[558,4454,540],{"class":728},[558,4456,4457],{"class":590},"ErrListProducts",[558,4459,540],{"class":728},[558,4461,4462],{"class":610},"Wrap",[558,4464,1049],{"class":728},[558,4466,1431],{"class":590},[558,4468,1055],{"class":728},[558,4470,729],{"class":728},[558,4472,4473],{"class":568},"api: list products",[558,4475,1312],{"class":728},[558,4477,960],{"class":728},[558,4479,4480],{"class":560,"line":1251},[558,4481,1439],{"class":728},[558,4483,4484,4486,4488,4490,4493,4495,4498,4500],{"class":560,"line":1257},[558,4485,3630],{"class":853},[558,4487,4213],{"class":590},[558,4489,540],{"class":728},[558,4491,4492],{"class":610},"ListProducts200JSONResponse",[558,4494,1049],{"class":728},[558,4496,4497],{"class":590},"page",[558,4499,2847],{"class":728},[558,4501,1333],{"class":728},[558,4503,4504],{"class":560,"line":1279},[558,4505,1445],{"class":728},[549,4507,4510],{"className":833,"code":4508,"filename":4509,"language":565,"meta":554,"style":554},"package policy\n\nimport (\n    \"context\"\n\n    kitpolicy \"github.com\u002Fgp-system\u002Fauth\u002Fpolicy\"\n    \"github.com\u002Fgp-system\u002Fauth\u002Frbac\"\n\n    gen \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fgen\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Frepository\"\n)\n\nfunc New(orders *repository.OrderRepo) *kitpolicy.Registry {\n    reg := kitpolicy.NewRegistry()\n    \u002F\u002F gpsystem:policies\n    reg.Register(\"orders.view\", func(ctx context.Context, id *rbac.Identity, req any) error {\n        if id.HasRole(\"admin\") {\n            return nil\n        }\n        r, ok := req.(gen.GetOrderRequest)\n        if !ok {\n            return kitpolicy.Deny(\"unexpected request type\")\n        }\n        order, err := orders.GetByID(ctx, r.OrderId)\n        if err != nil {\n            return err\n        }\n        if order.UserID != id.Subject {\n            return kitpolicy.Deny(\"You can only view your own orders.\")\n        }\n        return nil\n    })\n    reg.Register(\"orders.place\", func(ctx context.Context, id *rbac.Identity, req any) error {\n        r, ok := req.(gen.PlaceOrderRequest)\n        if !ok {\n            return kitpolicy.Deny(\"unexpected request type\")\n        }\n        if r.Body.CustomerId != id.Subject {\n            return kitpolicy.Deny(\"You can only place orders on your own behalf.\")\n        }\n        return nil\n    })\n    return reg\n}\n","internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fpolicy\u002Fpolicy.go",[470,4511,4512,4519,4523,4529,4537,4541,4551,4560,4564,4575,4584,4588,4592,4626,4643,4648,4706,4729,4735,4739,4764,4776,4798,4802,4837,4849,4855,4859,4882,4903,4907,4913,4917,4970,4992,5002,5022,5026,5052,5073,5077,5083,5087,5094],{"__ignoreMap":554},[558,4513,4514,4516],{"class":560,"line":561},[558,4515,841],{"class":728},[558,4517,4518],{"class":564}," policy\n",[558,4520,4521],{"class":560,"line":594},[558,4522,621],{"emptyLinePlaceholder":620},[558,4524,4525,4527],{"class":560,"line":607},[558,4526,854],{"class":853},[558,4528,857],{"class":728},[558,4530,4531,4533,4535],{"class":560,"line":617},[558,4532,862],{"class":728},[558,4534,865],{"class":564},[558,4536,735],{"class":728},[558,4538,4539],{"class":560,"line":624},[558,4540,621],{"emptyLinePlaceholder":620},[558,4542,4543,4545,4547,4549],{"class":560,"line":643},[558,4544,2079],{"class":590},[558,4546,1312],{"class":728},[558,4548,2084],{"class":564},[558,4550,735],{"class":728},[558,4552,4553,4555,4558],{"class":560,"line":662},[558,4554,862],{"class":728},[558,4556,4557],{"class":564},"github.com\u002Fgp-system\u002Fauth\u002Frbac",[558,4559,735],{"class":728},[558,4561,4562],{"class":560,"line":680},[558,4563,621],{"emptyLinePlaceholder":620},[558,4565,4566,4569,4571,4573],{"class":560,"line":707},[558,4567,4568],{"class":590},"    gen ",[558,4570,1312],{"class":728},[558,4572,2202],{"class":564},[558,4574,735],{"class":728},[558,4576,4577,4579,4582],{"class":560,"line":738},[558,4578,862],{"class":728},[558,4580,4581],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Frepository",[558,4583,735],{"class":728},[558,4585,4586],{"class":560,"line":755},[558,4587,960],{"class":728},[558,4589,4590],{"class":560,"line":760},[558,4591,621],{"emptyLinePlaceholder":620},[558,4593,4594,4596,4598,4600,4603,4605,4608,4610,4613,4615,4617,4620,4622,4624],{"class":560,"line":932},[558,4595,971],{"class":728},[558,4597,4126],{"class":610},[558,4599,1049],{"class":728},[558,4601,4602],{"class":1107},"orders",[558,4604,1747],{"class":728},[558,4606,4607],{"class":564},"repository",[558,4609,540],{"class":728},[558,4611,4612],{"class":564},"OrderRepo",[558,4614,1119],{"class":728},[558,4616,1747],{"class":728},[558,4618,4619],{"class":564},"kitpolicy",[558,4621,540],{"class":728},[558,4623,1754],{"class":564},[558,4625,980],{"class":728},[558,4627,4628,4631,4633,4636,4638,4641],{"class":560,"line":937},[558,4629,4630],{"class":590},"    reg ",[558,4632,989],{"class":728},[558,4634,4635],{"class":590}," kitpolicy",[558,4637,540],{"class":728},[558,4639,4640],{"class":610},"NewRegistry",[558,4642,1030],{"class":728},[558,4644,4645],{"class":560,"line":947},[558,4646,4647],{"class":603},"    \u002F\u002F gpsystem:policies\n",[558,4649,4650,4653,4655,4657,4659,4661,4664,4666,4668,4670,4672,4674,4676,4678,4680,4683,4685,4688,4690,4693,4695,4697,4700,4702,4704],{"class":560,"line":957},[558,4651,4652],{"class":590},"    reg",[558,4654,540],{"class":728},[558,4656,1874],{"class":610},[558,4658,1049],{"class":728},[558,4660,1312],{"class":728},[558,4662,4663],{"class":568},"orders.view",[558,4665,1312],{"class":728},[558,4667,1055],{"class":728},[558,4669,1104],{"class":728},[558,4671,1052],{"class":1107},[558,4673,1022],{"class":564},[558,4675,540],{"class":728},[558,4677,1366],{"class":564},[558,4679,1055],{"class":728},[558,4681,4682],{"class":1107}," id",[558,4684,1747],{"class":728},[558,4686,4687],{"class":564},"rbac",[558,4689,540],{"class":728},[558,4691,4692],{"class":564},"Identity",[558,4694,1055],{"class":728},[558,4696,4210],{"class":1107},[558,4698,4699],{"class":564}," any",[558,4701,1119],{"class":728},[558,4703,1123],{"class":1122},[558,4705,980],{"class":728},[558,4707,4708,4710,4712,4714,4717,4719,4721,4723,4725,4727],{"class":560,"line":963},[558,4709,3969],{"class":853},[558,4711,4682],{"class":590},[558,4713,540],{"class":728},[558,4715,4716],{"class":610},"HasRole",[558,4718,1049],{"class":728},[558,4720,1312],{"class":728},[558,4722,490],{"class":568},[558,4724,1312],{"class":728},[558,4726,1119],{"class":728},[558,4728,980],{"class":728},[558,4730,4731,4733],{"class":560,"line":968},[558,4732,1981],{"class":853},[558,4734,1333],{"class":728},[558,4736,4737],{"class":560,"line":983},[558,4738,1254],{"class":728},[558,4740,4741,4743,4745,4748,4750,4752,4755,4757,4759,4762],{"class":560,"line":1014},[558,4742,1302],{"class":590},[558,4744,1055],{"class":728},[558,4746,4747],{"class":590}," ok ",[558,4749,989],{"class":728},[558,4751,4210],{"class":590},[558,4753,4754],{"class":728},".(",[558,4756,4225],{"class":564},[558,4758,540],{"class":728},[558,4760,4761],{"class":564},"GetOrderRequest",[558,4763,960],{"class":728},[558,4765,4766,4768,4771,4774],{"class":560,"line":1033},[558,4767,3969],{"class":853},[558,4769,4770],{"class":728}," !",[558,4772,4773],{"class":590},"ok ",[558,4775,1160],{"class":728},[558,4777,4778,4780,4782,4784,4787,4789,4791,4794,4796],{"class":560,"line":1068},[558,4779,1981],{"class":853},[558,4781,4635],{"class":590},[558,4783,540],{"class":728},[558,4785,4786],{"class":610},"Deny",[558,4788,1049],{"class":728},[558,4790,1312],{"class":728},[558,4792,4793],{"class":568},"unexpected request type",[558,4795,1312],{"class":728},[558,4797,960],{"class":728},[558,4799,4800],{"class":560,"line":1073},[558,4801,1254],{"class":728},[558,4803,4804,4807,4809,4811,4813,4816,4818,4821,4823,4825,4827,4830,4832,4835],{"class":560,"line":1128},[558,4805,4806],{"class":590},"        order",[558,4808,1055],{"class":728},[558,4810,1407],{"class":590},[558,4812,989],{"class":728},[558,4814,4815],{"class":590}," orders",[558,4817,540],{"class":728},[558,4819,4820],{"class":610},"GetByID",[558,4822,1049],{"class":728},[558,4824,1052],{"class":590},[558,4826,1055],{"class":728},[558,4828,4829],{"class":590}," r",[558,4831,540],{"class":728},[558,4833,4834],{"class":590},"OrderId",[558,4836,960],{"class":728},[558,4838,4839,4841,4843,4845,4847],{"class":560,"line":1145},[558,4840,3969],{"class":853},[558,4842,1407],{"class":590},[558,4844,1410],{"class":728},[558,4846,1413],{"class":728},[558,4848,980],{"class":728},[558,4850,4851,4853],{"class":560,"line":1163},[558,4852,1981],{"class":853},[558,4854,3984],{"class":590},[558,4856,4857],{"class":560,"line":1188},[558,4858,1254],{"class":728},[558,4860,4861,4863,4866,4868,4871,4873,4875,4877,4880],{"class":560,"line":1209},[558,4862,3969],{"class":853},[558,4864,4865],{"class":590}," order",[558,4867,540],{"class":728},[558,4869,4870],{"class":590},"UserID ",[558,4872,1410],{"class":728},[558,4874,4682],{"class":590},[558,4876,540],{"class":728},[558,4878,4879],{"class":590},"Subject ",[558,4881,1160],{"class":728},[558,4883,4884,4886,4888,4890,4892,4894,4896,4899,4901],{"class":560,"line":1251},[558,4885,1981],{"class":853},[558,4887,4635],{"class":590},[558,4889,540],{"class":728},[558,4891,4786],{"class":610},[558,4893,1049],{"class":728},[558,4895,1312],{"class":728},[558,4897,4898],{"class":568},"You can only view your own orders.",[558,4900,1312],{"class":728},[558,4902,960],{"class":728},[558,4904,4905],{"class":560,"line":1257},[558,4906,1254],{"class":728},[558,4908,4909,4911],{"class":560,"line":1279},[558,4910,1330],{"class":853},[558,4912,1333],{"class":728},[558,4914,4915],{"class":560,"line":1299},[558,4916,2683],{"class":728},[558,4918,4919,4921,4923,4925,4927,4929,4932,4934,4936,4938,4940,4942,4944,4946,4948,4950,4952,4954,4956,4958,4960,4962,4964,4966,4968],{"class":560,"line":1327},[558,4920,4652],{"class":590},[558,4922,540],{"class":728},[558,4924,1874],{"class":610},[558,4926,1049],{"class":728},[558,4928,1312],{"class":728},[558,4930,4931],{"class":568},"orders.place",[558,4933,1312],{"class":728},[558,4935,1055],{"class":728},[558,4937,1104],{"class":728},[558,4939,1052],{"class":1107},[558,4941,1022],{"class":564},[558,4943,540],{"class":728},[558,4945,1366],{"class":564},[558,4947,1055],{"class":728},[558,4949,4682],{"class":1107},[558,4951,1747],{"class":728},[558,4953,4687],{"class":564},[558,4955,540],{"class":728},[558,4957,4692],{"class":564},[558,4959,1055],{"class":728},[558,4961,4210],{"class":1107},[558,4963,4699],{"class":564},[558,4965,1119],{"class":728},[558,4967,1123],{"class":1122},[558,4969,980],{"class":728},[558,4971,4972,4974,4976,4978,4980,4982,4984,4986,4988,4990],{"class":560,"line":1336},[558,4973,1302],{"class":590},[558,4975,1055],{"class":728},[558,4977,4747],{"class":590},[558,4979,989],{"class":728},[558,4981,4210],{"class":590},[558,4983,4754],{"class":728},[558,4985,4225],{"class":564},[558,4987,540],{"class":728},[558,4989,4218],{"class":564},[558,4991,960],{"class":728},[558,4993,4994,4996,4998,5000],{"class":560,"line":1375},[558,4995,3969],{"class":853},[558,4997,4770],{"class":728},[558,4999,4773],{"class":590},[558,5001,1160],{"class":728},[558,5003,5004,5006,5008,5010,5012,5014,5016,5018,5020],{"class":560,"line":1388},[558,5005,1981],{"class":853},[558,5007,4635],{"class":590},[558,5009,540],{"class":728},[558,5011,4786],{"class":610},[558,5013,1049],{"class":728},[558,5015,1312],{"class":728},[558,5017,4793],{"class":568},[558,5019,1312],{"class":728},[558,5021,960],{"class":728},[558,5023,5024],{"class":560,"line":1395},[558,5025,1254],{"class":728},[558,5027,5028,5030,5032,5034,5037,5039,5042,5044,5046,5048,5050],{"class":560,"line":1401},[558,5029,3969],{"class":853},[558,5031,4829],{"class":590},[558,5033,540],{"class":728},[558,5035,5036],{"class":590},"Body",[558,5038,540],{"class":728},[558,5040,5041],{"class":590},"CustomerId ",[558,5043,1410],{"class":728},[558,5045,4682],{"class":590},[558,5047,540],{"class":728},[558,5049,4879],{"class":590},[558,5051,1160],{"class":728},[558,5053,5054,5056,5058,5060,5062,5064,5066,5069,5071],{"class":560,"line":1418},[558,5055,1981],{"class":853},[558,5057,4635],{"class":590},[558,5059,540],{"class":728},[558,5061,4786],{"class":610},[558,5063,1049],{"class":728},[558,5065,1312],{"class":728},[558,5067,5068],{"class":568},"You can only place orders on your own behalf.",[558,5070,1312],{"class":728},[558,5072,960],{"class":728},[558,5074,5075],{"class":560,"line":1436},[558,5076,1254],{"class":728},[558,5078,5079,5081],{"class":560,"line":1442},[558,5080,1330],{"class":853},[558,5082,1333],{"class":728},[558,5084,5085],{"class":560,"line":1996},[558,5086,2683],{"class":728},[558,5088,5089,5091],{"class":560,"line":2009},[558,5090,3630],{"class":853},[558,5092,5093],{"class":590}," reg\n",[558,5095,5096],{"class":560,"line":2024},[558,5097,1445],{"class":728},[549,5099,5102],{"className":833,"code":5100,"filename":5101,"language":565,"meta":554,"style":554},"\u002F\u002F Package core a shop modul közös üzleti logikája: a rendelési szabály\n\u002F\u002F egyszer van leírva, és minden surface (ma az api, holnap akár egy partner\n\u002F\u002F surface) innen hívja. Importirány: http → service → core → repository.\npackage core\n\nimport (\n    \"context\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fevents\"\n\n    shopevents \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fevents\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Frepository\"\n)\n\ntype PlaceOrderInput struct {\n    CustomerID string\n    ProductID  string\n    Qty        int\n    Email      string\n}\n\ntype Service struct {\n    orders     *repository.OrderRepo\n    products   *repository.Products\n    tx         dbx.Transactor\n    dispatcher events.Dispatcher\n}\n\nfunc New(orders *repository.OrderRepo, products *repository.Products, tx dbx.Transactor, dispatcher events.Dispatcher) *Service {\n    return &Service{orders: orders, products: products, tx: tx, dispatcher: dispatcher}\n}\n\nfunc (c *Service) PlaceOrder(ctx context.Context, in PlaceOrderInput) error {\n    return c.tx.WithinTransaction(ctx, func(ctx context.Context) error {\n        order, err := c.orders.Insert(ctx, in)\n        if err != nil {\n            return err\n        }\n        if err := c.products.DecrementStock(ctx, in.ProductID, in.Qty); err != nil {\n            return err\n        }\n        return c.dispatcher.Dispatch(ctx, shopevents.OrderPlaced{\n            OrderID: order.ID,\n            Email:   order.Email,\n        })\n    })\n}\n","internal\u002Fmodules\u002Fshop\u002Fcore\u002Fcore.go",[470,5103,5104,5109,5114,5119,5126,5130,5136,5144,5148,5156,5164,5168,5178,5186,5190,5194,5205,5213,5220,5228,5235,5239,5243,5254,5268,5282,5293,5304,5308,5312,5378,5420,5424,5428,5468,5507,5538,5550,5556,5560,5613,5619,5623,5653,5669,5685,5689,5693],{"__ignoreMap":554},[558,5105,5106],{"class":560,"line":561},[558,5107,5108],{"class":603},"\u002F\u002F Package core a shop modul közös üzleti logikája: a rendelési szabály\n",[558,5110,5111],{"class":560,"line":594},[558,5112,5113],{"class":603},"\u002F\u002F egyszer van leírva, és minden surface (ma az api, holnap akár egy partner\n",[558,5115,5116],{"class":560,"line":607},[558,5117,5118],{"class":603},"\u002F\u002F surface) innen hívja. Importirány: http → service → core → repository.\n",[558,5120,5121,5123],{"class":560,"line":617},[558,5122,841],{"class":728},[558,5124,5125],{"class":564}," core\n",[558,5127,5128],{"class":560,"line":624},[558,5129,621],{"emptyLinePlaceholder":620},[558,5131,5132,5134],{"class":560,"line":643},[558,5133,854],{"class":853},[558,5135,857],{"class":728},[558,5137,5138,5140,5142],{"class":560,"line":662},[558,5139,862],{"class":728},[558,5141,865],{"class":564},[558,5143,735],{"class":728},[558,5145,5146],{"class":560,"line":680},[558,5147,621],{"emptyLinePlaceholder":620},[558,5149,5150,5152,5154],{"class":560,"line":707},[558,5151,862],{"class":728},[558,5153,2093],{"class":564},[558,5155,735],{"class":728},[558,5157,5158,5160,5162],{"class":560,"line":738},[558,5159,862],{"class":728},[558,5161,1510],{"class":564},[558,5163,735],{"class":728},[558,5165,5166],{"class":560,"line":755},[558,5167,621],{"emptyLinePlaceholder":620},[558,5169,5170,5172,5174,5176],{"class":560,"line":760},[558,5171,3545],{"class":590},[558,5173,1312],{"class":728},[558,5175,3550],{"class":564},[558,5177,735],{"class":728},[558,5179,5180,5182,5184],{"class":560,"line":932},[558,5181,862],{"class":728},[558,5183,4581],{"class":564},[558,5185,735],{"class":728},[558,5187,5188],{"class":560,"line":937},[558,5189,960],{"class":728},[558,5191,5192],{"class":560,"line":947},[558,5193,621],{"emptyLinePlaceholder":620},[558,5195,5196,5198,5201,5203],{"class":560,"line":957},[558,5197,2246],{"class":728},[558,5199,5200],{"class":564}," PlaceOrderInput",[558,5202,2252],{"class":728},[558,5204,980],{"class":728},[558,5206,5207,5210],{"class":560,"line":963},[558,5208,5209],{"class":590},"    CustomerID ",[558,5211,5212],{"class":1122},"string\n",[558,5214,5215,5218],{"class":560,"line":968},[558,5216,5217],{"class":590},"    ProductID  ",[558,5219,5212],{"class":1122},[558,5221,5222,5225],{"class":560,"line":983},[558,5223,5224],{"class":590},"    Qty        ",[558,5226,5227],{"class":1122},"int\n",[558,5229,5230,5233],{"class":560,"line":1014},[558,5231,5232],{"class":590},"    Email      ",[558,5234,5212],{"class":1122},[558,5236,5237],{"class":560,"line":1033},[558,5238,1445],{"class":728},[558,5240,5241],{"class":560,"line":1068},[558,5242,621],{"emptyLinePlaceholder":620},[558,5244,5245,5247,5250,5252],{"class":560,"line":1073},[558,5246,2246],{"class":728},[558,5248,5249],{"class":564}," Service",[558,5251,2252],{"class":728},[558,5253,980],{"class":728},[558,5255,5256,5259,5261,5263,5265],{"class":560,"line":1128},[558,5257,5258],{"class":590},"    orders     ",[558,5260,2262],{"class":728},[558,5262,4607],{"class":564},[558,5264,540],{"class":728},[558,5266,5267],{"class":564},"OrderRepo\n",[558,5269,5270,5273,5275,5277,5279],{"class":560,"line":1145},[558,5271,5272],{"class":590},"    products   ",[558,5274,2262],{"class":728},[558,5276,4607],{"class":564},[558,5278,540],{"class":728},[558,5280,5281],{"class":564},"Products\n",[558,5283,5284,5287,5289,5291],{"class":560,"line":1163},[558,5285,5286],{"class":590},"    tx         ",[558,5288,405],{"class":564},[558,5290,540],{"class":728},[558,5292,2281],{"class":564},[558,5294,5295,5298,5300,5302],{"class":560,"line":1188},[558,5296,5297],{"class":590},"    dispatcher ",[558,5299,61],{"class":564},[558,5301,540],{"class":728},[558,5303,2293],{"class":564},[558,5305,5306],{"class":560,"line":1209},[558,5307,1445],{"class":728},[558,5309,5310],{"class":560,"line":1251},[558,5311,621],{"emptyLinePlaceholder":620},[558,5313,5314,5316,5318,5320,5322,5324,5326,5328,5330,5332,5335,5337,5339,5341,5344,5346,5349,5352,5354,5357,5359,5362,5365,5367,5370,5372,5374,5376],{"class":560,"line":1257},[558,5315,971],{"class":728},[558,5317,4126],{"class":610},[558,5319,1049],{"class":728},[558,5321,4602],{"class":1107},[558,5323,1747],{"class":728},[558,5325,4607],{"class":564},[558,5327,540],{"class":728},[558,5329,4612],{"class":564},[558,5331,1055],{"class":728},[558,5333,5334],{"class":1107}," products",[558,5336,1747],{"class":728},[558,5338,4607],{"class":564},[558,5340,540],{"class":728},[558,5342,5343],{"class":564},"Products",[558,5345,1055],{"class":728},[558,5347,5348],{"class":1107}," tx",[558,5350,5351],{"class":564}," dbx",[558,5353,540],{"class":728},[558,5355,5356],{"class":564},"Transactor",[558,5358,1055],{"class":728},[558,5360,5361],{"class":1107}," dispatcher",[558,5363,5364],{"class":564}," events",[558,5366,540],{"class":728},[558,5368,5369],{"class":564},"Dispatcher",[558,5371,1119],{"class":728},[558,5373,1747],{"class":728},[558,5375,4140],{"class":564},[558,5377,980],{"class":728},[558,5379,5380,5382,5384,5386,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5408,5410,5412,5414,5416,5418],{"class":560,"line":1279},[558,5381,3630],{"class":853},[558,5383,4156],{"class":728},[558,5385,4140],{"class":564},[558,5387,3766],{"class":728},[558,5389,4602],{"class":590},[558,5391,1169],{"class":728},[558,5393,4815],{"class":590},[558,5395,1055],{"class":728},[558,5397,5334],{"class":590},[558,5399,1169],{"class":728},[558,5401,5334],{"class":590},[558,5403,1055],{"class":728},[558,5405,5348],{"class":590},[558,5407,1169],{"class":728},[558,5409,5348],{"class":590},[558,5411,1055],{"class":728},[558,5413,5361],{"class":590},[558,5415,1169],{"class":728},[558,5417,5361],{"class":590},[558,5419,1445],{"class":728},[558,5421,5422],{"class":560,"line":1299},[558,5423,1445],{"class":728},[558,5425,5426],{"class":560,"line":1327},[558,5427,621],{"emptyLinePlaceholder":620},[558,5429,5430,5432,5434,5437,5439,5441,5443,5445,5447,5449,5451,5453,5455,5457,5460,5462,5464,5466],{"class":560,"line":1336},[558,5431,971],{"class":728},[558,5433,3438],{"class":728},[558,5435,5436],{"class":1107},"c ",[558,5438,2262],{"class":728},[558,5440,4140],{"class":564},[558,5442,1119],{"class":728},[558,5444,4195],{"class":610},[558,5446,1049],{"class":728},[558,5448,1052],{"class":1107},[558,5450,1022],{"class":564},[558,5452,540],{"class":728},[558,5454,1366],{"class":564},[558,5456,1055],{"class":728},[558,5458,5459],{"class":1107}," in",[558,5461,5200],{"class":564},[558,5463,1119],{"class":728},[558,5465,1123],{"class":1122},[558,5467,980],{"class":728},[558,5469,5470,5472,5475,5477,5480,5482,5485,5487,5489,5491,5493,5495,5497,5499,5501,5503,5505],{"class":560,"line":1375},[558,5471,3630],{"class":853},[558,5473,5474],{"class":590}," c",[558,5476,540],{"class":728},[558,5478,5479],{"class":590},"tx",[558,5481,540],{"class":728},[558,5483,5484],{"class":610},"WithinTransaction",[558,5486,1049],{"class":728},[558,5488,1052],{"class":590},[558,5490,1055],{"class":728},[558,5492,1104],{"class":728},[558,5494,1052],{"class":1107},[558,5496,1022],{"class":564},[558,5498,540],{"class":728},[558,5500,1366],{"class":564},[558,5502,1119],{"class":728},[558,5504,1123],{"class":1122},[558,5506,980],{"class":728},[558,5508,5509,5511,5513,5515,5517,5519,5521,5523,5525,5528,5530,5532,5534,5536],{"class":560,"line":1388},[558,5510,4806],{"class":590},[558,5512,1055],{"class":728},[558,5514,1407],{"class":590},[558,5516,989],{"class":728},[558,5518,5474],{"class":590},[558,5520,540],{"class":728},[558,5522,4602],{"class":590},[558,5524,540],{"class":728},[558,5526,5527],{"class":610},"Insert",[558,5529,1049],{"class":728},[558,5531,1052],{"class":590},[558,5533,1055],{"class":728},[558,5535,5459],{"class":590},[558,5537,960],{"class":728},[558,5539,5540,5542,5544,5546,5548],{"class":560,"line":1395},[558,5541,3969],{"class":853},[558,5543,1407],{"class":590},[558,5545,1410],{"class":728},[558,5547,1413],{"class":728},[558,5549,980],{"class":728},[558,5551,5552,5554],{"class":560,"line":1401},[558,5553,1981],{"class":853},[558,5555,3984],{"class":590},[558,5557,5558],{"class":560,"line":1418},[558,5559,1254],{"class":728},[558,5561,5562,5564,5566,5568,5570,5572,5575,5577,5580,5582,5584,5586,5588,5590,5593,5595,5597,5599,5602,5605,5607,5609,5611],{"class":560,"line":1436},[558,5563,3969],{"class":853},[558,5565,1407],{"class":590},[558,5567,989],{"class":728},[558,5569,5474],{"class":590},[558,5571,540],{"class":728},[558,5573,5574],{"class":590},"products",[558,5576,540],{"class":728},[558,5578,5579],{"class":610},"DecrementStock",[558,5581,1049],{"class":728},[558,5583,1052],{"class":590},[558,5585,1055],{"class":728},[558,5587,5459],{"class":590},[558,5589,540],{"class":728},[558,5591,5592],{"class":590},"ProductID",[558,5594,1055],{"class":728},[558,5596,5459],{"class":590},[558,5598,540],{"class":728},[558,5600,5601],{"class":590},"Qty",[558,5603,5604],{"class":728},");",[558,5606,1407],{"class":590},[558,5608,1410],{"class":728},[558,5610,1413],{"class":728},[558,5612,980],{"class":728},[558,5614,5615,5617],{"class":560,"line":1442},[558,5616,1981],{"class":853},[558,5618,3984],{"class":590},[558,5620,5621],{"class":560,"line":1996},[558,5622,1254],{"class":728},[558,5624,5625,5627,5629,5631,5634,5636,5639,5641,5643,5645,5647,5649,5651],{"class":560,"line":2009},[558,5626,1330],{"class":853},[558,5628,5474],{"class":590},[558,5630,540],{"class":728},[558,5632,5633],{"class":590},"dispatcher",[558,5635,540],{"class":728},[558,5637,5638],{"class":610},"Dispatch",[558,5640,1049],{"class":728},[558,5642,1052],{"class":590},[558,5644,1055],{"class":728},[558,5646,3615],{"class":564},[558,5648,540],{"class":728},[558,5650,3441],{"class":564},[558,5652,1160],{"class":728},[558,5654,5655,5658,5660,5662,5664,5667],{"class":560,"line":2024},[558,5656,5657],{"class":590},"            OrderID",[558,5659,1169],{"class":728},[558,5661,4865],{"class":590},[558,5663,540],{"class":728},[558,5665,5666],{"class":590},"ID",[558,5668,2483],{"class":728},[558,5670,5671,5674,5676,5679,5681,5683],{"class":560,"line":2029},[558,5672,5673],{"class":590},"            Email",[558,5675,1169],{"class":728},[558,5677,5678],{"class":590},"   order",[558,5680,540],{"class":728},[558,5682,3690],{"class":590},[558,5684,2483],{"class":728},[558,5686,5687],{"class":560,"line":2589},[558,5688,2677],{"class":728},[558,5690,5691],{"class":560,"line":2607},[558,5692,2683],{"class":728},[558,5694,5695],{"class":560,"line":2624},[558,5696,1445],{"class":728},[549,5698,5701],{"className":833,"code":5699,"filename":5700,"language":565,"meta":554,"style":554},"package service\n\nimport (\n    \"context\"\n\n    \"github.com\u002Fgp-system\u002Fpaginate\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fcore\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Frepository\"\n)\n\nconst productSort = \"created_at DESC, id DESC\" \u002F\u002F meg kell egyeznie a repository ORDER BY-jával\n\n\u002F\u002F Alias: a handler és a mapper csak a saját surface-e service csomagját importálja.\ntype (\n    PlaceOrderInput = core.PlaceOrderInput\n    Product         = repository.Product\n)\n\ntype Service struct {\n    core     *core.Service\n    orders   *repository.OrderRepo\n    products *repository.Products\n}\n\nfunc New(deps shop.Dependencies) *Service {\n    orders := repository.NewOrderRepo(deps.DB)\n    products := repository.NewProducts(deps.DB)\n    return &Service{\n        core:     core.New(orders, products, deps.Transactor, deps.Dispatcher),\n        orders:   orders,\n        products: products,\n    }\n}\n\nfunc (s *Service) Orders() *repository.OrderRepo { return s.orders }\n\n\u002F\u002F PlaceOrder a modul közös szabályához delegál: a tranzakció, a\n\u002F\u002F készletcsökkentés és az event-dispatch a core-ban él, egyszer leírva.\nfunc (s *Service) PlaceOrder(ctx context.Context, in PlaceOrderInput) error {\n    return s.core.PlaceOrder(ctx, in)\n}\n\n\u002F\u002F ListProducts csak ezt a surface-t érinti, ezért itt marad a seamben.\nfunc (s *Service) ListProducts(ctx context.Context, cursor *string, limit *int) (paginate.CursorPage[Product], error) {\n    p, err := paginate.NormalizeCursor(cursor, limit, productSort)\n    if err != nil {\n        return paginate.CursorPage[Product]{}, err \u002F\u002F ErrInvalidCursor → HTTP 400\n    }\n    return s.products.List(ctx, p)\n}\n","internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\u002Fservice.go",[470,5702,5703,5710,5714,5720,5728,5732,5741,5745,5753,5762,5770,5774,5778,5799,5803,5808,5814,5830,5846,5850,5854,5864,5878,5891,5904,5908,5912,5936,5960,5983,5993,6033,6045,6056,6060,6064,6068,6110,6114,6119,6124,6162,6186,6190,6194,6199,6269,6304,6316,6338,6342,6368],{"__ignoreMap":554},[558,5704,5705,5707],{"class":560,"line":561},[558,5706,841],{"class":728},[558,5708,5709],{"class":564}," service\n",[558,5711,5712],{"class":560,"line":594},[558,5713,621],{"emptyLinePlaceholder":620},[558,5715,5716,5718],{"class":560,"line":607},[558,5717,854],{"class":853},[558,5719,857],{"class":728},[558,5721,5722,5724,5726],{"class":560,"line":617},[558,5723,862],{"class":728},[558,5725,865],{"class":564},[558,5727,735],{"class":728},[558,5729,5730],{"class":560,"line":624},[558,5731,621],{"emptyLinePlaceholder":620},[558,5733,5734,5736,5739],{"class":560,"line":643},[558,5735,862],{"class":728},[558,5737,5738],{"class":564},"github.com\u002Fgp-system\u002Fpaginate",[558,5740,735],{"class":728},[558,5742,5743],{"class":560,"line":662},[558,5744,621],{"emptyLinePlaceholder":620},[558,5746,5747,5749,5751],{"class":560,"line":680},[558,5748,862],{"class":728},[558,5750,942],{"class":564},[558,5752,735],{"class":728},[558,5754,5755,5757,5760],{"class":560,"line":707},[558,5756,862],{"class":728},[558,5758,5759],{"class":564},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fcore",[558,5761,735],{"class":728},[558,5763,5764,5766,5768],{"class":560,"line":738},[558,5765,862],{"class":728},[558,5767,4581],{"class":564},[558,5769,735],{"class":728},[558,5771,5772],{"class":560,"line":755},[558,5773,960],{"class":728},[558,5775,5776],{"class":560,"line":760},[558,5777,621],{"emptyLinePlaceholder":620},[558,5779,5780,5783,5786,5789,5791,5794,5796],{"class":560,"line":932},[558,5781,5782],{"class":728},"const",[558,5784,5785],{"class":590}," productSort ",[558,5787,5788],{"class":728},"=",[558,5790,729],{"class":728},[558,5792,5793],{"class":568},"created_at DESC, id DESC",[558,5795,1312],{"class":728},[558,5797,5798],{"class":603}," \u002F\u002F meg kell egyeznie a repository ORDER BY-jával\n",[558,5800,5801],{"class":560,"line":937},[558,5802,621],{"emptyLinePlaceholder":620},[558,5804,5805],{"class":560,"line":947},[558,5806,5807],{"class":603},"\u002F\u002F Alias: a handler és a mapper csak a saját surface-e service csomagját importálja.\n",[558,5809,5810,5812],{"class":560,"line":957},[558,5811,2246],{"class":728},[558,5813,857],{"class":728},[558,5815,5816,5819,5822,5825,5827],{"class":560,"line":963},[558,5817,5818],{"class":564},"    PlaceOrderInput",[558,5820,5821],{"class":728}," =",[558,5823,5824],{"class":564}," core",[558,5826,540],{"class":728},[558,5828,5829],{"class":564},"PlaceOrderInput\n",[558,5831,5832,5835,5838,5841,5843],{"class":560,"line":968},[558,5833,5834],{"class":564},"    Product",[558,5836,5837],{"class":728},"         =",[558,5839,5840],{"class":564}," repository",[558,5842,540],{"class":728},[558,5844,5845],{"class":564},"Product\n",[558,5847,5848],{"class":560,"line":983},[558,5849,960],{"class":728},[558,5851,5852],{"class":560,"line":1014},[558,5853,621],{"emptyLinePlaceholder":620},[558,5855,5856,5858,5860,5862],{"class":560,"line":1033},[558,5857,2246],{"class":728},[558,5859,5249],{"class":564},[558,5861,2252],{"class":728},[558,5863,980],{"class":728},[558,5865,5866,5869,5871,5874,5876],{"class":560,"line":1068},[558,5867,5868],{"class":590},"    core     ",[558,5870,2262],{"class":728},[558,5872,5873],{"class":564},"core",[558,5875,540],{"class":728},[558,5877,4111],{"class":564},[558,5879,5880,5883,5885,5887,5889],{"class":560,"line":1073},[558,5881,5882],{"class":590},"    orders   ",[558,5884,2262],{"class":728},[558,5886,4607],{"class":564},[558,5888,540],{"class":728},[558,5890,5267],{"class":564},[558,5892,5893,5896,5898,5900,5902],{"class":560,"line":1128},[558,5894,5895],{"class":590},"    products ",[558,5897,2262],{"class":728},[558,5899,4607],{"class":564},[558,5901,540],{"class":728},[558,5903,5281],{"class":564},[558,5905,5906],{"class":560,"line":1145},[558,5907,1445],{"class":728},[558,5909,5910],{"class":560,"line":1163},[558,5911,621],{"emptyLinePlaceholder":620},[558,5913,5914,5916,5918,5920,5922,5924,5926,5928,5930,5932,5934],{"class":560,"line":1188},[558,5915,971],{"class":728},[558,5917,4126],{"class":610},[558,5919,1049],{"class":728},[558,5921,2368],{"class":1107},[558,5923,581],{"class":564},[558,5925,540],{"class":728},[558,5927,1157],{"class":564},[558,5929,1119],{"class":728},[558,5931,1747],{"class":728},[558,5933,4140],{"class":564},[558,5935,980],{"class":728},[558,5937,5938,5941,5943,5945,5947,5950,5952,5954,5956,5958],{"class":560,"line":1209},[558,5939,5940],{"class":590},"    orders ",[558,5942,989],{"class":728},[558,5944,5840],{"class":590},[558,5946,540],{"class":728},[558,5948,5949],{"class":610},"NewOrderRepo",[558,5951,1049],{"class":728},[558,5953,2368],{"class":590},[558,5955,540],{"class":728},[558,5957,1063],{"class":590},[558,5959,960],{"class":728},[558,5961,5962,5964,5966,5968,5970,5973,5975,5977,5979,5981],{"class":560,"line":1251},[558,5963,5895],{"class":590},[558,5965,989],{"class":728},[558,5967,5840],{"class":590},[558,5969,540],{"class":728},[558,5971,5972],{"class":610},"NewProducts",[558,5974,1049],{"class":728},[558,5976,2368],{"class":590},[558,5978,540],{"class":728},[558,5980,1063],{"class":590},[558,5982,960],{"class":728},[558,5984,5985,5987,5989,5991],{"class":560,"line":1257},[558,5986,3630],{"class":853},[558,5988,4156],{"class":728},[558,5990,4140],{"class":564},[558,5992,1160],{"class":728},[558,5994,5995,5998,6000,6003,6005,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025,6027,6029,6031],{"class":560,"line":1279},[558,5996,5997],{"class":590},"        core",[558,5999,1169],{"class":728},[558,6001,6002],{"class":590},"     core",[558,6004,540],{"class":728},[558,6006,2363],{"class":610},[558,6008,1049],{"class":728},[558,6010,4602],{"class":590},[558,6012,1055],{"class":728},[558,6014,5334],{"class":590},[558,6016,1055],{"class":728},[558,6018,1274],{"class":590},[558,6020,540],{"class":728},[558,6022,5356],{"class":590},[558,6024,1055],{"class":728},[558,6026,1274],{"class":590},[558,6028,540],{"class":728},[558,6030,5369],{"class":590},[558,6032,1185],{"class":728},[558,6034,6035,6038,6040,6043],{"class":560,"line":1299},[558,6036,6037],{"class":590},"        orders",[558,6039,1169],{"class":728},[558,6041,6042],{"class":590},"   orders",[558,6044,2483],{"class":728},[558,6046,6047,6050,6052,6054],{"class":560,"line":1327},[558,6048,6049],{"class":590},"        products",[558,6051,1169],{"class":728},[558,6053,5334],{"class":590},[558,6055,2483],{"class":728},[558,6057,6058],{"class":560,"line":1336},[558,6059,1439],{"class":728},[558,6061,6062],{"class":560,"line":1375},[558,6063,1445],{"class":728},[558,6065,6066],{"class":560,"line":1388},[558,6067,621],{"emptyLinePlaceholder":620},[558,6069,6070,6072,6074,6077,6079,6081,6083,6086,6088,6090,6092,6094,6096,6098,6100,6103,6105,6108],{"class":560,"line":1395},[558,6071,971],{"class":728},[558,6073,3438],{"class":728},[558,6075,6076],{"class":1107},"s ",[558,6078,2262],{"class":728},[558,6080,4140],{"class":564},[558,6082,1119],{"class":728},[558,6084,6085],{"class":610}," Orders",[558,6087,977],{"class":728},[558,6089,1747],{"class":728},[558,6091,4607],{"class":564},[558,6093,540],{"class":728},[558,6095,4612],{"class":564},[558,6097,3454],{"class":728},[558,6099,3457],{"class":853},[558,6101,6102],{"class":590}," s",[558,6104,540],{"class":728},[558,6106,6107],{"class":590},"orders ",[558,6109,1445],{"class":728},[558,6111,6112],{"class":560,"line":1401},[558,6113,621],{"emptyLinePlaceholder":620},[558,6115,6116],{"class":560,"line":1418},[558,6117,6118],{"class":603},"\u002F\u002F PlaceOrder a modul közös szabályához delegál: a tranzakció, a\n",[558,6120,6121],{"class":560,"line":1436},[558,6122,6123],{"class":603},"\u002F\u002F készletcsökkentés és az event-dispatch a core-ban él, egyszer leírva.\n",[558,6125,6126,6128,6130,6132,6134,6136,6138,6140,6142,6144,6146,6148,6150,6152,6154,6156,6158,6160],{"class":560,"line":1442},[558,6127,971],{"class":728},[558,6129,3438],{"class":728},[558,6131,6076],{"class":1107},[558,6133,2262],{"class":728},[558,6135,4140],{"class":564},[558,6137,1119],{"class":728},[558,6139,4195],{"class":610},[558,6141,1049],{"class":728},[558,6143,1052],{"class":1107},[558,6145,1022],{"class":564},[558,6147,540],{"class":728},[558,6149,1366],{"class":564},[558,6151,1055],{"class":728},[558,6153,5459],{"class":1107},[558,6155,5200],{"class":564},[558,6157,1119],{"class":728},[558,6159,1123],{"class":1122},[558,6161,980],{"class":728},[558,6163,6164,6166,6168,6170,6172,6174,6176,6178,6180,6182,6184],{"class":560,"line":1996},[558,6165,3630],{"class":853},[558,6167,6102],{"class":590},[558,6169,540],{"class":728},[558,6171,5873],{"class":590},[558,6173,540],{"class":728},[558,6175,482],{"class":610},[558,6177,1049],{"class":728},[558,6179,1052],{"class":590},[558,6181,1055],{"class":728},[558,6183,5459],{"class":590},[558,6185,960],{"class":728},[558,6187,6188],{"class":560,"line":2009},[558,6189,1445],{"class":728},[558,6191,6192],{"class":560,"line":2024},[558,6193,621],{"emptyLinePlaceholder":620},[558,6195,6196],{"class":560,"line":2029},[558,6197,6198],{"class":603},"\u002F\u002F ListProducts csak ezt a surface-t érinti, ezért itt marad a seamben.\n",[558,6200,6201,6203,6205,6207,6209,6211,6213,6215,6217,6219,6221,6223,6225,6227,6230,6232,6234,6236,6239,6241,6244,6246,6248,6250,6252,6255,6257,6260,6263,6265,6267],{"class":560,"line":2589},[558,6202,971],{"class":728},[558,6204,3438],{"class":728},[558,6206,6076],{"class":1107},[558,6208,2262],{"class":728},[558,6210,4140],{"class":564},[558,6212,1119],{"class":728},[558,6214,4336],{"class":610},[558,6216,1049],{"class":728},[558,6218,1052],{"class":1107},[558,6220,1022],{"class":564},[558,6222,540],{"class":728},[558,6224,1366],{"class":564},[558,6226,1055],{"class":728},[558,6228,6229],{"class":1107}," cursor",[558,6231,1747],{"class":728},[558,6233,3400],{"class":1122},[558,6235,1055],{"class":728},[558,6237,6238],{"class":1107}," limit",[558,6240,1747],{"class":728},[558,6242,6243],{"class":1122},"int",[558,6245,1119],{"class":728},[558,6247,3438],{"class":728},[558,6249,431],{"class":564},[558,6251,540],{"class":728},[558,6253,6254],{"class":564},"CursorPage",[558,6256,1000],{"class":728},[558,6258,6259],{"class":564},"Product",[558,6261,6262],{"class":728},"],",[558,6264,1123],{"class":1122},[558,6266,1119],{"class":728},[558,6268,980],{"class":728},[558,6270,6271,6274,6276,6278,6280,6283,6285,6288,6290,6293,6295,6297,6299,6302],{"class":560,"line":2607},[558,6272,6273],{"class":590},"    p",[558,6275,1055],{"class":728},[558,6277,1407],{"class":590},[558,6279,989],{"class":728},[558,6281,6282],{"class":590}," paginate",[558,6284,540],{"class":728},[558,6286,6287],{"class":610},"NormalizeCursor",[558,6289,1049],{"class":728},[558,6291,6292],{"class":590},"cursor",[558,6294,1055],{"class":728},[558,6296,6238],{"class":590},[558,6298,1055],{"class":728},[558,6300,6301],{"class":590}," productSort",[558,6303,960],{"class":728},[558,6305,6306,6308,6310,6312,6314],{"class":560,"line":2624},[558,6307,1404],{"class":853},[558,6309,1407],{"class":590},[558,6311,1410],{"class":728},[558,6313,1413],{"class":728},[558,6315,980],{"class":728},[558,6317,6318,6320,6322,6324,6326,6328,6330,6333,6335],{"class":560,"line":2629},[558,6319,1330],{"class":853},[558,6321,6282],{"class":564},[558,6323,540],{"class":728},[558,6325,6254],{"class":564},[558,6327,1000],{"class":728},[558,6329,6259],{"class":564},[558,6331,6332],{"class":728},"]{},",[558,6334,1407],{"class":590},[558,6336,6337],{"class":603},"\u002F\u002F ErrInvalidCursor → HTTP 400\n",[558,6339,6340],{"class":560,"line":2644},[558,6341,1439],{"class":728},[558,6343,6344,6346,6348,6350,6352,6354,6357,6359,6361,6363,6366],{"class":560,"line":2657},[558,6345,3630],{"class":853},[558,6347,6102],{"class":590},[558,6349,540],{"class":728},[558,6351,5574],{"class":590},[558,6353,540],{"class":728},[558,6355,6356],{"class":610},"List",[558,6358,1049],{"class":728},[558,6360,1052],{"class":590},[558,6362,1055],{"class":728},[558,6364,6365],{"class":590}," p",[558,6367,960],{"class":728},[558,6369,6370],{"class":560,"line":2674},[558,6371,1445],{"class":728},[549,6373,6376],{"className":833,"code":6374,"filename":6375,"language":565,"meta":554,"style":554},"package repository\n\nimport (\n    \"context\"\n    \"net\u002Fhttp\"\n    \"time\"\n\n    \"github.com\u002Fjackc\u002Fpgx\u002Fv5\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Ferrs\"\n    \"github.com\u002Fgp-system\u002Fpaginate\"\n)\n\ntype Product struct {\n    ID         string\n    Name       string\n    PriceCents int64\n    Stock      int\n    CreatedAt  time.Time\n}\n\ntype Products struct {\n    db pg.DBTX\n}\n\nfunc NewProducts(db pg.DBTX) *Products {\n    return &Products{db: db}\n}\n\nvar ErrOutOfStock = errs.Define(\"shop_api_out_of_stock\",\n    errs.Public(\"A termék elfogyott.\"),\n    errs.Status(http.StatusConflict))\n\nfunc (r *Products) List(ctx context.Context, p paginate.CursorParams) (paginate.CursorPage[Product], error) {\n    query := `SELECT id, name, price_cents, stock, created_at FROM products`\n    args := []any{p.FetchLimit()}\n\n    if p.HasCursor() {\n        var createdAt time.Time\n        var id string\n        if err := p.DecodeKey(&createdAt, &id); err != nil {\n            return paginate.CursorPage[Product]{}, err\n        }\n        query += ` WHERE (created_at, id) \u003C ($2, $3)`\n        args = append(args, createdAt, id)\n    }\n    query += ` ORDER BY created_at DESC, id DESC LIMIT $1`\n\n    rows, err := r.db.Query(ctx, query, args...)\n    if err != nil {\n        return paginate.CursorPage[Product]{}, errs.Wrap(err, \"products: list\")\n    }\n    products, err := pgx.CollectRows(rows, pgx.RowToStructByName[Product])\n    if err != nil {\n        return paginate.CursorPage[Product]{}, errs.Wrap(err, \"products: scan\")\n    }\n\n    return paginate.NewCursorPage(products, p, func(last Product) []any {\n        return []any{last.CreatedAt, last.ID}\n    })\n}\n\nfunc (r *Products) DecrementStock(ctx context.Context, productID string, qty int) error {\n    tag, err := r.db.Exec(ctx,\n        `UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2`,\n        productID, qty)\n    if err != nil {\n        return errs.Wrap(err, \"products: decrement stock\")\n    }\n    if tag.RowsAffected() == 0 {\n        return ErrOutOfStock.New(\"products: decrement stock\",\n            errs.With(\"product_id\", productID))\n    }\n    return nil\n}\n","internal\u002Fmodules\u002Fshop\u002Frepository\u002Fproducts.go",[470,6377,6378,6385,6389,6395,6403,6412,6421,6425,6434,6438,6446,6455,6463,6467,6471,6482,6489,6496,6504,6511,6523,6527,6531,6542,6554,6558,6562,6589,6608,6612,6616,6644,6665,6686,6690,6751,6765,6789,6793,6808,6822,6831,6869,6887,6891,6906,6932,6936,6949,6953,6992,7004,7041,7045,7085,7097,7134,7138,7142,7178,7206,7210,7214,7218,7266,7294,7307,7318,7330,7355,7359,7382,7403,7428,7432,7438],{"__ignoreMap":554},[558,6379,6380,6382],{"class":560,"line":561},[558,6381,841],{"class":728},[558,6383,6384],{"class":564}," repository\n",[558,6386,6387],{"class":560,"line":594},[558,6388,621],{"emptyLinePlaceholder":620},[558,6390,6391,6393],{"class":560,"line":607},[558,6392,854],{"class":853},[558,6394,857],{"class":728},[558,6396,6397,6399,6401],{"class":560,"line":617},[558,6398,862],{"class":728},[558,6400,865],{"class":564},[558,6402,735],{"class":728},[558,6404,6405,6407,6410],{"class":560,"line":624},[558,6406,862],{"class":728},[558,6408,6409],{"class":564},"net\u002Fhttp",[558,6411,735],{"class":728},[558,6413,6414,6416,6419],{"class":560,"line":643},[558,6415,862],{"class":728},[558,6417,6418],{"class":564},"time",[558,6420,735],{"class":728},[558,6422,6423],{"class":560,"line":662},[558,6424,621],{"emptyLinePlaceholder":620},[558,6426,6427,6429,6432],{"class":560,"line":680},[558,6428,862],{"class":728},[558,6430,6431],{"class":564},"github.com\u002Fjackc\u002Fpgx\u002Fv5",[558,6433,735],{"class":728},[558,6435,6436],{"class":560,"line":707},[558,6437,621],{"emptyLinePlaceholder":620},[558,6439,6440,6442,6444],{"class":560,"line":738},[558,6441,862],{"class":728},[558,6443,900],{"class":564},[558,6445,735],{"class":728},[558,6447,6448,6450,6453],{"class":560,"line":755},[558,6449,862],{"class":728},[558,6451,6452],{"class":564},"github.com\u002Fgp-system\u002Ferrs",[558,6454,735],{"class":728},[558,6456,6457,6459,6461],{"class":560,"line":760},[558,6458,862],{"class":728},[558,6460,5738],{"class":564},[558,6462,735],{"class":728},[558,6464,6465],{"class":560,"line":932},[558,6466,960],{"class":728},[558,6468,6469],{"class":560,"line":937},[558,6470,621],{"emptyLinePlaceholder":620},[558,6472,6473,6475,6478,6480],{"class":560,"line":947},[558,6474,2246],{"class":728},[558,6476,6477],{"class":564}," Product",[558,6479,2252],{"class":728},[558,6481,980],{"class":728},[558,6483,6484,6487],{"class":560,"line":957},[558,6485,6486],{"class":590},"    ID         ",[558,6488,5212],{"class":1122},[558,6490,6491,6494],{"class":560,"line":963},[558,6492,6493],{"class":590},"    Name       ",[558,6495,5212],{"class":1122},[558,6497,6498,6501],{"class":560,"line":968},[558,6499,6500],{"class":590},"    PriceCents ",[558,6502,6503],{"class":1122},"int64\n",[558,6505,6506,6509],{"class":560,"line":983},[558,6507,6508],{"class":590},"    Stock      ",[558,6510,5227],{"class":1122},[558,6512,6513,6516,6518,6520],{"class":560,"line":1014},[558,6514,6515],{"class":590},"    CreatedAt  ",[558,6517,6418],{"class":564},[558,6519,540],{"class":728},[558,6521,6522],{"class":564},"Time\n",[558,6524,6525],{"class":560,"line":1033},[558,6526,1445],{"class":728},[558,6528,6529],{"class":560,"line":1068},[558,6530,621],{"emptyLinePlaceholder":620},[558,6532,6533,6535,6538,6540],{"class":560,"line":1073},[558,6534,2246],{"class":728},[558,6536,6537],{"class":564}," Products",[558,6539,2252],{"class":728},[558,6541,980],{"class":728},[558,6543,6544,6547,6549,6551],{"class":560,"line":1128},[558,6545,6546],{"class":590},"    db ",[558,6548,1237],{"class":564},[558,6550,540],{"class":728},[558,6552,6553],{"class":564},"DBTX\n",[558,6555,6556],{"class":560,"line":1145},[558,6557,1445],{"class":728},[558,6559,6560],{"class":560,"line":1163},[558,6561,621],{"emptyLinePlaceholder":620},[558,6563,6564,6566,6569,6571,6574,6576,6578,6581,6583,6585,6587],{"class":560,"line":1188},[558,6565,971],{"class":728},[558,6567,6568],{"class":610}," NewProducts",[558,6570,1049],{"class":728},[558,6572,6573],{"class":1107},"db",[558,6575,1041],{"class":564},[558,6577,540],{"class":728},[558,6579,6580],{"class":564},"DBTX",[558,6582,1119],{"class":728},[558,6584,1747],{"class":728},[558,6586,5343],{"class":564},[558,6588,980],{"class":728},[558,6590,6591,6593,6595,6597,6599,6601,6603,6606],{"class":560,"line":1209},[558,6592,3630],{"class":853},[558,6594,4156],{"class":728},[558,6596,5343],{"class":564},[558,6598,3766],{"class":728},[558,6600,6573],{"class":590},[558,6602,1169],{"class":728},[558,6604,6605],{"class":590}," db",[558,6607,1445],{"class":728},[558,6609,6610],{"class":560,"line":1251},[558,6611,1445],{"class":728},[558,6613,6614],{"class":560,"line":1257},[558,6615,621],{"emptyLinePlaceholder":620},[558,6617,6618,6620,6623,6625,6628,6630,6633,6635,6637,6640,6642],{"class":560,"line":1279},[558,6619,3570],{"class":728},[558,6621,6622],{"class":590}," ErrOutOfStock ",[558,6624,5788],{"class":728},[558,6626,6627],{"class":590}," errs",[558,6629,540],{"class":728},[558,6631,6632],{"class":610},"Define",[558,6634,1049],{"class":728},[558,6636,1312],{"class":728},[558,6638,6639],{"class":568},"shop_api_out_of_stock",[558,6641,1312],{"class":728},[558,6643,2483],{"class":728},[558,6645,6646,6649,6651,6654,6656,6658,6661,6663],{"class":560,"line":1299},[558,6647,6648],{"class":590},"    errs",[558,6650,540],{"class":728},[558,6652,6653],{"class":610},"Public",[558,6655,1049],{"class":728},[558,6657,1312],{"class":728},[558,6659,6660],{"class":568},"A termék elfogyott.",[558,6662,1312],{"class":728},[558,6664,1185],{"class":728},[558,6666,6667,6669,6671,6674,6676,6679,6681,6684],{"class":560,"line":1327},[558,6668,6648],{"class":590},[558,6670,540],{"class":728},[558,6672,6673],{"class":610},"Status",[558,6675,1049],{"class":728},[558,6677,6678],{"class":590},"http",[558,6680,540],{"class":728},[558,6682,6683],{"class":590},"StatusConflict",[558,6685,2865],{"class":728},[558,6687,6688],{"class":560,"line":1336},[558,6689,621],{"emptyLinePlaceholder":620},[558,6691,6692,6694,6696,6699,6701,6703,6705,6708,6710,6712,6714,6716,6718,6720,6722,6724,6726,6729,6731,6733,6735,6737,6739,6741,6743,6745,6747,6749],{"class":560,"line":1375},[558,6693,971],{"class":728},[558,6695,3438],{"class":728},[558,6697,6698],{"class":1107},"r ",[558,6700,2262],{"class":728},[558,6702,5343],{"class":564},[558,6704,1119],{"class":728},[558,6706,6707],{"class":610}," List",[558,6709,1049],{"class":728},[558,6711,1052],{"class":1107},[558,6713,1022],{"class":564},[558,6715,540],{"class":728},[558,6717,1366],{"class":564},[558,6719,1055],{"class":728},[558,6721,6365],{"class":1107},[558,6723,6282],{"class":564},[558,6725,540],{"class":728},[558,6727,6728],{"class":564},"CursorParams",[558,6730,1119],{"class":728},[558,6732,3438],{"class":728},[558,6734,431],{"class":564},[558,6736,540],{"class":728},[558,6738,6254],{"class":564},[558,6740,1000],{"class":728},[558,6742,6259],{"class":564},[558,6744,6262],{"class":728},[558,6746,1123],{"class":1122},[558,6748,1119],{"class":728},[558,6750,980],{"class":728},[558,6752,6753,6756,6758,6760,6763],{"class":560,"line":1388},[558,6754,6755],{"class":590},"    query ",[558,6757,989],{"class":728},[558,6759,3403],{"class":728},[558,6761,6762],{"class":568},"SELECT id, name, price_cents, stock, created_at FROM products",[558,6764,3409],{"class":728},[558,6766,6767,6770,6772,6775,6777,6779,6781,6783,6786],{"class":560,"line":1395},[558,6768,6769],{"class":590},"    args ",[558,6771,989],{"class":728},[558,6773,6774],{"class":728}," []",[558,6776,3763],{"class":564},[558,6778,3766],{"class":728},[558,6780,448],{"class":590},[558,6782,540],{"class":728},[558,6784,6785],{"class":610},"FetchLimit",[558,6787,6788],{"class":728},"()}\n",[558,6790,6791],{"class":560,"line":1401},[558,6792,621],{"emptyLinePlaceholder":620},[558,6794,6795,6797,6799,6801,6804,6806],{"class":560,"line":1418},[558,6796,1404],{"class":853},[558,6798,6365],{"class":590},[558,6800,540],{"class":728},[558,6802,6803],{"class":610},"HasCursor",[558,6805,977],{"class":728},[558,6807,980],{"class":728},[558,6809,6810,6813,6816,6818,6820],{"class":560,"line":1436},[558,6811,6812],{"class":728},"        var",[558,6814,6815],{"class":590}," createdAt ",[558,6817,6418],{"class":564},[558,6819,540],{"class":728},[558,6821,6522],{"class":564},[558,6823,6824,6826,6829],{"class":560,"line":1442},[558,6825,6812],{"class":728},[558,6827,6828],{"class":590}," id ",[558,6830,5212],{"class":1122},[558,6832,6833,6835,6837,6839,6841,6843,6846,6849,6852,6854,6856,6859,6861,6863,6865,6867],{"class":560,"line":1996},[558,6834,3969],{"class":853},[558,6836,1407],{"class":590},[558,6838,989],{"class":728},[558,6840,6365],{"class":590},[558,6842,540],{"class":728},[558,6844,6845],{"class":610},"DecodeKey",[558,6847,6848],{"class":728},"(&",[558,6850,6851],{"class":590},"createdAt",[558,6853,1055],{"class":728},[558,6855,4156],{"class":728},[558,6857,6858],{"class":590},"id",[558,6860,5604],{"class":728},[558,6862,1407],{"class":590},[558,6864,1410],{"class":728},[558,6866,1413],{"class":728},[558,6868,980],{"class":728},[558,6870,6871,6873,6875,6877,6879,6881,6883,6885],{"class":560,"line":2009},[558,6872,1981],{"class":853},[558,6874,6282],{"class":564},[558,6876,540],{"class":728},[558,6878,6254],{"class":564},[558,6880,1000],{"class":728},[558,6882,6259],{"class":564},[558,6884,6332],{"class":728},[558,6886,3984],{"class":590},[558,6888,6889],{"class":560,"line":2024},[558,6890,1254],{"class":728},[558,6892,6893,6896,6899,6901,6904],{"class":560,"line":2029},[558,6894,6895],{"class":590},"        query ",[558,6897,6898],{"class":728},"+=",[558,6900,3403],{"class":728},[558,6902,6903],{"class":568}," WHERE (created_at, id) \u003C ($2, $3)",[558,6905,3409],{"class":728},[558,6907,6908,6911,6913,6916,6918,6921,6923,6926,6928,6930],{"class":560,"line":2589},[558,6909,6910],{"class":590},"        args ",[558,6912,5788],{"class":728},[558,6914,6915],{"class":610}," append",[558,6917,1049],{"class":728},[558,6919,6920],{"class":590},"args",[558,6922,1055],{"class":728},[558,6924,6925],{"class":590}," createdAt",[558,6927,1055],{"class":728},[558,6929,4682],{"class":590},[558,6931,960],{"class":728},[558,6933,6934],{"class":560,"line":2607},[558,6935,1439],{"class":728},[558,6937,6938,6940,6942,6944,6947],{"class":560,"line":2624},[558,6939,6755],{"class":590},[558,6941,6898],{"class":728},[558,6943,3403],{"class":728},[558,6945,6946],{"class":568}," ORDER BY created_at DESC, id DESC LIMIT $1",[558,6948,3409],{"class":728},[558,6950,6951],{"class":560,"line":2629},[558,6952,621],{"emptyLinePlaceholder":620},[558,6954,6955,6958,6960,6962,6964,6966,6968,6970,6972,6975,6977,6979,6981,6984,6986,6989],{"class":560,"line":2644},[558,6956,6957],{"class":590},"    rows",[558,6959,1055],{"class":728},[558,6961,1407],{"class":590},[558,6963,989],{"class":728},[558,6965,4829],{"class":590},[558,6967,540],{"class":728},[558,6969,6573],{"class":590},[558,6971,540],{"class":728},[558,6973,6974],{"class":610},"Query",[558,6976,1049],{"class":728},[558,6978,1052],{"class":590},[558,6980,1055],{"class":728},[558,6982,6983],{"class":590}," query",[558,6985,1055],{"class":728},[558,6987,6988],{"class":590}," args",[558,6990,6991],{"class":728},"...)\n",[558,6993,6994,6996,6998,7000,7002],{"class":560,"line":2657},[558,6995,1404],{"class":853},[558,6997,1407],{"class":590},[558,6999,1410],{"class":728},[558,7001,1413],{"class":728},[558,7003,980],{"class":728},[558,7005,7006,7008,7010,7012,7014,7016,7018,7020,7022,7024,7026,7028,7030,7032,7034,7037,7039],{"class":560,"line":2674},[558,7007,1330],{"class":853},[558,7009,6282],{"class":564},[558,7011,540],{"class":728},[558,7013,6254],{"class":564},[558,7015,1000],{"class":728},[558,7017,6259],{"class":564},[558,7019,6332],{"class":728},[558,7021,6627],{"class":590},[558,7023,540],{"class":728},[558,7025,4462],{"class":610},[558,7027,1049],{"class":728},[558,7029,1431],{"class":590},[558,7031,1055],{"class":728},[558,7033,729],{"class":728},[558,7035,7036],{"class":568},"products: list",[558,7038,1312],{"class":728},[558,7040,960],{"class":728},[558,7042,7043],{"class":560,"line":2680},[558,7044,1439],{"class":728},[558,7046,7047,7050,7052,7054,7056,7059,7061,7064,7066,7069,7071,7073,7075,7078,7080,7082],{"class":560,"line":2686},[558,7048,7049],{"class":590},"    products",[558,7051,1055],{"class":728},[558,7053,1407],{"class":590},[558,7055,989],{"class":728},[558,7057,7058],{"class":590}," pgx",[558,7060,540],{"class":728},[558,7062,7063],{"class":610},"CollectRows",[558,7065,1049],{"class":728},[558,7067,7068],{"class":590},"rows",[558,7070,1055],{"class":728},[558,7072,7058],{"class":590},[558,7074,540],{"class":728},[558,7076,7077],{"class":590},"RowToStructByName",[558,7079,1000],{"class":728},[558,7081,6259],{"class":590},[558,7083,7084],{"class":728},"])\n",[558,7086,7087,7089,7091,7093,7095],{"class":560,"line":2691},[558,7088,1404],{"class":853},[558,7090,1407],{"class":590},[558,7092,1410],{"class":728},[558,7094,1413],{"class":728},[558,7096,980],{"class":728},[558,7098,7099,7101,7103,7105,7107,7109,7111,7113,7115,7117,7119,7121,7123,7125,7127,7130,7132],{"class":560,"line":2696},[558,7100,1330],{"class":853},[558,7102,6282],{"class":564},[558,7104,540],{"class":728},[558,7106,6254],{"class":564},[558,7108,1000],{"class":728},[558,7110,6259],{"class":564},[558,7112,6332],{"class":728},[558,7114,6627],{"class":590},[558,7116,540],{"class":728},[558,7118,4462],{"class":610},[558,7120,1049],{"class":728},[558,7122,1431],{"class":590},[558,7124,1055],{"class":728},[558,7126,729],{"class":728},[558,7128,7129],{"class":568},"products: scan",[558,7131,1312],{"class":728},[558,7133,960],{"class":728},[558,7135,7136],{"class":560,"line":2724},[558,7137,1439],{"class":728},[558,7139,7140],{"class":560,"line":2745},[558,7141,621],{"emptyLinePlaceholder":620},[558,7143,7144,7146,7148,7150,7153,7155,7157,7159,7161,7163,7165,7168,7170,7172,7174,7176],{"class":560,"line":2767},[558,7145,3630],{"class":853},[558,7147,6282],{"class":590},[558,7149,540],{"class":728},[558,7151,7152],{"class":610},"NewCursorPage",[558,7154,1049],{"class":728},[558,7156,5574],{"class":590},[558,7158,1055],{"class":728},[558,7160,6365],{"class":590},[558,7162,1055],{"class":728},[558,7164,1104],{"class":728},[558,7166,7167],{"class":1107},"last",[558,7169,6477],{"class":564},[558,7171,1119],{"class":728},[558,7173,6774],{"class":728},[558,7175,3763],{"class":564},[558,7177,980],{"class":728},[558,7179,7180,7182,7184,7186,7188,7190,7192,7195,7197,7200,7202,7204],{"class":560,"line":2784},[558,7181,1330],{"class":853},[558,7183,6774],{"class":728},[558,7185,3763],{"class":564},[558,7187,3766],{"class":728},[558,7189,7167],{"class":590},[558,7191,540],{"class":728},[558,7193,7194],{"class":590},"CreatedAt",[558,7196,1055],{"class":728},[558,7198,7199],{"class":590}," last",[558,7201,540],{"class":728},[558,7203,5666],{"class":590},[558,7205,1445],{"class":728},[558,7207,7208],{"class":560,"line":2818},[558,7209,2683],{"class":728},[558,7211,7212],{"class":560,"line":2868},[558,7213,1445],{"class":728},[558,7215,7216],{"class":560,"line":2889},[558,7217,621],{"emptyLinePlaceholder":620},[558,7219,7220,7222,7224,7226,7228,7230,7232,7235,7237,7239,7241,7243,7245,7247,7250,7252,7254,7257,7260,7262,7264],{"class":560,"line":2897},[558,7221,971],{"class":728},[558,7223,3438],{"class":728},[558,7225,6698],{"class":1107},[558,7227,2262],{"class":728},[558,7229,5343],{"class":564},[558,7231,1119],{"class":728},[558,7233,7234],{"class":610}," DecrementStock",[558,7236,1049],{"class":728},[558,7238,1052],{"class":1107},[558,7240,1022],{"class":564},[558,7242,540],{"class":728},[558,7244,1366],{"class":564},[558,7246,1055],{"class":728},[558,7248,7249],{"class":1107}," productID",[558,7251,3451],{"class":1122},[558,7253,1055],{"class":728},[558,7255,7256],{"class":1107}," qty",[558,7258,7259],{"class":1122}," int",[558,7261,1119],{"class":728},[558,7263,1123],{"class":1122},[558,7265,980],{"class":728},[558,7267,7268,7271,7273,7275,7277,7279,7281,7283,7285,7288,7290,7292],{"class":560,"line":2910},[558,7269,7270],{"class":590},"    tag",[558,7272,1055],{"class":728},[558,7274,1407],{"class":590},[558,7276,989],{"class":728},[558,7278,4829],{"class":590},[558,7280,540],{"class":728},[558,7282,6573],{"class":590},[558,7284,540],{"class":728},[558,7286,7287],{"class":610},"Exec",[558,7289,1049],{"class":728},[558,7291,1052],{"class":590},[558,7293,2483],{"class":728},[558,7295,7296,7299,7302,7305],{"class":560,"line":2929},[558,7297,7298],{"class":728},"        `",[558,7300,7301],{"class":568},"UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2",[558,7303,7304],{"class":728},"`",[558,7306,2483],{"class":728},[558,7308,7309,7312,7314,7316],{"class":560,"line":2970},[558,7310,7311],{"class":590},"        productID",[558,7313,1055],{"class":728},[558,7315,7256],{"class":590},[558,7317,960],{"class":728},[558,7319,7320,7322,7324,7326,7328],{"class":560,"line":2975},[558,7321,1404],{"class":853},[558,7323,1407],{"class":590},[558,7325,1410],{"class":728},[558,7327,1413],{"class":728},[558,7329,980],{"class":728},[558,7331,7332,7334,7336,7338,7340,7342,7344,7346,7348,7351,7353],{"class":560,"line":2987},[558,7333,1330],{"class":853},[558,7335,6627],{"class":590},[558,7337,540],{"class":728},[558,7339,4462],{"class":610},[558,7341,1049],{"class":728},[558,7343,1431],{"class":590},[558,7345,1055],{"class":728},[558,7347,729],{"class":728},[558,7349,7350],{"class":568},"products: decrement stock",[558,7352,1312],{"class":728},[558,7354,960],{"class":728},[558,7356,7357],{"class":560,"line":3002},[558,7358,1439],{"class":728},[558,7360,7361,7363,7366,7368,7371,7373,7376,7380],{"class":560,"line":3017},[558,7362,1404],{"class":853},[558,7364,7365],{"class":590}," tag",[558,7367,540],{"class":728},[558,7369,7370],{"class":610},"RowsAffected",[558,7372,977],{"class":728},[558,7374,7375],{"class":728}," ==",[558,7377,7379],{"class":7378},"sbssI"," 0",[558,7381,980],{"class":728},[558,7383,7384,7386,7389,7391,7393,7395,7397,7399,7401],{"class":560,"line":3022},[558,7385,1330],{"class":853},[558,7387,7388],{"class":590}," ErrOutOfStock",[558,7390,540],{"class":728},[558,7392,2363],{"class":610},[558,7394,1049],{"class":728},[558,7396,1312],{"class":728},[558,7398,7350],{"class":568},[558,7400,1312],{"class":728},[558,7402,2483],{"class":728},[558,7404,7405,7408,7410,7413,7415,7417,7420,7422,7424,7426],{"class":560,"line":3035},[558,7406,7407],{"class":590},"            errs",[558,7409,540],{"class":728},[558,7411,7412],{"class":610},"With",[558,7414,1049],{"class":728},[558,7416,1312],{"class":728},[558,7418,7419],{"class":568},"product_id",[558,7421,1312],{"class":728},[558,7423,1055],{"class":728},[558,7425,7249],{"class":590},[558,7427,2865],{"class":728},[558,7429,7430],{"class":560,"line":3046},[558,7431,1439],{"class":728},[558,7433,7434,7436],{"class":560,"line":3061},[558,7435,3630],{"class":853},[558,7437,1333],{"class":728},[558,7439,7440],{"class":560,"line":3066},[558,7441,1445],{"class":728},[549,7443,7446],{"className":833,"code":7444,"filename":7445,"language":565,"meta":554,"style":554},"package config\n\nimport (\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fworker\"\n    \u002F\u002F gpsystem:imports\n)\n\ntype Config struct {\n    Server server.Config\n    DB     dbx.Config `envPrefix:\"DB_\"`\n    Worker worker.Config\n    Outbox outbox.Config `envPrefix:\"OUTBOX_\"`\n    \u002F\u002F gpsystem:config\n}\n","internal\u002Fplatform\u002Fconfig\u002Fconfig.go",[470,7447,7448,7455,7459,7465,7473,7481,7489,7497,7501,7505,7509,7520,7532,7550,7562,7580,7585],{"__ignoreMap":554},[558,7449,7450,7452],{"class":560,"line":561},[558,7451,841],{"class":728},[558,7453,7454],{"class":564}," config\n",[558,7456,7457],{"class":560,"line":594},[558,7458,621],{"emptyLinePlaceholder":620},[558,7460,7461,7463],{"class":560,"line":607},[558,7462,854],{"class":853},[558,7464,857],{"class":728},[558,7466,7467,7469,7471],{"class":560,"line":617},[558,7468,862],{"class":728},[558,7470,2093],{"class":564},[558,7472,735],{"class":728},[558,7474,7475,7477,7479],{"class":560,"line":624},[558,7476,862],{"class":728},[558,7478,918],{"class":564},[558,7480,735],{"class":728},[558,7482,7483,7485,7487],{"class":560,"line":643},[558,7484,862],{"class":728},[558,7486,927],{"class":564},[558,7488,735],{"class":728},[558,7490,7491,7493,7495],{"class":560,"line":662},[558,7492,862],{"class":728},[558,7494,1536],{"class":564},[558,7496,735],{"class":728},[558,7498,7499],{"class":560,"line":680},[558,7500,2233],{"class":603},[558,7502,7503],{"class":560,"line":707},[558,7504,960],{"class":728},[558,7506,7507],{"class":560,"line":738},[558,7508,621],{"emptyLinePlaceholder":620},[558,7510,7511,7513,7516,7518],{"class":560,"line":755},[558,7512,2246],{"class":728},[558,7514,7515],{"class":564}," Config",[558,7517,2252],{"class":728},[558,7519,980],{"class":728},[558,7521,7522,7525,7527,7529],{"class":560,"line":760},[558,7523,7524],{"class":590},"    Server ",[558,7526,2830],{"class":564},[558,7528,540],{"class":728},[558,7530,7531],{"class":564},"Config\n",[558,7533,7534,7537,7539,7541,7543,7545,7548],{"class":560,"line":932},[558,7535,7536],{"class":590},"    DB     ",[558,7538,405],{"class":564},[558,7540,540],{"class":728},[558,7542,1008],{"class":564},[558,7544,3403],{"class":728},[558,7546,7547],{"class":568},"envPrefix:\"DB_\"",[558,7549,3409],{"class":728},[558,7551,7552,7555,7558,7560],{"class":560,"line":937},[558,7553,7554],{"class":590},"    Worker ",[558,7556,7557],{"class":564},"worker",[558,7559,540],{"class":728},[558,7561,7531],{"class":564},[558,7563,7564,7567,7569,7571,7573,7575,7578],{"class":560,"line":947},[558,7565,7566],{"class":590},"    Outbox ",[558,7568,1227],{"class":564},[558,7570,540],{"class":728},[558,7572,1008],{"class":564},[558,7574,3403],{"class":728},[558,7576,7577],{"class":568},"envPrefix:\"OUTBOX_\"",[558,7579,3409],{"class":728},[558,7581,7582],{"class":560,"line":957},[558,7583,7584],{"class":603},"    \u002F\u002F gpsystem:config\n",[558,7586,7587],{"class":560,"line":963},[558,7588,1445],{"class":728},[549,7590,7595],{"className":7591,"code":7592,"filename":7593,"language":7594,"meta":554,"style":554},"language-tsp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@tag(\"shop\")\ninterface ShopApi {\n  \u002F\u002F gpsystem:operations\n  @get\n  @route(\"\u002Fproducts\")\n  @operationId(\"ListProducts\")\n  @summary(\"List products\")\n  listProducts(...CursorQuery): CursorPage\u003CProduct>;\n\n  @post\n  @route(\"\u002Forders\")\n  @operationId(\"PlaceOrder\")\n  @permission(\"orders.place\")   \u002F\u002F durva szűrő: van-e joga hozzá\n  @policy(\"orders.place\")       \u002F\u002F finom szűrő: saját nevében rendel-e\n  placeOrder(@body body: PlaceOrderInput): Order | Unauthorized | Forbidden;\n\n  @get\n  @route(\"\u002Forders\u002F{orderId}\")\n  @operationId(\"GetOrder\")\n  @policy(\"orders.view\")        \u002F\u002F tulajdonos vagy admin\n  getOrder(@path orderId: string): Order | NotFound | Unauthorized | Forbidden;\n}\n","spec\u002Ftypespec\u002Fmodules\u002Fshop\u002Fapi.tsp","tsp",[470,7596,7597,7610,7620,7625,7630,7642,7654,7666,7691,7695,7700,7711,7722,7737,7751,7787,7791,7795,7806,7817,7831,7867],{"__ignoreMap":554},[558,7598,7599,7603,7605,7608],{"class":560,"line":561},[558,7600,7602],{"class":7601},"swJcz","@tag",[558,7604,1049],{"class":728},[558,7606,7607],{"class":568},"\"shop\"",[558,7609,960],{"class":728},[558,7611,7612,7615,7618],{"class":560,"line":594},[558,7613,7614],{"class":7378},"interface",[558,7616,7617],{"class":564}," ShopApi",[558,7619,980],{"class":728},[558,7621,7622],{"class":560,"line":607},[558,7623,7624],{"class":603},"  \u002F\u002F gpsystem:operations\n",[558,7626,7627],{"class":560,"line":617},[558,7628,7629],{"class":7601},"  @get\n",[558,7631,7632,7635,7637,7640],{"class":560,"line":624},[558,7633,7634],{"class":7601},"  @route",[558,7636,1049],{"class":728},[558,7638,7639],{"class":568},"\"\u002Fproducts\"",[558,7641,960],{"class":728},[558,7643,7644,7647,7649,7652],{"class":560,"line":643},[558,7645,7646],{"class":7601},"  @operationId",[558,7648,1049],{"class":728},[558,7650,7651],{"class":568},"\"ListProducts\"",[558,7653,960],{"class":728},[558,7655,7656,7659,7661,7664],{"class":560,"line":662},[558,7657,7658],{"class":7601},"  @summary",[558,7660,1049],{"class":728},[558,7662,7663],{"class":568},"\"List products\"",[558,7665,960],{"class":728},[558,7667,7668,7671,7674,7677,7680,7683,7686,7688],{"class":560,"line":680},[558,7669,7670],{"class":610},"  listProducts",[558,7672,7673],{"class":728},"(...",[558,7675,7676],{"class":564},"CursorQuery",[558,7678,7679],{"class":728},"):",[558,7681,7682],{"class":564}," CursorPage",[558,7684,7685],{"class":728},"\u003C",[558,7687,6259],{"class":564},[558,7689,7690],{"class":728},">;\n",[558,7692,7693],{"class":560,"line":707},[558,7694,621],{"emptyLinePlaceholder":620},[558,7696,7697],{"class":560,"line":738},[558,7698,7699],{"class":7601},"  @post\n",[558,7701,7702,7704,7706,7709],{"class":560,"line":755},[558,7703,7634],{"class":7601},[558,7705,1049],{"class":728},[558,7707,7708],{"class":568},"\"\u002Forders\"",[558,7710,960],{"class":728},[558,7712,7713,7715,7717,7720],{"class":560,"line":760},[558,7714,7646],{"class":7601},[558,7716,1049],{"class":728},[558,7718,7719],{"class":568},"\"PlaceOrder\"",[558,7721,960],{"class":728},[558,7723,7724,7727,7729,7732,7734],{"class":560,"line":932},[558,7725,7726],{"class":7601},"  @permission",[558,7728,1049],{"class":728},[558,7730,7731],{"class":568},"\"orders.place\"",[558,7733,1119],{"class":728},[558,7735,7736],{"class":603},"   \u002F\u002F durva szűrő: van-e joga hozzá\n",[558,7738,7739,7742,7744,7746,7748],{"class":560,"line":937},[558,7740,7741],{"class":7601},"  @policy",[558,7743,1049],{"class":728},[558,7745,7731],{"class":568},[558,7747,1119],{"class":728},[558,7749,7750],{"class":603},"       \u002F\u002F finom szűrő: saját nevében rendel-e\n",[558,7752,7753,7756,7758,7761,7764,7766,7768,7770,7773,7776,7779,7781,7784],{"class":560,"line":947},[558,7754,7755],{"class":610},"  placeOrder",[558,7757,1049],{"class":728},[558,7759,7760],{"class":7601},"@body",[558,7762,7763],{"class":590}," body",[558,7765,1169],{"class":728},[558,7767,5200],{"class":564},[558,7769,7679],{"class":728},[558,7771,7772],{"class":564}," Order",[558,7774,7775],{"class":590}," | ",[558,7777,7778],{"class":564},"Unauthorized",[558,7780,7775],{"class":590},[558,7782,7783],{"class":564},"Forbidden",[558,7785,7786],{"class":728},";\n",[558,7788,7789],{"class":560,"line":957},[558,7790,621],{"emptyLinePlaceholder":620},[558,7792,7793],{"class":560,"line":963},[558,7794,7629],{"class":7601},[558,7796,7797,7799,7801,7804],{"class":560,"line":968},[558,7798,7634],{"class":7601},[558,7800,1049],{"class":728},[558,7802,7803],{"class":568},"\"\u002Forders\u002F{orderId}\"",[558,7805,960],{"class":728},[558,7807,7808,7810,7812,7815],{"class":560,"line":983},[558,7809,7646],{"class":7601},[558,7811,1049],{"class":728},[558,7813,7814],{"class":568},"\"GetOrder\"",[558,7816,960],{"class":728},[558,7818,7819,7821,7823,7826,7828],{"class":560,"line":1014},[558,7820,7741],{"class":7601},[558,7822,1049],{"class":728},[558,7824,7825],{"class":568},"\"orders.view\"",[558,7827,1119],{"class":728},[558,7829,7830],{"class":603},"        \u002F\u002F tulajdonos vagy admin\n",[558,7832,7833,7836,7838,7841,7844,7846,7848,7850,7852,7854,7857,7859,7861,7863,7865],{"class":560,"line":1033},[558,7834,7835],{"class":610},"  getOrder",[558,7837,1049],{"class":728},[558,7839,7840],{"class":7601},"@path",[558,7842,7843],{"class":590}," orderId",[558,7845,1169],{"class":728},[558,7847,3451],{"class":564},[558,7849,7679],{"class":728},[558,7851,7772],{"class":564},[558,7853,7775],{"class":590},[558,7855,7856],{"class":564},"NotFound",[558,7858,7775],{"class":590},[558,7860,7778],{"class":564},[558,7862,7775],{"class":590},[558,7864,7783],{"class":564},[558,7866,7786],{"class":728},[558,7868,7869],{"class":560,"line":1068},[558,7870,1445],{"class":728},[549,7872,7877],{"className":7873,"code":7874,"filename":7875,"language":7876,"meta":554,"style":554},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- +goose Up\n-- +goose StatementBegin\nCREATE TABLE products (\n    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    name        text        NOT NULL,\n    price_cents bigint      NOT NULL,\n    stock       int         NOT NULL DEFAULT 0,\n    created_at  timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE TABLE orders (\n    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    user_id     text        NOT NULL,\n    product_id  bigint      NOT NULL REFERENCES products (id),\n    qty         int         NOT NULL,\n    email       text        NOT NULL,\n    created_at  timestamptz NOT NULL DEFAULT now()\n);\n-- +goose StatementEnd\n\n-- +goose Down\n-- +goose StatementBegin\nDROP TABLE orders;\nDROP TABLE products;\n-- +goose StatementEnd\n","migrations\u002F20260720143012_create_products_and_orders.sql","sql",[470,7878,7879,7884,7889,7901,7926,7939,7951,7968,7986,7991,7995,8005,8023,8035,8050,8061,8072,8086,8090,8095,8099,8104,8108,8118,8127],{"__ignoreMap":554},[558,7880,7881],{"class":560,"line":561},[558,7882,7883],{"class":603},"-- +goose Up\n",[558,7885,7886],{"class":560,"line":594},[558,7887,7888],{"class":603},"-- +goose StatementBegin\n",[558,7890,7891,7894,7897,7899],{"class":560,"line":607},[558,7892,7893],{"class":7378},"CREATE",[558,7895,7896],{"class":7378}," TABLE",[558,7898,5334],{"class":610},[558,7900,857],{"class":590},[558,7902,7903,7906,7909,7912,7915,7918,7921,7924],{"class":560,"line":617},[558,7904,7905],{"class":590},"    id          ",[558,7907,7908],{"class":1122},"bigint",[558,7910,7911],{"class":7378}," GENERATED",[558,7913,7914],{"class":7378}," ALWAYS",[558,7916,7917],{"class":7378}," AS",[558,7919,7920],{"class":7378}," IDENTITY",[558,7922,7923],{"class":1122}," PRIMARY KEY",[558,7925,2483],{"class":590},[558,7927,7928,7931,7934,7937],{"class":560,"line":624},[558,7929,7930],{"class":7378},"    name",[558,7932,7933],{"class":1122},"        text",[558,7935,7936],{"class":7378},"        NOT NULL",[558,7938,2483],{"class":590},[558,7940,7941,7944,7946,7949],{"class":560,"line":643},[558,7942,7943],{"class":590},"    price_cents ",[558,7945,7908],{"class":1122},[558,7947,7948],{"class":7378},"      NOT NULL",[558,7950,2483],{"class":590},[558,7952,7953,7956,7958,7961,7964,7966],{"class":560,"line":662},[558,7954,7955],{"class":590},"    stock       ",[558,7957,6243],{"class":1122},[558,7959,7960],{"class":7378},"         NOT NULL",[558,7962,7963],{"class":1122}," DEFAULT",[558,7965,7379],{"class":7378},[558,7967,2483],{"class":590},[558,7969,7970,7973,7976,7979,7981,7984],{"class":560,"line":680},[558,7971,7972],{"class":590},"    created_at  ",[558,7974,7975],{"class":1122},"timestamptz",[558,7977,7978],{"class":7378}," NOT NULL",[558,7980,7963],{"class":1122},[558,7982,7983],{"class":7378}," now",[558,7985,1030],{"class":728},[558,7987,7988],{"class":560,"line":707},[558,7989,7990],{"class":590},");\n",[558,7992,7993],{"class":560,"line":738},[558,7994,621],{"emptyLinePlaceholder":620},[558,7996,7997,7999,8001,8003],{"class":560,"line":755},[558,7998,7893],{"class":7378},[558,8000,7896],{"class":7378},[558,8002,4815],{"class":610},[558,8004,857],{"class":590},[558,8006,8007,8009,8011,8013,8015,8017,8019,8021],{"class":560,"line":760},[558,8008,7905],{"class":590},[558,8010,7908],{"class":1122},[558,8012,7911],{"class":7378},[558,8014,7914],{"class":7378},[558,8016,7917],{"class":7378},[558,8018,7920],{"class":7378},[558,8020,7923],{"class":1122},[558,8022,2483],{"class":590},[558,8024,8025,8028,8031,8033],{"class":560,"line":932},[558,8026,8027],{"class":590},"    user_id     ",[558,8029,8030],{"class":1122},"text",[558,8032,7936],{"class":7378},[558,8034,2483],{"class":590},[558,8036,8037,8040,8042,8044,8047],{"class":560,"line":937},[558,8038,8039],{"class":590},"    product_id  ",[558,8041,7908],{"class":1122},[558,8043,7948],{"class":7378},[558,8045,8046],{"class":1122}," REFERENCES",[558,8048,8049],{"class":590}," products (id),\n",[558,8051,8052,8055,8057,8059],{"class":560,"line":947},[558,8053,8054],{"class":590},"    qty         ",[558,8056,6243],{"class":1122},[558,8058,7960],{"class":7378},[558,8060,2483],{"class":590},[558,8062,8063,8066,8068,8070],{"class":560,"line":957},[558,8064,8065],{"class":590},"    email       ",[558,8067,8030],{"class":1122},[558,8069,7936],{"class":7378},[558,8071,2483],{"class":590},[558,8073,8074,8076,8078,8080,8082,8084],{"class":560,"line":963},[558,8075,7972],{"class":590},[558,8077,7975],{"class":1122},[558,8079,7978],{"class":7378},[558,8081,7963],{"class":1122},[558,8083,7983],{"class":7378},[558,8085,1030],{"class":728},[558,8087,8088],{"class":560,"line":968},[558,8089,7990],{"class":590},[558,8091,8092],{"class":560,"line":983},[558,8093,8094],{"class":603},"-- +goose StatementEnd\n",[558,8096,8097],{"class":560,"line":1014},[558,8098,621],{"emptyLinePlaceholder":620},[558,8100,8101],{"class":560,"line":1033},[558,8102,8103],{"class":603},"-- +goose Down\n",[558,8105,8106],{"class":560,"line":1068},[558,8107,7888],{"class":603},[558,8109,8110,8113,8115],{"class":560,"line":1073},[558,8111,8112],{"class":7378},"DROP",[558,8114,7896],{"class":7378},[558,8116,8117],{"class":590}," orders;\n",[558,8119,8120,8122,8124],{"class":560,"line":1128},[558,8121,8112],{"class":7378},[558,8123,7896],{"class":7378},[558,8125,8126],{"class":590}," products;\n",[558,8128,8129],{"class":560,"line":1145},[558,8130,8094],{"class":603},[448,8132,8133,8134,8137,8138,8140,8141,8143,8144,8148,8149,495,8152,8155,8156,8159,8160,8164],{},"A ",[470,8135,8136],{},"register.go"," ",[470,8139,1265],{},"\u002F",[470,8142,1286],{}," függvényei ugyanazt a generált mintát követik, amit ",[476,8145,8147],{"href":8146},"\u002Fhu\u002Fkit\u002Fserver#registerfunc-%C3%A9s-strictvalidator","A szerver mag"," oldal sorról sorra dokumentál: explicit service → handler → policy-registry felépítés, surface-enként egy ",[470,8150,8151],{},"router.Route",[470,8153,8154],{},"server.StrictValidator"," és ",[470,8157,8158],{},"kitpolicy.Enforcer"," strict middleware-ként, ",[476,8161,8162],{"href":396},[470,8163,386],{},"-en át renderelt hibákkal.",[457,8166,8168],{"id":8167},"kövesd-a-rendelést","Kövesd a rendelést",[448,8170,8171,8172,8175],{},"Egy ",[470,8173,8174],{},"POST \u002Fapi\u002Fv1\u002Fshop\u002Forders"," kérés útja a rendszeren át, lépésenként azzal az oldallal, ami az adott ugrást dokumentálja:",[8177,8178,8179,8195],"table",{},[8180,8181,8182],"thead",{},[8183,8184,8185,8189,8192],"tr",{},[8186,8187,8188],"th",{},"#",[8186,8190,8191],{},"Mi történik",[8186,8193,8194],{},"Hol dokumentált",[8196,8197,8198,8211,8226,8243,8259,8279,8291],"tbody",{},[8183,8199,8200,8204,8207],{},[8201,8202,8203],"td",{},"1",[8201,8205,8206],{},"A generált kód bindolja és validálja a kérést",[8201,8208,8209],{},[476,8210,400],{"href":401},[8183,8212,8213,8216,8222],{},[8201,8214,8215],{},"2",[8201,8217,8218,8219,8221],{},"Az enforcer middleware kiértékeli az ",[470,8220,4931],{}," permissiont és policy-t",[8201,8223,8224],{},[476,8225,98],{"href":99},[8183,8227,8228,8231,8237],{},[8201,8229,8230],{},"3",[8201,8232,8233,8234,8236],{},"A service a modul core-jába delegál; a core a ",[470,8235,5484],{},"-ben: rendelés insert + készletcsökkentés + outbox-sor",[8201,8238,8239,495,8241],{},[476,8240,422],{"href":423},[476,8242,72],{"href":73},[8183,8244,8245,8248,8254],{},[8201,8246,8247],{},"4",[8201,8249,8250,8251,8253],{},"A relay a Valkey queue-ba továbbítja az ",[470,8252,508],{}," eventet",[8201,8255,8256],{},[476,8257,8258],{"href":53},"Queue",[8183,8260,8261,8264,8270],{},[8201,8262,8263],{},"5",[8201,8265,8266,8267,8269],{},"A worker fan-outolja a listenereknek; a ",[470,8268,521],{}," e-mailt küld",[8201,8271,8272,495,8274,495,8276],{},[476,8273,263],{"href":264},[476,8275,67],{"href":68},[476,8277,8278],{"href":119},"E-mail",[8183,8280,8281,8284,8287],{},[8201,8282,8283],{},"6",[8201,8285,8286],{},"Az egész út egyetlen trace, a HTTP-kéréstől a levélküldésig",[8201,8288,8289],{},[476,8290,188],{"href":189},[8183,8292,8293,8296,8302],{},[8201,8294,8295],{},"7",[8201,8297,8298,8299,8301],{},"Hiba esetén: ",[470,8300,358],{}," lánc → problem+json a kliensnek, stack a Sentry-be",[8201,8303,8304,495,8306],{},[476,8305,224],{"href":225},[476,8307,193],{"href":194},[448,8309,8310,8311,8314],{},"Következő lépés: ",[476,8312,8313],{"href":31},"az első modulod",", ugyanez az út, a saját geped előtt ülve.",[8316,8317,8318],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":554,"searchDepth":594,"depth":594,"links":8320},[8321,8322,8323,8324],{"id":459,"depth":594,"text":460},{"id":543,"depth":594,"text":544},{"id":775,"depth":594,"text":776},{"id":8167,"depth":594,"text":8168},"Egy végigvitt példaprojekt, a dokumentáció minden kódpéldája erre épül.","md",null,{},{"icon":43},{"title":40,"description":8325},"LLXZ3UCfajp44uCw5Fz5B8DUQf72DPSFbeCZ3BxVJNE",[8333,8335],{"title":35,"path":36,"stem":37,"description":8334,"icon":38,"children":-1},"Egy generált fogyasztó projekt felépítése és a mögötte lévő szabályok.",{"title":52,"path":53,"stem":54,"description":8336,"icon":55,"children":-1},"Az asynq + Valkey alapréteg: kapcsolat-config, kliens és task-beküldés, amire az egész async kategória épül.",1785445881535]