Skip to content

Commit 0683f39

Browse files
committed
merge: dev4 → master — indici UNIQUE totali per companies/highlights (mig 050) + backlog swipe-triage posizioni
2 parents 5ae20d9 + 8bb5275 commit 0683f39

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

BACKLOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,17 @@ Versione: `package.json` `v0.1.17` (production ferma a `v0.1.12` dopo blocco Tur
184184

185185
---
186186

187+
### 🃏 [JHT-POSITIONS-SWIPE-TRIAGE] Triage rapido posizioni — swipe destra/sinistra (NEW 2026-06-29)
188+
189+
**Sezione/modalità "swipe" (stile Tinder) per fare un triage veloce delle posizioni e scartare subito quelle sicuramente da evitare.** Idea utente 2026-06-29 mentre lavoriamo al redesign delle pagine posizione (vedi memoria `[[project_position_page_content_redesign]]`). Da fare DOPO il perfezionamento delle pagine posizione.
190+
191+
- **UX**: una card per posizione (titolo, azienda, score, sintesi JD breve); **swipe sinistra = scarta** (sicuramente da evitare), **swipe destra = tieni/interessa**; supporto anche frecce tastiera/bottoni per desktop. Pensata per smaltire in fretta il backlog di posizioni "ready"/"scored" senza aprirle una a una.
192+
- **Backend già pronto**: l'azione di esclusione utente esiste — la route `user-exclude` scrive `last_actor='user'` + `user_excluded_at` + transizione, e `pull-desired-state` la propaga NARROW cloud→VPS così il team smette di lavorarci (vedi `[JHT-DATA-SYNC]` "Follow-up categorizzazione azioni utente"). Lo swipe sarebbe un nuovo *front-end* su quell'azione, più un'azione "tieni/like" (`position_feedback`).
193+
- **Vincolo read-only/sicurezza**: la scrittura (escludi/tieni) deve passare da desktop/local (`requireLocalWrite`) **oppure** dalla corsia richieste async cloud — come like/ticket, che restano cloud (vedi `[[feedback_web_readonly_is_security]]`). Quindi lo swipe può vivere anche sul web cloud purché usi la corsia async, non la scrittura diretta.
194+
- **Aperto**: dove collocarlo (pagina dedicata `/positions/triage` vs modalità della lista); se filtrare per soglia score; se mostrare solo le non-ancora-triate; gesture mobile vs desktop.
195+
196+
---
197+
187198
### 1️⃣ PHASE 1 — Web Platform Consolidation (current sprint)
188199

189200
#### 🔴 HIGH PRIORITY
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
-- 050_companies_highlights_full_unique_index.sql
2+
-- Fix bug latente di mig 046: gli indici UNIQUE di `companies` e
3+
-- `position_highlights` erano PARZIALI (`WHERE legacy_id IS NOT NULL`).
4+
--
5+
-- Il route push usa `supabase-js .upsert(payload, { onConflict: "user_id,legacy_id" })`
6+
-- (web/app/api/cloud-sync/push/route.ts:433 companies, :743 highlights), che genera
7+
-- `INSERT ... ON CONFLICT (user_id, legacy_id)` SENZA la clausola `WHERE`. Postgres
8+
-- NON può inferire un indice PARZIALE da un ON CONFLICT senza lo stesso predicato →
9+
-- "there is no unique or exclusion constraint matching the ON CONFLICT specification"
10+
-- → il push falliva con HTTP 500 al PRIMO esercizio reale del path (companies/highlights
11+
-- non erano mai risaliti finché il route nuovo non è andato in production).
12+
--
13+
-- positions (mig 007 `positions_user_legacy_unique`) usa un indice TOTALE e funziona:
14+
-- allineiamo companies/highlights allo stesso schema. I NULL restano non-collidenti
15+
-- (UNIQUE tratta i NULL come distinti in Postgres), quindi le righe legacy senza
16+
-- legacy_id non violano il vincolo — esattamente come positions.
17+
18+
-- ── COMPANIES ──────────────────────────────────────────────────
19+
DROP INDEX IF EXISTS idx_companies_user_legacy;
20+
CREATE UNIQUE INDEX IF NOT EXISTS idx_companies_user_legacy
21+
ON companies(user_id, legacy_id);
22+
23+
-- ── POSITION_HIGHLIGHTS ────────────────────────────────────────
24+
DROP INDEX IF EXISTS idx_highlights_user_legacy;
25+
CREATE UNIQUE INDEX IF NOT EXISTS idx_highlights_user_legacy
26+
ON position_highlights(user_id, legacy_id);

0 commit comments

Comments
 (0)