feat(chat): modifica dei messaggi e firma di chi risponde
Due mancanze emerse provando la chat a canali in produzione. **Modifica dei messaggi** (migration 0022, additiva, già applicata a prod). Modello Slack/Discord: si corregge un proprio messaggio senza limite di tempo, il testo precedente non si conserva, accanto all'ora compare «modificato». Scelta deliberata, annotata in STATUS.md. Il punto delicato non è la scrittura ma la propagazione: il poll chiede `created_at > since` e una modifica non cambia `created_at`, quindi l'altra parte vedrebbe il testo vecchio fino a un reload. Il filtro ora guarda anche `edited_at`, e il watermark del client è il massimo fra i due su tutti i messaggi — senza, il server rispedirebbe lo stesso messaggio a ogni giro per sempre. Il merge per id già esistente fa il resto, quindi niente duplicati. Il non-letto resta ancorato a `created_at` di proposito: correggere un refuso non deve riaccendere il pallino di un canale già letto. Si modifica solo ciò di cui si è autori — il controllo è su `author`, non solo sulla proprietà dell'entità, e lo rifà il server. **Firma in chat.** Il nome era la stringa "iamcavalli" cablata nel pannello: il cliente leggeva il marchio dove si aspetta una persona. Ora arriva da `settings` (nessuna migration) con foto via URL esterno, che rispetta il vincolo LOCKED #5 — l'upload su volume non esiste, la deroga per l'audit è scritta in CLAUDE.md ma non è mai stata costruita. Avatar rotto o assente ricade sul monogramma. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,8 @@ export type ThreadMessage = {
|
||||
author: "client" | "admin";
|
||||
body: string;
|
||||
created_at: Date;
|
||||
/** Valorizzato solo se il messaggio è stato modificato dopo l'invio. */
|
||||
edited_at: Date | null;
|
||||
entityLabel: string;
|
||||
entityType: string;
|
||||
/**
|
||||
@@ -276,6 +278,7 @@ export async function getConversationThread(
|
||||
author: c.author as "client" | "admin",
|
||||
body: c.body,
|
||||
created_at: c.created_at,
|
||||
edited_at: c.edited_at,
|
||||
entityLabel: info?.label ?? "Generale",
|
||||
entityType: info?.type ?? "general",
|
||||
// Entità sparita (fase cancellata): il messaggio riemerge in Generale
|
||||
|
||||
Reference in New Issue
Block a user