Causa del 403: Supabase evalúa siempre la política INSERT cuando se usa .upsert(), incluso si la fila ya existe. client_editor no tiene INSERT en processes, entonces cualquier .upsert() sobre procesos existentes fallaba con 403.
Some checks failed
/ Deploy to Cloudflare Pages (push) Has been cancelled

Fix: nuevo método updateEditable() en process-repo.ts que usa .update().eq('id', process.id) con solo los campos editables (sin bpmn_xml, owner_id, created_by, id). Todos los paths de edición en process-store.ts y library-store.ts ahora usan updateEditable(). El .upsert() original queda únicamente para la creación inicial desde ImportPage y setCurrentProcess — rutas que client_editor nunca puede alcanzar (el import está bloqueado por el guard de rol).
This commit is contained in:
2026-07-07 13:25:43 -03:00
parent 9b89cb8669
commit cad8fbca4f
3 changed files with 29 additions and 7 deletions

View File

@@ -72,6 +72,28 @@ export const supabaseProcessRepo = {
if (error) throw error
},
// Actualiza solo campos editables por el usuario (sin bpmn_xml, owner_id, created_by).
// Usa UPDATE en lugar de upsert para evitar el chequeo de INSERT policy (que client_editor no tiene).
async updateEditable(process: Process, userId: string): Promise<void> {
const { error } = await supabase
.from('processes')
.update({
name: process.name,
client: process.clientName,
currency: process.currency,
overhead_percentage: process.overheadPercentage,
annual_frequency: process.annualFrequency,
analysis_horizon_years: process.analysisHorizonYears,
automation_investment: process.automationInvestment,
tags: process.tags,
group_id: process.groupId,
updated_by: userId,
updated_at: new Date().toISOString(),
})
.eq('id', process.id)
if (error) throw error
},
async getById(id: string): Promise<Process | undefined> {
const { data, error } = await supabase
.from('processes')