[{"data":1,"prerenderedAt":12823},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/multi-tenancy-en":444,"/docs/nuxt-auto/auto-api/multi-tenancy-surround-en":12818},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":12814},{"id":446,"title":235,"body":447,"description":457,"extension":12813,"links":12814,"meta":12815,"navigation":12814,"ogImage":12814,"path":236,"seo":12816,"stem":237,"__hash__":12817},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy.md",{"type":448,"value":449,"toc":12744},"minimark",[450,454,458,462,465,500,503,507,562,564,567,572,1335,1339,1460,1464,1673,1677,1680,1760,1762,1765,1769,1772,3237,3241,3271,3273,3276,3280,3485,3489,3649,3653,3806,3808,3811,3815,3818,4697,4701,5309,5313,5665,5667,5670,5673,5689,5693,6051,6055,6554,6558,6683,6687,6721,6723,6727,6730,7230,7234,7699,7703,8213,8217,8264,8268,8274,8367,8371,8532,8534,8537,8541,8597,8607,8611,8782,8796,8800,8859,8867,8871,9003,9011,9015,9275,9277,9280,9284,9443,9447,9537,9541,9650,9654,9871,9873,9876,9880,11573,11577,12178,12180,12184,12188,12274,12278,12426,12430,12493,12497,12557,12561,12596,12598,12602,12606,12612,12617,12643,12647,12652,12656,12673,12677,12682,12686,12711,12713,12717,12740],[451,452,235],"h1",{"id":453},"multi-tenancy",[455,456,457],"p",{},"This guide covers building multi-tenant SaaS applications with organization-level permissions, where users can have different roles across organizations.",[459,460,5],"h2",{"id":461},"overview",[455,463,464],{},"Multi-tenancy enables:",[466,467,468,476,482,488,494],"ul",{},[469,470,471,475],"li",{},[472,473,474],"strong",{},"Data isolation"," - Automatic filtering by organization",[469,477,478,481],{},[472,479,480],{},"Organization-level permissions"," - User is admin in Org A, member in Org B",[469,483,484,487],{},[472,485,486],{},"API token scoping"," - Tokens bound to organizations",[469,489,490,493],{},[472,491,492],{},"Flexible tenant resolution"," - From user, header, subdomain, etc.",[469,495,496,499],{},[472,497,498],{},"Admin bypass"," - Superadmins can access all organizations",[501,502],"hr",{},[459,504,506],{"id":505},"table-of-contents","Table of Contents",[508,509,510,516,522,528,534,539,545,551,557],"ol",{},[469,511,512],{},[513,514,198],"a",{"href":515},"#quick-start",[469,517,518],{},[513,519,521],{"href":520},"#schema-design","Schema Design",[469,523,524],{},[513,525,527],{"href":526},"#configuration","Configuration",[469,529,530],{},[513,531,533],{"href":532},"#organization-member-permissions","Organization-Member Permissions",[469,535,536],{},[513,537,287],{"href":538},"#better-auth-integration",[469,540,541],{},[513,542,544],{"href":543},"#api-token-plugin-with-organizations","API Token Plugin",[469,546,547],{},[513,548,550],{"href":549},"#tenant-resolution-strategies","Tenant Resolution Strategies",[469,552,553],{},[513,554,556],{"href":555},"#advanced-patterns","Advanced Patterns",[469,558,559],{},[513,560,271],{"href":561},"#testing",[501,563],{},[459,565,198],{"id":566},"quick-start",[568,569,571],"h3",{"id":570},"_1-add-organization-field-to-schema","1. Add Organization Field to Schema",[573,574,579],"pre",{"className":575,"code":576,"language":577,"meta":578,"style":578},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// server/database/schema.ts\nimport { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'\nimport { relations } from 'drizzle-orm'\n\nexport const organizations = sqliteTable('organizations', {\n  id: text('id').primaryKey(),\n  name: text('name').notNull(),\n  slug: text('slug').notNull().unique(),\n  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n})\n\nexport const posts = sqliteTable('posts', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  title: text('title').notNull(),\n  content: text('content'),\n  userId: integer('user_id').notNull(),\n  organizationId: text('organization_id')  // ← Multi-tenancy field\n    .notNull()\n    .references(() => organizations.id, { onDelete: 'cascade' }),\n  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n})\n\nexport const postsRelations = relations(posts, ({ one }) => ({\n  organization: one(organizations, {\n    fields: [posts.organizationId],\n    references: [organizations.id],\n  }),\n  user: one(users, {\n    fields: [posts.userId],\n    references: [users.id],\n  }),\n}))\n","typescript","",[580,581,582,591,633,654,661,696,732,762,798,860,869,874,901,944,973,996,1025,1050,1061,1104,1157,1164,1169,1206,1223,1241,1259,1269,1286,1302,1318,1327],"code",{"__ignoreMap":578},[583,584,587],"span",{"class":585,"line":586},"line",1,[583,588,590],{"class":589},"sHwdD","// server/database/schema.ts\n",[583,592,594,598,602,606,609,612,614,617,620,623,626,630],{"class":585,"line":593},2,[583,595,597],{"class":596},"s7zQu","import",[583,599,601],{"class":600},"sMK4o"," {",[583,603,605],{"class":604},"sTEyZ"," sqliteTable",[583,607,608],{"class":600},",",[583,610,611],{"class":604}," text",[583,613,608],{"class":600},[583,615,616],{"class":604}," integer",[583,618,619],{"class":600}," }",[583,621,622],{"class":596}," from",[583,624,625],{"class":600}," '",[583,627,629],{"class":628},"sfazB","drizzle-orm/sqlite-core",[583,631,632],{"class":600},"'\n",[583,634,636,638,640,643,645,647,649,652],{"class":585,"line":635},3,[583,637,597],{"class":596},[583,639,601],{"class":600},[583,641,642],{"class":604}," relations",[583,644,619],{"class":600},[583,646,622],{"class":596},[583,648,625],{"class":600},[583,650,651],{"class":628},"drizzle-orm",[583,653,632],{"class":600},[583,655,657],{"class":585,"line":656},4,[583,658,660],{"emptyLinePlaceholder":659},true,"\n",[583,662,664,667,671,674,677,680,683,686,689,691,693],{"class":585,"line":663},5,[583,665,666],{"class":596},"export",[583,668,670],{"class":669},"spNyl"," const",[583,672,673],{"class":604}," organizations ",[583,675,676],{"class":600},"=",[583,678,605],{"class":679},"s2Zo4",[583,681,682],{"class":604},"(",[583,684,685],{"class":600},"'",[583,687,688],{"class":628},"organizations",[583,690,685],{"class":600},[583,692,608],{"class":600},[583,694,695],{"class":600}," {\n",[583,697,699,703,706,708,710,712,715,717,720,723,726,729],{"class":585,"line":698},6,[583,700,702],{"class":701},"swJcz","  id",[583,704,705],{"class":600},":",[583,707,611],{"class":679},[583,709,682],{"class":604},[583,711,685],{"class":600},[583,713,714],{"class":628},"id",[583,716,685],{"class":600},[583,718,719],{"class":604},")",[583,721,722],{"class":600},".",[583,724,725],{"class":679},"primaryKey",[583,727,728],{"class":604},"()",[583,730,731],{"class":600},",\n",[583,733,735,738,740,742,744,746,749,751,753,755,758,760],{"class":585,"line":734},7,[583,736,737],{"class":701},"  name",[583,739,705],{"class":600},[583,741,611],{"class":679},[583,743,682],{"class":604},[583,745,685],{"class":600},[583,747,748],{"class":628},"name",[583,750,685],{"class":600},[583,752,719],{"class":604},[583,754,722],{"class":600},[583,756,757],{"class":679},"notNull",[583,759,728],{"class":604},[583,761,731],{"class":600},[583,763,765,768,770,772,774,776,779,781,783,785,787,789,791,794,796],{"class":585,"line":764},8,[583,766,767],{"class":701},"  slug",[583,769,705],{"class":600},[583,771,611],{"class":679},[583,773,682],{"class":604},[583,775,685],{"class":600},[583,777,778],{"class":628},"slug",[583,780,685],{"class":600},[583,782,719],{"class":604},[583,784,722],{"class":600},[583,786,757],{"class":679},[583,788,728],{"class":604},[583,790,722],{"class":600},[583,792,793],{"class":679},"unique",[583,795,728],{"class":604},[583,797,731],{"class":600},[583,799,801,804,806,808,810,812,815,817,819,821,824,826,828,831,833,835,837,839,842,844,846,849,852,855,858],{"class":585,"line":800},9,[583,802,803],{"class":701},"  createdAt",[583,805,705],{"class":600},[583,807,616],{"class":679},[583,809,682],{"class":604},[583,811,685],{"class":600},[583,813,814],{"class":628},"created_at",[583,816,685],{"class":600},[583,818,608],{"class":600},[583,820,601],{"class":600},[583,822,823],{"class":701}," mode",[583,825,705],{"class":600},[583,827,625],{"class":600},[583,829,830],{"class":628},"timestamp",[583,832,685],{"class":600},[583,834,619],{"class":600},[583,836,719],{"class":604},[583,838,722],{"class":600},[583,840,841],{"class":679},"$defaultFn",[583,843,682],{"class":604},[583,845,728],{"class":600},[583,847,848],{"class":669}," =>",[583,850,851],{"class":600}," new",[583,853,854],{"class":679}," Date",[583,856,857],{"class":604},"())",[583,859,731],{"class":600},[583,861,863,866],{"class":585,"line":862},10,[583,864,865],{"class":600},"}",[583,867,868],{"class":604},")\n",[583,870,872],{"class":585,"line":871},11,[583,873,660],{"emptyLinePlaceholder":659},[583,875,877,879,881,884,886,888,890,892,895,897,899],{"class":585,"line":876},12,[583,878,666],{"class":596},[583,880,670],{"class":669},[583,882,883],{"class":604}," posts ",[583,885,676],{"class":600},[583,887,605],{"class":679},[583,889,682],{"class":604},[583,891,685],{"class":600},[583,893,894],{"class":628},"posts",[583,896,685],{"class":600},[583,898,608],{"class":600},[583,900,695],{"class":600},[583,902,904,906,908,910,912,914,916,918,920,922,924,926,929,932,934,938,940,942],{"class":585,"line":903},13,[583,905,702],{"class":701},[583,907,705],{"class":600},[583,909,616],{"class":679},[583,911,682],{"class":604},[583,913,685],{"class":600},[583,915,714],{"class":628},[583,917,685],{"class":600},[583,919,719],{"class":604},[583,921,722],{"class":600},[583,923,725],{"class":679},[583,925,682],{"class":604},[583,927,928],{"class":600},"{",[583,930,931],{"class":701}," autoIncrement",[583,933,705],{"class":600},[583,935,937],{"class":936},"sfNiH"," true",[583,939,619],{"class":600},[583,941,719],{"class":604},[583,943,731],{"class":600},[583,945,947,950,952,954,956,958,961,963,965,967,969,971],{"class":585,"line":946},14,[583,948,949],{"class":701},"  title",[583,951,705],{"class":600},[583,953,611],{"class":679},[583,955,682],{"class":604},[583,957,685],{"class":600},[583,959,960],{"class":628},"title",[583,962,685],{"class":600},[583,964,719],{"class":604},[583,966,722],{"class":600},[583,968,757],{"class":679},[583,970,728],{"class":604},[583,972,731],{"class":600},[583,974,976,979,981,983,985,987,990,992,994],{"class":585,"line":975},15,[583,977,978],{"class":701},"  content",[583,980,705],{"class":600},[583,982,611],{"class":679},[583,984,682],{"class":604},[583,986,685],{"class":600},[583,988,989],{"class":628},"content",[583,991,685],{"class":600},[583,993,719],{"class":604},[583,995,731],{"class":600},[583,997,999,1002,1004,1006,1008,1010,1013,1015,1017,1019,1021,1023],{"class":585,"line":998},16,[583,1000,1001],{"class":701},"  userId",[583,1003,705],{"class":600},[583,1005,616],{"class":679},[583,1007,682],{"class":604},[583,1009,685],{"class":600},[583,1011,1012],{"class":628},"user_id",[583,1014,685],{"class":600},[583,1016,719],{"class":604},[583,1018,722],{"class":600},[583,1020,757],{"class":679},[583,1022,728],{"class":604},[583,1024,731],{"class":600},[583,1026,1028,1031,1033,1035,1037,1039,1042,1044,1047],{"class":585,"line":1027},17,[583,1029,1030],{"class":701},"  organizationId",[583,1032,705],{"class":600},[583,1034,611],{"class":679},[583,1036,682],{"class":604},[583,1038,685],{"class":600},[583,1040,1041],{"class":628},"organization_id",[583,1043,685],{"class":600},[583,1045,1046],{"class":604},")  ",[583,1048,1049],{"class":589},"// ← Multi-tenancy field\n",[583,1051,1053,1056,1058],{"class":585,"line":1052},18,[583,1054,1055],{"class":600},"    .",[583,1057,757],{"class":679},[583,1059,1060],{"class":604},"()\n",[583,1062,1064,1066,1069,1071,1073,1075,1078,1080,1082,1084,1086,1089,1091,1093,1096,1098,1100,1102],{"class":585,"line":1063},19,[583,1065,1055],{"class":600},[583,1067,1068],{"class":679},"references",[583,1070,682],{"class":604},[583,1072,728],{"class":600},[583,1074,848],{"class":669},[583,1076,1077],{"class":604}," organizations",[583,1079,722],{"class":600},[583,1081,714],{"class":604},[583,1083,608],{"class":600},[583,1085,601],{"class":600},[583,1087,1088],{"class":701}," onDelete",[583,1090,705],{"class":600},[583,1092,625],{"class":600},[583,1094,1095],{"class":628},"cascade",[583,1097,685],{"class":600},[583,1099,619],{"class":600},[583,1101,719],{"class":604},[583,1103,731],{"class":600},[583,1105,1107,1109,1111,1113,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155],{"class":585,"line":1106},20,[583,1108,803],{"class":701},[583,1110,705],{"class":600},[583,1112,616],{"class":679},[583,1114,682],{"class":604},[583,1116,685],{"class":600},[583,1118,814],{"class":628},[583,1120,685],{"class":600},[583,1122,608],{"class":600},[583,1124,601],{"class":600},[583,1126,823],{"class":701},[583,1128,705],{"class":600},[583,1130,625],{"class":600},[583,1132,830],{"class":628},[583,1134,685],{"class":600},[583,1136,619],{"class":600},[583,1138,719],{"class":604},[583,1140,722],{"class":600},[583,1142,841],{"class":679},[583,1144,682],{"class":604},[583,1146,728],{"class":600},[583,1148,848],{"class":669},[583,1150,851],{"class":600},[583,1152,854],{"class":679},[583,1154,857],{"class":604},[583,1156,731],{"class":600},[583,1158,1160,1162],{"class":585,"line":1159},21,[583,1161,865],{"class":600},[583,1163,868],{"class":604},[583,1165,1167],{"class":585,"line":1166},22,[583,1168,660],{"emptyLinePlaceholder":659},[583,1170,1172,1174,1176,1179,1181,1183,1186,1188,1191,1195,1198,1200,1203],{"class":585,"line":1171},23,[583,1173,666],{"class":596},[583,1175,670],{"class":669},[583,1177,1178],{"class":604}," postsRelations ",[583,1180,676],{"class":600},[583,1182,642],{"class":679},[583,1184,1185],{"class":604},"(posts",[583,1187,608],{"class":600},[583,1189,1190],{"class":600}," ({",[583,1192,1194],{"class":1193},"sHdIc"," one",[583,1196,1197],{"class":600}," })",[583,1199,848],{"class":669},[583,1201,1202],{"class":604}," (",[583,1204,1205],{"class":600},"{\n",[583,1207,1209,1212,1214,1216,1219,1221],{"class":585,"line":1208},24,[583,1210,1211],{"class":701},"  organization",[583,1213,705],{"class":600},[583,1215,1194],{"class":679},[583,1217,1218],{"class":604},"(organizations",[583,1220,608],{"class":600},[583,1222,695],{"class":600},[583,1224,1226,1229,1231,1234,1236,1239],{"class":585,"line":1225},25,[583,1227,1228],{"class":701},"    fields",[583,1230,705],{"class":600},[583,1232,1233],{"class":604}," [posts",[583,1235,722],{"class":600},[583,1237,1238],{"class":604},"organizationId]",[583,1240,731],{"class":600},[583,1242,1244,1247,1249,1252,1254,1257],{"class":585,"line":1243},26,[583,1245,1246],{"class":701},"    references",[583,1248,705],{"class":600},[583,1250,1251],{"class":604}," [organizations",[583,1253,722],{"class":600},[583,1255,1256],{"class":604},"id]",[583,1258,731],{"class":600},[583,1260,1262,1265,1267],{"class":585,"line":1261},27,[583,1263,1264],{"class":600},"  }",[583,1266,719],{"class":604},[583,1268,731],{"class":600},[583,1270,1272,1275,1277,1279,1282,1284],{"class":585,"line":1271},28,[583,1273,1274],{"class":701},"  user",[583,1276,705],{"class":600},[583,1278,1194],{"class":679},[583,1280,1281],{"class":604},"(users",[583,1283,608],{"class":600},[583,1285,695],{"class":600},[583,1287,1289,1291,1293,1295,1297,1300],{"class":585,"line":1288},29,[583,1290,1228],{"class":701},[583,1292,705],{"class":600},[583,1294,1233],{"class":604},[583,1296,722],{"class":600},[583,1298,1299],{"class":604},"userId]",[583,1301,731],{"class":600},[583,1303,1305,1307,1309,1312,1314,1316],{"class":585,"line":1304},30,[583,1306,1246],{"class":701},[583,1308,705],{"class":600},[583,1310,1311],{"class":604}," [users",[583,1313,722],{"class":600},[583,1315,1256],{"class":604},[583,1317,731],{"class":600},[583,1319,1321,1323,1325],{"class":585,"line":1320},31,[583,1322,1264],{"class":600},[583,1324,719],{"class":604},[583,1326,731],{"class":600},[583,1328,1330,1332],{"class":585,"line":1329},32,[583,1331,865],{"class":600},[583,1333,1334],{"class":604},"))\n",[568,1336,1338],{"id":1337},"_2-enable-multi-tenancy","2. Enable Multi-Tenancy",[573,1340,1342],{"className":575,"code":1341,"language":577,"meta":578,"style":578},"// nuxt.config.ts\nexport default defineNuxtConfig({\n  autoApi: {\n    multiTenancy: {\n      enabled: true,\n      tenantIdField: 'organizationId',\n      getTenantId: (event) => event.context.user?.organizationId,\n    }\n  }\n})\n",[580,1343,1344,1349,1363,1372,1381,1392,1408,1444,1449,1454],{"__ignoreMap":578},[583,1345,1346],{"class":585,"line":586},[583,1347,1348],{"class":589},"// nuxt.config.ts\n",[583,1350,1351,1353,1356,1359,1361],{"class":585,"line":593},[583,1352,666],{"class":596},[583,1354,1355],{"class":596}," default",[583,1357,1358],{"class":679}," defineNuxtConfig",[583,1360,682],{"class":604},[583,1362,1205],{"class":600},[583,1364,1365,1368,1370],{"class":585,"line":635},[583,1366,1367],{"class":701},"  autoApi",[583,1369,705],{"class":600},[583,1371,695],{"class":600},[583,1373,1374,1377,1379],{"class":585,"line":656},[583,1375,1376],{"class":701},"    multiTenancy",[583,1378,705],{"class":600},[583,1380,695],{"class":600},[583,1382,1383,1386,1388,1390],{"class":585,"line":663},[583,1384,1385],{"class":701},"      enabled",[583,1387,705],{"class":600},[583,1389,937],{"class":936},[583,1391,731],{"class":600},[583,1393,1394,1397,1399,1401,1404,1406],{"class":585,"line":698},[583,1395,1396],{"class":701},"      tenantIdField",[583,1398,705],{"class":600},[583,1400,625],{"class":600},[583,1402,1403],{"class":628},"organizationId",[583,1405,685],{"class":600},[583,1407,731],{"class":600},[583,1409,1410,1413,1415,1417,1420,1422,1424,1427,1429,1432,1434,1437,1440,1442],{"class":585,"line":734},[583,1411,1412],{"class":679},"      getTenantId",[583,1414,705],{"class":600},[583,1416,1202],{"class":600},[583,1418,1419],{"class":1193},"event",[583,1421,719],{"class":600},[583,1423,848],{"class":669},[583,1425,1426],{"class":604}," event",[583,1428,722],{"class":600},[583,1430,1431],{"class":604},"context",[583,1433,722],{"class":600},[583,1435,1436],{"class":604},"user",[583,1438,1439],{"class":600},"?.",[583,1441,1403],{"class":604},[583,1443,731],{"class":600},[583,1445,1446],{"class":585,"line":764},[583,1447,1448],{"class":600},"    }\n",[583,1450,1451],{"class":585,"line":800},[583,1452,1453],{"class":600},"  }\n",[583,1455,1456,1458],{"class":585,"line":862},[583,1457,865],{"class":600},[583,1459,868],{"class":604},[568,1461,1463],{"id":1462},"_3-set-user-context","3. Set User Context",[573,1465,1467],{"className":575,"code":1466,"language":577,"meta":578,"style":578},"// server/plugins/auth.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('request', async (event) => {\n    const session = await getSession(event)\n\n    if (session) {\n      event.context.user = {\n        id: session.user.id,\n        email: session.user.email,\n        organizationId: session.activeOrganizationId,  // ← Current org\n      }\n    }\n  })\n})\n",[580,1468,1469,1474,1496,1535,1558,1562,1577,1594,1613,1633,1652,1657,1661,1667],{"__ignoreMap":578},[583,1470,1471],{"class":585,"line":586},[583,1472,1473],{"class":589},"// server/plugins/auth.ts\n",[583,1475,1476,1478,1480,1483,1485,1487,1490,1492,1494],{"class":585,"line":593},[583,1477,666],{"class":596},[583,1479,1355],{"class":596},[583,1481,1482],{"class":679}," defineNitroPlugin",[583,1484,682],{"class":604},[583,1486,682],{"class":600},[583,1488,1489],{"class":1193},"nitroApp",[583,1491,719],{"class":600},[583,1493,848],{"class":669},[583,1495,695],{"class":600},[583,1497,1498,1501,1503,1506,1508,1511,1513,1515,1518,1520,1522,1525,1527,1529,1531,1533],{"class":585,"line":635},[583,1499,1500],{"class":604},"  nitroApp",[583,1502,722],{"class":600},[583,1504,1505],{"class":604},"hooks",[583,1507,722],{"class":600},[583,1509,1510],{"class":679},"hook",[583,1512,682],{"class":701},[583,1514,685],{"class":600},[583,1516,1517],{"class":628},"request",[583,1519,685],{"class":600},[583,1521,608],{"class":600},[583,1523,1524],{"class":669}," async",[583,1526,1202],{"class":600},[583,1528,1419],{"class":1193},[583,1530,719],{"class":600},[583,1532,848],{"class":669},[583,1534,695],{"class":600},[583,1536,1537,1540,1543,1546,1549,1552,1554,1556],{"class":585,"line":656},[583,1538,1539],{"class":669},"    const",[583,1541,1542],{"class":604}," session",[583,1544,1545],{"class":600}," =",[583,1547,1548],{"class":596}," await",[583,1550,1551],{"class":679}," getSession",[583,1553,682],{"class":701},[583,1555,1419],{"class":604},[583,1557,868],{"class":701},[583,1559,1560],{"class":585,"line":663},[583,1561,660],{"emptyLinePlaceholder":659},[583,1563,1564,1567,1569,1572,1575],{"class":585,"line":698},[583,1565,1566],{"class":596},"    if",[583,1568,1202],{"class":701},[583,1570,1571],{"class":604},"session",[583,1573,1574],{"class":701},") ",[583,1576,1205],{"class":600},[583,1578,1579,1582,1584,1586,1588,1590,1592],{"class":585,"line":734},[583,1580,1581],{"class":604},"      event",[583,1583,722],{"class":600},[583,1585,1431],{"class":604},[583,1587,722],{"class":600},[583,1589,1436],{"class":604},[583,1591,1545],{"class":600},[583,1593,695],{"class":600},[583,1595,1596,1599,1601,1603,1605,1607,1609,1611],{"class":585,"line":764},[583,1597,1598],{"class":701},"        id",[583,1600,705],{"class":600},[583,1602,1542],{"class":604},[583,1604,722],{"class":600},[583,1606,1436],{"class":604},[583,1608,722],{"class":600},[583,1610,714],{"class":604},[583,1612,731],{"class":600},[583,1614,1615,1618,1620,1622,1624,1626,1628,1631],{"class":585,"line":800},[583,1616,1617],{"class":701},"        email",[583,1619,705],{"class":600},[583,1621,1542],{"class":604},[583,1623,722],{"class":600},[583,1625,1436],{"class":604},[583,1627,722],{"class":600},[583,1629,1630],{"class":604},"email",[583,1632,731],{"class":600},[583,1634,1635,1638,1640,1642,1644,1647,1649],{"class":585,"line":862},[583,1636,1637],{"class":701},"        organizationId",[583,1639,705],{"class":600},[583,1641,1542],{"class":604},[583,1643,722],{"class":600},[583,1645,1646],{"class":604},"activeOrganizationId",[583,1648,608],{"class":600},[583,1650,1651],{"class":589},"  // ← Current org\n",[583,1653,1654],{"class":585,"line":871},[583,1655,1656],{"class":600},"      }\n",[583,1658,1659],{"class":585,"line":876},[583,1660,1448],{"class":600},[583,1662,1663,1665],{"class":585,"line":903},[583,1664,1264],{"class":600},[583,1666,868],{"class":701},[583,1668,1669,1671],{"class":585,"line":946},[583,1670,865],{"class":600},[583,1672,868],{"class":604},[568,1674,1676],{"id":1675},"_4-done","4. Done!",[455,1678,1679],{},"All operations are now automatically scoped to the user's organization:",[573,1681,1685],{"className":1682,"code":1683,"language":1684,"meta":578,"style":578},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# User in Org A\nGET /api/posts\n# Returns only posts where organizationId = 'org_a'\n\nPOST /api/posts\n{ \"title\": \"New Post\", \"content\": \"...\" }\n# Automatically sets organizationId = 'org_a'\n","bash",[580,1686,1687,1692,1701,1706,1710,1717,1755],{"__ignoreMap":578},[583,1688,1689],{"class":585,"line":586},[583,1690,1691],{"class":589},"# User in Org A\n",[583,1693,1694,1698],{"class":585,"line":593},[583,1695,1697],{"class":1696},"sBMFI","GET",[583,1699,1700],{"class":628}," /api/posts\n",[583,1702,1703],{"class":585,"line":635},[583,1704,1705],{"class":589},"# Returns only posts where organizationId = 'org_a'\n",[583,1707,1708],{"class":585,"line":656},[583,1709,660],{"emptyLinePlaceholder":659},[583,1711,1712,1715],{"class":585,"line":663},[583,1713,1714],{"class":1696},"POST",[583,1716,1700],{"class":628},[583,1718,1719,1721,1724,1726,1729,1732,1735,1737,1739,1741,1743,1745,1747,1750,1752],{"class":585,"line":698},[583,1720,928],{"class":600},[583,1722,1723],{"class":1696}," \"title\"",[583,1725,705],{"class":679},[583,1727,1728],{"class":600}," \"",[583,1730,1731],{"class":628},"New Post",[583,1733,1734],{"class":600},"\"",[583,1736,608],{"class":628},[583,1738,1728],{"class":600},[583,1740,989],{"class":628},[583,1742,1734],{"class":600},[583,1744,705],{"class":628},[583,1746,1728],{"class":600},[583,1748,1749],{"class":628},"...",[583,1751,1734],{"class":600},[583,1753,1754],{"class":628}," }\n",[583,1756,1757],{"class":585,"line":734},[583,1758,1759],{"class":589},"# Automatically sets organizationId = 'org_a'\n",[501,1761],{},[459,1763,521],{"id":1764},"schema-design",[568,1766,1768],{"id":1767},"organization-member-pattern","Organization-Member Pattern",[455,1770,1771],{},"For users with different roles per organization, use a join table:",[573,1773,1775],{"className":575,"code":1774,"language":577,"meta":578,"style":578},"// Organizations\nexport const organizations = sqliteTable('organizations', {\n  id: text('id').primaryKey(),\n  name: text('name').notNull(),\n  slug: text('slug').notNull().unique(),\n  plan: text('plan', { enum: ['free', 'pro', 'enterprise'] }).default('free'),\n  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n})\n\n// Users (global, no org field)\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  email: text('email').notNull().unique(),\n  name: text('name'),\n  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n})\n\n// Organization Members (role per org)\nexport const organizationMembers = sqliteTable('organization_members', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  userId: integer('user_id')\n    .notNull()\n    .references(() => users.id, { onDelete: 'cascade' }),\n  organizationId: text('organization_id')\n    .notNull()\n    .references(() => organizations.id, { onDelete: 'cascade' }),\n  role: text('role', { enum: ['owner', 'admin', 'member', 'viewer'] })\n    .notNull()\n    .default('member'),\n  invitedAt: integer('invited_at', { mode: 'timestamp' }),\n  joinedAt: integer('joined_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n}, (table) => ({\n  // User can be member of org only once\n  uniqueUserOrg: unique().on(table.userId, table.organizationId),\n}))\n\n// Relations\nexport const organizationMembersRelations = relations(organizationMembers, ({ one }) => ({\n  user: one(users, {\n    fields: [organizationMembers.userId],\n    references: [users.id],\n  }),\n  organization: one(organizations, {\n    fields: [organizationMembers.organizationId],\n    references: [organizations.id],\n  }),\n}))\n\nexport const usersRelations = relations(users, ({ many }) => ({\n  memberships: many(organizationMembers),\n}))\n\nexport const organizationsRelations = relations(organizations, ({ many }) => ({\n  members: many(organizationMembers),\n  posts: many(posts),\n}))\n\n// Scoped Resources\nexport const posts = sqliteTable('posts', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  title: text('title').notNull(),\n  content: text('content'),\n  authorId: integer('author_id').notNull(),  // Not FK to prevent cascade\n  organizationId: text('organization_id')\n    .notNull()\n    .references(() => organizations.id, { onDelete: 'cascade' }),\n  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),\n})\n",[580,1776,1777,1782,1806,1832,1858,1890,1969,2021,2027,2031,2036,2062,2100,2133,2153,2205,2211,2215,2220,2246,2284,2302,2310,2349,2367,2375,2413,2481,2489,2507,2545,2599,2617,2623,2661,2668,2673,2679,2710,2725,2741,2756,2765,2780,2795,2810,2819,2826,2831,2862,2877,2884,2889,2919,2933,2948,2955,2960,2966,2991,3030,3057,3078,3110,3129,3138,3177,3230],{"__ignoreMap":578},[583,1778,1779],{"class":585,"line":586},[583,1780,1781],{"class":589},"// Organizations\n",[583,1783,1784,1786,1788,1790,1792,1794,1796,1798,1800,1802,1804],{"class":585,"line":593},[583,1785,666],{"class":596},[583,1787,670],{"class":669},[583,1789,673],{"class":604},[583,1791,676],{"class":600},[583,1793,605],{"class":679},[583,1795,682],{"class":604},[583,1797,685],{"class":600},[583,1799,688],{"class":628},[583,1801,685],{"class":600},[583,1803,608],{"class":600},[583,1805,695],{"class":600},[583,1807,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830],{"class":585,"line":635},[583,1809,702],{"class":701},[583,1811,705],{"class":600},[583,1813,611],{"class":679},[583,1815,682],{"class":604},[583,1817,685],{"class":600},[583,1819,714],{"class":628},[583,1821,685],{"class":600},[583,1823,719],{"class":604},[583,1825,722],{"class":600},[583,1827,725],{"class":679},[583,1829,728],{"class":604},[583,1831,731],{"class":600},[583,1833,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856],{"class":585,"line":656},[583,1835,737],{"class":701},[583,1837,705],{"class":600},[583,1839,611],{"class":679},[583,1841,682],{"class":604},[583,1843,685],{"class":600},[583,1845,748],{"class":628},[583,1847,685],{"class":600},[583,1849,719],{"class":604},[583,1851,722],{"class":600},[583,1853,757],{"class":679},[583,1855,728],{"class":604},[583,1857,731],{"class":600},[583,1859,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888],{"class":585,"line":663},[583,1861,767],{"class":701},[583,1863,705],{"class":600},[583,1865,611],{"class":679},[583,1867,682],{"class":604},[583,1869,685],{"class":600},[583,1871,778],{"class":628},[583,1873,685],{"class":600},[583,1875,719],{"class":604},[583,1877,722],{"class":600},[583,1879,757],{"class":679},[583,1881,728],{"class":604},[583,1883,722],{"class":600},[583,1885,793],{"class":679},[583,1887,728],{"class":604},[583,1889,731],{"class":600},[583,1891,1892,1895,1897,1899,1901,1903,1906,1908,1910,1912,1915,1917,1920,1922,1925,1927,1929,1931,1934,1936,1938,1940,1943,1945,1948,1950,1952,1954,1957,1959,1961,1963,1965,1967],{"class":585,"line":698},[583,1893,1894],{"class":701},"  plan",[583,1896,705],{"class":600},[583,1898,611],{"class":679},[583,1900,682],{"class":604},[583,1902,685],{"class":600},[583,1904,1905],{"class":628},"plan",[583,1907,685],{"class":600},[583,1909,608],{"class":600},[583,1911,601],{"class":600},[583,1913,1914],{"class":701}," enum",[583,1916,705],{"class":600},[583,1918,1919],{"class":604}," [",[583,1921,685],{"class":600},[583,1923,1924],{"class":628},"free",[583,1926,685],{"class":600},[583,1928,608],{"class":600},[583,1930,625],{"class":600},[583,1932,1933],{"class":628},"pro",[583,1935,685],{"class":600},[583,1937,608],{"class":600},[583,1939,625],{"class":600},[583,1941,1942],{"class":628},"enterprise",[583,1944,685],{"class":600},[583,1946,1947],{"class":604},"] ",[583,1949,865],{"class":600},[583,1951,719],{"class":604},[583,1953,722],{"class":600},[583,1955,1956],{"class":679},"default",[583,1958,682],{"class":604},[583,1960,685],{"class":600},[583,1962,1924],{"class":628},[583,1964,685],{"class":600},[583,1966,719],{"class":604},[583,1968,731],{"class":600},[583,1970,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019],{"class":585,"line":734},[583,1972,803],{"class":701},[583,1974,705],{"class":600},[583,1976,616],{"class":679},[583,1978,682],{"class":604},[583,1980,685],{"class":600},[583,1982,814],{"class":628},[583,1984,685],{"class":600},[583,1986,608],{"class":600},[583,1988,601],{"class":600},[583,1990,823],{"class":701},[583,1992,705],{"class":600},[583,1994,625],{"class":600},[583,1996,830],{"class":628},[583,1998,685],{"class":600},[583,2000,619],{"class":600},[583,2002,719],{"class":604},[583,2004,722],{"class":600},[583,2006,841],{"class":679},[583,2008,682],{"class":604},[583,2010,728],{"class":600},[583,2012,848],{"class":669},[583,2014,851],{"class":600},[583,2016,854],{"class":679},[583,2018,857],{"class":604},[583,2020,731],{"class":600},[583,2022,2023,2025],{"class":585,"line":764},[583,2024,865],{"class":600},[583,2026,868],{"class":604},[583,2028,2029],{"class":585,"line":800},[583,2030,660],{"emptyLinePlaceholder":659},[583,2032,2033],{"class":585,"line":862},[583,2034,2035],{"class":589},"// Users (global, no org field)\n",[583,2037,2038,2040,2042,2045,2047,2049,2051,2053,2056,2058,2060],{"class":585,"line":871},[583,2039,666],{"class":596},[583,2041,670],{"class":669},[583,2043,2044],{"class":604}," users ",[583,2046,676],{"class":600},[583,2048,605],{"class":679},[583,2050,682],{"class":604},[583,2052,685],{"class":600},[583,2054,2055],{"class":628},"users",[583,2057,685],{"class":600},[583,2059,608],{"class":600},[583,2061,695],{"class":600},[583,2063,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098],{"class":585,"line":876},[583,2065,702],{"class":701},[583,2067,705],{"class":600},[583,2069,616],{"class":679},[583,2071,682],{"class":604},[583,2073,685],{"class":600},[583,2075,714],{"class":628},[583,2077,685],{"class":600},[583,2079,719],{"class":604},[583,2081,722],{"class":600},[583,2083,725],{"class":679},[583,2085,682],{"class":604},[583,2087,928],{"class":600},[583,2089,931],{"class":701},[583,2091,705],{"class":600},[583,2093,937],{"class":936},[583,2095,619],{"class":600},[583,2097,719],{"class":604},[583,2099,731],{"class":600},[583,2101,2102,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131],{"class":585,"line":903},[583,2103,2104],{"class":701},"  email",[583,2106,705],{"class":600},[583,2108,611],{"class":679},[583,2110,682],{"class":604},[583,2112,685],{"class":600},[583,2114,1630],{"class":628},[583,2116,685],{"class":600},[583,2118,719],{"class":604},[583,2120,722],{"class":600},[583,2122,757],{"class":679},[583,2124,728],{"class":604},[583,2126,722],{"class":600},[583,2128,793],{"class":679},[583,2130,728],{"class":604},[583,2132,731],{"class":600},[583,2134,2135,2137,2139,2141,2143,2145,2147,2149,2151],{"class":585,"line":946},[583,2136,737],{"class":701},[583,2138,705],{"class":600},[583,2140,611],{"class":679},[583,2142,682],{"class":604},[583,2144,685],{"class":600},[583,2146,748],{"class":628},[583,2148,685],{"class":600},[583,2150,719],{"class":604},[583,2152,731],{"class":600},[583,2154,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203],{"class":585,"line":975},[583,2156,803],{"class":701},[583,2158,705],{"class":600},[583,2160,616],{"class":679},[583,2162,682],{"class":604},[583,2164,685],{"class":600},[583,2166,814],{"class":628},[583,2168,685],{"class":600},[583,2170,608],{"class":600},[583,2172,601],{"class":600},[583,2174,823],{"class":701},[583,2176,705],{"class":600},[583,2178,625],{"class":600},[583,2180,830],{"class":628},[583,2182,685],{"class":600},[583,2184,619],{"class":600},[583,2186,719],{"class":604},[583,2188,722],{"class":600},[583,2190,841],{"class":679},[583,2192,682],{"class":604},[583,2194,728],{"class":600},[583,2196,848],{"class":669},[583,2198,851],{"class":600},[583,2200,854],{"class":679},[583,2202,857],{"class":604},[583,2204,731],{"class":600},[583,2206,2207,2209],{"class":585,"line":998},[583,2208,865],{"class":600},[583,2210,868],{"class":604},[583,2212,2213],{"class":585,"line":1027},[583,2214,660],{"emptyLinePlaceholder":659},[583,2216,2217],{"class":585,"line":1052},[583,2218,2219],{"class":589},"// Organization Members (role per org)\n",[583,2221,2222,2224,2226,2229,2231,2233,2235,2237,2240,2242,2244],{"class":585,"line":1063},[583,2223,666],{"class":596},[583,2225,670],{"class":669},[583,2227,2228],{"class":604}," organizationMembers ",[583,2230,676],{"class":600},[583,2232,605],{"class":679},[583,2234,682],{"class":604},[583,2236,685],{"class":600},[583,2238,2239],{"class":628},"organization_members",[583,2241,685],{"class":600},[583,2243,608],{"class":600},[583,2245,695],{"class":600},[583,2247,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282],{"class":585,"line":1106},[583,2249,702],{"class":701},[583,2251,705],{"class":600},[583,2253,616],{"class":679},[583,2255,682],{"class":604},[583,2257,685],{"class":600},[583,2259,714],{"class":628},[583,2261,685],{"class":600},[583,2263,719],{"class":604},[583,2265,722],{"class":600},[583,2267,725],{"class":679},[583,2269,682],{"class":604},[583,2271,928],{"class":600},[583,2273,931],{"class":701},[583,2275,705],{"class":600},[583,2277,937],{"class":936},[583,2279,619],{"class":600},[583,2281,719],{"class":604},[583,2283,731],{"class":600},[583,2285,2286,2288,2290,2292,2294,2296,2298,2300],{"class":585,"line":1159},[583,2287,1001],{"class":701},[583,2289,705],{"class":600},[583,2291,616],{"class":679},[583,2293,682],{"class":604},[583,2295,685],{"class":600},[583,2297,1012],{"class":628},[583,2299,685],{"class":600},[583,2301,868],{"class":604},[583,2303,2304,2306,2308],{"class":585,"line":1166},[583,2305,1055],{"class":600},[583,2307,757],{"class":679},[583,2309,1060],{"class":604},[583,2311,2312,2314,2316,2318,2320,2322,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347],{"class":585,"line":1171},[583,2313,1055],{"class":600},[583,2315,1068],{"class":679},[583,2317,682],{"class":604},[583,2319,728],{"class":600},[583,2321,848],{"class":669},[583,2323,2324],{"class":604}," users",[583,2326,722],{"class":600},[583,2328,714],{"class":604},[583,2330,608],{"class":600},[583,2332,601],{"class":600},[583,2334,1088],{"class":701},[583,2336,705],{"class":600},[583,2338,625],{"class":600},[583,2340,1095],{"class":628},[583,2342,685],{"class":600},[583,2344,619],{"class":600},[583,2346,719],{"class":604},[583,2348,731],{"class":600},[583,2350,2351,2353,2355,2357,2359,2361,2363,2365],{"class":585,"line":1208},[583,2352,1030],{"class":701},[583,2354,705],{"class":600},[583,2356,611],{"class":679},[583,2358,682],{"class":604},[583,2360,685],{"class":600},[583,2362,1041],{"class":628},[583,2364,685],{"class":600},[583,2366,868],{"class":604},[583,2368,2369,2371,2373],{"class":585,"line":1225},[583,2370,1055],{"class":600},[583,2372,757],{"class":679},[583,2374,1060],{"class":604},[583,2376,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411],{"class":585,"line":1243},[583,2378,1055],{"class":600},[583,2380,1068],{"class":679},[583,2382,682],{"class":604},[583,2384,728],{"class":600},[583,2386,848],{"class":669},[583,2388,1077],{"class":604},[583,2390,722],{"class":600},[583,2392,714],{"class":604},[583,2394,608],{"class":600},[583,2396,601],{"class":600},[583,2398,1088],{"class":701},[583,2400,705],{"class":600},[583,2402,625],{"class":600},[583,2404,1095],{"class":628},[583,2406,685],{"class":600},[583,2408,619],{"class":600},[583,2410,719],{"class":604},[583,2412,731],{"class":600},[583,2414,2415,2418,2420,2422,2424,2426,2429,2431,2433,2435,2437,2439,2441,2443,2446,2448,2450,2452,2455,2457,2459,2461,2464,2466,2468,2470,2473,2475,2477,2479],{"class":585,"line":1261},[583,2416,2417],{"class":701},"  role",[583,2419,705],{"class":600},[583,2421,611],{"class":679},[583,2423,682],{"class":604},[583,2425,685],{"class":600},[583,2427,2428],{"class":628},"role",[583,2430,685],{"class":600},[583,2432,608],{"class":600},[583,2434,601],{"class":600},[583,2436,1914],{"class":701},[583,2438,705],{"class":600},[583,2440,1919],{"class":604},[583,2442,685],{"class":600},[583,2444,2445],{"class":628},"owner",[583,2447,685],{"class":600},[583,2449,608],{"class":600},[583,2451,625],{"class":600},[583,2453,2454],{"class":628},"admin",[583,2456,685],{"class":600},[583,2458,608],{"class":600},[583,2460,625],{"class":600},[583,2462,2463],{"class":628},"member",[583,2465,685],{"class":600},[583,2467,608],{"class":600},[583,2469,625],{"class":600},[583,2471,2472],{"class":628},"viewer",[583,2474,685],{"class":600},[583,2476,1947],{"class":604},[583,2478,865],{"class":600},[583,2480,868],{"class":604},[583,2482,2483,2485,2487],{"class":585,"line":1271},[583,2484,1055],{"class":600},[583,2486,757],{"class":679},[583,2488,1060],{"class":604},[583,2490,2491,2493,2495,2497,2499,2501,2503,2505],{"class":585,"line":1288},[583,2492,1055],{"class":600},[583,2494,1956],{"class":679},[583,2496,682],{"class":604},[583,2498,685],{"class":600},[583,2500,2463],{"class":628},[583,2502,685],{"class":600},[583,2504,719],{"class":604},[583,2506,731],{"class":600},[583,2508,2509,2512,2514,2516,2518,2520,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":585,"line":1304},[583,2510,2511],{"class":701},"  invitedAt",[583,2513,705],{"class":600},[583,2515,616],{"class":679},[583,2517,682],{"class":604},[583,2519,685],{"class":600},[583,2521,2522],{"class":628},"invited_at",[583,2524,685],{"class":600},[583,2526,608],{"class":600},[583,2528,601],{"class":600},[583,2530,823],{"class":701},[583,2532,705],{"class":600},[583,2534,625],{"class":600},[583,2536,830],{"class":628},[583,2538,685],{"class":600},[583,2540,619],{"class":600},[583,2542,719],{"class":604},[583,2544,731],{"class":600},[583,2546,2547,2550,2552,2554,2556,2558,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597],{"class":585,"line":1320},[583,2548,2549],{"class":701},"  joinedAt",[583,2551,705],{"class":600},[583,2553,616],{"class":679},[583,2555,682],{"class":604},[583,2557,685],{"class":600},[583,2559,2560],{"class":628},"joined_at",[583,2562,685],{"class":600},[583,2564,608],{"class":600},[583,2566,601],{"class":600},[583,2568,823],{"class":701},[583,2570,705],{"class":600},[583,2572,625],{"class":600},[583,2574,830],{"class":628},[583,2576,685],{"class":600},[583,2578,619],{"class":600},[583,2580,719],{"class":604},[583,2582,722],{"class":600},[583,2584,841],{"class":679},[583,2586,682],{"class":604},[583,2588,728],{"class":600},[583,2590,848],{"class":669},[583,2592,851],{"class":600},[583,2594,854],{"class":679},[583,2596,857],{"class":604},[583,2598,731],{"class":600},[583,2600,2601,2604,2606,2609,2611,2613,2615],{"class":585,"line":1329},[583,2602,2603],{"class":600},"},",[583,2605,1202],{"class":600},[583,2607,2608],{"class":1193},"table",[583,2610,719],{"class":600},[583,2612,848],{"class":669},[583,2614,1202],{"class":604},[583,2616,1205],{"class":600},[583,2618,2620],{"class":585,"line":2619},33,[583,2621,2622],{"class":589},"  // User can be member of org only once\n",[583,2624,2626,2629,2631,2634,2636,2638,2641,2644,2646,2649,2651,2654,2656,2659],{"class":585,"line":2625},34,[583,2627,2628],{"class":701},"  uniqueUserOrg",[583,2630,705],{"class":600},[583,2632,2633],{"class":679}," unique",[583,2635,728],{"class":604},[583,2637,722],{"class":600},[583,2639,2640],{"class":679},"on",[583,2642,2643],{"class":604},"(table",[583,2645,722],{"class":600},[583,2647,2648],{"class":604},"userId",[583,2650,608],{"class":600},[583,2652,2653],{"class":604}," table",[583,2655,722],{"class":600},[583,2657,2658],{"class":604},"organizationId)",[583,2660,731],{"class":600},[583,2662,2664,2666],{"class":585,"line":2663},35,[583,2665,865],{"class":600},[583,2667,1334],{"class":604},[583,2669,2671],{"class":585,"line":2670},36,[583,2672,660],{"emptyLinePlaceholder":659},[583,2674,2676],{"class":585,"line":2675},37,[583,2677,2678],{"class":589},"// Relations\n",[583,2680,2682,2684,2686,2689,2691,2693,2696,2698,2700,2702,2704,2706,2708],{"class":585,"line":2681},38,[583,2683,666],{"class":596},[583,2685,670],{"class":669},[583,2687,2688],{"class":604}," organizationMembersRelations ",[583,2690,676],{"class":600},[583,2692,642],{"class":679},[583,2694,2695],{"class":604},"(organizationMembers",[583,2697,608],{"class":600},[583,2699,1190],{"class":600},[583,2701,1194],{"class":1193},[583,2703,1197],{"class":600},[583,2705,848],{"class":669},[583,2707,1202],{"class":604},[583,2709,1205],{"class":600},[583,2711,2713,2715,2717,2719,2721,2723],{"class":585,"line":2712},39,[583,2714,1274],{"class":701},[583,2716,705],{"class":600},[583,2718,1194],{"class":679},[583,2720,1281],{"class":604},[583,2722,608],{"class":600},[583,2724,695],{"class":600},[583,2726,2728,2730,2732,2735,2737,2739],{"class":585,"line":2727},40,[583,2729,1228],{"class":701},[583,2731,705],{"class":600},[583,2733,2734],{"class":604}," [organizationMembers",[583,2736,722],{"class":600},[583,2738,1299],{"class":604},[583,2740,731],{"class":600},[583,2742,2744,2746,2748,2750,2752,2754],{"class":585,"line":2743},41,[583,2745,1246],{"class":701},[583,2747,705],{"class":600},[583,2749,1311],{"class":604},[583,2751,722],{"class":600},[583,2753,1256],{"class":604},[583,2755,731],{"class":600},[583,2757,2759,2761,2763],{"class":585,"line":2758},42,[583,2760,1264],{"class":600},[583,2762,719],{"class":604},[583,2764,731],{"class":600},[583,2766,2768,2770,2772,2774,2776,2778],{"class":585,"line":2767},43,[583,2769,1211],{"class":701},[583,2771,705],{"class":600},[583,2773,1194],{"class":679},[583,2775,1218],{"class":604},[583,2777,608],{"class":600},[583,2779,695],{"class":600},[583,2781,2783,2785,2787,2789,2791,2793],{"class":585,"line":2782},44,[583,2784,1228],{"class":701},[583,2786,705],{"class":600},[583,2788,2734],{"class":604},[583,2790,722],{"class":600},[583,2792,1238],{"class":604},[583,2794,731],{"class":600},[583,2796,2798,2800,2802,2804,2806,2808],{"class":585,"line":2797},45,[583,2799,1246],{"class":701},[583,2801,705],{"class":600},[583,2803,1251],{"class":604},[583,2805,722],{"class":600},[583,2807,1256],{"class":604},[583,2809,731],{"class":600},[583,2811,2813,2815,2817],{"class":585,"line":2812},46,[583,2814,1264],{"class":600},[583,2816,719],{"class":604},[583,2818,731],{"class":600},[583,2820,2822,2824],{"class":585,"line":2821},47,[583,2823,865],{"class":600},[583,2825,1334],{"class":604},[583,2827,2829],{"class":585,"line":2828},48,[583,2830,660],{"emptyLinePlaceholder":659},[583,2832,2834,2836,2838,2841,2843,2845,2847,2849,2851,2854,2856,2858,2860],{"class":585,"line":2833},49,[583,2835,666],{"class":596},[583,2837,670],{"class":669},[583,2839,2840],{"class":604}," usersRelations ",[583,2842,676],{"class":600},[583,2844,642],{"class":679},[583,2846,1281],{"class":604},[583,2848,608],{"class":600},[583,2850,1190],{"class":600},[583,2852,2853],{"class":1193}," many",[583,2855,1197],{"class":600},[583,2857,848],{"class":669},[583,2859,1202],{"class":604},[583,2861,1205],{"class":600},[583,2863,2865,2868,2870,2872,2875],{"class":585,"line":2864},50,[583,2866,2867],{"class":701},"  memberships",[583,2869,705],{"class":600},[583,2871,2853],{"class":679},[583,2873,2874],{"class":604},"(organizationMembers)",[583,2876,731],{"class":600},[583,2878,2880,2882],{"class":585,"line":2879},51,[583,2881,865],{"class":600},[583,2883,1334],{"class":604},[583,2885,2887],{"class":585,"line":2886},52,[583,2888,660],{"emptyLinePlaceholder":659},[583,2890,2892,2894,2896,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917],{"class":585,"line":2891},53,[583,2893,666],{"class":596},[583,2895,670],{"class":669},[583,2897,2898],{"class":604}," organizationsRelations ",[583,2900,676],{"class":600},[583,2902,642],{"class":679},[583,2904,1218],{"class":604},[583,2906,608],{"class":600},[583,2908,1190],{"class":600},[583,2910,2853],{"class":1193},[583,2912,1197],{"class":600},[583,2914,848],{"class":669},[583,2916,1202],{"class":604},[583,2918,1205],{"class":600},[583,2920,2922,2925,2927,2929,2931],{"class":585,"line":2921},54,[583,2923,2924],{"class":701},"  members",[583,2926,705],{"class":600},[583,2928,2853],{"class":679},[583,2930,2874],{"class":604},[583,2932,731],{"class":600},[583,2934,2936,2939,2941,2943,2946],{"class":585,"line":2935},55,[583,2937,2938],{"class":701},"  posts",[583,2940,705],{"class":600},[583,2942,2853],{"class":679},[583,2944,2945],{"class":604},"(posts)",[583,2947,731],{"class":600},[583,2949,2951,2953],{"class":585,"line":2950},56,[583,2952,865],{"class":600},[583,2954,1334],{"class":604},[583,2956,2958],{"class":585,"line":2957},57,[583,2959,660],{"emptyLinePlaceholder":659},[583,2961,2963],{"class":585,"line":2962},58,[583,2964,2965],{"class":589},"// Scoped Resources\n",[583,2967,2969,2971,2973,2975,2977,2979,2981,2983,2985,2987,2989],{"class":585,"line":2968},59,[583,2970,666],{"class":596},[583,2972,670],{"class":669},[583,2974,883],{"class":604},[583,2976,676],{"class":600},[583,2978,605],{"class":679},[583,2980,682],{"class":604},[583,2982,685],{"class":600},[583,2984,894],{"class":628},[583,2986,685],{"class":600},[583,2988,608],{"class":600},[583,2990,695],{"class":600},[583,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028],{"class":585,"line":2993},60,[583,2995,702],{"class":701},[583,2997,705],{"class":600},[583,2999,616],{"class":679},[583,3001,682],{"class":604},[583,3003,685],{"class":600},[583,3005,714],{"class":628},[583,3007,685],{"class":600},[583,3009,719],{"class":604},[583,3011,722],{"class":600},[583,3013,725],{"class":679},[583,3015,682],{"class":604},[583,3017,928],{"class":600},[583,3019,931],{"class":701},[583,3021,705],{"class":600},[583,3023,937],{"class":936},[583,3025,619],{"class":600},[583,3027,719],{"class":604},[583,3029,731],{"class":600},[583,3031,3033,3035,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055],{"class":585,"line":3032},61,[583,3034,949],{"class":701},[583,3036,705],{"class":600},[583,3038,611],{"class":679},[583,3040,682],{"class":604},[583,3042,685],{"class":600},[583,3044,960],{"class":628},[583,3046,685],{"class":600},[583,3048,719],{"class":604},[583,3050,722],{"class":600},[583,3052,757],{"class":679},[583,3054,728],{"class":604},[583,3056,731],{"class":600},[583,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076],{"class":585,"line":3059},62,[583,3061,978],{"class":701},[583,3063,705],{"class":600},[583,3065,611],{"class":679},[583,3067,682],{"class":604},[583,3069,685],{"class":600},[583,3071,989],{"class":628},[583,3073,685],{"class":600},[583,3075,719],{"class":604},[583,3077,731],{"class":600},[583,3079,3081,3084,3086,3088,3090,3092,3095,3097,3099,3101,3103,3105,3107],{"class":585,"line":3080},63,[583,3082,3083],{"class":701},"  authorId",[583,3085,705],{"class":600},[583,3087,616],{"class":679},[583,3089,682],{"class":604},[583,3091,685],{"class":600},[583,3093,3094],{"class":628},"author_id",[583,3096,685],{"class":600},[583,3098,719],{"class":604},[583,3100,722],{"class":600},[583,3102,757],{"class":679},[583,3104,728],{"class":604},[583,3106,608],{"class":600},[583,3108,3109],{"class":589},"  // Not FK to prevent cascade\n",[583,3111,3113,3115,3117,3119,3121,3123,3125,3127],{"class":585,"line":3112},64,[583,3114,1030],{"class":701},[583,3116,705],{"class":600},[583,3118,611],{"class":679},[583,3120,682],{"class":604},[583,3122,685],{"class":600},[583,3124,1041],{"class":628},[583,3126,685],{"class":600},[583,3128,868],{"class":604},[583,3130,3132,3134,3136],{"class":585,"line":3131},65,[583,3133,1055],{"class":600},[583,3135,757],{"class":679},[583,3137,1060],{"class":604},[583,3139,3141,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175],{"class":585,"line":3140},66,[583,3142,1055],{"class":600},[583,3144,1068],{"class":679},[583,3146,682],{"class":604},[583,3148,728],{"class":600},[583,3150,848],{"class":669},[583,3152,1077],{"class":604},[583,3154,722],{"class":600},[583,3156,714],{"class":604},[583,3158,608],{"class":600},[583,3160,601],{"class":600},[583,3162,1088],{"class":701},[583,3164,705],{"class":600},[583,3166,625],{"class":600},[583,3168,1095],{"class":628},[583,3170,685],{"class":600},[583,3172,619],{"class":600},[583,3174,719],{"class":604},[583,3176,731],{"class":600},[583,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228],{"class":585,"line":3179},67,[583,3181,803],{"class":701},[583,3183,705],{"class":600},[583,3185,616],{"class":679},[583,3187,682],{"class":604},[583,3189,685],{"class":600},[583,3191,814],{"class":628},[583,3193,685],{"class":600},[583,3195,608],{"class":600},[583,3197,601],{"class":600},[583,3199,823],{"class":701},[583,3201,705],{"class":600},[583,3203,625],{"class":600},[583,3205,830],{"class":628},[583,3207,685],{"class":600},[583,3209,619],{"class":600},[583,3211,719],{"class":604},[583,3213,722],{"class":600},[583,3215,841],{"class":679},[583,3217,682],{"class":604},[583,3219,728],{"class":600},[583,3221,848],{"class":669},[583,3223,851],{"class":600},[583,3225,854],{"class":679},[583,3227,857],{"class":604},[583,3229,731],{"class":600},[583,3231,3233,3235],{"class":585,"line":3232},68,[583,3234,865],{"class":600},[583,3236,868],{"class":604},[568,3238,3240],{"id":3239},"why-this-pattern","Why This Pattern?",[455,3242,3243,3244,3247,3248,3251,3252,3255,3256,3258,3259,3255,3262,3264,3265,3251,3267,3270],{},"✅ ",[472,3245,3246],{},"User belongs to multiple organizations"," - via ",[580,3249,3250],{},"organizationMembers","\n✅ ",[472,3253,3254],{},"Different role per organization"," - ",[580,3257,2428],{}," field on membership\n✅ ",[472,3260,3261],{},"Resources scoped to organization",[580,3263,1403],{}," on ",[580,3266,894],{},[472,3268,3269],{},"Clean user switching"," - Change active organization without re-auth",[501,3272],{},[459,3274,527],{"id":3275},"configuration",[568,3277,3279],{"id":3278},"basic-configuration","Basic Configuration",[573,3281,3283],{"className":575,"code":3282,"language":577,"meta":578,"style":578},"export default defineNuxtConfig({\n  autoApi: {\n    multiTenancy: {\n      enabled: true,\n      tenantIdField: 'organizationId',  // Field name in tables\n      scopedResources: '*',              // All resources (default)\n      excludedResources: [],             // Global resources\n      requireTenant: true,               // Require tenant for all ops\n      getTenantId: (event) => {\n        return event.context.user?.organizationId\n      },\n      allowCrossTenantAccess: (user) => {\n        return user?.role === 'superadmin'\n      },\n    }\n  }\n})\n",[580,3284,3285,3297,3305,3313,3323,3340,3359,3374,3388,3404,3424,3429,3446,3467,3471,3475,3479],{"__ignoreMap":578},[583,3286,3287,3289,3291,3293,3295],{"class":585,"line":586},[583,3288,666],{"class":596},[583,3290,1355],{"class":596},[583,3292,1358],{"class":679},[583,3294,682],{"class":604},[583,3296,1205],{"class":600},[583,3298,3299,3301,3303],{"class":585,"line":593},[583,3300,1367],{"class":701},[583,3302,705],{"class":600},[583,3304,695],{"class":600},[583,3306,3307,3309,3311],{"class":585,"line":635},[583,3308,1376],{"class":701},[583,3310,705],{"class":600},[583,3312,695],{"class":600},[583,3314,3315,3317,3319,3321],{"class":585,"line":656},[583,3316,1385],{"class":701},[583,3318,705],{"class":600},[583,3320,937],{"class":936},[583,3322,731],{"class":600},[583,3324,3325,3327,3329,3331,3333,3335,3337],{"class":585,"line":663},[583,3326,1396],{"class":701},[583,3328,705],{"class":600},[583,3330,625],{"class":600},[583,3332,1403],{"class":628},[583,3334,685],{"class":600},[583,3336,608],{"class":600},[583,3338,3339],{"class":589},"  // Field name in tables\n",[583,3341,3342,3345,3347,3349,3352,3354,3356],{"class":585,"line":698},[583,3343,3344],{"class":701},"      scopedResources",[583,3346,705],{"class":600},[583,3348,625],{"class":600},[583,3350,3351],{"class":628},"*",[583,3353,685],{"class":600},[583,3355,608],{"class":600},[583,3357,3358],{"class":589},"              // All resources (default)\n",[583,3360,3361,3364,3366,3369,3371],{"class":585,"line":734},[583,3362,3363],{"class":701},"      excludedResources",[583,3365,705],{"class":600},[583,3367,3368],{"class":604}," []",[583,3370,608],{"class":600},[583,3372,3373],{"class":589},"             // Global resources\n",[583,3375,3376,3379,3381,3383,3385],{"class":585,"line":764},[583,3377,3378],{"class":701},"      requireTenant",[583,3380,705],{"class":600},[583,3382,937],{"class":936},[583,3384,608],{"class":600},[583,3386,3387],{"class":589},"               // Require tenant for all ops\n",[583,3389,3390,3392,3394,3396,3398,3400,3402],{"class":585,"line":800},[583,3391,1412],{"class":679},[583,3393,705],{"class":600},[583,3395,1202],{"class":600},[583,3397,1419],{"class":1193},[583,3399,719],{"class":600},[583,3401,848],{"class":669},[583,3403,695],{"class":600},[583,3405,3406,3409,3411,3413,3415,3417,3419,3421],{"class":585,"line":862},[583,3407,3408],{"class":596},"        return",[583,3410,1426],{"class":604},[583,3412,722],{"class":600},[583,3414,1431],{"class":604},[583,3416,722],{"class":600},[583,3418,1436],{"class":604},[583,3420,1439],{"class":600},[583,3422,3423],{"class":604},"organizationId\n",[583,3425,3426],{"class":585,"line":871},[583,3427,3428],{"class":600},"      },\n",[583,3430,3431,3434,3436,3438,3440,3442,3444],{"class":585,"line":876},[583,3432,3433],{"class":679},"      allowCrossTenantAccess",[583,3435,705],{"class":600},[583,3437,1202],{"class":600},[583,3439,1436],{"class":1193},[583,3441,719],{"class":600},[583,3443,848],{"class":669},[583,3445,695],{"class":600},[583,3447,3448,3450,3453,3455,3457,3460,3462,3465],{"class":585,"line":903},[583,3449,3408],{"class":596},[583,3451,3452],{"class":604}," user",[583,3454,1439],{"class":600},[583,3456,2428],{"class":604},[583,3458,3459],{"class":600}," ===",[583,3461,625],{"class":600},[583,3463,3464],{"class":628},"superadmin",[583,3466,632],{"class":600},[583,3468,3469],{"class":585,"line":946},[583,3470,3428],{"class":600},[583,3472,3473],{"class":585,"line":975},[583,3474,1448],{"class":600},[583,3476,3477],{"class":585,"line":998},[583,3478,1453],{"class":600},[583,3480,3481,3483],{"class":585,"line":1027},[583,3482,865],{"class":600},[583,3484,868],{"class":604},[568,3486,3488],{"id":3487},"configuration-reference","Configuration Reference",[2608,3490,3491,3510],{},[3492,3493,3494],"thead",{},[3495,3496,3497,3501,3504,3507],"tr",{},[3498,3499,3500],"th",{},"Property",[3498,3502,3503],{},"Type",[3498,3505,3506],{},"Default",[3498,3508,3509],{},"Description",[3511,3512,3513,3534,3554,3577,3596,3615,3633],"tbody",{},[3495,3514,3515,3521,3526,3531],{},[3516,3517,3518],"td",{},[580,3519,3520],{},"enabled",[3516,3522,3523],{},[580,3524,3525],{},"boolean",[3516,3527,3528],{},[580,3529,3530],{},"false",[3516,3532,3533],{},"Enable multi-tenancy",[3495,3535,3536,3541,3546,3551],{},[3516,3537,3538],{},[580,3539,3540],{},"tenantIdField",[3516,3542,3543],{},[580,3544,3545],{},"string",[3516,3547,3548],{},[580,3549,3550],{},"'organizationId'",[3516,3552,3553],{},"Column name for tenant ID",[3495,3555,3556,3561,3570,3574],{},[3516,3557,3558],{},[580,3559,3560],{},"scopedResources",[3516,3562,3563,3566,3567],{},[580,3564,3565],{},"'*'"," | ",[580,3568,3569],{},"string[]",[3516,3571,3572],{},[580,3573,3565],{},[3516,3575,3576],{},"Which resources to scope",[3495,3578,3579,3584,3588,3593],{},[3516,3580,3581],{},[580,3582,3583],{},"excludedResources",[3516,3585,3586],{},[580,3587,3569],{},[3516,3589,3590],{},[580,3591,3592],{},"[]",[3516,3594,3595],{},"Global resources (not scoped)",[3495,3597,3598,3603,3607,3612],{},[3516,3599,3600],{},[580,3601,3602],{},"requireTenant",[3516,3604,3605],{},[580,3606,3525],{},[3516,3608,3609],{},[580,3610,3611],{},"true",[3516,3613,3614],{},"Require tenant for all operations",[3495,3616,3617,3622,3627,3630],{},[3516,3618,3619],{},[580,3620,3621],{},"getTenantId",[3516,3623,3624],{},[580,3625,3626],{},"function",[3516,3628,3629],{},"-",[3516,3631,3632],{},"Extract tenant ID from request",[3495,3634,3635,3640,3644,3646],{},[3516,3636,3637],{},[580,3638,3639],{},"allowCrossTenantAccess",[3516,3641,3642],{},[580,3643,3626],{},[3516,3645,3629],{},[3516,3647,3648],{},"Check if user can access all orgs",[568,3650,3652],{"id":3651},"scoped-vs-global-resources","Scoped vs Global Resources",[573,3654,3656],{"className":575,"code":3655,"language":577,"meta":578,"style":578},"multiTenancy: {\n  enabled: true,\n\n  // All resources except these are scoped\n  excludedResources: [\n    'users',        // Global user table\n    'countries',    // Shared reference data\n    'timezones',    // Shared reference data\n  ],\n\n  // Only these resources are scoped\n  scopedResources: [\n    'posts',\n    'comments',\n    'projects',\n  ],\n}\n",[580,3657,3658,3667,3678,3682,3687,3697,3711,3725,3738,3745,3749,3754,3763,3773,3784,3795,3801],{"__ignoreMap":578},[583,3659,3660,3663,3665],{"class":585,"line":586},[583,3661,3662],{"class":1696},"multiTenancy",[583,3664,705],{"class":600},[583,3666,695],{"class":600},[583,3668,3669,3672,3674,3676],{"class":585,"line":593},[583,3670,3671],{"class":1696},"  enabled",[583,3673,705],{"class":600},[583,3675,937],{"class":936},[583,3677,731],{"class":600},[583,3679,3680],{"class":585,"line":635},[583,3681,660],{"emptyLinePlaceholder":659},[583,3683,3684],{"class":585,"line":656},[583,3685,3686],{"class":589},"  // All resources except these are scoped\n",[583,3688,3689,3692,3694],{"class":585,"line":663},[583,3690,3691],{"class":1696},"  excludedResources",[583,3693,705],{"class":600},[583,3695,3696],{"class":701}," [\n",[583,3698,3699,3702,3704,3706,3708],{"class":585,"line":698},[583,3700,3701],{"class":600},"    '",[583,3703,2055],{"class":628},[583,3705,685],{"class":600},[583,3707,608],{"class":600},[583,3709,3710],{"class":589},"        // Global user table\n",[583,3712,3713,3715,3718,3720,3722],{"class":585,"line":734},[583,3714,3701],{"class":600},[583,3716,3717],{"class":628},"countries",[583,3719,685],{"class":600},[583,3721,608],{"class":600},[583,3723,3724],{"class":589},"    // Shared reference data\n",[583,3726,3727,3729,3732,3734,3736],{"class":585,"line":764},[583,3728,3701],{"class":600},[583,3730,3731],{"class":628},"timezones",[583,3733,685],{"class":600},[583,3735,608],{"class":600},[583,3737,3724],{"class":589},[583,3739,3740,3743],{"class":585,"line":800},[583,3741,3742],{"class":701},"  ]",[583,3744,731],{"class":600},[583,3746,3747],{"class":585,"line":862},[583,3748,660],{"emptyLinePlaceholder":659},[583,3750,3751],{"class":585,"line":871},[583,3752,3753],{"class":589},"  // Only these resources are scoped\n",[583,3755,3756,3759,3761],{"class":585,"line":876},[583,3757,3758],{"class":1696},"  scopedResources",[583,3760,705],{"class":600},[583,3762,3696],{"class":701},[583,3764,3765,3767,3769,3771],{"class":585,"line":903},[583,3766,3701],{"class":600},[583,3768,894],{"class":628},[583,3770,685],{"class":600},[583,3772,731],{"class":600},[583,3774,3775,3777,3780,3782],{"class":585,"line":946},[583,3776,3701],{"class":600},[583,3778,3779],{"class":628},"comments",[583,3781,685],{"class":600},[583,3783,731],{"class":600},[583,3785,3786,3788,3791,3793],{"class":585,"line":975},[583,3787,3701],{"class":600},[583,3789,3790],{"class":628},"projects",[583,3792,685],{"class":600},[583,3794,731],{"class":600},[583,3796,3797,3799],{"class":585,"line":998},[583,3798,3742],{"class":701},[583,3800,731],{"class":600},[583,3802,3803],{"class":585,"line":1027},[583,3804,3805],{"class":600},"}\n",[501,3807],{},[459,3809,533],{"id":3810},"organization-member-permissions",[568,3812,3814],{"id":3813},"permission-helpers","Permission Helpers",[455,3816,3817],{},"Create helpers to check organization membership and role:",[573,3819,3821],{"className":575,"code":3820,"language":577,"meta":578,"style":578},"// server/utils/orgPermissions.ts\nimport type { H3Event } from 'h3'\nimport { db } from '../database/db'\nimport { organizationMembers } from '../database/schema'\nimport { and, eq } from 'drizzle-orm'\n\nexport type OrgRole = 'owner' | 'admin' | 'member' | 'viewer'\n\nexport async function getOrgMembership(\n  userId: number,\n  organizationId: string\n): Promise\u003COrgRole | null> {\n  const membership = await db.query.organizationMembers.findFirst({\n    where: and(\n      eq(organizationMembers.userId, userId),\n      eq(organizationMembers.organizationId, organizationId)\n    ),\n  })\n\n  return membership?.role ?? null\n}\n\nexport async function hasOrgRole(\n  userId: number,\n  organizationId: string,\n  requiredRoles: OrgRole | OrgRole[]\n): Promise\u003Cboolean> {\n  const role = await getOrgMembership(userId, organizationId)\n  if (!role) return false\n\n  const roles = Array.isArray(requiredRoles) ? requiredRoles : [requiredRoles]\n  return roles.includes(role)\n}\n\nexport async function isOrgOwner(userId: number, organizationId: string): Promise\u003Cboolean> {\n  return hasOrgRole(userId, organizationId, 'owner')\n}\n\nexport async function isOrgAdmin(userId: number, organizationId: string): Promise\u003Cboolean> {\n  return hasOrgRole(userId, organizationId, ['owner', 'admin'])\n}\n\n// Role hierarchy check\nconst roleHierarchy: Record\u003COrgRole, number> = {\n  owner: 4,\n  admin: 3,\n  member: 2,\n  viewer: 1,\n}\n\nexport async function hasMinimumRole(\n  userId: number,\n  organizationId: string,\n  minimumRole: OrgRole\n): Promise\u003Cboolean> {\n  const userRole = await getOrgMembership(userId, organizationId)\n  if (!userRole) return false\n\n  return roleHierarchy[userRole] >= roleHierarchy[minimumRole]\n}\n",[580,3822,3823,3828,3850,3870,3890,3914,3918,3960,3964,3979,3990,3999,4023,4055,4066,4088,4107,4114,4120,4124,4141,4145,4149,4162,4172,4183,4199,4213,4236,4256,4260,4300,4317,4321,4325,4364,4388,4392,4396,4435,4470,4474,4478,4483,4510,4523,4535,4547,4559,4563,4567,4580,4590,4600,4610,4624,4647,4664,4668,4693],{"__ignoreMap":578},[583,3824,3825],{"class":585,"line":586},[583,3826,3827],{"class":589},"// server/utils/orgPermissions.ts\n",[583,3829,3830,3832,3835,3837,3840,3842,3844,3846,3848],{"class":585,"line":593},[583,3831,597],{"class":596},[583,3833,3834],{"class":596}," type",[583,3836,601],{"class":600},[583,3838,3839],{"class":604}," H3Event",[583,3841,619],{"class":600},[583,3843,622],{"class":596},[583,3845,625],{"class":600},[583,3847,568],{"class":628},[583,3849,632],{"class":600},[583,3851,3852,3854,3856,3859,3861,3863,3865,3868],{"class":585,"line":635},[583,3853,597],{"class":596},[583,3855,601],{"class":600},[583,3857,3858],{"class":604}," db",[583,3860,619],{"class":600},[583,3862,622],{"class":596},[583,3864,625],{"class":600},[583,3866,3867],{"class":628},"../database/db",[583,3869,632],{"class":600},[583,3871,3872,3874,3876,3879,3881,3883,3885,3888],{"class":585,"line":656},[583,3873,597],{"class":596},[583,3875,601],{"class":600},[583,3877,3878],{"class":604}," organizationMembers",[583,3880,619],{"class":600},[583,3882,622],{"class":596},[583,3884,625],{"class":600},[583,3886,3887],{"class":628},"../database/schema",[583,3889,632],{"class":600},[583,3891,3892,3894,3896,3899,3901,3904,3906,3908,3910,3912],{"class":585,"line":663},[583,3893,597],{"class":596},[583,3895,601],{"class":600},[583,3897,3898],{"class":604}," and",[583,3900,608],{"class":600},[583,3902,3903],{"class":604}," eq",[583,3905,619],{"class":600},[583,3907,622],{"class":596},[583,3909,625],{"class":600},[583,3911,651],{"class":628},[583,3913,632],{"class":600},[583,3915,3916],{"class":585,"line":698},[583,3917,660],{"emptyLinePlaceholder":659},[583,3919,3920,3922,3924,3927,3929,3931,3933,3935,3938,3940,3942,3944,3946,3948,3950,3952,3954,3956,3958],{"class":585,"line":734},[583,3921,666],{"class":596},[583,3923,3834],{"class":669},[583,3925,3926],{"class":1696}," OrgRole",[583,3928,1545],{"class":600},[583,3930,625],{"class":600},[583,3932,2445],{"class":628},[583,3934,685],{"class":600},[583,3936,3937],{"class":600}," |",[583,3939,625],{"class":600},[583,3941,2454],{"class":628},[583,3943,685],{"class":600},[583,3945,3937],{"class":600},[583,3947,625],{"class":600},[583,3949,2463],{"class":628},[583,3951,685],{"class":600},[583,3953,3937],{"class":600},[583,3955,625],{"class":600},[583,3957,2472],{"class":628},[583,3959,632],{"class":600},[583,3961,3962],{"class":585,"line":764},[583,3963,660],{"emptyLinePlaceholder":659},[583,3965,3966,3968,3970,3973,3976],{"class":585,"line":800},[583,3967,666],{"class":596},[583,3969,1524],{"class":669},[583,3971,3972],{"class":669}," function",[583,3974,3975],{"class":679}," getOrgMembership",[583,3977,3978],{"class":600},"(\n",[583,3980,3981,3983,3985,3988],{"class":585,"line":862},[583,3982,1001],{"class":1193},[583,3984,705],{"class":600},[583,3986,3987],{"class":1696}," number",[583,3989,731],{"class":600},[583,3991,3992,3994,3996],{"class":585,"line":871},[583,3993,1030],{"class":1193},[583,3995,705],{"class":600},[583,3997,3998],{"class":1696}," string\n",[583,4000,4001,4004,4007,4010,4013,4015,4018,4021],{"class":585,"line":876},[583,4002,4003],{"class":600},"):",[583,4005,4006],{"class":1696}," Promise",[583,4008,4009],{"class":600},"\u003C",[583,4011,4012],{"class":1696},"OrgRole",[583,4014,3937],{"class":600},[583,4016,4017],{"class":1696}," null",[583,4019,4020],{"class":600},">",[583,4022,695],{"class":600},[583,4024,4025,4028,4031,4033,4035,4037,4039,4042,4044,4046,4048,4051,4053],{"class":585,"line":903},[583,4026,4027],{"class":669},"  const",[583,4029,4030],{"class":604}," membership",[583,4032,1545],{"class":600},[583,4034,1548],{"class":596},[583,4036,3858],{"class":604},[583,4038,722],{"class":600},[583,4040,4041],{"class":604},"query",[583,4043,722],{"class":600},[583,4045,3250],{"class":604},[583,4047,722],{"class":600},[583,4049,4050],{"class":679},"findFirst",[583,4052,682],{"class":701},[583,4054,1205],{"class":600},[583,4056,4057,4060,4062,4064],{"class":585,"line":946},[583,4058,4059],{"class":701},"    where",[583,4061,705],{"class":600},[583,4063,3898],{"class":679},[583,4065,3978],{"class":701},[583,4067,4068,4071,4073,4075,4077,4079,4081,4084,4086],{"class":585,"line":975},[583,4069,4070],{"class":679},"      eq",[583,4072,682],{"class":701},[583,4074,3250],{"class":604},[583,4076,722],{"class":600},[583,4078,2648],{"class":604},[583,4080,608],{"class":600},[583,4082,4083],{"class":604}," userId",[583,4085,719],{"class":701},[583,4087,731],{"class":600},[583,4089,4090,4092,4094,4096,4098,4100,4102,4105],{"class":585,"line":998},[583,4091,4070],{"class":679},[583,4093,682],{"class":701},[583,4095,3250],{"class":604},[583,4097,722],{"class":600},[583,4099,1403],{"class":604},[583,4101,608],{"class":600},[583,4103,4104],{"class":604}," organizationId",[583,4106,868],{"class":701},[583,4108,4109,4112],{"class":585,"line":1027},[583,4110,4111],{"class":701},"    )",[583,4113,731],{"class":600},[583,4115,4116,4118],{"class":585,"line":1052},[583,4117,1264],{"class":600},[583,4119,868],{"class":701},[583,4121,4122],{"class":585,"line":1063},[583,4123,660],{"emptyLinePlaceholder":659},[583,4125,4126,4129,4131,4133,4135,4138],{"class":585,"line":1106},[583,4127,4128],{"class":596},"  return",[583,4130,4030],{"class":604},[583,4132,1439],{"class":600},[583,4134,2428],{"class":604},[583,4136,4137],{"class":600}," ??",[583,4139,4140],{"class":600}," null\n",[583,4142,4143],{"class":585,"line":1159},[583,4144,3805],{"class":600},[583,4146,4147],{"class":585,"line":1166},[583,4148,660],{"emptyLinePlaceholder":659},[583,4150,4151,4153,4155,4157,4160],{"class":585,"line":1171},[583,4152,666],{"class":596},[583,4154,1524],{"class":669},[583,4156,3972],{"class":669},[583,4158,4159],{"class":679}," hasOrgRole",[583,4161,3978],{"class":600},[583,4163,4164,4166,4168,4170],{"class":585,"line":1208},[583,4165,1001],{"class":1193},[583,4167,705],{"class":600},[583,4169,3987],{"class":1696},[583,4171,731],{"class":600},[583,4173,4174,4176,4178,4181],{"class":585,"line":1225},[583,4175,1030],{"class":1193},[583,4177,705],{"class":600},[583,4179,4180],{"class":1696}," string",[583,4182,731],{"class":600},[583,4184,4185,4188,4190,4192,4194,4196],{"class":585,"line":1243},[583,4186,4187],{"class":1193},"  requiredRoles",[583,4189,705],{"class":600},[583,4191,3926],{"class":1696},[583,4193,3937],{"class":600},[583,4195,3926],{"class":1696},[583,4197,4198],{"class":604},"[]\n",[583,4200,4201,4203,4205,4207,4209,4211],{"class":585,"line":1261},[583,4202,4003],{"class":600},[583,4204,4006],{"class":1696},[583,4206,4009],{"class":600},[583,4208,3525],{"class":1696},[583,4210,4020],{"class":600},[583,4212,695],{"class":600},[583,4214,4215,4217,4220,4222,4224,4226,4228,4230,4232,4234],{"class":585,"line":1271},[583,4216,4027],{"class":669},[583,4218,4219],{"class":604}," role",[583,4221,1545],{"class":600},[583,4223,1548],{"class":596},[583,4225,3975],{"class":679},[583,4227,682],{"class":701},[583,4229,2648],{"class":604},[583,4231,608],{"class":600},[583,4233,4104],{"class":604},[583,4235,868],{"class":701},[583,4237,4238,4241,4243,4246,4248,4250,4253],{"class":585,"line":1288},[583,4239,4240],{"class":596},"  if",[583,4242,1202],{"class":701},[583,4244,4245],{"class":600},"!",[583,4247,2428],{"class":604},[583,4249,1574],{"class":701},[583,4251,4252],{"class":596},"return",[583,4254,4255],{"class":936}," false\n",[583,4257,4258],{"class":585,"line":1304},[583,4259,660],{"emptyLinePlaceholder":659},[583,4261,4262,4264,4267,4269,4272,4274,4277,4279,4282,4284,4287,4290,4293,4295,4297],{"class":585,"line":1320},[583,4263,4027],{"class":669},[583,4265,4266],{"class":604}," roles",[583,4268,1545],{"class":600},[583,4270,4271],{"class":604}," Array",[583,4273,722],{"class":600},[583,4275,4276],{"class":679},"isArray",[583,4278,682],{"class":701},[583,4280,4281],{"class":604},"requiredRoles",[583,4283,1574],{"class":701},[583,4285,4286],{"class":600},"?",[583,4288,4289],{"class":604}," requiredRoles",[583,4291,4292],{"class":600}," :",[583,4294,1919],{"class":701},[583,4296,4281],{"class":604},[583,4298,4299],{"class":701},"]\n",[583,4301,4302,4304,4306,4308,4311,4313,4315],{"class":585,"line":1329},[583,4303,4128],{"class":596},[583,4305,4266],{"class":604},[583,4307,722],{"class":600},[583,4309,4310],{"class":679},"includes",[583,4312,682],{"class":701},[583,4314,2428],{"class":604},[583,4316,868],{"class":701},[583,4318,4319],{"class":585,"line":2619},[583,4320,3805],{"class":600},[583,4322,4323],{"class":585,"line":2625},[583,4324,660],{"emptyLinePlaceholder":659},[583,4326,4327,4329,4331,4333,4336,4338,4340,4342,4344,4346,4348,4350,4352,4354,4356,4358,4360,4362],{"class":585,"line":2663},[583,4328,666],{"class":596},[583,4330,1524],{"class":669},[583,4332,3972],{"class":669},[583,4334,4335],{"class":679}," isOrgOwner",[583,4337,682],{"class":600},[583,4339,2648],{"class":1193},[583,4341,705],{"class":600},[583,4343,3987],{"class":1696},[583,4345,608],{"class":600},[583,4347,4104],{"class":1193},[583,4349,705],{"class":600},[583,4351,4180],{"class":1696},[583,4353,4003],{"class":600},[583,4355,4006],{"class":1696},[583,4357,4009],{"class":600},[583,4359,3525],{"class":1696},[583,4361,4020],{"class":600},[583,4363,695],{"class":600},[583,4365,4366,4368,4370,4372,4374,4376,4378,4380,4382,4384,4386],{"class":585,"line":2670},[583,4367,4128],{"class":596},[583,4369,4159],{"class":679},[583,4371,682],{"class":701},[583,4373,2648],{"class":604},[583,4375,608],{"class":600},[583,4377,4104],{"class":604},[583,4379,608],{"class":600},[583,4381,625],{"class":600},[583,4383,2445],{"class":628},[583,4385,685],{"class":600},[583,4387,868],{"class":701},[583,4389,4390],{"class":585,"line":2675},[583,4391,3805],{"class":600},[583,4393,4394],{"class":585,"line":2681},[583,4395,660],{"emptyLinePlaceholder":659},[583,4397,4398,4400,4402,4404,4407,4409,4411,4413,4415,4417,4419,4421,4423,4425,4427,4429,4431,4433],{"class":585,"line":2712},[583,4399,666],{"class":596},[583,4401,1524],{"class":669},[583,4403,3972],{"class":669},[583,4405,4406],{"class":679}," isOrgAdmin",[583,4408,682],{"class":600},[583,4410,2648],{"class":1193},[583,4412,705],{"class":600},[583,4414,3987],{"class":1696},[583,4416,608],{"class":600},[583,4418,4104],{"class":1193},[583,4420,705],{"class":600},[583,4422,4180],{"class":1696},[583,4424,4003],{"class":600},[583,4426,4006],{"class":1696},[583,4428,4009],{"class":600},[583,4430,3525],{"class":1696},[583,4432,4020],{"class":600},[583,4434,695],{"class":600},[583,4436,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467],{"class":585,"line":2727},[583,4438,4128],{"class":596},[583,4440,4159],{"class":679},[583,4442,682],{"class":701},[583,4444,2648],{"class":604},[583,4446,608],{"class":600},[583,4448,4104],{"class":604},[583,4450,608],{"class":600},[583,4452,1919],{"class":701},[583,4454,685],{"class":600},[583,4456,2445],{"class":628},[583,4458,685],{"class":600},[583,4460,608],{"class":600},[583,4462,625],{"class":600},[583,4464,2454],{"class":628},[583,4466,685],{"class":600},[583,4468,4469],{"class":701},"])\n",[583,4471,4472],{"class":585,"line":2743},[583,4473,3805],{"class":600},[583,4475,4476],{"class":585,"line":2758},[583,4477,660],{"emptyLinePlaceholder":659},[583,4479,4480],{"class":585,"line":2767},[583,4481,4482],{"class":589},"// Role hierarchy check\n",[583,4484,4485,4488,4491,4493,4496,4498,4500,4502,4504,4506,4508],{"class":585,"line":2782},[583,4486,4487],{"class":669},"const",[583,4489,4490],{"class":604}," roleHierarchy",[583,4492,705],{"class":600},[583,4494,4495],{"class":1696}," Record",[583,4497,4009],{"class":600},[583,4499,4012],{"class":1696},[583,4501,608],{"class":600},[583,4503,3987],{"class":1696},[583,4505,4020],{"class":600},[583,4507,1545],{"class":600},[583,4509,695],{"class":600},[583,4511,4512,4515,4517,4521],{"class":585,"line":2797},[583,4513,4514],{"class":701},"  owner",[583,4516,705],{"class":600},[583,4518,4520],{"class":4519},"sbssI"," 4",[583,4522,731],{"class":600},[583,4524,4525,4528,4530,4533],{"class":585,"line":2812},[583,4526,4527],{"class":701},"  admin",[583,4529,705],{"class":600},[583,4531,4532],{"class":4519}," 3",[583,4534,731],{"class":600},[583,4536,4537,4540,4542,4545],{"class":585,"line":2821},[583,4538,4539],{"class":701},"  member",[583,4541,705],{"class":600},[583,4543,4544],{"class":4519}," 2",[583,4546,731],{"class":600},[583,4548,4549,4552,4554,4557],{"class":585,"line":2828},[583,4550,4551],{"class":701},"  viewer",[583,4553,705],{"class":600},[583,4555,4556],{"class":4519}," 1",[583,4558,731],{"class":600},[583,4560,4561],{"class":585,"line":2833},[583,4562,3805],{"class":600},[583,4564,4565],{"class":585,"line":2864},[583,4566,660],{"emptyLinePlaceholder":659},[583,4568,4569,4571,4573,4575,4578],{"class":585,"line":2879},[583,4570,666],{"class":596},[583,4572,1524],{"class":669},[583,4574,3972],{"class":669},[583,4576,4577],{"class":679}," hasMinimumRole",[583,4579,3978],{"class":600},[583,4581,4582,4584,4586,4588],{"class":585,"line":2886},[583,4583,1001],{"class":1193},[583,4585,705],{"class":600},[583,4587,3987],{"class":1696},[583,4589,731],{"class":600},[583,4591,4592,4594,4596,4598],{"class":585,"line":2891},[583,4593,1030],{"class":1193},[583,4595,705],{"class":600},[583,4597,4180],{"class":1696},[583,4599,731],{"class":600},[583,4601,4602,4605,4607],{"class":585,"line":2921},[583,4603,4604],{"class":1193},"  minimumRole",[583,4606,705],{"class":600},[583,4608,4609],{"class":1696}," OrgRole\n",[583,4611,4612,4614,4616,4618,4620,4622],{"class":585,"line":2935},[583,4613,4003],{"class":600},[583,4615,4006],{"class":1696},[583,4617,4009],{"class":600},[583,4619,3525],{"class":1696},[583,4621,4020],{"class":600},[583,4623,695],{"class":600},[583,4625,4626,4628,4631,4633,4635,4637,4639,4641,4643,4645],{"class":585,"line":2950},[583,4627,4027],{"class":669},[583,4629,4630],{"class":604}," userRole",[583,4632,1545],{"class":600},[583,4634,1548],{"class":596},[583,4636,3975],{"class":679},[583,4638,682],{"class":701},[583,4640,2648],{"class":604},[583,4642,608],{"class":600},[583,4644,4104],{"class":604},[583,4646,868],{"class":701},[583,4648,4649,4651,4653,4655,4658,4660,4662],{"class":585,"line":2957},[583,4650,4240],{"class":596},[583,4652,1202],{"class":701},[583,4654,4245],{"class":600},[583,4656,4657],{"class":604},"userRole",[583,4659,1574],{"class":701},[583,4661,4252],{"class":596},[583,4663,4255],{"class":936},[583,4665,4666],{"class":585,"line":2962},[583,4667,660],{"emptyLinePlaceholder":659},[583,4669,4670,4672,4674,4677,4679,4681,4684,4686,4688,4691],{"class":585,"line":2968},[583,4671,4128],{"class":596},[583,4673,4490],{"class":604},[583,4675,4676],{"class":701},"[",[583,4678,4657],{"class":604},[583,4680,1947],{"class":701},[583,4682,4683],{"class":600},">=",[583,4685,4490],{"class":604},[583,4687,4676],{"class":701},[583,4689,4690],{"class":604},"minimumRole",[583,4692,4299],{"class":701},[583,4694,4695],{"class":585,"line":2993},[583,4696,3805],{"class":600},[568,4698,4700],{"id":4699},"resource-permissions-with-organization-roles","Resource Permissions with Organization Roles",[573,4702,4704],{"className":575,"code":4703,"language":577,"meta":578,"style":578},"// modules/blog/auth.ts\nimport { hasMinimumRole, isOrgAdmin } from '~/server/utils/orgPermissions'\n\nexport const postsAuth = {\n  async canList(user, context) {\n    if (!user) return false\n\n    // Must be member of the organization\n    return hasMinimumRole(user.id, context.tenant.id, 'viewer')\n  },\n\n  async canCreate(user, context) {\n    // Must be member or admin\n    return hasMinimumRole(user.id, context.tenant.id, 'member')\n  },\n\n  async canUpdate(user, context) {\n    // Check per-object (own posts or admin)\n    return true  // Object-level check handles this\n  },\n\n  async canDelete(user, context) {\n    // Only admins can delete\n    return isOrgAdmin(user.id, context.tenant.id)\n  },\n\n  // Object-level: Can update own posts, or admin can update any\n  async objectLevel(post, context) {\n    if (!context.user) return false\n\n    // Post author can edit\n    if (post.authorId === context.user.id) return true\n\n    // Org admin can edit any post in their org\n    return isOrgAdmin(context.user.id, post.organizationId)\n  },\n\n  // SQL-level list filtering\n  listFilter: (table, context) => {\n    const { user } = context\n    if (!user) return eq(table.id, -1)  // Return nothing\n\n    // Viewers see only published, members+ see all\n    return hasMinimumRole(user.id, context.tenant.id, 'member')\n      ? undefined  // No filter (tenant isolation handles org boundary)\n      : eq(table.published, true)\n  },\n}\n",[580,4705,4706,4711,4734,4738,4751,4772,4788,4792,4797,4835,4840,4844,4863,4868,4904,4908,4912,4931,4936,4945,4949,4953,4972,4977,5005,5009,5013,5018,5038,5058,5062,5067,5099,5103,5108,5137,5141,5145,5150,5171,5186,5223,5227,5232,5268,5279,5301,5305],{"__ignoreMap":578},[583,4707,4708],{"class":585,"line":586},[583,4709,4710],{"class":589},"// modules/blog/auth.ts\n",[583,4712,4713,4715,4717,4719,4721,4723,4725,4727,4729,4732],{"class":585,"line":593},[583,4714,597],{"class":596},[583,4716,601],{"class":600},[583,4718,4577],{"class":604},[583,4720,608],{"class":600},[583,4722,4406],{"class":604},[583,4724,619],{"class":600},[583,4726,622],{"class":596},[583,4728,625],{"class":600},[583,4730,4731],{"class":628},"~/server/utils/orgPermissions",[583,4733,632],{"class":600},[583,4735,4736],{"class":585,"line":635},[583,4737,660],{"emptyLinePlaceholder":659},[583,4739,4740,4742,4744,4747,4749],{"class":585,"line":656},[583,4741,666],{"class":596},[583,4743,670],{"class":669},[583,4745,4746],{"class":604}," postsAuth ",[583,4748,676],{"class":600},[583,4750,695],{"class":600},[583,4752,4753,4756,4759,4761,4763,4765,4768,4770],{"class":585,"line":663},[583,4754,4755],{"class":669},"  async",[583,4757,4758],{"class":701}," canList",[583,4760,682],{"class":600},[583,4762,1436],{"class":1193},[583,4764,608],{"class":600},[583,4766,4767],{"class":1193}," context",[583,4769,719],{"class":600},[583,4771,695],{"class":600},[583,4773,4774,4776,4778,4780,4782,4784,4786],{"class":585,"line":698},[583,4775,1566],{"class":596},[583,4777,1202],{"class":701},[583,4779,4245],{"class":600},[583,4781,1436],{"class":604},[583,4783,1574],{"class":701},[583,4785,4252],{"class":596},[583,4787,4255],{"class":936},[583,4789,4790],{"class":585,"line":734},[583,4791,660],{"emptyLinePlaceholder":659},[583,4793,4794],{"class":585,"line":764},[583,4795,4796],{"class":589},"    // Must be member of the organization\n",[583,4798,4799,4802,4804,4806,4808,4810,4812,4814,4816,4818,4821,4823,4825,4827,4829,4831,4833],{"class":585,"line":800},[583,4800,4801],{"class":596},"    return",[583,4803,4577],{"class":679},[583,4805,682],{"class":701},[583,4807,1436],{"class":604},[583,4809,722],{"class":600},[583,4811,714],{"class":604},[583,4813,608],{"class":600},[583,4815,4767],{"class":604},[583,4817,722],{"class":600},[583,4819,4820],{"class":604},"tenant",[583,4822,722],{"class":600},[583,4824,714],{"class":604},[583,4826,608],{"class":600},[583,4828,625],{"class":600},[583,4830,2472],{"class":628},[583,4832,685],{"class":600},[583,4834,868],{"class":701},[583,4836,4837],{"class":585,"line":862},[583,4838,4839],{"class":600},"  },\n",[583,4841,4842],{"class":585,"line":871},[583,4843,660],{"emptyLinePlaceholder":659},[583,4845,4846,4848,4851,4853,4855,4857,4859,4861],{"class":585,"line":876},[583,4847,4755],{"class":669},[583,4849,4850],{"class":701}," canCreate",[583,4852,682],{"class":600},[583,4854,1436],{"class":1193},[583,4856,608],{"class":600},[583,4858,4767],{"class":1193},[583,4860,719],{"class":600},[583,4862,695],{"class":600},[583,4864,4865],{"class":585,"line":903},[583,4866,4867],{"class":589},"    // Must be member or admin\n",[583,4869,4870,4872,4874,4876,4878,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902],{"class":585,"line":946},[583,4871,4801],{"class":596},[583,4873,4577],{"class":679},[583,4875,682],{"class":701},[583,4877,1436],{"class":604},[583,4879,722],{"class":600},[583,4881,714],{"class":604},[583,4883,608],{"class":600},[583,4885,4767],{"class":604},[583,4887,722],{"class":600},[583,4889,4820],{"class":604},[583,4891,722],{"class":600},[583,4893,714],{"class":604},[583,4895,608],{"class":600},[583,4897,625],{"class":600},[583,4899,2463],{"class":628},[583,4901,685],{"class":600},[583,4903,868],{"class":701},[583,4905,4906],{"class":585,"line":975},[583,4907,4839],{"class":600},[583,4909,4910],{"class":585,"line":998},[583,4911,660],{"emptyLinePlaceholder":659},[583,4913,4914,4916,4919,4921,4923,4925,4927,4929],{"class":585,"line":1027},[583,4915,4755],{"class":669},[583,4917,4918],{"class":701}," canUpdate",[583,4920,682],{"class":600},[583,4922,1436],{"class":1193},[583,4924,608],{"class":600},[583,4926,4767],{"class":1193},[583,4928,719],{"class":600},[583,4930,695],{"class":600},[583,4932,4933],{"class":585,"line":1052},[583,4934,4935],{"class":589},"    // Check per-object (own posts or admin)\n",[583,4937,4938,4940,4942],{"class":585,"line":1063},[583,4939,4801],{"class":596},[583,4941,937],{"class":936},[583,4943,4944],{"class":589},"  // Object-level check handles this\n",[583,4946,4947],{"class":585,"line":1106},[583,4948,4839],{"class":600},[583,4950,4951],{"class":585,"line":1159},[583,4952,660],{"emptyLinePlaceholder":659},[583,4954,4955,4957,4960,4962,4964,4966,4968,4970],{"class":585,"line":1166},[583,4956,4755],{"class":669},[583,4958,4959],{"class":701}," canDelete",[583,4961,682],{"class":600},[583,4963,1436],{"class":1193},[583,4965,608],{"class":600},[583,4967,4767],{"class":1193},[583,4969,719],{"class":600},[583,4971,695],{"class":600},[583,4973,4974],{"class":585,"line":1171},[583,4975,4976],{"class":589},"    // Only admins can delete\n",[583,4978,4979,4981,4983,4985,4987,4989,4991,4993,4995,4997,4999,5001,5003],{"class":585,"line":1208},[583,4980,4801],{"class":596},[583,4982,4406],{"class":679},[583,4984,682],{"class":701},[583,4986,1436],{"class":604},[583,4988,722],{"class":600},[583,4990,714],{"class":604},[583,4992,608],{"class":600},[583,4994,4767],{"class":604},[583,4996,722],{"class":600},[583,4998,4820],{"class":604},[583,5000,722],{"class":600},[583,5002,714],{"class":604},[583,5004,868],{"class":701},[583,5006,5007],{"class":585,"line":1225},[583,5008,4839],{"class":600},[583,5010,5011],{"class":585,"line":1243},[583,5012,660],{"emptyLinePlaceholder":659},[583,5014,5015],{"class":585,"line":1261},[583,5016,5017],{"class":589},"  // Object-level: Can update own posts, or admin can update any\n",[583,5019,5020,5022,5025,5027,5030,5032,5034,5036],{"class":585,"line":1271},[583,5021,4755],{"class":669},[583,5023,5024],{"class":701}," objectLevel",[583,5026,682],{"class":600},[583,5028,5029],{"class":1193},"post",[583,5031,608],{"class":600},[583,5033,4767],{"class":1193},[583,5035,719],{"class":600},[583,5037,695],{"class":600},[583,5039,5040,5042,5044,5046,5048,5050,5052,5054,5056],{"class":585,"line":1288},[583,5041,1566],{"class":596},[583,5043,1202],{"class":701},[583,5045,4245],{"class":600},[583,5047,1431],{"class":604},[583,5049,722],{"class":600},[583,5051,1436],{"class":604},[583,5053,1574],{"class":701},[583,5055,4252],{"class":596},[583,5057,4255],{"class":936},[583,5059,5060],{"class":585,"line":1304},[583,5061,660],{"emptyLinePlaceholder":659},[583,5063,5064],{"class":585,"line":1320},[583,5065,5066],{"class":589},"    // Post author can edit\n",[583,5068,5069,5071,5073,5075,5077,5080,5082,5084,5086,5088,5090,5092,5094,5096],{"class":585,"line":1329},[583,5070,1566],{"class":596},[583,5072,1202],{"class":701},[583,5074,5029],{"class":604},[583,5076,722],{"class":600},[583,5078,5079],{"class":604},"authorId",[583,5081,3459],{"class":600},[583,5083,4767],{"class":604},[583,5085,722],{"class":600},[583,5087,1436],{"class":604},[583,5089,722],{"class":600},[583,5091,714],{"class":604},[583,5093,1574],{"class":701},[583,5095,4252],{"class":596},[583,5097,5098],{"class":936}," true\n",[583,5100,5101],{"class":585,"line":2619},[583,5102,660],{"emptyLinePlaceholder":659},[583,5104,5105],{"class":585,"line":2625},[583,5106,5107],{"class":589},"    // Org admin can edit any post in their org\n",[583,5109,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128,5131,5133,5135],{"class":585,"line":2663},[583,5111,4801],{"class":596},[583,5113,4406],{"class":679},[583,5115,682],{"class":701},[583,5117,1431],{"class":604},[583,5119,722],{"class":600},[583,5121,1436],{"class":604},[583,5123,722],{"class":600},[583,5125,714],{"class":604},[583,5127,608],{"class":600},[583,5129,5130],{"class":604}," post",[583,5132,722],{"class":600},[583,5134,1403],{"class":604},[583,5136,868],{"class":701},[583,5138,5139],{"class":585,"line":2670},[583,5140,4839],{"class":600},[583,5142,5143],{"class":585,"line":2675},[583,5144,660],{"emptyLinePlaceholder":659},[583,5146,5147],{"class":585,"line":2681},[583,5148,5149],{"class":589},"  // SQL-level list filtering\n",[583,5151,5152,5155,5157,5159,5161,5163,5165,5167,5169],{"class":585,"line":2712},[583,5153,5154],{"class":679},"  listFilter",[583,5156,705],{"class":600},[583,5158,1202],{"class":600},[583,5160,2608],{"class":1193},[583,5162,608],{"class":600},[583,5164,4767],{"class":1193},[583,5166,719],{"class":600},[583,5168,848],{"class":669},[583,5170,695],{"class":600},[583,5172,5173,5175,5177,5179,5181,5183],{"class":585,"line":2727},[583,5174,1539],{"class":669},[583,5176,601],{"class":600},[583,5178,3452],{"class":604},[583,5180,619],{"class":600},[583,5182,1545],{"class":600},[583,5184,5185],{"class":604}," context\n",[583,5187,5188,5190,5192,5194,5196,5198,5200,5202,5204,5206,5208,5210,5212,5215,5218,5220],{"class":585,"line":2743},[583,5189,1566],{"class":596},[583,5191,1202],{"class":701},[583,5193,4245],{"class":600},[583,5195,1436],{"class":604},[583,5197,1574],{"class":701},[583,5199,4252],{"class":596},[583,5201,3903],{"class":679},[583,5203,682],{"class":701},[583,5205,2608],{"class":604},[583,5207,722],{"class":600},[583,5209,714],{"class":604},[583,5211,608],{"class":600},[583,5213,5214],{"class":600}," -",[583,5216,5217],{"class":4519},"1",[583,5219,1046],{"class":701},[583,5221,5222],{"class":589},"// Return nothing\n",[583,5224,5225],{"class":585,"line":2758},[583,5226,660],{"emptyLinePlaceholder":659},[583,5228,5229],{"class":585,"line":2767},[583,5230,5231],{"class":589},"    // Viewers see only published, members+ see all\n",[583,5233,5234,5236,5238,5240,5242,5244,5246,5248,5250,5252,5254,5256,5258,5260,5262,5264,5266],{"class":585,"line":2782},[583,5235,4801],{"class":596},[583,5237,4577],{"class":679},[583,5239,682],{"class":701},[583,5241,1436],{"class":604},[583,5243,722],{"class":600},[583,5245,714],{"class":604},[583,5247,608],{"class":600},[583,5249,4767],{"class":604},[583,5251,722],{"class":600},[583,5253,4820],{"class":604},[583,5255,722],{"class":600},[583,5257,714],{"class":604},[583,5259,608],{"class":600},[583,5261,625],{"class":600},[583,5263,2463],{"class":628},[583,5265,685],{"class":600},[583,5267,868],{"class":701},[583,5269,5270,5273,5276],{"class":585,"line":2797},[583,5271,5272],{"class":600},"      ?",[583,5274,5275],{"class":600}," undefined",[583,5277,5278],{"class":589},"  // No filter (tenant isolation handles org boundary)\n",[583,5280,5281,5284,5286,5288,5290,5292,5295,5297,5299],{"class":585,"line":2812},[583,5282,5283],{"class":600},"      :",[583,5285,3903],{"class":679},[583,5287,682],{"class":701},[583,5289,2608],{"class":604},[583,5291,722],{"class":600},[583,5293,5294],{"class":604},"published",[583,5296,608],{"class":600},[583,5298,937],{"class":936},[583,5300,868],{"class":701},[583,5302,5303],{"class":585,"line":2821},[583,5304,4839],{"class":600},[583,5306,5307],{"class":585,"line":2828},[583,5308,3805],{"class":600},[568,5310,5312],{"id":5311},"example-different-permissions-per-org","Example: Different Permissions Per Org",[573,5314,5316],{"className":575,"code":5315,"language":577,"meta":578,"style":578},"// User Alice\nconst alice = {\n  id: 1,\n  email: 'alice@example.com',\n  organizationId: 'org_a',  // Currently active org\n}\n\n// Alice's memberships\nawait db.insert(organizationMembers).values([\n  { userId: 1, organizationId: 'org_a', role: 'admin' },   // Admin in Org A\n  { userId: 1, organizationId: 'org_b', role: 'viewer' },  // Viewer in Org B\n])\n\n// In Org A context (alice.organizationId = 'org_a')\nawait canCreate(alice, { tenant: { id: 'org_a' } })   // ✅ true (admin)\nawait canDelete(alice, { tenant: { id: 'org_a' } })   // ✅ true (admin)\n\n// If Alice switches to Org B (alice.organizationId = 'org_b')\nawait canCreate(alice, { tenant: { id: 'org_b' } })   // ❌ false (viewer)\nawait canDelete(alice, { tenant: { id: 'org_b' } })   // ❌ false (viewer)\n",[580,5317,5318,5323,5334,5344,5359,5377,5381,5385,5390,5412,5453,5493,5497,5501,5506,5547,5583,5587,5592,5629],{"__ignoreMap":578},[583,5319,5320],{"class":585,"line":586},[583,5321,5322],{"class":589},"// User Alice\n",[583,5324,5325,5327,5330,5332],{"class":585,"line":593},[583,5326,4487],{"class":669},[583,5328,5329],{"class":604}," alice ",[583,5331,676],{"class":600},[583,5333,695],{"class":600},[583,5335,5336,5338,5340,5342],{"class":585,"line":635},[583,5337,702],{"class":701},[583,5339,705],{"class":600},[583,5341,4556],{"class":4519},[583,5343,731],{"class":600},[583,5345,5346,5348,5350,5352,5355,5357],{"class":585,"line":656},[583,5347,2104],{"class":701},[583,5349,705],{"class":600},[583,5351,625],{"class":600},[583,5353,5354],{"class":628},"alice@example.com",[583,5356,685],{"class":600},[583,5358,731],{"class":600},[583,5360,5361,5363,5365,5367,5370,5372,5374],{"class":585,"line":663},[583,5362,1030],{"class":701},[583,5364,705],{"class":600},[583,5366,625],{"class":600},[583,5368,5369],{"class":628},"org_a",[583,5371,685],{"class":600},[583,5373,608],{"class":600},[583,5375,5376],{"class":589},"  // Currently active org\n",[583,5378,5379],{"class":585,"line":698},[583,5380,3805],{"class":600},[583,5382,5383],{"class":585,"line":734},[583,5384,660],{"emptyLinePlaceholder":659},[583,5386,5387],{"class":585,"line":764},[583,5388,5389],{"class":589},"// Alice's memberships\n",[583,5391,5392,5395,5397,5399,5402,5404,5406,5409],{"class":585,"line":800},[583,5393,5394],{"class":596},"await",[583,5396,3858],{"class":604},[583,5398,722],{"class":600},[583,5400,5401],{"class":679},"insert",[583,5403,2874],{"class":604},[583,5405,722],{"class":600},[583,5407,5408],{"class":679},"values",[583,5410,5411],{"class":604},"([\n",[583,5413,5414,5417,5419,5421,5423,5425,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445,5447,5450],{"class":585,"line":862},[583,5415,5416],{"class":600},"  {",[583,5418,4083],{"class":701},[583,5420,705],{"class":600},[583,5422,4556],{"class":4519},[583,5424,608],{"class":600},[583,5426,4104],{"class":701},[583,5428,705],{"class":600},[583,5430,625],{"class":600},[583,5432,5369],{"class":628},[583,5434,685],{"class":600},[583,5436,608],{"class":600},[583,5438,4219],{"class":701},[583,5440,705],{"class":600},[583,5442,625],{"class":600},[583,5444,2454],{"class":628},[583,5446,685],{"class":600},[583,5448,5449],{"class":600}," },",[583,5451,5452],{"class":589},"   // Admin in Org A\n",[583,5454,5455,5457,5459,5461,5463,5465,5467,5469,5471,5474,5476,5478,5480,5482,5484,5486,5488,5490],{"class":585,"line":871},[583,5456,5416],{"class":600},[583,5458,4083],{"class":701},[583,5460,705],{"class":600},[583,5462,4556],{"class":4519},[583,5464,608],{"class":600},[583,5466,4104],{"class":701},[583,5468,705],{"class":600},[583,5470,625],{"class":600},[583,5472,5473],{"class":628},"org_b",[583,5475,685],{"class":600},[583,5477,608],{"class":600},[583,5479,4219],{"class":701},[583,5481,705],{"class":600},[583,5483,625],{"class":600},[583,5485,2472],{"class":628},[583,5487,685],{"class":600},[583,5489,5449],{"class":600},[583,5491,5492],{"class":589},"  // Viewer in Org B\n",[583,5494,5495],{"class":585,"line":876},[583,5496,4469],{"class":604},[583,5498,5499],{"class":585,"line":903},[583,5500,660],{"emptyLinePlaceholder":659},[583,5502,5503],{"class":585,"line":946},[583,5504,5505],{"class":589},"// In Org A context (alice.organizationId = 'org_a')\n",[583,5507,5508,5510,5512,5515,5517,5519,5522,5524,5526,5529,5531,5533,5535,5537,5539,5541,5544],{"class":585,"line":975},[583,5509,5394],{"class":596},[583,5511,4850],{"class":679},[583,5513,5514],{"class":604},"(alice",[583,5516,608],{"class":600},[583,5518,601],{"class":600},[583,5520,5521],{"class":701}," tenant",[583,5523,705],{"class":600},[583,5525,601],{"class":600},[583,5527,5528],{"class":701}," id",[583,5530,705],{"class":600},[583,5532,625],{"class":600},[583,5534,5369],{"class":628},[583,5536,685],{"class":600},[583,5538,619],{"class":600},[583,5540,619],{"class":600},[583,5542,5543],{"class":604},")   ",[583,5545,5546],{"class":589},"// ✅ true (admin)\n",[583,5548,5549,5551,5553,5555,5557,5559,5561,5563,5565,5567,5569,5571,5573,5575,5577,5579,5581],{"class":585,"line":998},[583,5550,5394],{"class":596},[583,5552,4959],{"class":679},[583,5554,5514],{"class":604},[583,5556,608],{"class":600},[583,5558,601],{"class":600},[583,5560,5521],{"class":701},[583,5562,705],{"class":600},[583,5564,601],{"class":600},[583,5566,5528],{"class":701},[583,5568,705],{"class":600},[583,5570,625],{"class":600},[583,5572,5369],{"class":628},[583,5574,685],{"class":600},[583,5576,619],{"class":600},[583,5578,619],{"class":600},[583,5580,5543],{"class":604},[583,5582,5546],{"class":589},[583,5584,5585],{"class":585,"line":1027},[583,5586,660],{"emptyLinePlaceholder":659},[583,5588,5589],{"class":585,"line":1052},[583,5590,5591],{"class":589},"// If Alice switches to Org B (alice.organizationId = 'org_b')\n",[583,5593,5594,5596,5598,5600,5602,5604,5606,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626],{"class":585,"line":1063},[583,5595,5394],{"class":596},[583,5597,4850],{"class":679},[583,5599,5514],{"class":604},[583,5601,608],{"class":600},[583,5603,601],{"class":600},[583,5605,5521],{"class":701},[583,5607,705],{"class":600},[583,5609,601],{"class":600},[583,5611,5528],{"class":701},[583,5613,705],{"class":600},[583,5615,625],{"class":600},[583,5617,5473],{"class":628},[583,5619,685],{"class":600},[583,5621,619],{"class":600},[583,5623,619],{"class":600},[583,5625,5543],{"class":604},[583,5627,5628],{"class":589},"// ❌ false (viewer)\n",[583,5630,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651,5653,5655,5657,5659,5661,5663],{"class":585,"line":1106},[583,5632,5394],{"class":596},[583,5634,4959],{"class":679},[583,5636,5514],{"class":604},[583,5638,608],{"class":600},[583,5640,601],{"class":600},[583,5642,5521],{"class":701},[583,5644,705],{"class":600},[583,5646,601],{"class":600},[583,5648,5528],{"class":701},[583,5650,705],{"class":600},[583,5652,625],{"class":600},[583,5654,5473],{"class":628},[583,5656,685],{"class":600},[583,5658,619],{"class":600},[583,5660,619],{"class":600},[583,5662,5543],{"class":604},[583,5664,5628],{"class":589},[501,5666],{},[459,5668,287],{"id":5669},"better-auth-integration",[568,5671,194],{"id":5672},"installation",[573,5674,5676],{"className":1682,"code":5675,"language":1684,"meta":578,"style":578},"npm install better-auth\n",[580,5677,5678],{"__ignoreMap":578},[583,5679,5680,5683,5686],{"class":585,"line":586},[583,5681,5682],{"class":1696},"npm",[583,5684,5685],{"class":628}," install",[583,5687,5688],{"class":628}," better-auth\n",[568,5690,5692],{"id":5691},"setup-with-organization-plugin","Setup with Organization Plugin",[573,5694,5696],{"className":575,"code":5695,"language":577,"meta":578,"style":578},"// server/lib/auth.ts\nimport { betterAuth } from 'better-auth'\nimport { organization } from 'better-auth/plugins'\nimport { drizzleAdapter } from 'better-auth/adapters/drizzle'\nimport { db } from '../database/db'\nimport * as schema from '../database/schema'\n\nexport const auth = betterAuth({\n  database: drizzleAdapter(db, {\n    provider: 'sqlite',\n    schema,\n  }),\n\n  plugins: [\n    organization({\n      // Organization plugin adds:\n      // - organizations table\n      // - members table with roles\n      // - session.activeOrganizationId\n      // - organization switching API\n      roles: ['owner', 'admin', 'member', 'viewer'],\n    }),\n  ],\n\n  session: {\n    expiresIn: 60 * 60 * 24 * 7, // 7 days\n    updateAge: 60 * 60 * 24,      // Update every 24 hours\n  },\n})\n",[580,5697,5698,5703,5723,5743,5763,5781,5803,5807,5824,5840,5856,5863,5871,5875,5884,5893,5898,5903,5908,5913,5918,5962,5971,5977,5981,5990,6019,6041,6045],{"__ignoreMap":578},[583,5699,5700],{"class":585,"line":586},[583,5701,5702],{"class":589},"// server/lib/auth.ts\n",[583,5704,5705,5707,5709,5712,5714,5716,5718,5721],{"class":585,"line":593},[583,5706,597],{"class":596},[583,5708,601],{"class":600},[583,5710,5711],{"class":604}," betterAuth",[583,5713,619],{"class":600},[583,5715,622],{"class":596},[583,5717,625],{"class":600},[583,5719,5720],{"class":628},"better-auth",[583,5722,632],{"class":600},[583,5724,5725,5727,5729,5732,5734,5736,5738,5741],{"class":585,"line":635},[583,5726,597],{"class":596},[583,5728,601],{"class":600},[583,5730,5731],{"class":604}," organization",[583,5733,619],{"class":600},[583,5735,622],{"class":596},[583,5737,625],{"class":600},[583,5739,5740],{"class":628},"better-auth/plugins",[583,5742,632],{"class":600},[583,5744,5745,5747,5749,5752,5754,5756,5758,5761],{"class":585,"line":656},[583,5746,597],{"class":596},[583,5748,601],{"class":600},[583,5750,5751],{"class":604}," drizzleAdapter",[583,5753,619],{"class":600},[583,5755,622],{"class":596},[583,5757,625],{"class":600},[583,5759,5760],{"class":628},"better-auth/adapters/drizzle",[583,5762,632],{"class":600},[583,5764,5765,5767,5769,5771,5773,5775,5777,5779],{"class":585,"line":663},[583,5766,597],{"class":596},[583,5768,601],{"class":600},[583,5770,3858],{"class":604},[583,5772,619],{"class":600},[583,5774,622],{"class":596},[583,5776,625],{"class":600},[583,5778,3867],{"class":628},[583,5780,632],{"class":600},[583,5782,5783,5785,5788,5791,5794,5797,5799,5801],{"class":585,"line":698},[583,5784,597],{"class":596},[583,5786,5787],{"class":600}," *",[583,5789,5790],{"class":596}," as",[583,5792,5793],{"class":604}," schema ",[583,5795,5796],{"class":596},"from",[583,5798,625],{"class":600},[583,5800,3887],{"class":628},[583,5802,632],{"class":600},[583,5804,5805],{"class":585,"line":734},[583,5806,660],{"emptyLinePlaceholder":659},[583,5808,5809,5811,5813,5816,5818,5820,5822],{"class":585,"line":764},[583,5810,666],{"class":596},[583,5812,670],{"class":669},[583,5814,5815],{"class":604}," auth ",[583,5817,676],{"class":600},[583,5819,5711],{"class":679},[583,5821,682],{"class":604},[583,5823,1205],{"class":600},[583,5825,5826,5829,5831,5833,5836,5838],{"class":585,"line":800},[583,5827,5828],{"class":701},"  database",[583,5830,705],{"class":600},[583,5832,5751],{"class":679},[583,5834,5835],{"class":604},"(db",[583,5837,608],{"class":600},[583,5839,695],{"class":600},[583,5841,5842,5845,5847,5849,5852,5854],{"class":585,"line":862},[583,5843,5844],{"class":701},"    provider",[583,5846,705],{"class":600},[583,5848,625],{"class":600},[583,5850,5851],{"class":628},"sqlite",[583,5853,685],{"class":600},[583,5855,731],{"class":600},[583,5857,5858,5861],{"class":585,"line":871},[583,5859,5860],{"class":604},"    schema",[583,5862,731],{"class":600},[583,5864,5865,5867,5869],{"class":585,"line":876},[583,5866,1264],{"class":600},[583,5868,719],{"class":604},[583,5870,731],{"class":600},[583,5872,5873],{"class":585,"line":903},[583,5874,660],{"emptyLinePlaceholder":659},[583,5876,5877,5880,5882],{"class":585,"line":946},[583,5878,5879],{"class":701},"  plugins",[583,5881,705],{"class":600},[583,5883,3696],{"class":604},[583,5885,5886,5889,5891],{"class":585,"line":975},[583,5887,5888],{"class":679},"    organization",[583,5890,682],{"class":604},[583,5892,1205],{"class":600},[583,5894,5895],{"class":585,"line":998},[583,5896,5897],{"class":589},"      // Organization plugin adds:\n",[583,5899,5900],{"class":585,"line":1027},[583,5901,5902],{"class":589},"      // - organizations table\n",[583,5904,5905],{"class":585,"line":1052},[583,5906,5907],{"class":589},"      // - members table with roles\n",[583,5909,5910],{"class":585,"line":1063},[583,5911,5912],{"class":589},"      // - session.activeOrganizationId\n",[583,5914,5915],{"class":585,"line":1106},[583,5916,5917],{"class":589},"      // - organization switching API\n",[583,5919,5920,5923,5925,5927,5929,5931,5933,5935,5937,5939,5941,5943,5945,5947,5949,5951,5953,5955,5957,5960],{"class":585,"line":1159},[583,5921,5922],{"class":701},"      roles",[583,5924,705],{"class":600},[583,5926,1919],{"class":604},[583,5928,685],{"class":600},[583,5930,2445],{"class":628},[583,5932,685],{"class":600},[583,5934,608],{"class":600},[583,5936,625],{"class":600},[583,5938,2454],{"class":628},[583,5940,685],{"class":600},[583,5942,608],{"class":600},[583,5944,625],{"class":600},[583,5946,2463],{"class":628},[583,5948,685],{"class":600},[583,5950,608],{"class":600},[583,5952,625],{"class":600},[583,5954,2472],{"class":628},[583,5956,685],{"class":600},[583,5958,5959],{"class":604},"]",[583,5961,731],{"class":600},[583,5963,5964,5967,5969],{"class":585,"line":1166},[583,5965,5966],{"class":600},"    }",[583,5968,719],{"class":604},[583,5970,731],{"class":600},[583,5972,5973,5975],{"class":585,"line":1171},[583,5974,3742],{"class":604},[583,5976,731],{"class":600},[583,5978,5979],{"class":585,"line":1208},[583,5980,660],{"emptyLinePlaceholder":659},[583,5982,5983,5986,5988],{"class":585,"line":1225},[583,5984,5985],{"class":701},"  session",[583,5987,705],{"class":600},[583,5989,695],{"class":600},[583,5991,5992,5995,5997,6000,6002,6004,6006,6009,6011,6014,6016],{"class":585,"line":1243},[583,5993,5994],{"class":701},"    expiresIn",[583,5996,705],{"class":600},[583,5998,5999],{"class":4519}," 60",[583,6001,5787],{"class":600},[583,6003,5999],{"class":4519},[583,6005,5787],{"class":600},[583,6007,6008],{"class":4519}," 24",[583,6010,5787],{"class":600},[583,6012,6013],{"class":4519}," 7",[583,6015,608],{"class":600},[583,6017,6018],{"class":589}," // 7 days\n",[583,6020,6021,6024,6026,6028,6030,6032,6034,6036,6038],{"class":585,"line":1261},[583,6022,6023],{"class":701},"    updateAge",[583,6025,705],{"class":600},[583,6027,5999],{"class":4519},[583,6029,5787],{"class":600},[583,6031,5999],{"class":4519},[583,6033,5787],{"class":600},[583,6035,6008],{"class":4519},[583,6037,608],{"class":600},[583,6039,6040],{"class":589},"      // Update every 24 hours\n",[583,6042,6043],{"class":585,"line":1271},[583,6044,4839],{"class":600},[583,6046,6047,6049],{"class":585,"line":1288},[583,6048,865],{"class":600},[583,6050,868],{"class":604},[568,6052,6054],{"id":6053},"auth-plugin-for-nuxt-auto-api","Auth Plugin for Nuxt-Auto-API",[573,6056,6058],{"className":575,"code":6057,"language":577,"meta":578,"style":578},"// server/plugins/auth.ts\nimport { auth } from '../lib/auth'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('request', async (event) => {\n    // Get session from Better-Auth\n    const session = await auth.api.getSession({\n      headers: event.node.req.headers,\n    })\n\n    if (!session) return\n\n    // Get active organization membership\n    const activeMembership = session.user.organizationId\n      ? await db.query.organizationMembers.findFirst({\n          where: and(\n            eq(organizationMembers.userId, session.user.id),\n            eq(organizationMembers.organizationId, session.user.organizationId)\n          ),\n        })\n      : null\n\n    // Set user context with organization\n    event.context.user = {\n      id: session.user.id,\n      email: session.user.email,\n      name: session.user.name,\n      organizationId: session.activeOrganizationId,  // Current org\n      role: activeMembership?.role ?? 'viewer',      // Role in current org\n    }\n\n    // Set permissions array (for simple permission checks)\n    event.context.permissions = activeMembership\n      ? [activeMembership.role]\n      : []\n  })\n})\n",[580,6059,6060,6064,6084,6088,6108,6142,6147,6173,6199,6205,6209,6224,6228,6233,6252,6276,6287,6316,6342,6349,6356,6362,6366,6371,6388,6407,6426,6445,6463,6489,6493,6497,6502,6520,6535,6542,6548],{"__ignoreMap":578},[583,6061,6062],{"class":585,"line":586},[583,6063,1473],{"class":589},[583,6065,6066,6068,6070,6073,6075,6077,6079,6082],{"class":585,"line":593},[583,6067,597],{"class":596},[583,6069,601],{"class":600},[583,6071,6072],{"class":604}," auth",[583,6074,619],{"class":600},[583,6076,622],{"class":596},[583,6078,625],{"class":600},[583,6080,6081],{"class":628},"../lib/auth",[583,6083,632],{"class":600},[583,6085,6086],{"class":585,"line":635},[583,6087,660],{"emptyLinePlaceholder":659},[583,6089,6090,6092,6094,6096,6098,6100,6102,6104,6106],{"class":585,"line":656},[583,6091,666],{"class":596},[583,6093,1355],{"class":596},[583,6095,1482],{"class":679},[583,6097,682],{"class":604},[583,6099,682],{"class":600},[583,6101,1489],{"class":1193},[583,6103,719],{"class":600},[583,6105,848],{"class":669},[583,6107,695],{"class":600},[583,6109,6110,6112,6114,6116,6118,6120,6122,6124,6126,6128,6130,6132,6134,6136,6138,6140],{"class":585,"line":663},[583,6111,1500],{"class":604},[583,6113,722],{"class":600},[583,6115,1505],{"class":604},[583,6117,722],{"class":600},[583,6119,1510],{"class":679},[583,6121,682],{"class":701},[583,6123,685],{"class":600},[583,6125,1517],{"class":628},[583,6127,685],{"class":600},[583,6129,608],{"class":600},[583,6131,1524],{"class":669},[583,6133,1202],{"class":600},[583,6135,1419],{"class":1193},[583,6137,719],{"class":600},[583,6139,848],{"class":669},[583,6141,695],{"class":600},[583,6143,6144],{"class":585,"line":698},[583,6145,6146],{"class":589},"    // Get session from Better-Auth\n",[583,6148,6149,6151,6153,6155,6157,6159,6161,6164,6166,6169,6171],{"class":585,"line":734},[583,6150,1539],{"class":669},[583,6152,1542],{"class":604},[583,6154,1545],{"class":600},[583,6156,1548],{"class":596},[583,6158,6072],{"class":604},[583,6160,722],{"class":600},[583,6162,6163],{"class":604},"api",[583,6165,722],{"class":600},[583,6167,6168],{"class":679},"getSession",[583,6170,682],{"class":701},[583,6172,1205],{"class":600},[583,6174,6175,6178,6180,6182,6184,6187,6189,6192,6194,6197],{"class":585,"line":764},[583,6176,6177],{"class":701},"      headers",[583,6179,705],{"class":600},[583,6181,1426],{"class":604},[583,6183,722],{"class":600},[583,6185,6186],{"class":604},"node",[583,6188,722],{"class":600},[583,6190,6191],{"class":604},"req",[583,6193,722],{"class":600},[583,6195,6196],{"class":604},"headers",[583,6198,731],{"class":600},[583,6200,6201,6203],{"class":585,"line":800},[583,6202,5966],{"class":600},[583,6204,868],{"class":701},[583,6206,6207],{"class":585,"line":862},[583,6208,660],{"emptyLinePlaceholder":659},[583,6210,6211,6213,6215,6217,6219,6221],{"class":585,"line":871},[583,6212,1566],{"class":596},[583,6214,1202],{"class":701},[583,6216,4245],{"class":600},[583,6218,1571],{"class":604},[583,6220,1574],{"class":701},[583,6222,6223],{"class":596},"return\n",[583,6225,6226],{"class":585,"line":876},[583,6227,660],{"emptyLinePlaceholder":659},[583,6229,6230],{"class":585,"line":903},[583,6231,6232],{"class":589},"    // Get active organization membership\n",[583,6234,6235,6237,6240,6242,6244,6246,6248,6250],{"class":585,"line":946},[583,6236,1539],{"class":669},[583,6238,6239],{"class":604}," activeMembership",[583,6241,1545],{"class":600},[583,6243,1542],{"class":604},[583,6245,722],{"class":600},[583,6247,1436],{"class":604},[583,6249,722],{"class":600},[583,6251,3423],{"class":604},[583,6253,6254,6256,6258,6260,6262,6264,6266,6268,6270,6272,6274],{"class":585,"line":975},[583,6255,5272],{"class":600},[583,6257,1548],{"class":596},[583,6259,3858],{"class":604},[583,6261,722],{"class":600},[583,6263,4041],{"class":604},[583,6265,722],{"class":600},[583,6267,3250],{"class":604},[583,6269,722],{"class":600},[583,6271,4050],{"class":679},[583,6273,682],{"class":701},[583,6275,1205],{"class":600},[583,6277,6278,6281,6283,6285],{"class":585,"line":998},[583,6279,6280],{"class":701},"          where",[583,6282,705],{"class":600},[583,6284,3898],{"class":679},[583,6286,3978],{"class":701},[583,6288,6289,6292,6294,6296,6298,6300,6302,6304,6306,6308,6310,6312,6314],{"class":585,"line":1027},[583,6290,6291],{"class":679},"            eq",[583,6293,682],{"class":701},[583,6295,3250],{"class":604},[583,6297,722],{"class":600},[583,6299,2648],{"class":604},[583,6301,608],{"class":600},[583,6303,1542],{"class":604},[583,6305,722],{"class":600},[583,6307,1436],{"class":604},[583,6309,722],{"class":600},[583,6311,714],{"class":604},[583,6313,719],{"class":701},[583,6315,731],{"class":600},[583,6317,6318,6320,6322,6324,6326,6328,6330,6332,6334,6336,6338,6340],{"class":585,"line":1052},[583,6319,6291],{"class":679},[583,6321,682],{"class":701},[583,6323,3250],{"class":604},[583,6325,722],{"class":600},[583,6327,1403],{"class":604},[583,6329,608],{"class":600},[583,6331,1542],{"class":604},[583,6333,722],{"class":600},[583,6335,1436],{"class":604},[583,6337,722],{"class":600},[583,6339,1403],{"class":604},[583,6341,868],{"class":701},[583,6343,6344,6347],{"class":585,"line":1063},[583,6345,6346],{"class":701},"          )",[583,6348,731],{"class":600},[583,6350,6351,6354],{"class":585,"line":1106},[583,6352,6353],{"class":600},"        }",[583,6355,868],{"class":701},[583,6357,6358,6360],{"class":585,"line":1159},[583,6359,5283],{"class":600},[583,6361,4140],{"class":600},[583,6363,6364],{"class":585,"line":1166},[583,6365,660],{"emptyLinePlaceholder":659},[583,6367,6368],{"class":585,"line":1171},[583,6369,6370],{"class":589},"    // Set user context with organization\n",[583,6372,6373,6376,6378,6380,6382,6384,6386],{"class":585,"line":1208},[583,6374,6375],{"class":604},"    event",[583,6377,722],{"class":600},[583,6379,1431],{"class":604},[583,6381,722],{"class":600},[583,6383,1436],{"class":604},[583,6385,1545],{"class":600},[583,6387,695],{"class":600},[583,6389,6390,6393,6395,6397,6399,6401,6403,6405],{"class":585,"line":1225},[583,6391,6392],{"class":701},"      id",[583,6394,705],{"class":600},[583,6396,1542],{"class":604},[583,6398,722],{"class":600},[583,6400,1436],{"class":604},[583,6402,722],{"class":600},[583,6404,714],{"class":604},[583,6406,731],{"class":600},[583,6408,6409,6412,6414,6416,6418,6420,6422,6424],{"class":585,"line":1243},[583,6410,6411],{"class":701},"      email",[583,6413,705],{"class":600},[583,6415,1542],{"class":604},[583,6417,722],{"class":600},[583,6419,1436],{"class":604},[583,6421,722],{"class":600},[583,6423,1630],{"class":604},[583,6425,731],{"class":600},[583,6427,6428,6431,6433,6435,6437,6439,6441,6443],{"class":585,"line":1261},[583,6429,6430],{"class":701},"      name",[583,6432,705],{"class":600},[583,6434,1542],{"class":604},[583,6436,722],{"class":600},[583,6438,1436],{"class":604},[583,6440,722],{"class":600},[583,6442,748],{"class":604},[583,6444,731],{"class":600},[583,6446,6447,6450,6452,6454,6456,6458,6460],{"class":585,"line":1271},[583,6448,6449],{"class":701},"      organizationId",[583,6451,705],{"class":600},[583,6453,1542],{"class":604},[583,6455,722],{"class":600},[583,6457,1646],{"class":604},[583,6459,608],{"class":600},[583,6461,6462],{"class":589},"  // Current org\n",[583,6464,6465,6468,6470,6472,6474,6476,6478,6480,6482,6484,6486],{"class":585,"line":1288},[583,6466,6467],{"class":701},"      role",[583,6469,705],{"class":600},[583,6471,6239],{"class":604},[583,6473,1439],{"class":600},[583,6475,2428],{"class":604},[583,6477,4137],{"class":600},[583,6479,625],{"class":600},[583,6481,2472],{"class":628},[583,6483,685],{"class":600},[583,6485,608],{"class":600},[583,6487,6488],{"class":589},"      // Role in current org\n",[583,6490,6491],{"class":585,"line":1304},[583,6492,1448],{"class":600},[583,6494,6495],{"class":585,"line":1320},[583,6496,660],{"emptyLinePlaceholder":659},[583,6498,6499],{"class":585,"line":1329},[583,6500,6501],{"class":589},"    // Set permissions array (for simple permission checks)\n",[583,6503,6504,6506,6508,6510,6512,6515,6517],{"class":585,"line":2619},[583,6505,6375],{"class":604},[583,6507,722],{"class":600},[583,6509,1431],{"class":604},[583,6511,722],{"class":600},[583,6513,6514],{"class":604},"permissions",[583,6516,1545],{"class":600},[583,6518,6519],{"class":604}," activeMembership\n",[583,6521,6522,6524,6526,6529,6531,6533],{"class":585,"line":2625},[583,6523,5272],{"class":600},[583,6525,1919],{"class":701},[583,6527,6528],{"class":604},"activeMembership",[583,6530,722],{"class":600},[583,6532,2428],{"class":604},[583,6534,4299],{"class":701},[583,6536,6537,6539],{"class":585,"line":2663},[583,6538,5283],{"class":600},[583,6540,6541],{"class":701}," []\n",[583,6543,6544,6546],{"class":585,"line":2670},[583,6545,1264],{"class":600},[583,6547,868],{"class":701},[583,6549,6550,6552],{"class":585,"line":2675},[583,6551,865],{"class":600},[583,6553,868],{"class":604},[568,6555,6557],{"id":6556},"organization-switching","Organization Switching",[573,6559,6561],{"className":575,"code":6560,"language":577,"meta":578,"style":578},"// Frontend: Switch active organization\nasync function switchOrganization(orgId: string) {\n  await $fetch('/api/auth/organization/set-active', {\n    method: 'POST',\n    body: { organizationId: orgId },\n  })\n\n  // Refresh session\n  await refreshNuxtData()\n\n  // All subsequent API calls now use new org context\n}\n",[580,6562,6563,6568,6591,6612,6627,6646,6652,6656,6661,6670,6674,6679],{"__ignoreMap":578},[583,6564,6565],{"class":585,"line":586},[583,6566,6567],{"class":589},"// Frontend: Switch active organization\n",[583,6569,6570,6573,6575,6578,6580,6583,6585,6587,6589],{"class":585,"line":593},[583,6571,6572],{"class":669},"async",[583,6574,3972],{"class":669},[583,6576,6577],{"class":679}," switchOrganization",[583,6579,682],{"class":600},[583,6581,6582],{"class":1193},"orgId",[583,6584,705],{"class":600},[583,6586,4180],{"class":1696},[583,6588,719],{"class":600},[583,6590,695],{"class":600},[583,6592,6593,6596,6599,6601,6603,6606,6608,6610],{"class":585,"line":635},[583,6594,6595],{"class":596},"  await",[583,6597,6598],{"class":679}," $fetch",[583,6600,682],{"class":701},[583,6602,685],{"class":600},[583,6604,6605],{"class":628},"/api/auth/organization/set-active",[583,6607,685],{"class":600},[583,6609,608],{"class":600},[583,6611,695],{"class":600},[583,6613,6614,6617,6619,6621,6623,6625],{"class":585,"line":656},[583,6615,6616],{"class":701},"    method",[583,6618,705],{"class":600},[583,6620,625],{"class":600},[583,6622,1714],{"class":628},[583,6624,685],{"class":600},[583,6626,731],{"class":600},[583,6628,6629,6632,6634,6636,6638,6640,6643],{"class":585,"line":663},[583,6630,6631],{"class":701},"    body",[583,6633,705],{"class":600},[583,6635,601],{"class":600},[583,6637,4104],{"class":701},[583,6639,705],{"class":600},[583,6641,6642],{"class":604}," orgId",[583,6644,6645],{"class":600}," },\n",[583,6647,6648,6650],{"class":585,"line":698},[583,6649,1264],{"class":600},[583,6651,868],{"class":701},[583,6653,6654],{"class":585,"line":734},[583,6655,660],{"emptyLinePlaceholder":659},[583,6657,6658],{"class":585,"line":764},[583,6659,6660],{"class":589},"  // Refresh session\n",[583,6662,6663,6665,6668],{"class":585,"line":800},[583,6664,6595],{"class":596},[583,6666,6667],{"class":679}," refreshNuxtData",[583,6669,1060],{"class":701},[583,6671,6672],{"class":585,"line":862},[583,6673,660],{"emptyLinePlaceholder":659},[583,6675,6676],{"class":585,"line":871},[583,6677,6678],{"class":589},"  // All subsequent API calls now use new org context\n",[583,6680,6681],{"class":585,"line":876},[583,6682,3805],{"class":600},[568,6684,6686],{"id":6685},"better-auth-organization-schema","Better-Auth Organization Schema",[573,6688,6690],{"className":575,"code":6689,"language":577,"meta":578,"style":578},"// Better-Auth creates these tables automatically:\n// - organizations: { id, name, slug, createdAt, ... }\n// - members: { id, userId, organizationId, role, ... }\n// - sessions: { ..., activeOrganizationId }\n\n// You don't need to define them manually!\n",[580,6691,6692,6697,6702,6707,6712,6716],{"__ignoreMap":578},[583,6693,6694],{"class":585,"line":586},[583,6695,6696],{"class":589},"// Better-Auth creates these tables automatically:\n",[583,6698,6699],{"class":585,"line":593},[583,6700,6701],{"class":589},"// - organizations: { id, name, slug, createdAt, ... }\n",[583,6703,6704],{"class":585,"line":635},[583,6705,6706],{"class":589},"// - members: { id, userId, organizationId, role, ... }\n",[583,6708,6709],{"class":585,"line":656},[583,6710,6711],{"class":589},"// - sessions: { ..., activeOrganizationId }\n",[583,6713,6714],{"class":585,"line":663},[583,6715,660],{"emptyLinePlaceholder":659},[583,6717,6718],{"class":585,"line":698},[583,6719,6720],{"class":589},"// You don't need to define them manually!\n",[501,6722],{},[459,6724,6726],{"id":6725},"api-token-plugin-with-organizations","API Token Plugin with Organizations",[568,6728,527],{"id":6729},"configuration-1",[573,6731,6733],{"className":575,"code":6732,"language":577,"meta":578,"style":578},"// server/plugins/apiKeys.ts\nimport { createApiTokenPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default createApiTokenPlugin({\n  resources: {\n    apiKeys: {\n      userRelation: {\n        field: 'userId',\n        resource: 'users',\n      },\n      orgField: 'organizationId',  // ← Org scoping for tokens\n      scopeField: 'scopes',\n      expiresField: 'expiresAt',\n      lastUsedField: 'lastUsedAt',\n      authEnabled: true,\n    },\n  },\n\n  auth: {\n    enabled: true,\n    header: 'Authorization',\n    prefix: 'Bearer',\n    tokenPrefix: 'sk_',\n  },\n\n  mapUser: async (dbRow, db) => {\n    // Fetch user's role in the token's organization\n    const membership = await db.query.organizationMembers.findFirst({\n      where: and(\n        eq(organizationMembers.userId, dbRow.userId),\n        eq(organizationMembers.organizationId, dbRow.organizationId)\n      ),\n    })\n\n    return {\n      id: dbRow.userId,\n      email: dbRow.user?.email,\n      organizationId: dbRow.organizationId,  // Token's org\n      role: membership?.role ?? 'member',     // Role in that org\n    }\n  },\n})\n",[580,6734,6735,6740,6760,6764,6776,6785,6794,6803,6818,6833,6837,6855,6871,6887,6903,6914,6919,6923,6927,6936,6947,6963,6979,6995,6999,7003,7027,7032,7060,7071,7097,7119,7126,7132,7136,7142,7156,7174,7191,7216,7220,7224],{"__ignoreMap":578},[583,6736,6737],{"class":585,"line":586},[583,6738,6739],{"class":589},"// server/plugins/apiKeys.ts\n",[583,6741,6742,6744,6746,6749,6751,6753,6755,6758],{"class":585,"line":593},[583,6743,597],{"class":596},[583,6745,601],{"class":600},[583,6747,6748],{"class":604}," createApiTokenPlugin",[583,6750,619],{"class":600},[583,6752,622],{"class":596},[583,6754,625],{"class":600},[583,6756,6757],{"class":628},"@websideproject/nuxt-auto-api/plugins",[583,6759,632],{"class":600},[583,6761,6762],{"class":585,"line":635},[583,6763,660],{"emptyLinePlaceholder":659},[583,6765,6766,6768,6770,6772,6774],{"class":585,"line":656},[583,6767,666],{"class":596},[583,6769,1355],{"class":596},[583,6771,6748],{"class":679},[583,6773,682],{"class":604},[583,6775,1205],{"class":600},[583,6777,6778,6781,6783],{"class":585,"line":663},[583,6779,6780],{"class":701},"  resources",[583,6782,705],{"class":600},[583,6784,695],{"class":600},[583,6786,6787,6790,6792],{"class":585,"line":698},[583,6788,6789],{"class":701},"    apiKeys",[583,6791,705],{"class":600},[583,6793,695],{"class":600},[583,6795,6796,6799,6801],{"class":585,"line":734},[583,6797,6798],{"class":701},"      userRelation",[583,6800,705],{"class":600},[583,6802,695],{"class":600},[583,6804,6805,6808,6810,6812,6814,6816],{"class":585,"line":764},[583,6806,6807],{"class":701},"        field",[583,6809,705],{"class":600},[583,6811,625],{"class":600},[583,6813,2648],{"class":628},[583,6815,685],{"class":600},[583,6817,731],{"class":600},[583,6819,6820,6823,6825,6827,6829,6831],{"class":585,"line":800},[583,6821,6822],{"class":701},"        resource",[583,6824,705],{"class":600},[583,6826,625],{"class":600},[583,6828,2055],{"class":628},[583,6830,685],{"class":600},[583,6832,731],{"class":600},[583,6834,6835],{"class":585,"line":862},[583,6836,3428],{"class":600},[583,6838,6839,6842,6844,6846,6848,6850,6852],{"class":585,"line":871},[583,6840,6841],{"class":701},"      orgField",[583,6843,705],{"class":600},[583,6845,625],{"class":600},[583,6847,1403],{"class":628},[583,6849,685],{"class":600},[583,6851,608],{"class":600},[583,6853,6854],{"class":589},"  // ← Org scoping for tokens\n",[583,6856,6857,6860,6862,6864,6867,6869],{"class":585,"line":876},[583,6858,6859],{"class":701},"      scopeField",[583,6861,705],{"class":600},[583,6863,625],{"class":600},[583,6865,6866],{"class":628},"scopes",[583,6868,685],{"class":600},[583,6870,731],{"class":600},[583,6872,6873,6876,6878,6880,6883,6885],{"class":585,"line":903},[583,6874,6875],{"class":701},"      expiresField",[583,6877,705],{"class":600},[583,6879,625],{"class":600},[583,6881,6882],{"class":628},"expiresAt",[583,6884,685],{"class":600},[583,6886,731],{"class":600},[583,6888,6889,6892,6894,6896,6899,6901],{"class":585,"line":946},[583,6890,6891],{"class":701},"      lastUsedField",[583,6893,705],{"class":600},[583,6895,625],{"class":600},[583,6897,6898],{"class":628},"lastUsedAt",[583,6900,685],{"class":600},[583,6902,731],{"class":600},[583,6904,6905,6908,6910,6912],{"class":585,"line":975},[583,6906,6907],{"class":701},"      authEnabled",[583,6909,705],{"class":600},[583,6911,937],{"class":936},[583,6913,731],{"class":600},[583,6915,6916],{"class":585,"line":998},[583,6917,6918],{"class":600},"    },\n",[583,6920,6921],{"class":585,"line":1027},[583,6922,4839],{"class":600},[583,6924,6925],{"class":585,"line":1052},[583,6926,660],{"emptyLinePlaceholder":659},[583,6928,6929,6932,6934],{"class":585,"line":1063},[583,6930,6931],{"class":701},"  auth",[583,6933,705],{"class":600},[583,6935,695],{"class":600},[583,6937,6938,6941,6943,6945],{"class":585,"line":1106},[583,6939,6940],{"class":701},"    enabled",[583,6942,705],{"class":600},[583,6944,937],{"class":936},[583,6946,731],{"class":600},[583,6948,6949,6952,6954,6956,6959,6961],{"class":585,"line":1159},[583,6950,6951],{"class":701},"    header",[583,6953,705],{"class":600},[583,6955,625],{"class":600},[583,6957,6958],{"class":628},"Authorization",[583,6960,685],{"class":600},[583,6962,731],{"class":600},[583,6964,6965,6968,6970,6972,6975,6977],{"class":585,"line":1166},[583,6966,6967],{"class":701},"    prefix",[583,6969,705],{"class":600},[583,6971,625],{"class":600},[583,6973,6974],{"class":628},"Bearer",[583,6976,685],{"class":600},[583,6978,731],{"class":600},[583,6980,6981,6984,6986,6988,6991,6993],{"class":585,"line":1171},[583,6982,6983],{"class":701},"    tokenPrefix",[583,6985,705],{"class":600},[583,6987,625],{"class":600},[583,6989,6990],{"class":628},"sk_",[583,6992,685],{"class":600},[583,6994,731],{"class":600},[583,6996,6997],{"class":585,"line":1208},[583,6998,4839],{"class":600},[583,7000,7001],{"class":585,"line":1225},[583,7002,660],{"emptyLinePlaceholder":659},[583,7004,7005,7008,7010,7012,7014,7017,7019,7021,7023,7025],{"class":585,"line":1243},[583,7006,7007],{"class":679},"  mapUser",[583,7009,705],{"class":600},[583,7011,1524],{"class":669},[583,7013,1202],{"class":600},[583,7015,7016],{"class":1193},"dbRow",[583,7018,608],{"class":600},[583,7020,3858],{"class":1193},[583,7022,719],{"class":600},[583,7024,848],{"class":669},[583,7026,695],{"class":600},[583,7028,7029],{"class":585,"line":1261},[583,7030,7031],{"class":589},"    // Fetch user's role in the token's organization\n",[583,7033,7034,7036,7038,7040,7042,7044,7046,7048,7050,7052,7054,7056,7058],{"class":585,"line":1271},[583,7035,1539],{"class":669},[583,7037,4030],{"class":604},[583,7039,1545],{"class":600},[583,7041,1548],{"class":596},[583,7043,3858],{"class":604},[583,7045,722],{"class":600},[583,7047,4041],{"class":604},[583,7049,722],{"class":600},[583,7051,3250],{"class":604},[583,7053,722],{"class":600},[583,7055,4050],{"class":679},[583,7057,682],{"class":701},[583,7059,1205],{"class":600},[583,7061,7062,7065,7067,7069],{"class":585,"line":1288},[583,7063,7064],{"class":701},"      where",[583,7066,705],{"class":600},[583,7068,3898],{"class":679},[583,7070,3978],{"class":701},[583,7072,7073,7076,7078,7080,7082,7084,7086,7089,7091,7093,7095],{"class":585,"line":1304},[583,7074,7075],{"class":679},"        eq",[583,7077,682],{"class":701},[583,7079,3250],{"class":604},[583,7081,722],{"class":600},[583,7083,2648],{"class":604},[583,7085,608],{"class":600},[583,7087,7088],{"class":604}," dbRow",[583,7090,722],{"class":600},[583,7092,2648],{"class":604},[583,7094,719],{"class":701},[583,7096,731],{"class":600},[583,7098,7099,7101,7103,7105,7107,7109,7111,7113,7115,7117],{"class":585,"line":1320},[583,7100,7075],{"class":679},[583,7102,682],{"class":701},[583,7104,3250],{"class":604},[583,7106,722],{"class":600},[583,7108,1403],{"class":604},[583,7110,608],{"class":600},[583,7112,7088],{"class":604},[583,7114,722],{"class":600},[583,7116,1403],{"class":604},[583,7118,868],{"class":701},[583,7120,7121,7124],{"class":585,"line":1329},[583,7122,7123],{"class":701},"      )",[583,7125,731],{"class":600},[583,7127,7128,7130],{"class":585,"line":2619},[583,7129,5966],{"class":600},[583,7131,868],{"class":701},[583,7133,7134],{"class":585,"line":2625},[583,7135,660],{"emptyLinePlaceholder":659},[583,7137,7138,7140],{"class":585,"line":2663},[583,7139,4801],{"class":596},[583,7141,695],{"class":600},[583,7143,7144,7146,7148,7150,7152,7154],{"class":585,"line":2670},[583,7145,6392],{"class":701},[583,7147,705],{"class":600},[583,7149,7088],{"class":604},[583,7151,722],{"class":600},[583,7153,2648],{"class":604},[583,7155,731],{"class":600},[583,7157,7158,7160,7162,7164,7166,7168,7170,7172],{"class":585,"line":2675},[583,7159,6411],{"class":701},[583,7161,705],{"class":600},[583,7163,7088],{"class":604},[583,7165,722],{"class":600},[583,7167,1436],{"class":604},[583,7169,1439],{"class":600},[583,7171,1630],{"class":604},[583,7173,731],{"class":600},[583,7175,7176,7178,7180,7182,7184,7186,7188],{"class":585,"line":2681},[583,7177,6449],{"class":701},[583,7179,705],{"class":600},[583,7181,7088],{"class":604},[583,7183,722],{"class":600},[583,7185,1403],{"class":604},[583,7187,608],{"class":600},[583,7189,7190],{"class":589},"  // Token's org\n",[583,7192,7193,7195,7197,7199,7201,7203,7205,7207,7209,7211,7213],{"class":585,"line":2712},[583,7194,6467],{"class":701},[583,7196,705],{"class":600},[583,7198,4030],{"class":604},[583,7200,1439],{"class":600},[583,7202,2428],{"class":604},[583,7204,4137],{"class":600},[583,7206,625],{"class":600},[583,7208,2463],{"class":628},[583,7210,685],{"class":600},[583,7212,608],{"class":600},[583,7214,7215],{"class":589},"     // Role in that org\n",[583,7217,7218],{"class":585,"line":2727},[583,7219,1448],{"class":600},[583,7221,7222],{"class":585,"line":2743},[583,7223,4839],{"class":600},[583,7225,7226,7228],{"class":585,"line":2758},[583,7227,865],{"class":600},[583,7229,868],{"class":604},[568,7231,7233],{"id":7232},"api-keys-schema","API Keys Schema",[573,7235,7237],{"className":575,"code":7236,"language":577,"meta":578,"style":578},"// modules/api-tokens/schema.ts\nexport const apiKeys = sqliteTable('api_keys', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  name: text('name').notNull(),\n  key: text('key').notNull().unique(),  // SHA-256 hash\n  userId: integer('user_id')\n    .notNull()\n    .references(() => users.id, { onDelete: 'cascade' }),\n  organizationId: text('organization_id')  // ← Token scoped to org\n    .notNull()\n    .references(() => organizations.id, { onDelete: 'cascade' }),\n  scopes: text('scopes', { mode: 'json' }).$type\u003Cstring[]>(),\n  expiresAt: integer('expires_at', { mode: 'timestamp' }),\n  lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n  createdAt: integer('created_at', { mode: 'timestamp' })\n    .notNull()\n    .$defaultFn(() => new Date()),\n})\n",[580,7238,7239,7244,7270,7308,7334,7371,7389,7397,7435,7456,7464,7502,7555,7593,7631,7665,7673,7693],{"__ignoreMap":578},[583,7240,7241],{"class":585,"line":586},[583,7242,7243],{"class":589},"// modules/api-tokens/schema.ts\n",[583,7245,7246,7248,7250,7253,7255,7257,7259,7261,7264,7266,7268],{"class":585,"line":593},[583,7247,666],{"class":596},[583,7249,670],{"class":669},[583,7251,7252],{"class":604}," apiKeys ",[583,7254,676],{"class":600},[583,7256,605],{"class":679},[583,7258,682],{"class":604},[583,7260,685],{"class":600},[583,7262,7263],{"class":628},"api_keys",[583,7265,685],{"class":600},[583,7267,608],{"class":600},[583,7269,695],{"class":600},[583,7271,7272,7274,7276,7278,7280,7282,7284,7286,7288,7290,7292,7294,7296,7298,7300,7302,7304,7306],{"class":585,"line":635},[583,7273,702],{"class":701},[583,7275,705],{"class":600},[583,7277,616],{"class":679},[583,7279,682],{"class":604},[583,7281,685],{"class":600},[583,7283,714],{"class":628},[583,7285,685],{"class":600},[583,7287,719],{"class":604},[583,7289,722],{"class":600},[583,7291,725],{"class":679},[583,7293,682],{"class":604},[583,7295,928],{"class":600},[583,7297,931],{"class":701},[583,7299,705],{"class":600},[583,7301,937],{"class":936},[583,7303,619],{"class":600},[583,7305,719],{"class":604},[583,7307,731],{"class":600},[583,7309,7310,7312,7314,7316,7318,7320,7322,7324,7326,7328,7330,7332],{"class":585,"line":656},[583,7311,737],{"class":701},[583,7313,705],{"class":600},[583,7315,611],{"class":679},[583,7317,682],{"class":604},[583,7319,685],{"class":600},[583,7321,748],{"class":628},[583,7323,685],{"class":600},[583,7325,719],{"class":604},[583,7327,722],{"class":600},[583,7329,757],{"class":679},[583,7331,728],{"class":604},[583,7333,731],{"class":600},[583,7335,7336,7339,7341,7343,7345,7347,7350,7352,7354,7356,7358,7360,7362,7364,7366,7368],{"class":585,"line":663},[583,7337,7338],{"class":701},"  key",[583,7340,705],{"class":600},[583,7342,611],{"class":679},[583,7344,682],{"class":604},[583,7346,685],{"class":600},[583,7348,7349],{"class":628},"key",[583,7351,685],{"class":600},[583,7353,719],{"class":604},[583,7355,722],{"class":600},[583,7357,757],{"class":679},[583,7359,728],{"class":604},[583,7361,722],{"class":600},[583,7363,793],{"class":679},[583,7365,728],{"class":604},[583,7367,608],{"class":600},[583,7369,7370],{"class":589},"  // SHA-256 hash\n",[583,7372,7373,7375,7377,7379,7381,7383,7385,7387],{"class":585,"line":698},[583,7374,1001],{"class":701},[583,7376,705],{"class":600},[583,7378,616],{"class":679},[583,7380,682],{"class":604},[583,7382,685],{"class":600},[583,7384,1012],{"class":628},[583,7386,685],{"class":600},[583,7388,868],{"class":604},[583,7390,7391,7393,7395],{"class":585,"line":734},[583,7392,1055],{"class":600},[583,7394,757],{"class":679},[583,7396,1060],{"class":604},[583,7398,7399,7401,7403,7405,7407,7409,7411,7413,7415,7417,7419,7421,7423,7425,7427,7429,7431,7433],{"class":585,"line":764},[583,7400,1055],{"class":600},[583,7402,1068],{"class":679},[583,7404,682],{"class":604},[583,7406,728],{"class":600},[583,7408,848],{"class":669},[583,7410,2324],{"class":604},[583,7412,722],{"class":600},[583,7414,714],{"class":604},[583,7416,608],{"class":600},[583,7418,601],{"class":600},[583,7420,1088],{"class":701},[583,7422,705],{"class":600},[583,7424,625],{"class":600},[583,7426,1095],{"class":628},[583,7428,685],{"class":600},[583,7430,619],{"class":600},[583,7432,719],{"class":604},[583,7434,731],{"class":600},[583,7436,7437,7439,7441,7443,7445,7447,7449,7451,7453],{"class":585,"line":800},[583,7438,1030],{"class":701},[583,7440,705],{"class":600},[583,7442,611],{"class":679},[583,7444,682],{"class":604},[583,7446,685],{"class":600},[583,7448,1041],{"class":628},[583,7450,685],{"class":600},[583,7452,1046],{"class":604},[583,7454,7455],{"class":589},"// ← Token scoped to org\n",[583,7457,7458,7460,7462],{"class":585,"line":862},[583,7459,1055],{"class":600},[583,7461,757],{"class":679},[583,7463,1060],{"class":604},[583,7465,7466,7468,7470,7472,7474,7476,7478,7480,7482,7484,7486,7488,7490,7492,7494,7496,7498,7500],{"class":585,"line":871},[583,7467,1055],{"class":600},[583,7469,1068],{"class":679},[583,7471,682],{"class":604},[583,7473,728],{"class":600},[583,7475,848],{"class":669},[583,7477,1077],{"class":604},[583,7479,722],{"class":600},[583,7481,714],{"class":604},[583,7483,608],{"class":600},[583,7485,601],{"class":600},[583,7487,1088],{"class":701},[583,7489,705],{"class":600},[583,7491,625],{"class":600},[583,7493,1095],{"class":628},[583,7495,685],{"class":600},[583,7497,619],{"class":600},[583,7499,719],{"class":604},[583,7501,731],{"class":600},[583,7503,7504,7507,7509,7511,7513,7515,7517,7519,7521,7523,7525,7527,7529,7532,7534,7536,7538,7540,7543,7545,7547,7549,7551,7553],{"class":585,"line":876},[583,7505,7506],{"class":701},"  scopes",[583,7508,705],{"class":600},[583,7510,611],{"class":679},[583,7512,682],{"class":604},[583,7514,685],{"class":600},[583,7516,6866],{"class":628},[583,7518,685],{"class":600},[583,7520,608],{"class":600},[583,7522,601],{"class":600},[583,7524,823],{"class":701},[583,7526,705],{"class":600},[583,7528,625],{"class":600},[583,7530,7531],{"class":628},"json",[583,7533,685],{"class":600},[583,7535,619],{"class":600},[583,7537,719],{"class":604},[583,7539,722],{"class":600},[583,7541,7542],{"class":679},"$type",[583,7544,4009],{"class":600},[583,7546,3545],{"class":1696},[583,7548,3592],{"class":604},[583,7550,4020],{"class":600},[583,7552,728],{"class":604},[583,7554,731],{"class":600},[583,7556,7557,7560,7562,7564,7566,7568,7571,7573,7575,7577,7579,7581,7583,7585,7587,7589,7591],{"class":585,"line":903},[583,7558,7559],{"class":701},"  expiresAt",[583,7561,705],{"class":600},[583,7563,616],{"class":679},[583,7565,682],{"class":604},[583,7567,685],{"class":600},[583,7569,7570],{"class":628},"expires_at",[583,7572,685],{"class":600},[583,7574,608],{"class":600},[583,7576,601],{"class":600},[583,7578,823],{"class":701},[583,7580,705],{"class":600},[583,7582,625],{"class":600},[583,7584,830],{"class":628},[583,7586,685],{"class":600},[583,7588,619],{"class":600},[583,7590,719],{"class":604},[583,7592,731],{"class":600},[583,7594,7595,7598,7600,7602,7604,7606,7609,7611,7613,7615,7617,7619,7621,7623,7625,7627,7629],{"class":585,"line":946},[583,7596,7597],{"class":701},"  lastUsedAt",[583,7599,705],{"class":600},[583,7601,616],{"class":679},[583,7603,682],{"class":604},[583,7605,685],{"class":600},[583,7607,7608],{"class":628},"last_used_at",[583,7610,685],{"class":600},[583,7612,608],{"class":600},[583,7614,601],{"class":600},[583,7616,823],{"class":701},[583,7618,705],{"class":600},[583,7620,625],{"class":600},[583,7622,830],{"class":628},[583,7624,685],{"class":600},[583,7626,619],{"class":600},[583,7628,719],{"class":604},[583,7630,731],{"class":600},[583,7632,7633,7635,7637,7639,7641,7643,7645,7647,7649,7651,7653,7655,7657,7659,7661,7663],{"class":585,"line":975},[583,7634,803],{"class":701},[583,7636,705],{"class":600},[583,7638,616],{"class":679},[583,7640,682],{"class":604},[583,7642,685],{"class":600},[583,7644,814],{"class":628},[583,7646,685],{"class":600},[583,7648,608],{"class":600},[583,7650,601],{"class":600},[583,7652,823],{"class":701},[583,7654,705],{"class":600},[583,7656,625],{"class":600},[583,7658,830],{"class":628},[583,7660,685],{"class":600},[583,7662,619],{"class":600},[583,7664,868],{"class":604},[583,7666,7667,7669,7671],{"class":585,"line":998},[583,7668,1055],{"class":600},[583,7670,757],{"class":679},[583,7672,1060],{"class":604},[583,7674,7675,7677,7679,7681,7683,7685,7687,7689,7691],{"class":585,"line":1027},[583,7676,1055],{"class":600},[583,7678,841],{"class":679},[583,7680,682],{"class":604},[583,7682,728],{"class":600},[583,7684,848],{"class":669},[583,7686,851],{"class":600},[583,7688,854],{"class":679},[583,7690,857],{"class":604},[583,7692,731],{"class":600},[583,7694,7695,7697],{"class":585,"line":1052},[583,7696,865],{"class":600},[583,7698,868],{"class":604},[568,7700,7702],{"id":7701},"creating-organization-scoped-tokens","Creating Organization-Scoped Tokens",[573,7704,7706],{"className":575,"code":7705,"language":577,"meta":578,"style":578},"// Backend: Create token endpoint\nexport default defineEventHandler(async (event) => {\n  const user = event.context.user\n  if (!user?.organizationId) {\n    throw createError({ statusCode: 401, message: 'Unauthorized' })\n  }\n\n  // Generate token\n  const rawToken = `sk_${randomBytes(32).toString('hex')}`\n  const hashedKey = createHash('sha256').update(rawToken).digest('hex')\n\n  // Store with org scope\n  const apiKey = await db.insert(apiKeys).values({\n    name: 'My API Token',\n    key: hashedKey,\n    userId: user.id,\n    organizationId: user.organizationId,  // ← Bound to user's current org\n    scopes: ['posts:read', 'posts:write'],\n    expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), // 1 year\n  }).returning()\n\n  // Return raw token ONCE (never stored)\n  return {\n    id: apiKey.id,\n    token: rawToken,  // Show to user, they must save it\n    name: apiKey.name,\n    scopes: apiKey.scopes,\n    expiresAt: apiKey.expiresAt,\n  }\n})\n",[580,7707,7708,7713,7736,7755,7773,7811,7815,7819,7824,7870,7920,7924,7929,7961,7977,7988,8003,8021,8050,8104,8117,8121,8126,8132,8147,8161,8175,8189,8203,8207],{"__ignoreMap":578},[583,7709,7710],{"class":585,"line":586},[583,7711,7712],{"class":589},"// Backend: Create token endpoint\n",[583,7714,7715,7717,7719,7722,7724,7726,7728,7730,7732,7734],{"class":585,"line":593},[583,7716,666],{"class":596},[583,7718,1355],{"class":596},[583,7720,7721],{"class":679}," defineEventHandler",[583,7723,682],{"class":604},[583,7725,6572],{"class":669},[583,7727,1202],{"class":600},[583,7729,1419],{"class":1193},[583,7731,719],{"class":600},[583,7733,848],{"class":669},[583,7735,695],{"class":600},[583,7737,7738,7740,7742,7744,7746,7748,7750,7752],{"class":585,"line":635},[583,7739,4027],{"class":669},[583,7741,3452],{"class":604},[583,7743,1545],{"class":600},[583,7745,1426],{"class":604},[583,7747,722],{"class":600},[583,7749,1431],{"class":604},[583,7751,722],{"class":600},[583,7753,7754],{"class":604},"user\n",[583,7756,7757,7759,7761,7763,7765,7767,7769,7771],{"class":585,"line":656},[583,7758,4240],{"class":596},[583,7760,1202],{"class":701},[583,7762,4245],{"class":600},[583,7764,1436],{"class":604},[583,7766,1439],{"class":600},[583,7768,1403],{"class":604},[583,7770,1574],{"class":701},[583,7772,1205],{"class":600},[583,7774,7775,7778,7781,7783,7785,7788,7790,7793,7795,7798,7800,7802,7805,7807,7809],{"class":585,"line":663},[583,7776,7777],{"class":596},"    throw",[583,7779,7780],{"class":679}," createError",[583,7782,682],{"class":701},[583,7784,928],{"class":600},[583,7786,7787],{"class":701}," statusCode",[583,7789,705],{"class":600},[583,7791,7792],{"class":4519}," 401",[583,7794,608],{"class":600},[583,7796,7797],{"class":701}," message",[583,7799,705],{"class":600},[583,7801,625],{"class":600},[583,7803,7804],{"class":628},"Unauthorized",[583,7806,685],{"class":600},[583,7808,619],{"class":600},[583,7810,868],{"class":701},[583,7812,7813],{"class":585,"line":698},[583,7814,1453],{"class":600},[583,7816,7817],{"class":585,"line":734},[583,7818,660],{"emptyLinePlaceholder":659},[583,7820,7821],{"class":585,"line":764},[583,7822,7823],{"class":589},"  // Generate token\n",[583,7825,7826,7828,7831,7833,7836,7838,7841,7844,7846,7849,7851,7853,7856,7858,7860,7863,7865,7867],{"class":585,"line":800},[583,7827,4027],{"class":669},[583,7829,7830],{"class":604}," rawToken",[583,7832,1545],{"class":600},[583,7834,7835],{"class":600}," `",[583,7837,6990],{"class":628},[583,7839,7840],{"class":600},"${",[583,7842,7843],{"class":679},"randomBytes",[583,7845,682],{"class":604},[583,7847,7848],{"class":4519},"32",[583,7850,719],{"class":604},[583,7852,722],{"class":600},[583,7854,7855],{"class":679},"toString",[583,7857,682],{"class":604},[583,7859,685],{"class":600},[583,7861,7862],{"class":628},"hex",[583,7864,685],{"class":600},[583,7866,719],{"class":604},[583,7868,7869],{"class":600},"}`\n",[583,7871,7872,7874,7877,7879,7882,7884,7886,7889,7891,7893,7895,7898,7900,7903,7905,7907,7910,7912,7914,7916,7918],{"class":585,"line":862},[583,7873,4027],{"class":669},[583,7875,7876],{"class":604}," hashedKey",[583,7878,1545],{"class":600},[583,7880,7881],{"class":679}," createHash",[583,7883,682],{"class":701},[583,7885,685],{"class":600},[583,7887,7888],{"class":628},"sha256",[583,7890,685],{"class":600},[583,7892,719],{"class":701},[583,7894,722],{"class":600},[583,7896,7897],{"class":679},"update",[583,7899,682],{"class":701},[583,7901,7902],{"class":604},"rawToken",[583,7904,719],{"class":701},[583,7906,722],{"class":600},[583,7908,7909],{"class":679},"digest",[583,7911,682],{"class":701},[583,7913,685],{"class":600},[583,7915,7862],{"class":628},[583,7917,685],{"class":600},[583,7919,868],{"class":701},[583,7921,7922],{"class":585,"line":871},[583,7923,660],{"emptyLinePlaceholder":659},[583,7925,7926],{"class":585,"line":876},[583,7927,7928],{"class":589},"  // Store with org scope\n",[583,7930,7931,7933,7936,7938,7940,7942,7944,7946,7948,7951,7953,7955,7957,7959],{"class":585,"line":903},[583,7932,4027],{"class":669},[583,7934,7935],{"class":604}," apiKey",[583,7937,1545],{"class":600},[583,7939,1548],{"class":596},[583,7941,3858],{"class":604},[583,7943,722],{"class":600},[583,7945,5401],{"class":679},[583,7947,682],{"class":701},[583,7949,7950],{"class":604},"apiKeys",[583,7952,719],{"class":701},[583,7954,722],{"class":600},[583,7956,5408],{"class":679},[583,7958,682],{"class":701},[583,7960,1205],{"class":600},[583,7962,7963,7966,7968,7970,7973,7975],{"class":585,"line":946},[583,7964,7965],{"class":701},"    name",[583,7967,705],{"class":600},[583,7969,625],{"class":600},[583,7971,7972],{"class":628},"My API Token",[583,7974,685],{"class":600},[583,7976,731],{"class":600},[583,7978,7979,7982,7984,7986],{"class":585,"line":975},[583,7980,7981],{"class":701},"    key",[583,7983,705],{"class":600},[583,7985,7876],{"class":604},[583,7987,731],{"class":600},[583,7989,7990,7993,7995,7997,7999,8001],{"class":585,"line":998},[583,7991,7992],{"class":701},"    userId",[583,7994,705],{"class":600},[583,7996,3452],{"class":604},[583,7998,722],{"class":600},[583,8000,714],{"class":604},[583,8002,731],{"class":600},[583,8004,8005,8008,8010,8012,8014,8016,8018],{"class":585,"line":1027},[583,8006,8007],{"class":701},"    organizationId",[583,8009,705],{"class":600},[583,8011,3452],{"class":604},[583,8013,722],{"class":600},[583,8015,1403],{"class":604},[583,8017,608],{"class":600},[583,8019,8020],{"class":589},"  // ← Bound to user's current org\n",[583,8022,8023,8026,8028,8030,8032,8035,8037,8039,8041,8044,8046,8048],{"class":585,"line":1052},[583,8024,8025],{"class":701},"    scopes",[583,8027,705],{"class":600},[583,8029,1919],{"class":701},[583,8031,685],{"class":600},[583,8033,8034],{"class":628},"posts:read",[583,8036,685],{"class":600},[583,8038,608],{"class":600},[583,8040,625],{"class":600},[583,8042,8043],{"class":628},"posts:write",[583,8045,685],{"class":600},[583,8047,5959],{"class":701},[583,8049,731],{"class":600},[583,8051,8052,8055,8057,8059,8061,8063,8066,8068,8071,8074,8077,8080,8082,8084,8086,8088,8090,8092,8094,8097,8099,8101],{"class":585,"line":1063},[583,8053,8054],{"class":701},"    expiresAt",[583,8056,705],{"class":600},[583,8058,851],{"class":600},[583,8060,854],{"class":679},[583,8062,682],{"class":701},[583,8064,8065],{"class":604},"Date",[583,8067,722],{"class":600},[583,8069,8070],{"class":679},"now",[583,8072,8073],{"class":701},"() ",[583,8075,8076],{"class":600},"+",[583,8078,8079],{"class":4519}," 365",[583,8081,5787],{"class":600},[583,8083,6008],{"class":4519},[583,8085,5787],{"class":600},[583,8087,5999],{"class":4519},[583,8089,5787],{"class":600},[583,8091,5999],{"class":4519},[583,8093,5787],{"class":600},[583,8095,8096],{"class":4519}," 1000",[583,8098,719],{"class":701},[583,8100,608],{"class":600},[583,8102,8103],{"class":589}," // 1 year\n",[583,8105,8106,8108,8110,8112,8115],{"class":585,"line":1106},[583,8107,1264],{"class":600},[583,8109,719],{"class":701},[583,8111,722],{"class":600},[583,8113,8114],{"class":679},"returning",[583,8116,1060],{"class":701},[583,8118,8119],{"class":585,"line":1159},[583,8120,660],{"emptyLinePlaceholder":659},[583,8122,8123],{"class":585,"line":1166},[583,8124,8125],{"class":589},"  // Return raw token ONCE (never stored)\n",[583,8127,8128,8130],{"class":585,"line":1171},[583,8129,4128],{"class":596},[583,8131,695],{"class":600},[583,8133,8134,8137,8139,8141,8143,8145],{"class":585,"line":1208},[583,8135,8136],{"class":701},"    id",[583,8138,705],{"class":600},[583,8140,7935],{"class":604},[583,8142,722],{"class":600},[583,8144,714],{"class":604},[583,8146,731],{"class":600},[583,8148,8149,8152,8154,8156,8158],{"class":585,"line":1225},[583,8150,8151],{"class":701},"    token",[583,8153,705],{"class":600},[583,8155,7830],{"class":604},[583,8157,608],{"class":600},[583,8159,8160],{"class":589},"  // Show to user, they must save it\n",[583,8162,8163,8165,8167,8169,8171,8173],{"class":585,"line":1243},[583,8164,7965],{"class":701},[583,8166,705],{"class":600},[583,8168,7935],{"class":604},[583,8170,722],{"class":600},[583,8172,748],{"class":604},[583,8174,731],{"class":600},[583,8176,8177,8179,8181,8183,8185,8187],{"class":585,"line":1261},[583,8178,8025],{"class":701},[583,8180,705],{"class":600},[583,8182,7935],{"class":604},[583,8184,722],{"class":600},[583,8186,6866],{"class":604},[583,8188,731],{"class":600},[583,8190,8191,8193,8195,8197,8199,8201],{"class":585,"line":1271},[583,8192,8054],{"class":701},[583,8194,705],{"class":600},[583,8196,7935],{"class":604},[583,8198,722],{"class":600},[583,8200,6882],{"class":604},[583,8202,731],{"class":600},[583,8204,8205],{"class":585,"line":1288},[583,8206,1453],{"class":600},[583,8208,8209,8211],{"class":585,"line":1304},[583,8210,865],{"class":600},[583,8212,868],{"class":604},[568,8214,8216],{"id":8215},"using-organization-scoped-tokens","Using Organization-Scoped Tokens",[573,8218,8220],{"className":1682,"code":8219,"language":1684,"meta":578,"style":578},"# Token automatically sets organization context\ncurl -H \"Authorization: Bearer sk_abc123...\" \\\n  https://api.example.com/api/posts\n\n# Returns only posts from token's organization\n# Token cannot access other organizations\n",[580,8221,8222,8227,8245,8250,8254,8259],{"__ignoreMap":578},[583,8223,8224],{"class":585,"line":586},[583,8225,8226],{"class":589},"# Token automatically sets organization context\n",[583,8228,8229,8232,8235,8237,8240,8242],{"class":585,"line":593},[583,8230,8231],{"class":1696},"curl",[583,8233,8234],{"class":628}," -H",[583,8236,1728],{"class":600},[583,8238,8239],{"class":628},"Authorization: Bearer sk_abc123...",[583,8241,1734],{"class":600},[583,8243,8244],{"class":604}," \\\n",[583,8246,8247],{"class":585,"line":635},[583,8248,8249],{"class":628},"  https://api.example.com/api/posts\n",[583,8251,8252],{"class":585,"line":656},[583,8253,660],{"emptyLinePlaceholder":659},[583,8255,8256],{"class":585,"line":663},[583,8257,8258],{"class":589},"# Returns only posts from token's organization\n",[583,8260,8261],{"class":585,"line":698},[583,8262,8263],{"class":589},"# Token cannot access other organizations\n",[568,8265,8267],{"id":8266},"token-behavior-with-multi-tenancy","Token Behavior with Multi-Tenancy",[455,8269,8270,8271,705],{},"When API token plugin detects ",[580,8272,8273],{},"orgField",[508,8275,8276,8282,8355,8361],{},[469,8277,8278,8281],{},[472,8279,8280],{},"Extracts organization"," from token record",[469,8283,8284,8287,8288],{},[472,8285,8286],{},"Sets tenant context"," automatically:\n",[573,8289,8291],{"className":575,"code":8290,"language":577,"meta":578,"style":578},"context.tenant = {\n  id: token.organizationId,\n  field: 'organizationId',\n  canAccessAllTenants: false,  // Tokens are single-org only\n}\n",[580,8292,8293,8306,8321,8336,8351],{"__ignoreMap":578},[583,8294,8295,8297,8299,8302,8304],{"class":585,"line":586},[583,8296,1431],{"class":604},[583,8298,722],{"class":600},[583,8300,8301],{"class":604},"tenant ",[583,8303,676],{"class":600},[583,8305,695],{"class":600},[583,8307,8308,8310,8312,8315,8317,8319],{"class":585,"line":593},[583,8309,702],{"class":701},[583,8311,705],{"class":600},[583,8313,8314],{"class":604}," token",[583,8316,722],{"class":600},[583,8318,1403],{"class":604},[583,8320,731],{"class":600},[583,8322,8323,8326,8328,8330,8332,8334],{"class":585,"line":635},[583,8324,8325],{"class":701},"  field",[583,8327,705],{"class":600},[583,8329,625],{"class":600},[583,8331,1403],{"class":628},[583,8333,685],{"class":600},[583,8335,731],{"class":600},[583,8337,8338,8341,8343,8346,8348],{"class":585,"line":656},[583,8339,8340],{"class":701},"  canAccessAllTenants",[583,8342,705],{"class":600},[583,8344,8345],{"class":936}," false",[583,8347,608],{"class":600},[583,8349,8350],{"class":589},"  // Tokens are single-org only\n",[583,8352,8353],{"class":585,"line":663},[583,8354,3805],{"class":600},[469,8356,8357,8360],{},[472,8358,8359],{},"All operations scoped"," to token's organization",[469,8362,8363,8366],{},[472,8364,8365],{},"Cannot bypass"," tenant isolation (even if user is admin in another org)",[568,8368,8370],{"id":8369},"token-introspection","Token Introspection",[573,8372,8374],{"className":1682,"code":8373,"language":1684,"meta":578,"style":578},"GET /api/_token/introspect\nAuthorization: Bearer sk_abc123...\n\n{\n  \"data\": {\n    \"resource\": \"apiKeys\",\n    \"id\": 42,\n    \"name\": \"My API Token\",\n    \"scopes\": [\"posts:read\", \"posts:write\"],\n    \"organizationId\": \"org_a\",\n    \"expiresAt\": \"2026-01-01T00:00:00Z\",\n    \"lastUsedAt\": \"2026-02-08T10:30:00Z\"\n  }\n}\n",[580,8375,8376,8383,8394,8398,8402,8411,8426,8436,8451,8478,8493,8509,8524,8528],{"__ignoreMap":578},[583,8377,8378,8380],{"class":585,"line":586},[583,8379,1697],{"class":1696},[583,8381,8382],{"class":628}," /api/_token/introspect\n",[583,8384,8385,8388,8391],{"class":585,"line":593},[583,8386,8387],{"class":1696},"Authorization:",[583,8389,8390],{"class":628}," Bearer",[583,8392,8393],{"class":628}," sk_abc123...\n",[583,8395,8396],{"class":585,"line":635},[583,8397,660],{"emptyLinePlaceholder":659},[583,8399,8400],{"class":585,"line":656},[583,8401,1205],{"class":600},[583,8403,8404,8407,8409],{"class":585,"line":663},[583,8405,8406],{"class":1696},"  \"data\"",[583,8408,705],{"class":679},[583,8410,695],{"class":628},[583,8412,8413,8416,8418,8420,8422,8424],{"class":585,"line":698},[583,8414,8415],{"class":1696},"    \"resource\"",[583,8417,705],{"class":679},[583,8419,1728],{"class":600},[583,8421,7950],{"class":628},[583,8423,1734],{"class":600},[583,8425,731],{"class":628},[583,8427,8428,8431,8433],{"class":585,"line":734},[583,8429,8430],{"class":1696},"    \"id\"",[583,8432,705],{"class":679},[583,8434,8435],{"class":628}," 42,\n",[583,8437,8438,8441,8443,8445,8447,8449],{"class":585,"line":764},[583,8439,8440],{"class":1696},"    \"name\"",[583,8442,705],{"class":679},[583,8444,1728],{"class":600},[583,8446,7972],{"class":628},[583,8448,1734],{"class":600},[583,8450,731],{"class":628},[583,8452,8453,8456,8458,8460,8462,8464,8466,8469,8471,8473,8475],{"class":585,"line":800},[583,8454,8455],{"class":1696},"    \"scopes\"",[583,8457,705],{"class":679},[583,8459,1919],{"class":604},[583,8461,1734],{"class":600},[583,8463,8034],{"class":628},[583,8465,1734],{"class":600},[583,8467,8468],{"class":604},", ",[583,8470,1734],{"class":600},[583,8472,8043],{"class":628},[583,8474,1734],{"class":600},[583,8476,8477],{"class":628},"],\n",[583,8479,8480,8483,8485,8487,8489,8491],{"class":585,"line":862},[583,8481,8482],{"class":1696},"    \"organizationId\"",[583,8484,705],{"class":679},[583,8486,1728],{"class":600},[583,8488,5369],{"class":628},[583,8490,1734],{"class":600},[583,8492,731],{"class":628},[583,8494,8495,8498,8500,8502,8505,8507],{"class":585,"line":871},[583,8496,8497],{"class":1696},"    \"expiresAt\"",[583,8499,705],{"class":679},[583,8501,1728],{"class":600},[583,8503,8504],{"class":628},"2026-01-01T00:00:00Z",[583,8506,1734],{"class":600},[583,8508,731],{"class":628},[583,8510,8511,8514,8516,8518,8521],{"class":585,"line":876},[583,8512,8513],{"class":1696},"    \"lastUsedAt\"",[583,8515,705],{"class":679},[583,8517,1728],{"class":600},[583,8519,8520],{"class":628},"2026-02-08T10:30:00Z",[583,8522,8523],{"class":600},"\"\n",[583,8525,8526],{"class":585,"line":903},[583,8527,1453],{"class":600},[583,8529,8530],{"class":585,"line":946},[583,8531,3805],{"class":604},[501,8533],{},[459,8535,550],{"id":8536},"tenant-resolution-strategies",[568,8538,8540],{"id":8539},"_1-from-user-context-recommended","1. From User Context (Recommended)",[573,8542,8544],{"className":575,"code":8543,"language":577,"meta":578,"style":578},"multiTenancy: {\n  getTenantId: (event) => {\n    return event.context.user?.organizationId\n  }\n}\n",[580,8545,8546,8554,8571,8589,8593],{"__ignoreMap":578},[583,8547,8548,8550,8552],{"class":585,"line":586},[583,8549,3662],{"class":1696},[583,8551,705],{"class":600},[583,8553,695],{"class":600},[583,8555,8556,8559,8561,8563,8565,8567,8569],{"class":585,"line":593},[583,8557,8558],{"class":1696},"  getTenantId",[583,8560,705],{"class":600},[583,8562,1202],{"class":600},[583,8564,1419],{"class":1193},[583,8566,719],{"class":600},[583,8568,848],{"class":669},[583,8570,695],{"class":600},[583,8572,8573,8575,8577,8579,8581,8583,8585,8587],{"class":585,"line":635},[583,8574,4801],{"class":596},[583,8576,1426],{"class":604},[583,8578,722],{"class":600},[583,8580,1431],{"class":604},[583,8582,722],{"class":600},[583,8584,1436],{"class":604},[583,8586,1439],{"class":600},[583,8588,3423],{"class":604},[583,8590,8591],{"class":585,"line":656},[583,8592,1453],{"class":600},[583,8594,8595],{"class":585,"line":663},[583,8596,3805],{"class":600},[455,8598,8599,8602,8603,8606],{},[472,8600,8601],{},"Pros:"," Works with Better-Auth, simple\n",[472,8604,8605],{},"Use case:"," Standard SaaS with user login",[568,8608,8610],{"id":8609},"_2-from-subdomain","2. From Subdomain",[573,8612,8614],{"className":575,"code":8613,"language":577,"meta":578,"style":578},"multiTenancy: {\n  getTenantId: (event) => {\n    const host = event.node.req.headers.host\n    if (!host) return null\n\n    // Extract subdomain: acme.example.com → acme\n    const subdomain = host.split('.')[0]\n    if (subdomain === 'www' || subdomain === 'api') return null\n\n    return subdomain\n  }\n}\n",[580,8615,8616,8624,8640,8668,8685,8689,8694,8726,8763,8767,8774,8778],{"__ignoreMap":578},[583,8617,8618,8620,8622],{"class":585,"line":586},[583,8619,3662],{"class":1696},[583,8621,705],{"class":600},[583,8623,695],{"class":600},[583,8625,8626,8628,8630,8632,8634,8636,8638],{"class":585,"line":593},[583,8627,8558],{"class":1696},[583,8629,705],{"class":600},[583,8631,1202],{"class":600},[583,8633,1419],{"class":1193},[583,8635,719],{"class":600},[583,8637,848],{"class":669},[583,8639,695],{"class":600},[583,8641,8642,8644,8647,8649,8651,8653,8655,8657,8659,8661,8663,8665],{"class":585,"line":635},[583,8643,1539],{"class":669},[583,8645,8646],{"class":604}," host",[583,8648,1545],{"class":600},[583,8650,1426],{"class":604},[583,8652,722],{"class":600},[583,8654,6186],{"class":604},[583,8656,722],{"class":600},[583,8658,6191],{"class":604},[583,8660,722],{"class":600},[583,8662,6196],{"class":604},[583,8664,722],{"class":600},[583,8666,8667],{"class":604},"host\n",[583,8669,8670,8672,8674,8676,8679,8681,8683],{"class":585,"line":656},[583,8671,1566],{"class":596},[583,8673,1202],{"class":701},[583,8675,4245],{"class":600},[583,8677,8678],{"class":604},"host",[583,8680,1574],{"class":701},[583,8682,4252],{"class":596},[583,8684,4140],{"class":600},[583,8686,8687],{"class":585,"line":663},[583,8688,660],{"emptyLinePlaceholder":659},[583,8690,8691],{"class":585,"line":698},[583,8692,8693],{"class":589},"    // Extract subdomain: acme.example.com → acme\n",[583,8695,8696,8698,8701,8703,8705,8707,8710,8712,8714,8716,8718,8721,8724],{"class":585,"line":734},[583,8697,1539],{"class":669},[583,8699,8700],{"class":604}," subdomain",[583,8702,1545],{"class":600},[583,8704,8646],{"class":604},[583,8706,722],{"class":600},[583,8708,8709],{"class":679},"split",[583,8711,682],{"class":701},[583,8713,685],{"class":600},[583,8715,722],{"class":628},[583,8717,685],{"class":600},[583,8719,8720],{"class":701},")[",[583,8722,8723],{"class":4519},"0",[583,8725,4299],{"class":701},[583,8727,8728,8730,8732,8735,8737,8739,8742,8744,8747,8749,8751,8753,8755,8757,8759,8761],{"class":585,"line":764},[583,8729,1566],{"class":596},[583,8731,1202],{"class":701},[583,8733,8734],{"class":604},"subdomain",[583,8736,3459],{"class":600},[583,8738,625],{"class":600},[583,8740,8741],{"class":628},"www",[583,8743,685],{"class":600},[583,8745,8746],{"class":600}," ||",[583,8748,8700],{"class":604},[583,8750,3459],{"class":600},[583,8752,625],{"class":600},[583,8754,6163],{"class":628},[583,8756,685],{"class":600},[583,8758,1574],{"class":701},[583,8760,4252],{"class":596},[583,8762,4140],{"class":600},[583,8764,8765],{"class":585,"line":800},[583,8766,660],{"emptyLinePlaceholder":659},[583,8768,8769,8771],{"class":585,"line":862},[583,8770,4801],{"class":596},[583,8772,8773],{"class":604}," subdomain\n",[583,8775,8776],{"class":585,"line":871},[583,8777,1453],{"class":600},[583,8779,8780],{"class":585,"line":876},[583,8781,3805],{"class":600},[455,8783,8784,8786,8787,8789,8790,8468,8793],{},[472,8785,8601],{}," Tenant-specific URLs\n",[472,8788,8605],{}," ",[580,8791,8792],{},"acme.app.com",[580,8794,8795],{},"globex.app.com",[568,8797,8799],{"id":8798},"_3-from-header","3. From Header",[573,8801,8803],{"className":575,"code":8802,"language":577,"meta":578,"style":578},"multiTenancy: {\n  getTenantId: (event) => {\n    return getHeader(event, 'x-tenant-id')\n  }\n}\n",[580,8804,8805,8813,8829,8851,8855],{"__ignoreMap":578},[583,8806,8807,8809,8811],{"class":585,"line":586},[583,8808,3662],{"class":1696},[583,8810,705],{"class":600},[583,8812,695],{"class":600},[583,8814,8815,8817,8819,8821,8823,8825,8827],{"class":585,"line":593},[583,8816,8558],{"class":1696},[583,8818,705],{"class":600},[583,8820,1202],{"class":600},[583,8822,1419],{"class":1193},[583,8824,719],{"class":600},[583,8826,848],{"class":669},[583,8828,695],{"class":600},[583,8830,8831,8833,8836,8838,8840,8842,8844,8847,8849],{"class":585,"line":635},[583,8832,4801],{"class":596},[583,8834,8835],{"class":679}," getHeader",[583,8837,682],{"class":701},[583,8839,1419],{"class":604},[583,8841,608],{"class":600},[583,8843,625],{"class":600},[583,8845,8846],{"class":628},"x-tenant-id",[583,8848,685],{"class":600},[583,8850,868],{"class":701},[583,8852,8853],{"class":585,"line":656},[583,8854,1453],{"class":600},[583,8856,8857],{"class":585,"line":663},[583,8858,3805],{"class":600},[455,8860,8861,8863,8864,8866],{},[472,8862,8601],{}," Flexible, works with any client\n",[472,8865,8605],{}," Mobile apps, API integrations",[568,8868,8870],{"id":8869},"_4-from-jwt-claim","4. From JWT Claim",[573,8872,8874],{"className":575,"code":8873,"language":577,"meta":578,"style":578},"multiTenancy: {\n  getTenantId: (event) => {\n    const token = getHeader(event, 'authorization')?.replace('Bearer ', '')\n    if (!token) return null\n\n    const decoded = decodeJWT(token)\n    return decoded.organizationId\n  }\n}\n",[580,8875,8876,8884,8900,8946,8963,8967,8985,8995,8999],{"__ignoreMap":578},[583,8877,8878,8880,8882],{"class":585,"line":586},[583,8879,3662],{"class":1696},[583,8881,705],{"class":600},[583,8883,695],{"class":600},[583,8885,8886,8888,8890,8892,8894,8896,8898],{"class":585,"line":593},[583,8887,8558],{"class":1696},[583,8889,705],{"class":600},[583,8891,1202],{"class":600},[583,8893,1419],{"class":1193},[583,8895,719],{"class":600},[583,8897,848],{"class":669},[583,8899,695],{"class":600},[583,8901,8902,8904,8906,8908,8910,8912,8914,8916,8918,8921,8923,8925,8927,8930,8932,8934,8937,8939,8941,8944],{"class":585,"line":635},[583,8903,1539],{"class":669},[583,8905,8314],{"class":604},[583,8907,1545],{"class":600},[583,8909,8835],{"class":679},[583,8911,682],{"class":701},[583,8913,1419],{"class":604},[583,8915,608],{"class":600},[583,8917,625],{"class":600},[583,8919,8920],{"class":628},"authorization",[583,8922,685],{"class":600},[583,8924,719],{"class":701},[583,8926,1439],{"class":600},[583,8928,8929],{"class":679},"replace",[583,8931,682],{"class":701},[583,8933,685],{"class":600},[583,8935,8936],{"class":628},"Bearer ",[583,8938,685],{"class":600},[583,8940,608],{"class":600},[583,8942,8943],{"class":600}," ''",[583,8945,868],{"class":701},[583,8947,8948,8950,8952,8954,8957,8959,8961],{"class":585,"line":656},[583,8949,1566],{"class":596},[583,8951,1202],{"class":701},[583,8953,4245],{"class":600},[583,8955,8956],{"class":604},"token",[583,8958,1574],{"class":701},[583,8960,4252],{"class":596},[583,8962,4140],{"class":600},[583,8964,8965],{"class":585,"line":663},[583,8966,660],{"emptyLinePlaceholder":659},[583,8968,8969,8971,8974,8976,8979,8981,8983],{"class":585,"line":698},[583,8970,1539],{"class":669},[583,8972,8973],{"class":604}," decoded",[583,8975,1545],{"class":600},[583,8977,8978],{"class":679}," decodeJWT",[583,8980,682],{"class":701},[583,8982,8956],{"class":604},[583,8984,868],{"class":701},[583,8986,8987,8989,8991,8993],{"class":585,"line":734},[583,8988,4801],{"class":596},[583,8990,8973],{"class":604},[583,8992,722],{"class":600},[583,8994,3423],{"class":604},[583,8996,8997],{"class":585,"line":764},[583,8998,1453],{"class":600},[583,9000,9001],{"class":585,"line":800},[583,9002,3805],{"class":600},[455,9004,9005,9007,9008,9010],{},[472,9006,8601],{}," Embedded in auth token\n",[472,9009,8605],{}," External auth providers (Auth0, Clerk)",[568,9012,9014],{"id":9013},"_5-hybrid-approach","5. Hybrid Approach",[573,9016,9018],{"className":575,"code":9017,"language":577,"meta":578,"style":578},"multiTenancy: {\n  getTenantId: async (event) => {\n    // 1. Try user context (Better-Auth)\n    if (event.context.user?.organizationId) {\n      return event.context.user.organizationId\n    }\n\n    // 2. Try header (API clients)\n    const headerTenant = getHeader(event, 'x-tenant-id')\n    if (headerTenant) return headerTenant\n\n    // 3. Try subdomain (multi-site)\n    const host = event.node.req.headers.host\n    if (host) {\n      const subdomain = host.split('.')[0]\n      if (subdomain && subdomain !== 'www') return subdomain\n    }\n\n    return null\n  }\n}\n",[580,9019,9020,9028,9046,9051,9075,9094,9098,9102,9107,9132,9148,9152,9157,9183,9195,9224,9253,9257,9261,9267,9271],{"__ignoreMap":578},[583,9021,9022,9024,9026],{"class":585,"line":586},[583,9023,3662],{"class":1696},[583,9025,705],{"class":600},[583,9027,695],{"class":600},[583,9029,9030,9032,9034,9036,9038,9040,9042,9044],{"class":585,"line":593},[583,9031,8558],{"class":1696},[583,9033,705],{"class":600},[583,9035,1524],{"class":669},[583,9037,1202],{"class":600},[583,9039,1419],{"class":1193},[583,9041,719],{"class":600},[583,9043,848],{"class":669},[583,9045,695],{"class":600},[583,9047,9048],{"class":585,"line":635},[583,9049,9050],{"class":589},"    // 1. Try user context (Better-Auth)\n",[583,9052,9053,9055,9057,9059,9061,9063,9065,9067,9069,9071,9073],{"class":585,"line":656},[583,9054,1566],{"class":596},[583,9056,1202],{"class":701},[583,9058,1419],{"class":604},[583,9060,722],{"class":600},[583,9062,1431],{"class":604},[583,9064,722],{"class":600},[583,9066,1436],{"class":604},[583,9068,1439],{"class":600},[583,9070,1403],{"class":604},[583,9072,1574],{"class":701},[583,9074,1205],{"class":600},[583,9076,9077,9080,9082,9084,9086,9088,9090,9092],{"class":585,"line":663},[583,9078,9079],{"class":596},"      return",[583,9081,1426],{"class":604},[583,9083,722],{"class":600},[583,9085,1431],{"class":604},[583,9087,722],{"class":600},[583,9089,1436],{"class":604},[583,9091,722],{"class":600},[583,9093,3423],{"class":604},[583,9095,9096],{"class":585,"line":698},[583,9097,1448],{"class":600},[583,9099,9100],{"class":585,"line":734},[583,9101,660],{"emptyLinePlaceholder":659},[583,9103,9104],{"class":585,"line":764},[583,9105,9106],{"class":589},"    // 2. Try header (API clients)\n",[583,9108,9109,9111,9114,9116,9118,9120,9122,9124,9126,9128,9130],{"class":585,"line":800},[583,9110,1539],{"class":669},[583,9112,9113],{"class":604}," headerTenant",[583,9115,1545],{"class":600},[583,9117,8835],{"class":679},[583,9119,682],{"class":701},[583,9121,1419],{"class":604},[583,9123,608],{"class":600},[583,9125,625],{"class":600},[583,9127,8846],{"class":628},[583,9129,685],{"class":600},[583,9131,868],{"class":701},[583,9133,9134,9136,9138,9141,9143,9145],{"class":585,"line":862},[583,9135,1566],{"class":596},[583,9137,1202],{"class":701},[583,9139,9140],{"class":604},"headerTenant",[583,9142,1574],{"class":701},[583,9144,4252],{"class":596},[583,9146,9147],{"class":604}," headerTenant\n",[583,9149,9150],{"class":585,"line":871},[583,9151,660],{"emptyLinePlaceholder":659},[583,9153,9154],{"class":585,"line":876},[583,9155,9156],{"class":589},"    // 3. Try subdomain (multi-site)\n",[583,9158,9159,9161,9163,9165,9167,9169,9171,9173,9175,9177,9179,9181],{"class":585,"line":903},[583,9160,1539],{"class":669},[583,9162,8646],{"class":604},[583,9164,1545],{"class":600},[583,9166,1426],{"class":604},[583,9168,722],{"class":600},[583,9170,6186],{"class":604},[583,9172,722],{"class":600},[583,9174,6191],{"class":604},[583,9176,722],{"class":600},[583,9178,6196],{"class":604},[583,9180,722],{"class":600},[583,9182,8667],{"class":604},[583,9184,9185,9187,9189,9191,9193],{"class":585,"line":946},[583,9186,1566],{"class":596},[583,9188,1202],{"class":701},[583,9190,8678],{"class":604},[583,9192,1574],{"class":701},[583,9194,1205],{"class":600},[583,9196,9197,9200,9202,9204,9206,9208,9210,9212,9214,9216,9218,9220,9222],{"class":585,"line":975},[583,9198,9199],{"class":669},"      const",[583,9201,8700],{"class":604},[583,9203,1545],{"class":600},[583,9205,8646],{"class":604},[583,9207,722],{"class":600},[583,9209,8709],{"class":679},[583,9211,682],{"class":701},[583,9213,685],{"class":600},[583,9215,722],{"class":628},[583,9217,685],{"class":600},[583,9219,8720],{"class":701},[583,9221,8723],{"class":4519},[583,9223,4299],{"class":701},[583,9225,9226,9229,9231,9233,9236,9238,9241,9243,9245,9247,9249,9251],{"class":585,"line":998},[583,9227,9228],{"class":596},"      if",[583,9230,1202],{"class":701},[583,9232,8734],{"class":604},[583,9234,9235],{"class":600}," &&",[583,9237,8700],{"class":604},[583,9239,9240],{"class":600}," !==",[583,9242,625],{"class":600},[583,9244,8741],{"class":628},[583,9246,685],{"class":600},[583,9248,1574],{"class":701},[583,9250,4252],{"class":596},[583,9252,8773],{"class":604},[583,9254,9255],{"class":585,"line":1027},[583,9256,1448],{"class":600},[583,9258,9259],{"class":585,"line":1052},[583,9260,660],{"emptyLinePlaceholder":659},[583,9262,9263,9265],{"class":585,"line":1063},[583,9264,4801],{"class":596},[583,9266,4140],{"class":600},[583,9268,9269],{"class":585,"line":1106},[583,9270,1453],{"class":600},[583,9272,9273],{"class":585,"line":1159},[583,9274,3805],{"class":600},[501,9276],{},[459,9278,556],{"id":9279},"advanced-patterns",[568,9281,9283],{"id":9282},"superadmin-bypass","Superadmin Bypass",[573,9285,9287],{"className":575,"code":9286,"language":577,"meta":578,"style":578},"multiTenancy: {\n  allowCrossTenantAccess: (user) => {\n    // Superadmin can access all organizations\n    return user?.role === 'superadmin' || user?.permissions?.includes('cross_tenant_access')\n  }\n}\n\n// Superadmin queries\nGET /api/posts?organizationId=org_a  // Returns org_a posts\nGET /api/posts?organizationId=org_b  // Returns org_b posts\nGET /api/posts                        // Returns ALL posts (cross-tenant)\n",[580,9288,9289,9297,9314,9319,9360,9364,9368,9372,9377,9403,9427],{"__ignoreMap":578},[583,9290,9291,9293,9295],{"class":585,"line":586},[583,9292,3662],{"class":1696},[583,9294,705],{"class":600},[583,9296,695],{"class":600},[583,9298,9299,9302,9304,9306,9308,9310,9312],{"class":585,"line":593},[583,9300,9301],{"class":1696},"  allowCrossTenantAccess",[583,9303,705],{"class":600},[583,9305,1202],{"class":600},[583,9307,1436],{"class":1193},[583,9309,719],{"class":600},[583,9311,848],{"class":669},[583,9313,695],{"class":600},[583,9315,9316],{"class":585,"line":635},[583,9317,9318],{"class":589},"    // Superadmin can access all organizations\n",[583,9320,9321,9323,9325,9327,9329,9331,9333,9335,9337,9339,9341,9343,9345,9347,9349,9351,9353,9356,9358],{"class":585,"line":656},[583,9322,4801],{"class":596},[583,9324,3452],{"class":604},[583,9326,1439],{"class":600},[583,9328,2428],{"class":604},[583,9330,3459],{"class":600},[583,9332,625],{"class":600},[583,9334,3464],{"class":628},[583,9336,685],{"class":600},[583,9338,8746],{"class":600},[583,9340,3452],{"class":604},[583,9342,1439],{"class":600},[583,9344,6514],{"class":604},[583,9346,1439],{"class":600},[583,9348,4310],{"class":679},[583,9350,682],{"class":701},[583,9352,685],{"class":600},[583,9354,9355],{"class":628},"cross_tenant_access",[583,9357,685],{"class":600},[583,9359,868],{"class":701},[583,9361,9362],{"class":585,"line":663},[583,9363,1453],{"class":600},[583,9365,9366],{"class":585,"line":698},[583,9367,3805],{"class":600},[583,9369,9370],{"class":585,"line":734},[583,9371,660],{"emptyLinePlaceholder":659},[583,9373,9374],{"class":585,"line":764},[583,9375,9376],{"class":589},"// Superadmin queries\n",[583,9378,9379,9382,9385,9387,9389,9391,9393,9395,9397,9400],{"class":585,"line":800},[583,9380,9381],{"class":604},"GET ",[583,9383,9384],{"class":600},"/",[583,9386,6163],{"class":604},[583,9388,9384],{"class":600},[583,9390,894],{"class":604},[583,9392,4286],{"class":600},[583,9394,1403],{"class":604},[583,9396,676],{"class":600},[583,9398,9399],{"class":604},"org_a  ",[583,9401,9402],{"class":589},"// Returns org_a posts\n",[583,9404,9405,9407,9409,9411,9413,9415,9417,9419,9421,9424],{"class":585,"line":862},[583,9406,9381],{"class":604},[583,9408,9384],{"class":600},[583,9410,6163],{"class":604},[583,9412,9384],{"class":600},[583,9414,894],{"class":604},[583,9416,4286],{"class":600},[583,9418,1403],{"class":604},[583,9420,676],{"class":600},[583,9422,9423],{"class":604},"org_b  ",[583,9425,9426],{"class":589},"// Returns org_b posts\n",[583,9428,9429,9431,9433,9435,9437,9440],{"class":585,"line":871},[583,9430,9381],{"class":604},[583,9432,9384],{"class":600},[583,9434,6163],{"class":604},[583,9436,9384],{"class":600},[583,9438,9439],{"class":604},"posts                        ",[583,9441,9442],{"class":589},"// Returns ALL posts (cross-tenant)\n",[568,9444,9446],{"id":9445},"organization-isolation-levels","Organization Isolation Levels",[573,9448,9450],{"className":575,"code":9449,"language":577,"meta":578,"style":578},"// STRICT: Require tenant for all operations\nmultiTenancy: {\n  enabled: true,\n  requireTenant: true,  // 400 error if no tenant\n}\n\n// PERMISSIVE: Allow operations without tenant (returns global data)\nmultiTenancy: {\n  enabled: true,\n  requireTenant: false,  // Allow null tenant\n}\n",[580,9451,9452,9457,9465,9475,9489,9493,9497,9502,9510,9520,9533],{"__ignoreMap":578},[583,9453,9454],{"class":585,"line":586},[583,9455,9456],{"class":589},"// STRICT: Require tenant for all operations\n",[583,9458,9459,9461,9463],{"class":585,"line":593},[583,9460,3662],{"class":1696},[583,9462,705],{"class":600},[583,9464,695],{"class":600},[583,9466,9467,9469,9471,9473],{"class":585,"line":635},[583,9468,3671],{"class":1696},[583,9470,705],{"class":600},[583,9472,937],{"class":936},[583,9474,731],{"class":600},[583,9476,9477,9480,9482,9484,9486],{"class":585,"line":656},[583,9478,9479],{"class":1696},"  requireTenant",[583,9481,705],{"class":600},[583,9483,937],{"class":936},[583,9485,608],{"class":600},[583,9487,9488],{"class":589},"  // 400 error if no tenant\n",[583,9490,9491],{"class":585,"line":663},[583,9492,3805],{"class":600},[583,9494,9495],{"class":585,"line":698},[583,9496,660],{"emptyLinePlaceholder":659},[583,9498,9499],{"class":585,"line":734},[583,9500,9501],{"class":589},"// PERMISSIVE: Allow operations without tenant (returns global data)\n",[583,9503,9504,9506,9508],{"class":585,"line":764},[583,9505,3662],{"class":1696},[583,9507,705],{"class":600},[583,9509,695],{"class":600},[583,9511,9512,9514,9516,9518],{"class":585,"line":800},[583,9513,3671],{"class":1696},[583,9515,705],{"class":600},[583,9517,937],{"class":936},[583,9519,731],{"class":600},[583,9521,9522,9524,9526,9528,9530],{"class":585,"line":862},[583,9523,9479],{"class":1696},[583,9525,705],{"class":600},[583,9527,8345],{"class":936},[583,9529,608],{"class":600},[583,9531,9532],{"class":589},"  // Allow null tenant\n",[583,9534,9535],{"class":585,"line":871},[583,9536,3805],{"class":600},[568,9538,9540],{"id":9539},"resource-level-overrides","Resource-Level Overrides",[573,9542,9544],{"className":575,"code":9543,"language":577,"meta":578,"style":578},"// Global handler override\nexport default defineAutoApiHandler({\n  resource: 'users',\n\n  // Disable multi-tenancy for this resource\n  multiTenancy: {\n    enabled: false,\n  },\n\n  operations: {\n    list: true,\n    // ...\n  },\n})\n",[580,9545,9546,9551,9564,9579,9583,9588,9597,9607,9611,9615,9624,9635,9640,9644],{"__ignoreMap":578},[583,9547,9548],{"class":585,"line":586},[583,9549,9550],{"class":589},"// Global handler override\n",[583,9552,9553,9555,9557,9560,9562],{"class":585,"line":593},[583,9554,666],{"class":596},[583,9556,1355],{"class":596},[583,9558,9559],{"class":679}," defineAutoApiHandler",[583,9561,682],{"class":604},[583,9563,1205],{"class":600},[583,9565,9566,9569,9571,9573,9575,9577],{"class":585,"line":635},[583,9567,9568],{"class":701},"  resource",[583,9570,705],{"class":600},[583,9572,625],{"class":600},[583,9574,2055],{"class":628},[583,9576,685],{"class":600},[583,9578,731],{"class":600},[583,9580,9581],{"class":585,"line":656},[583,9582,660],{"emptyLinePlaceholder":659},[583,9584,9585],{"class":585,"line":663},[583,9586,9587],{"class":589},"  // Disable multi-tenancy for this resource\n",[583,9589,9590,9593,9595],{"class":585,"line":698},[583,9591,9592],{"class":701},"  multiTenancy",[583,9594,705],{"class":600},[583,9596,695],{"class":600},[583,9598,9599,9601,9603,9605],{"class":585,"line":734},[583,9600,6940],{"class":701},[583,9602,705],{"class":600},[583,9604,8345],{"class":936},[583,9606,731],{"class":600},[583,9608,9609],{"class":585,"line":764},[583,9610,4839],{"class":600},[583,9612,9613],{"class":585,"line":800},[583,9614,660],{"emptyLinePlaceholder":659},[583,9616,9617,9620,9622],{"class":585,"line":862},[583,9618,9619],{"class":701},"  operations",[583,9621,705],{"class":600},[583,9623,695],{"class":600},[583,9625,9626,9629,9631,9633],{"class":585,"line":871},[583,9627,9628],{"class":701},"    list",[583,9630,705],{"class":600},[583,9632,937],{"class":936},[583,9634,731],{"class":600},[583,9636,9637],{"class":585,"line":876},[583,9638,9639],{"class":589},"    // ...\n",[583,9641,9642],{"class":585,"line":903},[583,9643,4839],{"class":600},[583,9645,9646,9648],{"class":585,"line":946},[583,9647,865],{"class":600},[583,9649,868],{"class":604},[568,9651,9653],{"id":9652},"audit-logging-with-organization-context","Audit Logging with Organization Context",[573,9655,9657],{"className":575,"code":9656,"language":577,"meta":578,"style":578},"// server/plugins/audit.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('autoApi:afterCreate', async (result, context) => {\n    await db.insert(auditLogs).values({\n      action: 'create',\n      resource: context.resource,\n      resourceId: result.id,\n      userId: context.user?.id,\n      organizationId: context.tenant?.id,  // ← Org context\n      timestamp: new Date(),\n    })\n  })\n})\n",[580,9658,9659,9664,9684,9724,9750,9766,9782,9798,9817,9838,9853,9859,9865],{"__ignoreMap":578},[583,9660,9661],{"class":585,"line":586},[583,9662,9663],{"class":589},"// server/plugins/audit.ts\n",[583,9665,9666,9668,9670,9672,9674,9676,9678,9680,9682],{"class":585,"line":593},[583,9667,666],{"class":596},[583,9669,1355],{"class":596},[583,9671,1482],{"class":679},[583,9673,682],{"class":604},[583,9675,682],{"class":600},[583,9677,1489],{"class":1193},[583,9679,719],{"class":600},[583,9681,848],{"class":669},[583,9683,695],{"class":600},[583,9685,9686,9688,9690,9692,9694,9696,9698,9700,9703,9705,9707,9709,9711,9714,9716,9718,9720,9722],{"class":585,"line":635},[583,9687,1500],{"class":604},[583,9689,722],{"class":600},[583,9691,1505],{"class":604},[583,9693,722],{"class":600},[583,9695,1510],{"class":679},[583,9697,682],{"class":701},[583,9699,685],{"class":600},[583,9701,9702],{"class":628},"autoApi:afterCreate",[583,9704,685],{"class":600},[583,9706,608],{"class":600},[583,9708,1524],{"class":669},[583,9710,1202],{"class":600},[583,9712,9713],{"class":1193},"result",[583,9715,608],{"class":600},[583,9717,4767],{"class":1193},[583,9719,719],{"class":600},[583,9721,848],{"class":669},[583,9723,695],{"class":600},[583,9725,9726,9729,9731,9733,9735,9737,9740,9742,9744,9746,9748],{"class":585,"line":656},[583,9727,9728],{"class":596},"    await",[583,9730,3858],{"class":604},[583,9732,722],{"class":600},[583,9734,5401],{"class":679},[583,9736,682],{"class":701},[583,9738,9739],{"class":604},"auditLogs",[583,9741,719],{"class":701},[583,9743,722],{"class":600},[583,9745,5408],{"class":679},[583,9747,682],{"class":701},[583,9749,1205],{"class":600},[583,9751,9752,9755,9757,9759,9762,9764],{"class":585,"line":663},[583,9753,9754],{"class":701},"      action",[583,9756,705],{"class":600},[583,9758,625],{"class":600},[583,9760,9761],{"class":628},"create",[583,9763,685],{"class":600},[583,9765,731],{"class":600},[583,9767,9768,9771,9773,9775,9777,9780],{"class":585,"line":698},[583,9769,9770],{"class":701},"      resource",[583,9772,705],{"class":600},[583,9774,4767],{"class":604},[583,9776,722],{"class":600},[583,9778,9779],{"class":604},"resource",[583,9781,731],{"class":600},[583,9783,9784,9787,9789,9792,9794,9796],{"class":585,"line":734},[583,9785,9786],{"class":701},"      resourceId",[583,9788,705],{"class":600},[583,9790,9791],{"class":604}," result",[583,9793,722],{"class":600},[583,9795,714],{"class":604},[583,9797,731],{"class":600},[583,9799,9800,9803,9805,9807,9809,9811,9813,9815],{"class":585,"line":764},[583,9801,9802],{"class":701},"      userId",[583,9804,705],{"class":600},[583,9806,4767],{"class":604},[583,9808,722],{"class":600},[583,9810,1436],{"class":604},[583,9812,1439],{"class":600},[583,9814,714],{"class":604},[583,9816,731],{"class":600},[583,9818,9819,9821,9823,9825,9827,9829,9831,9833,9835],{"class":585,"line":800},[583,9820,6449],{"class":701},[583,9822,705],{"class":600},[583,9824,4767],{"class":604},[583,9826,722],{"class":600},[583,9828,4820],{"class":604},[583,9830,1439],{"class":600},[583,9832,714],{"class":604},[583,9834,608],{"class":600},[583,9836,9837],{"class":589},"  // ← Org context\n",[583,9839,9840,9843,9845,9847,9849,9851],{"class":585,"line":862},[583,9841,9842],{"class":701},"      timestamp",[583,9844,705],{"class":600},[583,9846,851],{"class":600},[583,9848,854],{"class":679},[583,9850,728],{"class":701},[583,9852,731],{"class":600},[583,9854,9855,9857],{"class":585,"line":871},[583,9856,5966],{"class":600},[583,9858,868],{"class":701},[583,9860,9861,9863],{"class":585,"line":876},[583,9862,1264],{"class":600},[583,9864,868],{"class":701},[583,9866,9867,9869],{"class":585,"line":903},[583,9868,865],{"class":600},[583,9870,868],{"class":604},[501,9872],{},[459,9874,271],{"id":9875},"testing",[568,9877,9879],{"id":9878},"test-setup","Test Setup",[573,9881,9883],{"className":575,"code":9882,"language":577,"meta":578,"style":578},"// test/multi-tenancy.test.ts\nimport { describe, it, expect, beforeEach } from 'vitest'\nimport { db } from '../server/database/db'\nimport { organizations, organizationMembers, users, posts } from '../server/database/schema'\n\ndescribe('Multi-Tenancy', () => {\n  let org1: any, org2: any\n  let user1: any, user2: any\n  let adminUser: any\n\n  beforeEach(async () => {\n    // Create organizations\n    [org1, org2] = await db.insert(organizations).values([\n      { id: 'org_a', name: 'Acme Corp', slug: 'acme' },\n      { id: 'org_b', name: 'Globex Inc', slug: 'globex' },\n    ]).returning()\n\n    // Create users\n    [user1, user2, adminUser] = await db.insert(users).values([\n      { email: 'alice@acme.com', name: 'Alice' },\n      { email: 'bob@globex.com', name: 'Bob' },\n      { email: 'admin@example.com', name: 'Admin' },\n    ]).returning()\n\n    // Create memberships\n    await db.insert(organizationMembers).values([\n      { userId: user1.id, organizationId: org1.id, role: 'admin' },\n      { userId: user2.id, organizationId: org2.id, role: 'member' },\n      { userId: adminUser.id, organizationId: org1.id, role: 'owner' },\n      { userId: adminUser.id, organizationId: org2.id, role: 'owner' },\n    ])\n  })\n\n  it('lists posts scoped to user organization', async () => {\n    // Create posts in different orgs\n    await db.insert(posts).values([\n      { title: 'Post 1', organizationId: org1.id, authorId: user1.id },\n      { title: 'Post 2', organizationId: org2.id, authorId: user2.id },\n    ])\n\n    // User 1 (Org A) can only see Org A posts\n    const response1 = await $fetch('/api/posts', {\n      headers: { cookie: `session=${user1Session}` },\n    })\n    expect(response1.data).toHaveLength(1)\n    expect(response1.data[0].title).toBe('Post 1')\n\n    // User 2 (Org B) can only see Org B posts\n    const response2 = await $fetch('/api/posts', {\n      headers: { cookie: `session=${user2Session}` },\n    })\n    expect(response2.data).toHaveLength(1)\n    expect(response2.data[0].title).toBe('Post 2')\n  })\n\n  it('auto-assigns organization on create', async () => {\n    const newPost = await $fetch('/api/posts', {\n      method: 'POST',\n      body: { title: 'New Post', content: 'Test' },\n      headers: { cookie: `session=${user1Session}` },\n    })\n\n    expect(newPost.organizationId).toBe(org1.id)\n  })\n\n  it('blocks cross-organization access', async () => {\n    const org2Post = await db.insert(posts).values({\n      title: 'Org B Post',\n      organizationId: org2.id,\n      authorId: user2.id,\n    }).returning()\n\n    // User 1 (Org A) cannot access Org B post\n    await expect(\n      $fetch(`/api/posts/${org2Post[0].id}`, {\n        headers: { cookie: `session=${user1Session}` },\n      })\n    ).rejects.toThrow(/404|403/)\n  })\n\n  it('allows superadmin cross-tenant access', async () => {\n    const adminSession = await createSession(adminUser, org1.id)\n\n    // Admin can access all organizations' posts\n    const response = await $fetch('/api/posts', {\n      headers: { cookie: `session=${adminSession}` },\n    })\n\n    expect(response.data.length).toBeGreaterThanOrEqual(2)\n  })\n})\n",[580,9884,9885,9890,9925,9944,9976,9980,10002,10025,10045,10056,10060,10075,10080,10116,10161,10203,10214,10218,10223,10262,10293,10323,10352,10362,10366,10371,10393,10433,10473,10513,10553,10558,10564,10568,10592,10597,10619,10662,10703,10707,10711,10716,10742,10770,10776,10804,10843,10847,10852,10877,10902,10908,10933,10971,10977,10981,11004,11029,11044,11079,11103,11109,11113,11142,11148,11152,11175,11206,11222,11237,11253,11266,11271,11277,11286,11319,11345,11353,11385,11392,11397,11421,11451,11456,11462,11488,11514,11521,11526,11559,11566],{"__ignoreMap":578},[583,9886,9887],{"class":585,"line":586},[583,9888,9889],{"class":589},"// test/multi-tenancy.test.ts\n",[583,9891,9892,9894,9896,9899,9901,9904,9906,9909,9911,9914,9916,9918,9920,9923],{"class":585,"line":593},[583,9893,597],{"class":596},[583,9895,601],{"class":600},[583,9897,9898],{"class":604}," describe",[583,9900,608],{"class":600},[583,9902,9903],{"class":604}," it",[583,9905,608],{"class":600},[583,9907,9908],{"class":604}," expect",[583,9910,608],{"class":600},[583,9912,9913],{"class":604}," beforeEach",[583,9915,619],{"class":600},[583,9917,622],{"class":596},[583,9919,625],{"class":600},[583,9921,9922],{"class":628},"vitest",[583,9924,632],{"class":600},[583,9926,9927,9929,9931,9933,9935,9937,9939,9942],{"class":585,"line":635},[583,9928,597],{"class":596},[583,9930,601],{"class":600},[583,9932,3858],{"class":604},[583,9934,619],{"class":600},[583,9936,622],{"class":596},[583,9938,625],{"class":600},[583,9940,9941],{"class":628},"../server/database/db",[583,9943,632],{"class":600},[583,9945,9946,9948,9950,9952,9954,9956,9958,9960,9962,9965,9967,9969,9971,9974],{"class":585,"line":656},[583,9947,597],{"class":596},[583,9949,601],{"class":600},[583,9951,1077],{"class":604},[583,9953,608],{"class":600},[583,9955,3878],{"class":604},[583,9957,608],{"class":600},[583,9959,2324],{"class":604},[583,9961,608],{"class":600},[583,9963,9964],{"class":604}," posts",[583,9966,619],{"class":600},[583,9968,622],{"class":596},[583,9970,625],{"class":600},[583,9972,9973],{"class":628},"../server/database/schema",[583,9975,632],{"class":600},[583,9977,9978],{"class":585,"line":663},[583,9979,660],{"emptyLinePlaceholder":659},[583,9981,9982,9985,9987,9989,9991,9993,9995,9998,10000],{"class":585,"line":698},[583,9983,9984],{"class":679},"describe",[583,9986,682],{"class":604},[583,9988,685],{"class":600},[583,9990,235],{"class":628},[583,9992,685],{"class":600},[583,9994,608],{"class":600},[583,9996,9997],{"class":600}," ()",[583,9999,848],{"class":669},[583,10001,695],{"class":600},[583,10003,10004,10007,10010,10012,10015,10017,10020,10022],{"class":585,"line":734},[583,10005,10006],{"class":669},"  let",[583,10008,10009],{"class":604}," org1",[583,10011,705],{"class":600},[583,10013,10014],{"class":1696}," any",[583,10016,608],{"class":600},[583,10018,10019],{"class":604}," org2",[583,10021,705],{"class":600},[583,10023,10024],{"class":1696}," any\n",[583,10026,10027,10029,10032,10034,10036,10038,10041,10043],{"class":585,"line":764},[583,10028,10006],{"class":669},[583,10030,10031],{"class":604}," user1",[583,10033,705],{"class":600},[583,10035,10014],{"class":1696},[583,10037,608],{"class":600},[583,10039,10040],{"class":604}," user2",[583,10042,705],{"class":600},[583,10044,10024],{"class":1696},[583,10046,10047,10049,10052,10054],{"class":585,"line":800},[583,10048,10006],{"class":669},[583,10050,10051],{"class":604}," adminUser",[583,10053,705],{"class":600},[583,10055,10024],{"class":1696},[583,10057,10058],{"class":585,"line":862},[583,10059,660],{"emptyLinePlaceholder":659},[583,10061,10062,10065,10067,10069,10071,10073],{"class":585,"line":871},[583,10063,10064],{"class":679},"  beforeEach",[583,10066,682],{"class":701},[583,10068,6572],{"class":669},[583,10070,9997],{"class":600},[583,10072,848],{"class":669},[583,10074,695],{"class":600},[583,10076,10077],{"class":585,"line":876},[583,10078,10079],{"class":589},"    // Create organizations\n",[583,10081,10082,10085,10088,10090,10092,10094,10096,10098,10100,10102,10104,10106,10108,10110,10112,10114],{"class":585,"line":903},[583,10083,10084],{"class":701},"    [",[583,10086,10087],{"class":604},"org1",[583,10089,608],{"class":600},[583,10091,10019],{"class":604},[583,10093,1947],{"class":701},[583,10095,676],{"class":600},[583,10097,1548],{"class":596},[583,10099,3858],{"class":604},[583,10101,722],{"class":600},[583,10103,5401],{"class":679},[583,10105,682],{"class":701},[583,10107,688],{"class":604},[583,10109,719],{"class":701},[583,10111,722],{"class":600},[583,10113,5408],{"class":679},[583,10115,5411],{"class":701},[583,10117,10118,10121,10123,10125,10127,10129,10131,10133,10136,10138,10140,10143,10145,10147,10150,10152,10154,10157,10159],{"class":585,"line":946},[583,10119,10120],{"class":600},"      {",[583,10122,5528],{"class":701},[583,10124,705],{"class":600},[583,10126,625],{"class":600},[583,10128,5369],{"class":628},[583,10130,685],{"class":600},[583,10132,608],{"class":600},[583,10134,10135],{"class":701}," name",[583,10137,705],{"class":600},[583,10139,625],{"class":600},[583,10141,10142],{"class":628},"Acme Corp",[583,10144,685],{"class":600},[583,10146,608],{"class":600},[583,10148,10149],{"class":701}," slug",[583,10151,705],{"class":600},[583,10153,625],{"class":600},[583,10155,10156],{"class":628},"acme",[583,10158,685],{"class":600},[583,10160,6645],{"class":600},[583,10162,10163,10165,10167,10169,10171,10173,10175,10177,10179,10181,10183,10186,10188,10190,10192,10194,10196,10199,10201],{"class":585,"line":975},[583,10164,10120],{"class":600},[583,10166,5528],{"class":701},[583,10168,705],{"class":600},[583,10170,625],{"class":600},[583,10172,5473],{"class":628},[583,10174,685],{"class":600},[583,10176,608],{"class":600},[583,10178,10135],{"class":701},[583,10180,705],{"class":600},[583,10182,625],{"class":600},[583,10184,10185],{"class":628},"Globex Inc",[583,10187,685],{"class":600},[583,10189,608],{"class":600},[583,10191,10149],{"class":701},[583,10193,705],{"class":600},[583,10195,625],{"class":600},[583,10197,10198],{"class":628},"globex",[583,10200,685],{"class":600},[583,10202,6645],{"class":600},[583,10204,10205,10208,10210,10212],{"class":585,"line":998},[583,10206,10207],{"class":701},"    ])",[583,10209,722],{"class":600},[583,10211,8114],{"class":679},[583,10213,1060],{"class":701},[583,10215,10216],{"class":585,"line":1027},[583,10217,660],{"emptyLinePlaceholder":659},[583,10219,10220],{"class":585,"line":1052},[583,10221,10222],{"class":589},"    // Create users\n",[583,10224,10225,10227,10230,10232,10234,10236,10238,10240,10242,10244,10246,10248,10250,10252,10254,10256,10258,10260],{"class":585,"line":1063},[583,10226,10084],{"class":701},[583,10228,10229],{"class":604},"user1",[583,10231,608],{"class":600},[583,10233,10040],{"class":604},[583,10235,608],{"class":600},[583,10237,10051],{"class":604},[583,10239,1947],{"class":701},[583,10241,676],{"class":600},[583,10243,1548],{"class":596},[583,10245,3858],{"class":604},[583,10247,722],{"class":600},[583,10249,5401],{"class":679},[583,10251,682],{"class":701},[583,10253,2055],{"class":604},[583,10255,719],{"class":701},[583,10257,722],{"class":600},[583,10259,5408],{"class":679},[583,10261,5411],{"class":701},[583,10263,10264,10266,10269,10271,10273,10276,10278,10280,10282,10284,10286,10289,10291],{"class":585,"line":1106},[583,10265,10120],{"class":600},[583,10267,10268],{"class":701}," email",[583,10270,705],{"class":600},[583,10272,625],{"class":600},[583,10274,10275],{"class":628},"alice@acme.com",[583,10277,685],{"class":600},[583,10279,608],{"class":600},[583,10281,10135],{"class":701},[583,10283,705],{"class":600},[583,10285,625],{"class":600},[583,10287,10288],{"class":628},"Alice",[583,10290,685],{"class":600},[583,10292,6645],{"class":600},[583,10294,10295,10297,10299,10301,10303,10306,10308,10310,10312,10314,10316,10319,10321],{"class":585,"line":1159},[583,10296,10120],{"class":600},[583,10298,10268],{"class":701},[583,10300,705],{"class":600},[583,10302,625],{"class":600},[583,10304,10305],{"class":628},"bob@globex.com",[583,10307,685],{"class":600},[583,10309,608],{"class":600},[583,10311,10135],{"class":701},[583,10313,705],{"class":600},[583,10315,625],{"class":600},[583,10317,10318],{"class":628},"Bob",[583,10320,685],{"class":600},[583,10322,6645],{"class":600},[583,10324,10325,10327,10329,10331,10333,10336,10338,10340,10342,10344,10346,10348,10350],{"class":585,"line":1166},[583,10326,10120],{"class":600},[583,10328,10268],{"class":701},[583,10330,705],{"class":600},[583,10332,625],{"class":600},[583,10334,10335],{"class":628},"admin@example.com",[583,10337,685],{"class":600},[583,10339,608],{"class":600},[583,10341,10135],{"class":701},[583,10343,705],{"class":600},[583,10345,625],{"class":600},[583,10347,87],{"class":628},[583,10349,685],{"class":600},[583,10351,6645],{"class":600},[583,10353,10354,10356,10358,10360],{"class":585,"line":1171},[583,10355,10207],{"class":701},[583,10357,722],{"class":600},[583,10359,8114],{"class":679},[583,10361,1060],{"class":701},[583,10363,10364],{"class":585,"line":1208},[583,10365,660],{"emptyLinePlaceholder":659},[583,10367,10368],{"class":585,"line":1225},[583,10369,10370],{"class":589},"    // Create memberships\n",[583,10372,10373,10375,10377,10379,10381,10383,10385,10387,10389,10391],{"class":585,"line":1243},[583,10374,9728],{"class":596},[583,10376,3858],{"class":604},[583,10378,722],{"class":600},[583,10380,5401],{"class":679},[583,10382,682],{"class":701},[583,10384,3250],{"class":604},[583,10386,719],{"class":701},[583,10388,722],{"class":600},[583,10390,5408],{"class":679},[583,10392,5411],{"class":701},[583,10394,10395,10397,10399,10401,10403,10405,10407,10409,10411,10413,10415,10417,10419,10421,10423,10425,10427,10429,10431],{"class":585,"line":1261},[583,10396,10120],{"class":600},[583,10398,4083],{"class":701},[583,10400,705],{"class":600},[583,10402,10031],{"class":604},[583,10404,722],{"class":600},[583,10406,714],{"class":604},[583,10408,608],{"class":600},[583,10410,4104],{"class":701},[583,10412,705],{"class":600},[583,10414,10009],{"class":604},[583,10416,722],{"class":600},[583,10418,714],{"class":604},[583,10420,608],{"class":600},[583,10422,4219],{"class":701},[583,10424,705],{"class":600},[583,10426,625],{"class":600},[583,10428,2454],{"class":628},[583,10430,685],{"class":600},[583,10432,6645],{"class":600},[583,10434,10435,10437,10439,10441,10443,10445,10447,10449,10451,10453,10455,10457,10459,10461,10463,10465,10467,10469,10471],{"class":585,"line":1271},[583,10436,10120],{"class":600},[583,10438,4083],{"class":701},[583,10440,705],{"class":600},[583,10442,10040],{"class":604},[583,10444,722],{"class":600},[583,10446,714],{"class":604},[583,10448,608],{"class":600},[583,10450,4104],{"class":701},[583,10452,705],{"class":600},[583,10454,10019],{"class":604},[583,10456,722],{"class":600},[583,10458,714],{"class":604},[583,10460,608],{"class":600},[583,10462,4219],{"class":701},[583,10464,705],{"class":600},[583,10466,625],{"class":600},[583,10468,2463],{"class":628},[583,10470,685],{"class":600},[583,10472,6645],{"class":600},[583,10474,10475,10477,10479,10481,10483,10485,10487,10489,10491,10493,10495,10497,10499,10501,10503,10505,10507,10509,10511],{"class":585,"line":1288},[583,10476,10120],{"class":600},[583,10478,4083],{"class":701},[583,10480,705],{"class":600},[583,10482,10051],{"class":604},[583,10484,722],{"class":600},[583,10486,714],{"class":604},[583,10488,608],{"class":600},[583,10490,4104],{"class":701},[583,10492,705],{"class":600},[583,10494,10009],{"class":604},[583,10496,722],{"class":600},[583,10498,714],{"class":604},[583,10500,608],{"class":600},[583,10502,4219],{"class":701},[583,10504,705],{"class":600},[583,10506,625],{"class":600},[583,10508,2445],{"class":628},[583,10510,685],{"class":600},[583,10512,6645],{"class":600},[583,10514,10515,10517,10519,10521,10523,10525,10527,10529,10531,10533,10535,10537,10539,10541,10543,10545,10547,10549,10551],{"class":585,"line":1304},[583,10516,10120],{"class":600},[583,10518,4083],{"class":701},[583,10520,705],{"class":600},[583,10522,10051],{"class":604},[583,10524,722],{"class":600},[583,10526,714],{"class":604},[583,10528,608],{"class":600},[583,10530,4104],{"class":701},[583,10532,705],{"class":600},[583,10534,10019],{"class":604},[583,10536,722],{"class":600},[583,10538,714],{"class":604},[583,10540,608],{"class":600},[583,10542,4219],{"class":701},[583,10544,705],{"class":600},[583,10546,625],{"class":600},[583,10548,2445],{"class":628},[583,10550,685],{"class":600},[583,10552,6645],{"class":600},[583,10554,10555],{"class":585,"line":1320},[583,10556,10557],{"class":701},"    ])\n",[583,10559,10560,10562],{"class":585,"line":1329},[583,10561,1264],{"class":600},[583,10563,868],{"class":701},[583,10565,10566],{"class":585,"line":2619},[583,10567,660],{"emptyLinePlaceholder":659},[583,10569,10570,10573,10575,10577,10580,10582,10584,10586,10588,10590],{"class":585,"line":2625},[583,10571,10572],{"class":679},"  it",[583,10574,682],{"class":701},[583,10576,685],{"class":600},[583,10578,10579],{"class":628},"lists posts scoped to user organization",[583,10581,685],{"class":600},[583,10583,608],{"class":600},[583,10585,1524],{"class":669},[583,10587,9997],{"class":600},[583,10589,848],{"class":669},[583,10591,695],{"class":600},[583,10593,10594],{"class":585,"line":2663},[583,10595,10596],{"class":589},"    // Create posts in different orgs\n",[583,10598,10599,10601,10603,10605,10607,10609,10611,10613,10615,10617],{"class":585,"line":2670},[583,10600,9728],{"class":596},[583,10602,3858],{"class":604},[583,10604,722],{"class":600},[583,10606,5401],{"class":679},[583,10608,682],{"class":701},[583,10610,894],{"class":604},[583,10612,719],{"class":701},[583,10614,722],{"class":600},[583,10616,5408],{"class":679},[583,10618,5411],{"class":701},[583,10620,10621,10623,10626,10628,10630,10633,10635,10637,10639,10641,10643,10645,10647,10649,10652,10654,10656,10658,10660],{"class":585,"line":2675},[583,10622,10120],{"class":600},[583,10624,10625],{"class":701}," title",[583,10627,705],{"class":600},[583,10629,625],{"class":600},[583,10631,10632],{"class":628},"Post 1",[583,10634,685],{"class":600},[583,10636,608],{"class":600},[583,10638,4104],{"class":701},[583,10640,705],{"class":600},[583,10642,10009],{"class":604},[583,10644,722],{"class":600},[583,10646,714],{"class":604},[583,10648,608],{"class":600},[583,10650,10651],{"class":701}," authorId",[583,10653,705],{"class":600},[583,10655,10031],{"class":604},[583,10657,722],{"class":600},[583,10659,714],{"class":604},[583,10661,6645],{"class":600},[583,10663,10664,10666,10668,10670,10672,10675,10677,10679,10681,10683,10685,10687,10689,10691,10693,10695,10697,10699,10701],{"class":585,"line":2681},[583,10665,10120],{"class":600},[583,10667,10625],{"class":701},[583,10669,705],{"class":600},[583,10671,625],{"class":600},[583,10673,10674],{"class":628},"Post 2",[583,10676,685],{"class":600},[583,10678,608],{"class":600},[583,10680,4104],{"class":701},[583,10682,705],{"class":600},[583,10684,10019],{"class":604},[583,10686,722],{"class":600},[583,10688,714],{"class":604},[583,10690,608],{"class":600},[583,10692,10651],{"class":701},[583,10694,705],{"class":600},[583,10696,10040],{"class":604},[583,10698,722],{"class":600},[583,10700,714],{"class":604},[583,10702,6645],{"class":600},[583,10704,10705],{"class":585,"line":2712},[583,10706,10557],{"class":701},[583,10708,10709],{"class":585,"line":2727},[583,10710,660],{"emptyLinePlaceholder":659},[583,10712,10713],{"class":585,"line":2743},[583,10714,10715],{"class":589},"    // User 1 (Org A) can only see Org A posts\n",[583,10717,10718,10720,10723,10725,10727,10729,10731,10733,10736,10738,10740],{"class":585,"line":2758},[583,10719,1539],{"class":669},[583,10721,10722],{"class":604}," response1",[583,10724,1545],{"class":600},[583,10726,1548],{"class":596},[583,10728,6598],{"class":679},[583,10730,682],{"class":701},[583,10732,685],{"class":600},[583,10734,10735],{"class":628},"/api/posts",[583,10737,685],{"class":600},[583,10739,608],{"class":600},[583,10741,695],{"class":600},[583,10743,10744,10746,10748,10750,10753,10755,10757,10760,10762,10765,10768],{"class":585,"line":2767},[583,10745,6177],{"class":701},[583,10747,705],{"class":600},[583,10749,601],{"class":600},[583,10751,10752],{"class":701}," cookie",[583,10754,705],{"class":600},[583,10756,7835],{"class":600},[583,10758,10759],{"class":628},"session=",[583,10761,7840],{"class":600},[583,10763,10764],{"class":604},"user1Session",[583,10766,10767],{"class":600},"}`",[583,10769,6645],{"class":600},[583,10771,10772,10774],{"class":585,"line":2782},[583,10773,5966],{"class":600},[583,10775,868],{"class":701},[583,10777,10778,10781,10783,10786,10788,10791,10793,10795,10798,10800,10802],{"class":585,"line":2797},[583,10779,10780],{"class":679},"    expect",[583,10782,682],{"class":701},[583,10784,10785],{"class":604},"response1",[583,10787,722],{"class":600},[583,10789,10790],{"class":604},"data",[583,10792,719],{"class":701},[583,10794,722],{"class":600},[583,10796,10797],{"class":679},"toHaveLength",[583,10799,682],{"class":701},[583,10801,5217],{"class":4519},[583,10803,868],{"class":701},[583,10805,10806,10808,10810,10812,10814,10816,10818,10820,10822,10824,10826,10828,10830,10833,10835,10837,10839,10841],{"class":585,"line":2812},[583,10807,10780],{"class":679},[583,10809,682],{"class":701},[583,10811,10785],{"class":604},[583,10813,722],{"class":600},[583,10815,10790],{"class":604},[583,10817,4676],{"class":701},[583,10819,8723],{"class":4519},[583,10821,5959],{"class":701},[583,10823,722],{"class":600},[583,10825,960],{"class":604},[583,10827,719],{"class":701},[583,10829,722],{"class":600},[583,10831,10832],{"class":679},"toBe",[583,10834,682],{"class":701},[583,10836,685],{"class":600},[583,10838,10632],{"class":628},[583,10840,685],{"class":600},[583,10842,868],{"class":701},[583,10844,10845],{"class":585,"line":2821},[583,10846,660],{"emptyLinePlaceholder":659},[583,10848,10849],{"class":585,"line":2828},[583,10850,10851],{"class":589},"    // User 2 (Org B) can only see Org B posts\n",[583,10853,10854,10856,10859,10861,10863,10865,10867,10869,10871,10873,10875],{"class":585,"line":2833},[583,10855,1539],{"class":669},[583,10857,10858],{"class":604}," response2",[583,10860,1545],{"class":600},[583,10862,1548],{"class":596},[583,10864,6598],{"class":679},[583,10866,682],{"class":701},[583,10868,685],{"class":600},[583,10870,10735],{"class":628},[583,10872,685],{"class":600},[583,10874,608],{"class":600},[583,10876,695],{"class":600},[583,10878,10879,10881,10883,10885,10887,10889,10891,10893,10895,10898,10900],{"class":585,"line":2864},[583,10880,6177],{"class":701},[583,10882,705],{"class":600},[583,10884,601],{"class":600},[583,10886,10752],{"class":701},[583,10888,705],{"class":600},[583,10890,7835],{"class":600},[583,10892,10759],{"class":628},[583,10894,7840],{"class":600},[583,10896,10897],{"class":604},"user2Session",[583,10899,10767],{"class":600},[583,10901,6645],{"class":600},[583,10903,10904,10906],{"class":585,"line":2879},[583,10905,5966],{"class":600},[583,10907,868],{"class":701},[583,10909,10910,10912,10914,10917,10919,10921,10923,10925,10927,10929,10931],{"class":585,"line":2886},[583,10911,10780],{"class":679},[583,10913,682],{"class":701},[583,10915,10916],{"class":604},"response2",[583,10918,722],{"class":600},[583,10920,10790],{"class":604},[583,10922,719],{"class":701},[583,10924,722],{"class":600},[583,10926,10797],{"class":679},[583,10928,682],{"class":701},[583,10930,5217],{"class":4519},[583,10932,868],{"class":701},[583,10934,10935,10937,10939,10941,10943,10945,10947,10949,10951,10953,10955,10957,10959,10961,10963,10965,10967,10969],{"class":585,"line":2891},[583,10936,10780],{"class":679},[583,10938,682],{"class":701},[583,10940,10916],{"class":604},[583,10942,722],{"class":600},[583,10944,10790],{"class":604},[583,10946,4676],{"class":701},[583,10948,8723],{"class":4519},[583,10950,5959],{"class":701},[583,10952,722],{"class":600},[583,10954,960],{"class":604},[583,10956,719],{"class":701},[583,10958,722],{"class":600},[583,10960,10832],{"class":679},[583,10962,682],{"class":701},[583,10964,685],{"class":600},[583,10966,10674],{"class":628},[583,10968,685],{"class":600},[583,10970,868],{"class":701},[583,10972,10973,10975],{"class":585,"line":2921},[583,10974,1264],{"class":600},[583,10976,868],{"class":701},[583,10978,10979],{"class":585,"line":2935},[583,10980,660],{"emptyLinePlaceholder":659},[583,10982,10983,10985,10987,10989,10992,10994,10996,10998,11000,11002],{"class":585,"line":2950},[583,10984,10572],{"class":679},[583,10986,682],{"class":701},[583,10988,685],{"class":600},[583,10990,10991],{"class":628},"auto-assigns organization on create",[583,10993,685],{"class":600},[583,10995,608],{"class":600},[583,10997,1524],{"class":669},[583,10999,9997],{"class":600},[583,11001,848],{"class":669},[583,11003,695],{"class":600},[583,11005,11006,11008,11011,11013,11015,11017,11019,11021,11023,11025,11027],{"class":585,"line":2957},[583,11007,1539],{"class":669},[583,11009,11010],{"class":604}," newPost",[583,11012,1545],{"class":600},[583,11014,1548],{"class":596},[583,11016,6598],{"class":679},[583,11018,682],{"class":701},[583,11020,685],{"class":600},[583,11022,10735],{"class":628},[583,11024,685],{"class":600},[583,11026,608],{"class":600},[583,11028,695],{"class":600},[583,11030,11031,11034,11036,11038,11040,11042],{"class":585,"line":2962},[583,11032,11033],{"class":701},"      method",[583,11035,705],{"class":600},[583,11037,625],{"class":600},[583,11039,1714],{"class":628},[583,11041,685],{"class":600},[583,11043,731],{"class":600},[583,11045,11046,11049,11051,11053,11055,11057,11059,11061,11063,11065,11068,11070,11072,11075,11077],{"class":585,"line":2968},[583,11047,11048],{"class":701},"      body",[583,11050,705],{"class":600},[583,11052,601],{"class":600},[583,11054,10625],{"class":701},[583,11056,705],{"class":600},[583,11058,625],{"class":600},[583,11060,1731],{"class":628},[583,11062,685],{"class":600},[583,11064,608],{"class":600},[583,11066,11067],{"class":701}," content",[583,11069,705],{"class":600},[583,11071,625],{"class":600},[583,11073,11074],{"class":628},"Test",[583,11076,685],{"class":600},[583,11078,6645],{"class":600},[583,11080,11081,11083,11085,11087,11089,11091,11093,11095,11097,11099,11101],{"class":585,"line":2993},[583,11082,6177],{"class":701},[583,11084,705],{"class":600},[583,11086,601],{"class":600},[583,11088,10752],{"class":701},[583,11090,705],{"class":600},[583,11092,7835],{"class":600},[583,11094,10759],{"class":628},[583,11096,7840],{"class":600},[583,11098,10764],{"class":604},[583,11100,10767],{"class":600},[583,11102,6645],{"class":600},[583,11104,11105,11107],{"class":585,"line":3032},[583,11106,5966],{"class":600},[583,11108,868],{"class":701},[583,11110,11111],{"class":585,"line":3059},[583,11112,660],{"emptyLinePlaceholder":659},[583,11114,11115,11117,11119,11122,11124,11126,11128,11130,11132,11134,11136,11138,11140],{"class":585,"line":3080},[583,11116,10780],{"class":679},[583,11118,682],{"class":701},[583,11120,11121],{"class":604},"newPost",[583,11123,722],{"class":600},[583,11125,1403],{"class":604},[583,11127,719],{"class":701},[583,11129,722],{"class":600},[583,11131,10832],{"class":679},[583,11133,682],{"class":701},[583,11135,10087],{"class":604},[583,11137,722],{"class":600},[583,11139,714],{"class":604},[583,11141,868],{"class":701},[583,11143,11144,11146],{"class":585,"line":3112},[583,11145,1264],{"class":600},[583,11147,868],{"class":701},[583,11149,11150],{"class":585,"line":3131},[583,11151,660],{"emptyLinePlaceholder":659},[583,11153,11154,11156,11158,11160,11163,11165,11167,11169,11171,11173],{"class":585,"line":3140},[583,11155,10572],{"class":679},[583,11157,682],{"class":701},[583,11159,685],{"class":600},[583,11161,11162],{"class":628},"blocks cross-organization access",[583,11164,685],{"class":600},[583,11166,608],{"class":600},[583,11168,1524],{"class":669},[583,11170,9997],{"class":600},[583,11172,848],{"class":669},[583,11174,695],{"class":600},[583,11176,11177,11179,11182,11184,11186,11188,11190,11192,11194,11196,11198,11200,11202,11204],{"class":585,"line":3179},[583,11178,1539],{"class":669},[583,11180,11181],{"class":604}," org2Post",[583,11183,1545],{"class":600},[583,11185,1548],{"class":596},[583,11187,3858],{"class":604},[583,11189,722],{"class":600},[583,11191,5401],{"class":679},[583,11193,682],{"class":701},[583,11195,894],{"class":604},[583,11197,719],{"class":701},[583,11199,722],{"class":600},[583,11201,5408],{"class":679},[583,11203,682],{"class":701},[583,11205,1205],{"class":600},[583,11207,11208,11211,11213,11215,11218,11220],{"class":585,"line":3232},[583,11209,11210],{"class":701},"      title",[583,11212,705],{"class":600},[583,11214,625],{"class":600},[583,11216,11217],{"class":628},"Org B Post",[583,11219,685],{"class":600},[583,11221,731],{"class":600},[583,11223,11225,11227,11229,11231,11233,11235],{"class":585,"line":11224},69,[583,11226,6449],{"class":701},[583,11228,705],{"class":600},[583,11230,10019],{"class":604},[583,11232,722],{"class":600},[583,11234,714],{"class":604},[583,11236,731],{"class":600},[583,11238,11240,11243,11245,11247,11249,11251],{"class":585,"line":11239},70,[583,11241,11242],{"class":701},"      authorId",[583,11244,705],{"class":600},[583,11246,10040],{"class":604},[583,11248,722],{"class":600},[583,11250,714],{"class":604},[583,11252,731],{"class":600},[583,11254,11256,11258,11260,11262,11264],{"class":585,"line":11255},71,[583,11257,5966],{"class":600},[583,11259,719],{"class":701},[583,11261,722],{"class":600},[583,11263,8114],{"class":679},[583,11265,1060],{"class":701},[583,11267,11269],{"class":585,"line":11268},72,[583,11270,660],{"emptyLinePlaceholder":659},[583,11272,11274],{"class":585,"line":11273},73,[583,11275,11276],{"class":589},"    // User 1 (Org A) cannot access Org B post\n",[583,11278,11280,11282,11284],{"class":585,"line":11279},74,[583,11281,9728],{"class":596},[583,11283,9908],{"class":679},[583,11285,3978],{"class":701},[583,11287,11289,11292,11294,11297,11300,11302,11305,11307,11309,11311,11313,11315,11317],{"class":585,"line":11288},75,[583,11290,11291],{"class":679},"      $fetch",[583,11293,682],{"class":701},[583,11295,11296],{"class":600},"`",[583,11298,11299],{"class":628},"/api/posts/",[583,11301,7840],{"class":600},[583,11303,11304],{"class":604},"org2Post[",[583,11306,8723],{"class":4519},[583,11308,5959],{"class":604},[583,11310,722],{"class":600},[583,11312,714],{"class":604},[583,11314,10767],{"class":600},[583,11316,608],{"class":600},[583,11318,695],{"class":600},[583,11320,11322,11325,11327,11329,11331,11333,11335,11337,11339,11341,11343],{"class":585,"line":11321},76,[583,11323,11324],{"class":701},"        headers",[583,11326,705],{"class":600},[583,11328,601],{"class":600},[583,11330,10752],{"class":701},[583,11332,705],{"class":600},[583,11334,7835],{"class":600},[583,11336,10759],{"class":628},[583,11338,7840],{"class":600},[583,11340,10764],{"class":604},[583,11342,10767],{"class":600},[583,11344,6645],{"class":600},[583,11346,11348,11351],{"class":585,"line":11347},77,[583,11349,11350],{"class":600},"      }",[583,11352,868],{"class":701},[583,11354,11356,11358,11360,11363,11365,11368,11370,11372,11375,11378,11381,11383],{"class":585,"line":11355},78,[583,11357,4111],{"class":701},[583,11359,722],{"class":600},[583,11361,11362],{"class":604},"rejects",[583,11364,722],{"class":600},[583,11366,11367],{"class":679},"toThrow",[583,11369,682],{"class":701},[583,11371,9384],{"class":600},[583,11373,11374],{"class":628},"404",[583,11376,11377],{"class":600},"|",[583,11379,11380],{"class":628},"403",[583,11382,9384],{"class":600},[583,11384,868],{"class":701},[583,11386,11388,11390],{"class":585,"line":11387},79,[583,11389,1264],{"class":600},[583,11391,868],{"class":701},[583,11393,11395],{"class":585,"line":11394},80,[583,11396,660],{"emptyLinePlaceholder":659},[583,11398,11400,11402,11404,11406,11409,11411,11413,11415,11417,11419],{"class":585,"line":11399},81,[583,11401,10572],{"class":679},[583,11403,682],{"class":701},[583,11405,685],{"class":600},[583,11407,11408],{"class":628},"allows superadmin cross-tenant access",[583,11410,685],{"class":600},[583,11412,608],{"class":600},[583,11414,1524],{"class":669},[583,11416,9997],{"class":600},[583,11418,848],{"class":669},[583,11420,695],{"class":600},[583,11422,11424,11426,11429,11431,11433,11436,11438,11441,11443,11445,11447,11449],{"class":585,"line":11423},82,[583,11425,1539],{"class":669},[583,11427,11428],{"class":604}," adminSession",[583,11430,1545],{"class":600},[583,11432,1548],{"class":596},[583,11434,11435],{"class":679}," createSession",[583,11437,682],{"class":701},[583,11439,11440],{"class":604},"adminUser",[583,11442,608],{"class":600},[583,11444,10009],{"class":604},[583,11446,722],{"class":600},[583,11448,714],{"class":604},[583,11450,868],{"class":701},[583,11452,11454],{"class":585,"line":11453},83,[583,11455,660],{"emptyLinePlaceholder":659},[583,11457,11459],{"class":585,"line":11458},84,[583,11460,11461],{"class":589},"    // Admin can access all organizations' posts\n",[583,11463,11465,11467,11470,11472,11474,11476,11478,11480,11482,11484,11486],{"class":585,"line":11464},85,[583,11466,1539],{"class":669},[583,11468,11469],{"class":604}," response",[583,11471,1545],{"class":600},[583,11473,1548],{"class":596},[583,11475,6598],{"class":679},[583,11477,682],{"class":701},[583,11479,685],{"class":600},[583,11481,10735],{"class":628},[583,11483,685],{"class":600},[583,11485,608],{"class":600},[583,11487,695],{"class":600},[583,11489,11491,11493,11495,11497,11499,11501,11503,11505,11507,11510,11512],{"class":585,"line":11490},86,[583,11492,6177],{"class":701},[583,11494,705],{"class":600},[583,11496,601],{"class":600},[583,11498,10752],{"class":701},[583,11500,705],{"class":600},[583,11502,7835],{"class":600},[583,11504,10759],{"class":628},[583,11506,7840],{"class":600},[583,11508,11509],{"class":604},"adminSession",[583,11511,10767],{"class":600},[583,11513,6645],{"class":600},[583,11515,11517,11519],{"class":585,"line":11516},87,[583,11518,5966],{"class":600},[583,11520,868],{"class":701},[583,11522,11524],{"class":585,"line":11523},88,[583,11525,660],{"emptyLinePlaceholder":659},[583,11527,11529,11531,11533,11536,11538,11540,11542,11545,11547,11549,11552,11554,11557],{"class":585,"line":11528},89,[583,11530,10780],{"class":679},[583,11532,682],{"class":701},[583,11534,11535],{"class":604},"response",[583,11537,722],{"class":600},[583,11539,10790],{"class":604},[583,11541,722],{"class":600},[583,11543,11544],{"class":604},"length",[583,11546,719],{"class":701},[583,11548,722],{"class":600},[583,11550,11551],{"class":679},"toBeGreaterThanOrEqual",[583,11553,682],{"class":701},[583,11555,11556],{"class":4519},"2",[583,11558,868],{"class":701},[583,11560,11562,11564],{"class":585,"line":11561},90,[583,11563,1264],{"class":600},[583,11565,868],{"class":701},[583,11567,11569,11571],{"class":585,"line":11568},91,[583,11570,865],{"class":600},[583,11572,868],{"class":604},[568,11574,11576],{"id":11575},"testing-organization-switching","Testing Organization Switching",[573,11578,11580],{"className":575,"code":11579,"language":577,"meta":578,"style":578},"it('switches active organization', async () => {\n  // User is member of both orgs\n  await db.insert(organizationMembers).values([\n    { userId: user1.id, organizationId: org1.id, role: 'admin' },\n    { userId: user1.id, organizationId: org2.id, role: 'viewer' },\n  ])\n\n  // Create posts in each org\n  await db.insert(posts).values([\n    { title: 'Org A Post', organizationId: org1.id, authorId: user1.id },\n    { title: 'Org B Post', organizationId: org2.id, authorId: user1.id },\n  ])\n\n  // User in Org A sees Org A posts\n  let session = await createSession(user1, org1.id)\n  let response = await $fetch('/api/posts', {\n    headers: { cookie: `session=${session}` },\n  })\n  expect(response.data[0].title).toBe('Org A Post')\n\n  // Switch to Org B\n  await $fetch('/api/auth/organization/set-active', {\n    method: 'POST',\n    body: { organizationId: org2.id },\n    headers: { cookie: `session=${session}` },\n  })\n\n  // Now sees Org B posts\n  session = await refreshSession(session)\n  response = await $fetch('/api/posts', {\n    headers: { cookie: `session=${session}` },\n  })\n  expect(response.data[0].title).toBe('Org B Post')\n})\n",[580,11581,11582,11606,11611,11633,11674,11714,11719,11723,11728,11750,11791,11831,11835,11839,11844,11870,11894,11919,11925,11964,11968,11973,11991,12005,12025,12049,12055,12059,12064,12081,12104,12128,12134,12172],{"__ignoreMap":578},[583,11583,11584,11587,11589,11591,11594,11596,11598,11600,11602,11604],{"class":585,"line":586},[583,11585,11586],{"class":679},"it",[583,11588,682],{"class":604},[583,11590,685],{"class":600},[583,11592,11593],{"class":628},"switches active organization",[583,11595,685],{"class":600},[583,11597,608],{"class":600},[583,11599,1524],{"class":669},[583,11601,9997],{"class":600},[583,11603,848],{"class":669},[583,11605,695],{"class":600},[583,11607,11608],{"class":585,"line":593},[583,11609,11610],{"class":589},"  // User is member of both orgs\n",[583,11612,11613,11615,11617,11619,11621,11623,11625,11627,11629,11631],{"class":585,"line":635},[583,11614,6595],{"class":596},[583,11616,3858],{"class":604},[583,11618,722],{"class":600},[583,11620,5401],{"class":679},[583,11622,682],{"class":701},[583,11624,3250],{"class":604},[583,11626,719],{"class":701},[583,11628,722],{"class":600},[583,11630,5408],{"class":679},[583,11632,5411],{"class":701},[583,11634,11635,11638,11640,11642,11644,11646,11648,11650,11652,11654,11656,11658,11660,11662,11664,11666,11668,11670,11672],{"class":585,"line":656},[583,11636,11637],{"class":600},"    {",[583,11639,4083],{"class":701},[583,11641,705],{"class":600},[583,11643,10031],{"class":604},[583,11645,722],{"class":600},[583,11647,714],{"class":604},[583,11649,608],{"class":600},[583,11651,4104],{"class":701},[583,11653,705],{"class":600},[583,11655,10009],{"class":604},[583,11657,722],{"class":600},[583,11659,714],{"class":604},[583,11661,608],{"class":600},[583,11663,4219],{"class":701},[583,11665,705],{"class":600},[583,11667,625],{"class":600},[583,11669,2454],{"class":628},[583,11671,685],{"class":600},[583,11673,6645],{"class":600},[583,11675,11676,11678,11680,11682,11684,11686,11688,11690,11692,11694,11696,11698,11700,11702,11704,11706,11708,11710,11712],{"class":585,"line":663},[583,11677,11637],{"class":600},[583,11679,4083],{"class":701},[583,11681,705],{"class":600},[583,11683,10031],{"class":604},[583,11685,722],{"class":600},[583,11687,714],{"class":604},[583,11689,608],{"class":600},[583,11691,4104],{"class":701},[583,11693,705],{"class":600},[583,11695,10019],{"class":604},[583,11697,722],{"class":600},[583,11699,714],{"class":604},[583,11701,608],{"class":600},[583,11703,4219],{"class":701},[583,11705,705],{"class":600},[583,11707,625],{"class":600},[583,11709,2472],{"class":628},[583,11711,685],{"class":600},[583,11713,6645],{"class":600},[583,11715,11716],{"class":585,"line":698},[583,11717,11718],{"class":701},"  ])\n",[583,11720,11721],{"class":585,"line":734},[583,11722,660],{"emptyLinePlaceholder":659},[583,11724,11725],{"class":585,"line":764},[583,11726,11727],{"class":589},"  // Create posts in each org\n",[583,11729,11730,11732,11734,11736,11738,11740,11742,11744,11746,11748],{"class":585,"line":800},[583,11731,6595],{"class":596},[583,11733,3858],{"class":604},[583,11735,722],{"class":600},[583,11737,5401],{"class":679},[583,11739,682],{"class":701},[583,11741,894],{"class":604},[583,11743,719],{"class":701},[583,11745,722],{"class":600},[583,11747,5408],{"class":679},[583,11749,5411],{"class":701},[583,11751,11752,11754,11756,11758,11760,11763,11765,11767,11769,11771,11773,11775,11777,11779,11781,11783,11785,11787,11789],{"class":585,"line":862},[583,11753,11637],{"class":600},[583,11755,10625],{"class":701},[583,11757,705],{"class":600},[583,11759,625],{"class":600},[583,11761,11762],{"class":628},"Org A Post",[583,11764,685],{"class":600},[583,11766,608],{"class":600},[583,11768,4104],{"class":701},[583,11770,705],{"class":600},[583,11772,10009],{"class":604},[583,11774,722],{"class":600},[583,11776,714],{"class":604},[583,11778,608],{"class":600},[583,11780,10651],{"class":701},[583,11782,705],{"class":600},[583,11784,10031],{"class":604},[583,11786,722],{"class":600},[583,11788,714],{"class":604},[583,11790,6645],{"class":600},[583,11792,11793,11795,11797,11799,11801,11803,11805,11807,11809,11811,11813,11815,11817,11819,11821,11823,11825,11827,11829],{"class":585,"line":871},[583,11794,11637],{"class":600},[583,11796,10625],{"class":701},[583,11798,705],{"class":600},[583,11800,625],{"class":600},[583,11802,11217],{"class":628},[583,11804,685],{"class":600},[583,11806,608],{"class":600},[583,11808,4104],{"class":701},[583,11810,705],{"class":600},[583,11812,10019],{"class":604},[583,11814,722],{"class":600},[583,11816,714],{"class":604},[583,11818,608],{"class":600},[583,11820,10651],{"class":701},[583,11822,705],{"class":600},[583,11824,10031],{"class":604},[583,11826,722],{"class":600},[583,11828,714],{"class":604},[583,11830,6645],{"class":600},[583,11832,11833],{"class":585,"line":876},[583,11834,11718],{"class":701},[583,11836,11837],{"class":585,"line":903},[583,11838,660],{"emptyLinePlaceholder":659},[583,11840,11841],{"class":585,"line":946},[583,11842,11843],{"class":589},"  // User in Org A sees Org A posts\n",[583,11845,11846,11848,11850,11852,11854,11856,11858,11860,11862,11864,11866,11868],{"class":585,"line":975},[583,11847,10006],{"class":669},[583,11849,1542],{"class":604},[583,11851,1545],{"class":600},[583,11853,1548],{"class":596},[583,11855,11435],{"class":679},[583,11857,682],{"class":701},[583,11859,10229],{"class":604},[583,11861,608],{"class":600},[583,11863,10009],{"class":604},[583,11865,722],{"class":600},[583,11867,714],{"class":604},[583,11869,868],{"class":701},[583,11871,11872,11874,11876,11878,11880,11882,11884,11886,11888,11890,11892],{"class":585,"line":998},[583,11873,10006],{"class":669},[583,11875,11469],{"class":604},[583,11877,1545],{"class":600},[583,11879,1548],{"class":596},[583,11881,6598],{"class":679},[583,11883,682],{"class":701},[583,11885,685],{"class":600},[583,11887,10735],{"class":628},[583,11889,685],{"class":600},[583,11891,608],{"class":600},[583,11893,695],{"class":600},[583,11895,11896,11899,11901,11903,11905,11907,11909,11911,11913,11915,11917],{"class":585,"line":1027},[583,11897,11898],{"class":701},"    headers",[583,11900,705],{"class":600},[583,11902,601],{"class":600},[583,11904,10752],{"class":701},[583,11906,705],{"class":600},[583,11908,7835],{"class":600},[583,11910,10759],{"class":628},[583,11912,7840],{"class":600},[583,11914,1571],{"class":604},[583,11916,10767],{"class":600},[583,11918,6645],{"class":600},[583,11920,11921,11923],{"class":585,"line":1052},[583,11922,1264],{"class":600},[583,11924,868],{"class":701},[583,11926,11927,11930,11932,11934,11936,11938,11940,11942,11944,11946,11948,11950,11952,11954,11956,11958,11960,11962],{"class":585,"line":1063},[583,11928,11929],{"class":679},"  expect",[583,11931,682],{"class":701},[583,11933,11535],{"class":604},[583,11935,722],{"class":600},[583,11937,10790],{"class":604},[583,11939,4676],{"class":701},[583,11941,8723],{"class":4519},[583,11943,5959],{"class":701},[583,11945,722],{"class":600},[583,11947,960],{"class":604},[583,11949,719],{"class":701},[583,11951,722],{"class":600},[583,11953,10832],{"class":679},[583,11955,682],{"class":701},[583,11957,685],{"class":600},[583,11959,11762],{"class":628},[583,11961,685],{"class":600},[583,11963,868],{"class":701},[583,11965,11966],{"class":585,"line":1106},[583,11967,660],{"emptyLinePlaceholder":659},[583,11969,11970],{"class":585,"line":1159},[583,11971,11972],{"class":589},"  // Switch to Org B\n",[583,11974,11975,11977,11979,11981,11983,11985,11987,11989],{"class":585,"line":1166},[583,11976,6595],{"class":596},[583,11978,6598],{"class":679},[583,11980,682],{"class":701},[583,11982,685],{"class":600},[583,11984,6605],{"class":628},[583,11986,685],{"class":600},[583,11988,608],{"class":600},[583,11990,695],{"class":600},[583,11992,11993,11995,11997,11999,12001,12003],{"class":585,"line":1171},[583,11994,6616],{"class":701},[583,11996,705],{"class":600},[583,11998,625],{"class":600},[583,12000,1714],{"class":628},[583,12002,685],{"class":600},[583,12004,731],{"class":600},[583,12006,12007,12009,12011,12013,12015,12017,12019,12021,12023],{"class":585,"line":1208},[583,12008,6631],{"class":701},[583,12010,705],{"class":600},[583,12012,601],{"class":600},[583,12014,4104],{"class":701},[583,12016,705],{"class":600},[583,12018,10019],{"class":604},[583,12020,722],{"class":600},[583,12022,714],{"class":604},[583,12024,6645],{"class":600},[583,12026,12027,12029,12031,12033,12035,12037,12039,12041,12043,12045,12047],{"class":585,"line":1225},[583,12028,11898],{"class":701},[583,12030,705],{"class":600},[583,12032,601],{"class":600},[583,12034,10752],{"class":701},[583,12036,705],{"class":600},[583,12038,7835],{"class":600},[583,12040,10759],{"class":628},[583,12042,7840],{"class":600},[583,12044,1571],{"class":604},[583,12046,10767],{"class":600},[583,12048,6645],{"class":600},[583,12050,12051,12053],{"class":585,"line":1243},[583,12052,1264],{"class":600},[583,12054,868],{"class":701},[583,12056,12057],{"class":585,"line":1261},[583,12058,660],{"emptyLinePlaceholder":659},[583,12060,12061],{"class":585,"line":1271},[583,12062,12063],{"class":589},"  // Now sees Org B posts\n",[583,12065,12066,12068,12070,12072,12075,12077,12079],{"class":585,"line":1288},[583,12067,5985],{"class":604},[583,12069,1545],{"class":600},[583,12071,1548],{"class":596},[583,12073,12074],{"class":679}," refreshSession",[583,12076,682],{"class":701},[583,12078,1571],{"class":604},[583,12080,868],{"class":701},[583,12082,12083,12086,12088,12090,12092,12094,12096,12098,12100,12102],{"class":585,"line":1304},[583,12084,12085],{"class":604},"  response",[583,12087,1545],{"class":600},[583,12089,1548],{"class":596},[583,12091,6598],{"class":679},[583,12093,682],{"class":701},[583,12095,685],{"class":600},[583,12097,10735],{"class":628},[583,12099,685],{"class":600},[583,12101,608],{"class":600},[583,12103,695],{"class":600},[583,12105,12106,12108,12110,12112,12114,12116,12118,12120,12122,12124,12126],{"class":585,"line":1320},[583,12107,11898],{"class":701},[583,12109,705],{"class":600},[583,12111,601],{"class":600},[583,12113,10752],{"class":701},[583,12115,705],{"class":600},[583,12117,7835],{"class":600},[583,12119,10759],{"class":628},[583,12121,7840],{"class":600},[583,12123,1571],{"class":604},[583,12125,10767],{"class":600},[583,12127,6645],{"class":600},[583,12129,12130,12132],{"class":585,"line":1329},[583,12131,1264],{"class":600},[583,12133,868],{"class":701},[583,12135,12136,12138,12140,12142,12144,12146,12148,12150,12152,12154,12156,12158,12160,12162,12164,12166,12168,12170],{"class":585,"line":2619},[583,12137,11929],{"class":679},[583,12139,682],{"class":701},[583,12141,11535],{"class":604},[583,12143,722],{"class":600},[583,12145,10790],{"class":604},[583,12147,4676],{"class":701},[583,12149,8723],{"class":4519},[583,12151,5959],{"class":701},[583,12153,722],{"class":600},[583,12155,960],{"class":604},[583,12157,719],{"class":701},[583,12159,722],{"class":600},[583,12161,10832],{"class":679},[583,12163,682],{"class":701},[583,12165,685],{"class":600},[583,12167,11217],{"class":628},[583,12169,685],{"class":600},[583,12171,868],{"class":701},[583,12173,12174,12176],{"class":585,"line":2625},[583,12175,865],{"class":600},[583,12177,868],{"class":604},[501,12179],{},[459,12181,12183],{"id":12182},"best-practices","Best Practices",[568,12185,12187],{"id":12186},"_1-always-use-organization-member-pattern","1. Always Use Organization-Member Pattern",[573,12189,12191],{"className":575,"code":12190,"language":577,"meta":578,"style":578},"// ✅ GOOD: Roles on membership table\norganizationMembers: {\n  userId, organizationId, role: 'admin'\n}\n\n// ❌ BAD: Role directly on user\nusers: {\n  id, email, role: 'admin'  // Role for ALL organizations\n}\n",[580,12192,12193,12198,12206,12226,12230,12234,12239,12247,12270],{"__ignoreMap":578},[583,12194,12195],{"class":585,"line":586},[583,12196,12197],{"class":589},"// ✅ GOOD: Roles on membership table\n",[583,12199,12200,12202,12204],{"class":585,"line":593},[583,12201,3250],{"class":1696},[583,12203,705],{"class":600},[583,12205,695],{"class":600},[583,12207,12208,12210,12212,12214,12216,12218,12220,12222,12224],{"class":585,"line":635},[583,12209,1001],{"class":604},[583,12211,608],{"class":600},[583,12213,4104],{"class":604},[583,12215,608],{"class":600},[583,12217,4219],{"class":1696},[583,12219,705],{"class":600},[583,12221,625],{"class":600},[583,12223,2454],{"class":628},[583,12225,632],{"class":600},[583,12227,12228],{"class":585,"line":656},[583,12229,3805],{"class":600},[583,12231,12232],{"class":585,"line":663},[583,12233,660],{"emptyLinePlaceholder":659},[583,12235,12236],{"class":585,"line":698},[583,12237,12238],{"class":589},"// ❌ BAD: Role directly on user\n",[583,12240,12241,12243,12245],{"class":585,"line":734},[583,12242,2055],{"class":1696},[583,12244,705],{"class":600},[583,12246,695],{"class":600},[583,12248,12249,12251,12253,12255,12257,12259,12261,12263,12265,12267],{"class":585,"line":764},[583,12250,702],{"class":604},[583,12252,608],{"class":600},[583,12254,10268],{"class":604},[583,12256,608],{"class":600},[583,12258,4219],{"class":1696},[583,12260,705],{"class":600},[583,12262,625],{"class":600},[583,12264,2454],{"class":628},[583,12266,685],{"class":600},[583,12268,12269],{"class":589},"  // Role for ALL organizations\n",[583,12271,12272],{"class":585,"line":800},[583,12273,3805],{"class":600},[568,12275,12277],{"id":12276},"_2-validate-organization-membership","2. Validate Organization Membership",[573,12279,12281],{"className":575,"code":12280,"language":577,"meta":578,"style":578},"async objectLevel(post, context) {\n  // Verify user is member of the resource's organization\n  const isMember = await hasMinimumRole(\n    context.user.id,\n    post.organizationId,\n    'viewer'\n  )\n\n  if (!isMember) return false\n\n  // Then check specific permissions\n  return post.authorId === context.user.id || isOrgAdmin(...)\n}\n",[580,12282,12283,12301,12306,12321,12336,12347,12355,12360,12364,12381,12385,12390,12422],{"__ignoreMap":578},[583,12284,12285,12288,12291,12294,12296,12299],{"class":585,"line":586},[583,12286,12287],{"class":604},"async ",[583,12289,12290],{"class":679},"objectLevel",[583,12292,12293],{"class":604},"(post",[583,12295,608],{"class":600},[583,12297,12298],{"class":604}," context) ",[583,12300,1205],{"class":600},[583,12302,12303],{"class":585,"line":593},[583,12304,12305],{"class":589},"  // Verify user is member of the resource's organization\n",[583,12307,12308,12310,12313,12315,12317,12319],{"class":585,"line":635},[583,12309,4027],{"class":669},[583,12311,12312],{"class":604}," isMember",[583,12314,1545],{"class":600},[583,12316,1548],{"class":596},[583,12318,4577],{"class":679},[583,12320,3978],{"class":701},[583,12322,12323,12326,12328,12330,12332,12334],{"class":585,"line":656},[583,12324,12325],{"class":604},"    context",[583,12327,722],{"class":600},[583,12329,1436],{"class":604},[583,12331,722],{"class":600},[583,12333,714],{"class":604},[583,12335,731],{"class":600},[583,12337,12338,12341,12343,12345],{"class":585,"line":663},[583,12339,12340],{"class":604},"    post",[583,12342,722],{"class":600},[583,12344,1403],{"class":604},[583,12346,731],{"class":600},[583,12348,12349,12351,12353],{"class":585,"line":698},[583,12350,3701],{"class":600},[583,12352,2472],{"class":628},[583,12354,632],{"class":600},[583,12356,12357],{"class":585,"line":734},[583,12358,12359],{"class":701},"  )\n",[583,12361,12362],{"class":585,"line":764},[583,12363,660],{"emptyLinePlaceholder":659},[583,12365,12366,12368,12370,12372,12375,12377,12379],{"class":585,"line":800},[583,12367,4240],{"class":596},[583,12369,1202],{"class":701},[583,12371,4245],{"class":600},[583,12373,12374],{"class":604},"isMember",[583,12376,1574],{"class":701},[583,12378,4252],{"class":596},[583,12380,4255],{"class":936},[583,12382,12383],{"class":585,"line":862},[583,12384,660],{"emptyLinePlaceholder":659},[583,12386,12387],{"class":585,"line":871},[583,12388,12389],{"class":589},"  // Then check specific permissions\n",[583,12391,12392,12394,12396,12398,12400,12402,12404,12406,12408,12410,12412,12414,12416,12418,12420],{"class":585,"line":876},[583,12393,4128],{"class":596},[583,12395,5130],{"class":604},[583,12397,722],{"class":600},[583,12399,5079],{"class":604},[583,12401,3459],{"class":600},[583,12403,4767],{"class":604},[583,12405,722],{"class":600},[583,12407,1436],{"class":604},[583,12409,722],{"class":600},[583,12411,714],{"class":604},[583,12413,8746],{"class":600},[583,12415,4406],{"class":679},[583,12417,682],{"class":701},[583,12419,1749],{"class":600},[583,12421,868],{"class":701},[583,12423,12424],{"class":585,"line":903},[583,12425,3805],{"class":600},[568,12427,12429],{"id":12428},"_3-use-tenant-context-not-query-params","3. Use Tenant Context, Not Query Params",[573,12431,12433],{"className":575,"code":12432,"language":577,"meta":578,"style":578},"// ✅ GOOD: Tenant from context\nGET /api/posts\n// Returns posts for context.tenant.id\n\n// ❌ BAD: Tenant from query (can be spoofed)\nGET /api/posts?organizationId=org_b\n// User could access other orgs!\n",[580,12434,12435,12440,12453,12458,12462,12467,12488],{"__ignoreMap":578},[583,12436,12437],{"class":585,"line":586},[583,12438,12439],{"class":589},"// ✅ GOOD: Tenant from context\n",[583,12441,12442,12444,12446,12448,12450],{"class":585,"line":593},[583,12443,9381],{"class":604},[583,12445,9384],{"class":600},[583,12447,6163],{"class":604},[583,12449,9384],{"class":600},[583,12451,12452],{"class":604},"posts\n",[583,12454,12455],{"class":585,"line":635},[583,12456,12457],{"class":589},"// Returns posts for context.tenant.id\n",[583,12459,12460],{"class":585,"line":656},[583,12461,660],{"emptyLinePlaceholder":659},[583,12463,12464],{"class":585,"line":663},[583,12465,12466],{"class":589},"// ❌ BAD: Tenant from query (can be spoofed)\n",[583,12468,12469,12471,12473,12475,12477,12479,12481,12483,12485],{"class":585,"line":698},[583,12470,9381],{"class":604},[583,12472,9384],{"class":600},[583,12474,6163],{"class":604},[583,12476,9384],{"class":600},[583,12478,894],{"class":604},[583,12480,4286],{"class":600},[583,12482,1403],{"class":604},[583,12484,676],{"class":600},[583,12486,12487],{"class":604},"org_b\n",[583,12489,12490],{"class":585,"line":734},[583,12491,12492],{"class":589},"// User could access other orgs!\n",[568,12494,12496],{"id":12495},"_4-cascade-delete-organization-data","4. Cascade Delete Organization Data",[573,12498,12500],{"className":575,"code":12499,"language":577,"meta":578,"style":578},"organizationId: text('organization_id')\n  .references(() => organizations.id, { onDelete: 'cascade' })\n",[580,12501,12502,12520],{"__ignoreMap":578},[583,12503,12504,12506,12508,12510,12512,12514,12516,12518],{"class":585,"line":586},[583,12505,1403],{"class":1696},[583,12507,705],{"class":600},[583,12509,611],{"class":679},[583,12511,682],{"class":604},[583,12513,685],{"class":600},[583,12515,1041],{"class":628},[583,12517,685],{"class":600},[583,12519,868],{"class":604},[583,12521,12522,12525,12527,12529,12531,12533,12535,12537,12539,12541,12543,12545,12547,12549,12551,12553,12555],{"class":585,"line":593},[583,12523,12524],{"class":600},"  .",[583,12526,1068],{"class":679},[583,12528,682],{"class":604},[583,12530,728],{"class":600},[583,12532,848],{"class":669},[583,12534,1077],{"class":604},[583,12536,722],{"class":600},[583,12538,714],{"class":604},[583,12540,608],{"class":600},[583,12542,601],{"class":600},[583,12544,1088],{"class":701},[583,12546,705],{"class":600},[583,12548,625],{"class":600},[583,12550,1095],{"class":628},[583,12552,685],{"class":600},[583,12554,619],{"class":600},[583,12556,868],{"class":604},[568,12558,12560],{"id":12559},"_5-test-cross-tenant-scenarios","5. Test Cross-Tenant Scenarios",[573,12562,12564],{"className":575,"code":12563,"language":577,"meta":578,"style":578},"// Test matrix:\n// - User in Org A cannot see Org B data\n// - User in Org A cannot modify Org B data\n// - Admin in Org A cannot access Org B\n// - Superadmin can access all orgs\n// - Organization switching works correctly\n",[580,12565,12566,12571,12576,12581,12586,12591],{"__ignoreMap":578},[583,12567,12568],{"class":585,"line":586},[583,12569,12570],{"class":589},"// Test matrix:\n",[583,12572,12573],{"class":585,"line":593},[583,12574,12575],{"class":589},"// - User in Org A cannot see Org B data\n",[583,12577,12578],{"class":585,"line":635},[583,12579,12580],{"class":589},"// - User in Org A cannot modify Org B data\n",[583,12582,12583],{"class":585,"line":656},[583,12584,12585],{"class":589},"// - Admin in Org A cannot access Org B\n",[583,12587,12588],{"class":585,"line":663},[583,12589,12590],{"class":589},"// - Superadmin can access all orgs\n",[583,12592,12593],{"class":585,"line":698},[583,12594,12595],{"class":589},"// - Organization switching works correctly\n",[501,12597],{},[459,12599,12601],{"id":12600},"troubleshooting","Troubleshooting",[568,12603,12605],{"id":12604},"multi-tenancy-not-working","Multi-Tenancy Not Working",[455,12607,12608,12611],{},[472,12609,12610],{},"Problem:"," All organizations' data visible",[455,12613,12614],{},[472,12615,12616],{},"Solution:",[508,12618,12619,12625,12631,12637],{},[469,12620,12621,12622],{},"Verify ",[580,12623,12624],{},"multiTenancy.enabled: true",[469,12626,12627,12628,12630],{},"Check ",[580,12629,3621],{}," returns correct org ID",[469,12632,12633,12634,12636],{},"Ensure ",[580,12635,1403],{}," field exists in tables",[469,12638,12627,12639,12642],{},[580,12640,12641],{},"event.context.user?.organizationId"," is set",[568,12644,12646],{"id":12645},"cross-tenant-data-leakage","Cross-Tenant Data Leakage",[455,12648,12649,12651],{},[472,12650,12610],{}," User sees data from other organizations",[455,12653,12654],{},[472,12655,12616],{},[508,12657,12658,12664,12667,12670],{},[469,12659,12660,12661,12663],{},"Disable ",[580,12662,3639],{}," for regular users",[469,12665,12666],{},"Verify tenant context is set correctly",[469,12668,12669],{},"Check excluded resources list",[469,12671,12672],{},"Add integration tests for cross-tenant scenarios",[568,12674,12676],{"id":12675},"api-tokens-not-scoped","API Tokens Not Scoped",[455,12678,12679,12681],{},[472,12680,12610],{}," API token accesses all organizations",[455,12683,12684],{},[472,12685,12616],{},[508,12687,12688,12694,12700,12708],{},[469,12689,12633,12690,12693],{},[580,12691,12692],{},"orgField: 'organizationId'"," in token plugin config",[469,12695,12696,12697,12699],{},"Verify tokens have ",[580,12698,1403],{}," column",[469,12701,12627,12702,12705,12706],{},[580,12703,12704],{},"mapUser"," includes ",[580,12707,1403],{},[469,12709,12710],{},"Test token introspection endpoint",[501,12712],{},[459,12714,12716],{"id":12715},"see-also","See Also",[466,12718,12719,12725,12730,12735],{},[469,12720,12721,12724],{},[513,12722,12723],{"href":284},"Authorization Guide"," - Permission system",[469,12726,12727,12729],{},[513,12728,287],{"href":288}," - Session management",[469,12731,12732,12734],{},[513,12733,544],{"href":224}," - Token authentication",[469,12736,12737,12739],{},[513,12738,319],{"href":284}," - Resource permissions",[12741,12742,12743],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":578,"searchDepth":593,"depth":593,"links":12745},[12746,12747,12748,12754,12758,12763,12768,12775,12783,12790,12796,12800,12807,12812],{"id":461,"depth":593,"text":5},{"id":505,"depth":593,"text":506},{"id":566,"depth":593,"text":198,"children":12749},[12750,12751,12752,12753],{"id":570,"depth":635,"text":571},{"id":1337,"depth":635,"text":1338},{"id":1462,"depth":635,"text":1463},{"id":1675,"depth":635,"text":1676},{"id":1764,"depth":593,"text":521,"children":12755},[12756,12757],{"id":1767,"depth":635,"text":1768},{"id":3239,"depth":635,"text":3240},{"id":3275,"depth":593,"text":527,"children":12759},[12760,12761,12762],{"id":3278,"depth":635,"text":3279},{"id":3487,"depth":635,"text":3488},{"id":3651,"depth":635,"text":3652},{"id":3810,"depth":593,"text":533,"children":12764},[12765,12766,12767],{"id":3813,"depth":635,"text":3814},{"id":4699,"depth":635,"text":4700},{"id":5311,"depth":635,"text":5312},{"id":5669,"depth":593,"text":287,"children":12769},[12770,12771,12772,12773,12774],{"id":5672,"depth":635,"text":194},{"id":5691,"depth":635,"text":5692},{"id":6053,"depth":635,"text":6054},{"id":6556,"depth":635,"text":6557},{"id":6685,"depth":635,"text":6686},{"id":6725,"depth":593,"text":6726,"children":12776},[12777,12778,12779,12780,12781,12782],{"id":6729,"depth":635,"text":527},{"id":7232,"depth":635,"text":7233},{"id":7701,"depth":635,"text":7702},{"id":8215,"depth":635,"text":8216},{"id":8266,"depth":635,"text":8267},{"id":8369,"depth":635,"text":8370},{"id":8536,"depth":593,"text":550,"children":12784},[12785,12786,12787,12788,12789],{"id":8539,"depth":635,"text":8540},{"id":8609,"depth":635,"text":8610},{"id":8798,"depth":635,"text":8799},{"id":8869,"depth":635,"text":8870},{"id":9013,"depth":635,"text":9014},{"id":9279,"depth":593,"text":556,"children":12791},[12792,12793,12794,12795],{"id":9282,"depth":635,"text":9283},{"id":9445,"depth":635,"text":9446},{"id":9539,"depth":635,"text":9540},{"id":9652,"depth":635,"text":9653},{"id":9875,"depth":593,"text":271,"children":12797},[12798,12799],{"id":9878,"depth":635,"text":9879},{"id":11575,"depth":635,"text":11576},{"id":12182,"depth":593,"text":12183,"children":12801},[12802,12803,12804,12805,12806],{"id":12186,"depth":635,"text":12187},{"id":12276,"depth":635,"text":12277},{"id":12428,"depth":635,"text":12429},{"id":12495,"depth":635,"text":12496},{"id":12559,"depth":635,"text":12560},{"id":12600,"depth":593,"text":12601,"children":12808},[12809,12810,12811],{"id":12604,"depth":635,"text":12605},{"id":12645,"depth":635,"text":12646},{"id":12675,"depth":635,"text":12676},{"id":12715,"depth":593,"text":12716},"md",null,{},{"title":235,"description":457},"Vl9UGjb3xCLRS1BfEL9JBvKFZBHm9qxgCn67gX4xpgw",[12819,12821],{"title":231,"path":232,"stem":233,"description":12820,"children":-1},"@websideproject/nuxt-auto-api provides two approaches for building custom server endpoints that integrate with the auto-api pipeline: createEndpoint() for full pipeline integration, and standalone helpers for lightweight use in regular Nitro handlers.",{"title":239,"path":240,"stem":241,"description":12822,"children":-1},"@websideproject/nuxt-auto-api uses Zod for validation with automatic schema generation from Drizzle tables via drizzle-zod.",1772977478045]