[{"data":1,"prerenderedAt":1006},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-notify-database":442,"-hu-notify-database-surround":1001},[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":139,"body":444,"description":994,"extension":995,"links":996,"meta":997,"navigation":998,"path":140,"seo":999,"stem":141,"__hash__":1000},"docs_hu\u002Fhu\u002F14.notify\u002F2.database.md",{"type":445,"value":446,"toc":987},"minimark",[447,455,488,493,518,612,616,624,745,776,819,841,850,854,878,900,904,937,941,983],[448,449,450,451,454],"p",{},"Ez az alcsomag adja a ",[452,453,130],"code",{}," durable, lekérdezhető csatornáját: importáld, amikor egy notificationnek perzisztált, olvasható előzményt akarsz adni, nem csak egy elküldött mailt vagy egy élő push-t.",[456,457,462],"pre",{"className":458,"code":459,"language":460,"meta":461,"style":461},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import notifydatabase \"github.com\u002Fgp-system\u002Fnotify\u002Fdatabase\"\n","go","",[452,463,464],{"__ignoreMap":461},[465,466,469,473,477,481,485],"span",{"class":467,"line":468},"line",1,[465,470,472],{"class":471},"s7zQu","import",[465,474,476],{"class":475},"sTEyZ"," notifydatabase ",[465,478,480],{"class":479},"sMK4o","\"",[465,482,484],{"class":483},"sBMFI","github.com\u002Fgp-system\u002Fnotify\u002Fdatabase",[465,486,487],{"class":479},"\"\n",[489,490,492],"h2",{"id":491},"database","Database",[448,494,495,496,499,500,503,504,507,508,511,512,517],{},"A ",[452,497,498],{},"notify\u002Fdatabase"," (+",[452,501,502],{},"notify\u002Fdatabase\u002Fbunx",") egy notification durable, lekérdezhető oldala: minden ",[452,505,506],{},"Databasable"," notification egy ",[452,509,510],{},"notifications"," táblába kerül, így a recipiens egy perzisztált, „notification inbox\" mintát kap (a modul Laravel-notifications-szerű része) bármi más felett, ami elsül. A ",[513,514,515],"a",{"href":411},[452,516,405],{},"-ra épül, ugyanúgy, mint a kit többi perzisztencia-rétege.",[456,519,521],{"className":458,"code":520,"language":460,"meta":461,"style":461},"store := notifydatabase.NewStore(pg.NewDB(pool))       \u002F\u002F pgx\nstore := notifydatabasebunx.NewStore(bunDB)             \u002F\u002F bun, a notify\u002Fdatabase\u002Fbunx-on keresztül\nchannel := notifydatabase.NewChannel(store)\n",[452,522,523,564,589],{"__ignoreMap":461},[465,524,525,528,531,534,537,541,544,547,549,552,554,557,560],{"class":467,"line":468},[465,526,527],{"class":475},"store ",[465,529,530],{"class":479},":=",[465,532,533],{"class":475}," notifydatabase",[465,535,536],{"class":479},".",[465,538,540],{"class":539},"s2Zo4","NewStore",[465,542,543],{"class":479},"(",[465,545,546],{"class":475},"pg",[465,548,536],{"class":479},[465,550,551],{"class":539},"NewDB",[465,553,543],{"class":479},[465,555,556],{"class":475},"pool",[465,558,559],{"class":479},"))",[465,561,563],{"class":562},"sHwdD","       \u002F\u002F pgx\n",[465,565,567,569,571,574,576,578,580,583,586],{"class":467,"line":566},2,[465,568,527],{"class":475},[465,570,530],{"class":479},[465,572,573],{"class":475}," notifydatabasebunx",[465,575,536],{"class":479},[465,577,540],{"class":539},[465,579,543],{"class":479},[465,581,582],{"class":475},"bunDB",[465,584,585],{"class":479},")",[465,587,588],{"class":562},"             \u002F\u002F bun, a notify\u002Fdatabase\u002Fbunx-on keresztül\n",[465,590,592,595,597,599,601,604,606,609],{"class":467,"line":591},3,[465,593,594],{"class":475},"channel ",[465,596,530],{"class":479},[465,598,533],{"class":475},[465,600,536],{"class":479},[465,602,603],{"class":539},"NewChannel",[465,605,543],{"class":479},[465,607,608],{"class":475},"store",[465,610,611],{"class":479},")\n",[489,613,615],{"id":614},"record-és-store","Record és Store",[448,617,495,618,620,621,623],{},[452,619,506],{}," notificationöket egy ",[452,622,510],{}," táblába perzisztálja:",[456,625,629],{"className":626,"code":627,"language":628,"meta":461,"style":461},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CREATE TABLE notifications (\n    id           uuid        PRIMARY KEY,\n    recipient_id text        NOT NULL,\n    name         text        NOT NULL,\n    payload      jsonb       NOT NULL DEFAULT '{}'::jsonb,\n    read_at      timestamptz,\n    created_at   timestamptz NOT NULL DEFAULT now()\n);\n","sql",[452,630,631,646,658,671,684,709,720,739],{"__ignoreMap":461},[465,632,633,637,640,643],{"class":467,"line":468},[465,634,636],{"class":635},"sbssI","CREATE",[465,638,639],{"class":635}," TABLE",[465,641,642],{"class":539}," notifications",[465,644,645],{"class":475}," (\n",[465,647,648,651,655],{"class":467,"line":566},[465,649,650],{"class":475},"    id           uuid        ",[465,652,654],{"class":653},"spNyl","PRIMARY KEY",[465,656,657],{"class":475},",\n",[465,659,660,663,666,669],{"class":467,"line":591},[465,661,662],{"class":475},"    recipient_id ",[465,664,665],{"class":653},"text",[465,667,668],{"class":635},"        NOT NULL",[465,670,657],{"class":475},[465,672,674,677,680,682],{"class":467,"line":673},4,[465,675,676],{"class":635},"    name",[465,678,679],{"class":653},"         text",[465,681,668],{"class":635},[465,683,657],{"class":475},[465,685,687,690,693,696,699,703,706],{"class":467,"line":686},5,[465,688,689],{"class":475},"    payload      jsonb       ",[465,691,692],{"class":635},"NOT NULL",[465,694,695],{"class":653}," DEFAULT",[465,697,698],{"class":479}," '",[465,700,702],{"class":701},"sfazB","{}",[465,704,705],{"class":479},"'",[465,707,708],{"class":475},"::jsonb,\n",[465,710,712,715,718],{"class":467,"line":711},6,[465,713,714],{"class":475},"    read_at      ",[465,716,717],{"class":653},"timestamptz",[465,719,657],{"class":475},[465,721,723,726,728,731,733,736],{"class":467,"line":722},7,[465,724,725],{"class":475},"    created_at   ",[465,727,717],{"class":653},[465,729,730],{"class":635}," NOT NULL",[465,732,695],{"class":653},[465,734,735],{"class":635}," now",[465,737,738],{"class":479},"()\n",[465,740,742],{"class":467,"line":741},8,[465,743,744],{"class":475},");\n",[448,746,747,748,751,752,755,756,759,760,763,764,767,768,771,772,775],{},"Nincs ",[452,749,750],{},"notifiable_type"," oszlop (a kitnek nincs polimorf user-modellje, egy recipiens csak egy ",[452,753,754],{},"string"," id), nincs ",[452,757,758],{},"updated_at"," (a sorok csak ",[452,761,762],{},"read_at","-et kapnak). A csatorna megköveteli a ",[452,765,766],{},"Recipient.ID","-t; egy on-demand küldés (ID nélkül) hibázik ezen a csatornán: a ",[452,769,770],{},"Via","-ban ezekhez csak a ",[452,773,774],{},"notify.ChannelMail","-t nevezd meg.",[448,777,495,778,781,782,785,786,789,790,793,794,785,797,785,800,803,804,807,808,811,812,814,815,818],{},[452,779,780],{},"Store"," interfész az univerzális 90%-ot fedi: ",[452,783,784],{},"Insert",", ",[452,787,788],{},"List"," (",[452,791,792],{},"ListOptions{UnreadOnly, Limit, Offset}","), ",[452,795,796],{},"CountUnread",[452,798,799],{},"MarkRead",[452,801,802],{},"MarkAllRead",". Minden olvasás\u002Ffrissítés explicit ",[452,805,806],{},"recipientID","-t vár, így egy erre épülő handler sosem nyúlhat véletlenül másik recipiens sorába. A tényleges HTTP-inbox (response DTO-k, ",[452,809,810],{},"rbac.Identity.Subject"," → ",[452,813,806],{}," guard) felépítése a saját modulod dolga: a kit a Store-ig megy, ugyanaz a határ, amit az ",[513,816,817],{"href":73},"outbox"," is húz a saját táblája köré.",[448,820,821,822,825,826,828,829,832,833,837,838,840],{},"Az ",[452,823,824],{},"NewChannel(store)"," egy ",[452,827,780],{},"-t csomagol egy ",[452,830,831],{},"notify.Channel","-lé, amit a ",[513,834,836],{"href":835},"\u002Fhu\u002Fnotify\u002Foverview#a-hub","Hub"," dispatchol; ezen keresztül routolódik egy ",[452,839,506],{}," notification tartalma.",[448,842,747,843,846,847,849],{},[452,844,845],{},"NOTIFY_*"," env config: a csatorna-engedélyezés maga a wiring; a ",[452,848,836],{}," pontosan azokat a csatornákat tartalmazza, amit a belépési pont megkonstruál.",[489,851,853],{"id":852},"memorystore","MemoryStore",[456,855,857],{"className":458,"code":856,"language":460,"meta":461,"style":461},"store := notifydatabase.NewMemoryStore() \u002F\u002F a teljes Store-t implementálja, az olvasó oldalt is\n",[452,858,859],{"__ignoreMap":461},[465,860,861,863,865,867,869,872,875],{"class":467,"line":468},[465,862,527],{"class":475},[465,864,530],{"class":479},[465,866,533],{"class":475},[465,868,536],{"class":479},[465,870,871],{"class":539},"NewMemoryStore",[465,873,874],{"class":479},"()",[465,876,877],{"class":562}," \u002F\u002F a teljes Store-t implementálja, az olvasó oldalt is\n",[448,879,495,880,882,883,885,886,889,890,892,893,899],{},[452,881,853],{}," egy test double: minden ",[452,884,780],{},"-metódust implementál, így egy termék Postgres nélkül tesztelheti az inbox-handlereit (listázás, olvasottá jelölés, olvasatlanok számolása). Párosítsd a ",[452,887,888],{},"notifydatabase.NewChannel(store)","-dal tartalom-renderelési lefedettséghez egy ",[452,891,836],{},"-ban, ugyanúgy, ahogy a ",[513,894,896],{"href":895},"\u002Fhu\u002Fmail\u002Foverview#dev-mailerek-memory-log-%C3%A9s-discard",[452,897,898],{},"mail.NewMemory()"," is helyettesíti a valódi mailert.",[489,901,903],{"id":902},"migráció","Migráció",[448,905,495,906,908,909,915,916,919,920,925,926,929,930,933,934,936],{},[452,907,510],{}," tábla goose-migrációként érkezik, ugyanabban a mintában, mint az ",[513,910,912],{"href":911},"\u002Fhu\u002Fevents\u002Foutbox#a-t%C3%A1bla-%C3%A9s-a-migr%C3%A1ci%C3%B3",[452,913,914],{},"outbox.MigrationSQL",": a ",[452,917,918],{},"notifydatabase.MigrationSQL"," a séma forrása a csomagban, és az ",[513,921,923],{"href":922},"\u002Fhu\u002Fnotify\u002Foverview#add-notification",[452,924,305],{}," első futása írja be a projekt ",[452,927,928],{},"migrations\u002F"," könyvtárába, a következő szabad timestampen. Az inboxot birtokló service indítása előtt futtasd le: ",[452,931,932],{},"go run .\u002Fcmd\u002Fmigrate up"," (lásd ",[513,935,272],{"href":273},").",[489,938,940],{"id":939},"kapcsolódó-oldalak","Kapcsolódó oldalak",[942,943,944,956,962],"ul",{},[945,946,947,915,949,951,952,955],"li",{},[513,948,52],{"href":136},[452,950,836],{},", a ",[452,953,954],{},"Notification"," és a mail-csatorna.",[945,957,958,961],{},[513,959,960],{"href":144},"Broadcast",": ennek a durable csatornának az élő push-párja.",[945,963,964,969,970,975,976,978,979,982],{},[513,965,966],{"href":415},[452,967,968],{},"dbx: pgx"," és ",[513,971,972],{"href":419},[452,973,974],{},"dbx: bunx",": az executorok, amikre az ",[452,977,540],{}," és a ",[452,980,981],{},"bunx","-adapter épül.",[984,985,986],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":461,"searchDepth":566,"depth":566,"links":988},[989,990,991,992,993],{"id":491,"depth":566,"text":492},{"id":614,"depth":566,"text":615},{"id":852,"depth":566,"text":853},{"id":902,"depth":566,"text":903},{"id":939,"depth":566,"text":940},"A tartós database notification csatorna.","md",null,{},{"icon":131},{"title":139,"description":994},"enj_ugISisgCrb8iUl9kwerUEVdzXSpBQdtVkwBB-gM",[1002,1004],{"title":52,"path":136,"stem":137,"description":1003,"icon":131,"children":-1},"Többcsatornás notificationök: egy payload, több csatorna (database, mail, broadcast), egy közös Hub vezérli.",{"title":143,"path":144,"stem":145,"description":1005,"icon":131,"children":-1},"A realtime broadcast notification csatorna.",1785445896597]