multitenant-development
0
总安装量
1
周安装量
安装命令
npx skills add https://github.com/santiagoxor/pintureria-digital --skill multitenant-development
Agent 安装分布
amp
1
cline
1
opencode
1
cursor
1
continue
1
kimi-cli
1
Skill 文档
Multitenant Development
Quick Start
When working with multitenant features:
- Always verify tenant with
getTenantFromRequest()in APIs and middleware - Never make queries without filtering by
tenant_id - Ensure RLS policies include tenant verification
- Configure tenant-specific assets in
public/tenants/{tenant_slug}/ - Usar
getTenantAssetPath(tenant, assetPath, fallback)para URLs de assets (incluye cache busting?v=por deploy)
Key Files
src/lib/tenant/tenant-service.ts– Main tenant servicesrc/lib/tenant/tenant-assets.ts– URLs de assets con cache busting (Supabase o local)src/middleware.ts– Tenant detectionsrc/components/TenantThemeStyles.tsx– Tenant stylessupabase/migrations/*– RLS migrationsoptimize-pintemas-assets-upload.js– Subir assets de tenants al buckettenant-assets
Common Patterns
API with Tenant Isolation
import { getTenantFromRequest } from '@/lib/tenant/tenant-service';
import { createClient } from '@/lib/supabase/server';
export async function GET(request: NextRequest) {
const tenant = await getTenantFromRequest(request);
if (!tenant) {
return NextResponse.json({ error: 'Tenant not found' }, { status: 404 });
}
const supabase = createClient();
const { data, error } = await supabase
.from('products')
.select('*')
.eq('tenant_id', tenant.id);
if (error) {
return NextResponse.json({ error: error.message }, { status: 500 });
}
return NextResponse.json(data);
}
RLS Policy
CREATE POLICY "tenant_isolation_products" ON products
FOR ALL
USING (
tenant_id = (
SELECT id FROM tenants
WHERE slug = current_setting('app.tenant_slug', true)
)
);
Tenant Assets
Usar getTenantAssetPath() para que las URLs lleven cache busting y se actualicen tras cada deploy:
import { getTenantAssetPath } from '@/lib/tenant/tenant-assets';
const tenant = useTenant();
const logoPath = getTenantAssetPath(tenant, 'logo.svg', '/images/logo/logo.svg');
const primaryColor = tenant.primary_color || '#ea5a17';
- Assets en Supabase: bucket
tenant-assets, rutatenants/{slug}/.... Subir connode optimize-pintemas-assets-upload.js. - Tras cambiar assets: hacer deploy y purgar caché CDN (
npm run cache:purgeo Vercel â Settings â Caches) para que se vean pronto en todos los dispositivos. Verdocs/CACHE_PURGE_ANTES_DEPLOY.md.
Checklist
- Verify tenant in each request
- Include
tenant_idin all queries - Verify RLS policies are active
- Test with multiple tenants
- Verify data isolation
- Configure tenant assets if needed