feat(sprint-4/etapa-2): migración persistencia proceso/grupos/settings a Supabase

- Scripts SQL 002-004: process_groups, processes, app_settings con RLS
- supabaseProcessRepo: save/getById/getAll/delete con mapeo camelCase↔snake_case
  y limpieza Dexie en delete (actividades/gateways/resources/simulations)
- supabaseGroupRepo: save/getAll/getById/delete; FK ON DELETE SET NULL en processes
- supabaseSettingsRepo: get/update sobre fila singleton
- Stores actualizados: library-store y process-store usan repos Supabase para procesos
  (actividades/gateways/recursos siguen en Dexie hasta Etapa 3-4)
- ImportPage y useReportData actualizados a supabaseProcessRepo
- userId inyectado internamente en repos via supabase.auth.getSession() — no se
  threadea por la call stack; stores mantienen interfaces sin cambios
- 561/561 tests verdes, build limpio

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-28 00:23:38 -03:00
parent 78e776df6b
commit 11da15136d
10 changed files with 258 additions and 30 deletions

View File

@@ -1,5 +1,6 @@
import { create } from 'zustand'
import { processRepo, activityRepo, gatewayRepo, resourceRepo } from '@/persistence/repositories'
import { supabaseProcessRepo } from '@/persistence/supabase/process-repo'
import { activityRepo, gatewayRepo, resourceRepo } from '@/persistence/repositories'
import type { Process, Activity, GatewayConfig, Resource } from '@/domain/types'
interface ProcessState {
@@ -10,7 +11,6 @@ interface ProcessState {
isLoading: boolean
error: string | null
// Acciones
loadProcess: (processId: string) => Promise<void>
setCurrentProcess: (process: Process) => Promise<void>
updateProcess: (updates: Partial<Process>) => Promise<void>
@@ -34,7 +34,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
set({ isLoading: true, error: null })
try {
const [process, activities, gateways, resources] = await Promise.all([
processRepo.getById(processId),
supabaseProcessRepo.getById(processId),
activityRepo.getByProcess(processId),
gatewayRepo.getByProcess(processId),
resourceRepo.getByProcess(processId),
@@ -47,7 +47,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
},
setCurrentProcess: async (process) => {
await processRepo.save(process)
await supabaseProcessRepo.save(process)
const [activities, gateways, resources] = await Promise.all([
activityRepo.getByProcess(process.id),
gatewayRepo.getByProcess(process.id),
@@ -60,7 +60,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (!current) return
const updated: Process = { ...current, ...updates, updatedAt: Date.now() }
await processRepo.save(updated)
await supabaseProcessRepo.save(updated)
set({ currentProcess: updated })
},
@@ -69,7 +69,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (current) {
const updatedProcess = { ...current, updatedAt: Date.now() }
await processRepo.save(updatedProcess)
await supabaseProcessRepo.save(updatedProcess)
set((state) => ({
activities: state.activities.map((a) => (a.id === activity.id ? activity : a)),
currentProcess: updatedProcess,
@@ -86,7 +86,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (current) {
const updatedProcess = { ...current, updatedAt: Date.now() }
await processRepo.save(updatedProcess)
await supabaseProcessRepo.save(updatedProcess)
set((state) => ({
gateways: state.gateways.map((g) => (g.id === gateway.id ? gateway : g)),
currentProcess: updatedProcess,
@@ -103,7 +103,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (current) {
const updatedProcess = { ...current, updatedAt: Date.now() }
await processRepo.save(updatedProcess)
await supabaseProcessRepo.save(updatedProcess)
set((state) => ({ resources: [...state.resources, resource], currentProcess: updatedProcess }))
} else {
set((state) => ({ resources: [...state.resources, resource] }))
@@ -115,7 +115,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (current) {
const updatedProcess = { ...current, updatedAt: Date.now() }
await processRepo.save(updatedProcess)
await supabaseProcessRepo.save(updatedProcess)
set((state) => ({
resources: state.resources.map((r) => (r.id === resource.id ? resource : r)),
currentProcess: updatedProcess,
@@ -132,7 +132,7 @@ export const useProcessStore = create<ProcessState>((set, get) => ({
const current = get().currentProcess
if (current) {
const updatedProcess = { ...current, updatedAt: Date.now() }
await processRepo.save(updatedProcess)
await supabaseProcessRepo.save(updatedProcess)
set((state) => ({
resources: state.resources.filter((r) => r.id !== resourceId),
currentProcess: updatedProcess,