fix(jira): emitir card.moved al cambiar columna + adaptive indicator polling
Bug: handleMoveCard solo emitia board.invalidated. Dispatcher mapeaba a update() (PUT summary/description/labels) NUNCA a transition(), asi que mover una card en kanban no transicionaba su Jira issue de columna. Solo los labels reflejaban el cambio. Fix backend (handlers.go): - handleMoveCard ahora lee column_id antes del MoveCard. Si la card crusa columnas (prev != new) publica 'card.moved' antes de 'board.invalidated'. El dispatcher reconoce 'card.moved' y ejecuta transition() -> Jira status cambia + labels sincronizan. - Reorder dentro de la misma columna sigue como antes: solo board.invalidated para refetch del cliente sin tocar Jira. - nuevo helper db.lookupCardColumnID(cardID). UX frontend (JiraSyncIndicator): - Polling adaptativo: 5s steady, 1s mientras inflight=true. El usuario VE el yellow durante el sync. - Listener de window CustomEvent 'kanban-card-moved' (cardId match) que fuerza un refetch inmediato (~150ms) tras drop. App.tsx dispara el evento tras api.moveCard resolve. Yellow visible casi instantaneo en lugar de esperar al proximo tick steady.
This commit is contained in:
@@ -322,6 +322,10 @@ func handleMoveCard(db *DB, hub *EventHub) http.HandlerFunc {
|
||||
badRequest(w, "column_id required")
|
||||
return
|
||||
}
|
||||
// Read the previous column BEFORE mutating so we can decide whether
|
||||
// this is an actual column move (vs a same-column reorder). Outbound
|
||||
// modules (Jira) only care about the former.
|
||||
prevColumnID, _ := db.lookupCardColumnID(id)
|
||||
actor, _ := infra.UserIDFromContext(r.Context(), userCtxKey)
|
||||
if err := db.MoveCard(id, body.ColumnID, body.OrderedIDs, actor); err != nil {
|
||||
if strings.Contains(err.Error(), "not found") {
|
||||
@@ -331,6 +335,17 @@ func handleMoveCard(db *DB, hub *EventHub) http.HandlerFunc {
|
||||
serverError(w, err)
|
||||
return
|
||||
}
|
||||
// Distinct event when the card crossed columns so the Jira module
|
||||
// runs transition() instead of plain update(). Reorder-only goes
|
||||
// straight to board.invalidated (frontend refetch) without a Jira
|
||||
// roundtrip.
|
||||
if prevColumnID != "" && prevColumnID != body.ColumnID {
|
||||
hub.PublishJSON("card.moved", id, "", map[string]string{
|
||||
"card_id": id,
|
||||
"from_column_id": prevColumnID,
|
||||
"to_column_id": body.ColumnID,
|
||||
})
|
||||
}
|
||||
publishInvalidated(hub, id, body.ColumnID)
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user