feat(beskeder): klokken siger til, når nogen rører noget, der er dit
En delt note blev rettet af en anden, og man opdagede det kun ved at åbne den. En opgave blev givet til en, og den lå bare der. Det, andre gør ved det, man deler, skal man kunne se uden at lede efter det. Klokken i hovedet: ulæste beskeder om noter, der er blevet rettet, delt med en, eller opgaver, man har fået. Sætningen skrives i browseren, ikke på serveren, så et engelsk interface får en engelsk klokke. Beskeder om den samme note bliver slået sammen, mens de er ulæste. En note gemmes på en tastepause, så en række pr. gem ville lave én person, der skriver i fem minutter, om til tyve ens linjer. Er beskeden læst, er den næste rettelse en ny ting at få at vide — ikke en gentagelse. note_id får sin egen søjle ved siden af project_id og task_id frem for et generisk (kind, id)-par: de tre er ikke det samme slags nul, og fremmednøglen — dén, der rydder beskeden op, når noten slettes — kan et generisk par ikke have. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
48509e3073
commit
ab77024ec9
@@ -372,3 +372,41 @@ func (db *DB) SyncLinkedShares(ctx context.Context, ownerID string) ([]LinkedSha
|
||||
})
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// NoteAudience is everybody who can see a note: its owner, the people it is shared
|
||||
// with — chosen or followed along a link — and the members of the project it is
|
||||
// filed in.
|
||||
//
|
||||
// Ét spørgsmål frem for tre, fordi svaret skal være en mængde og ikke tre lister,
|
||||
// der skal lægges sammen bagefter: en person kan både eje projektet og have noten
|
||||
// delt direkte, og to beskeder om den samme rettelse er én for mange.
|
||||
//
|
||||
// The note's own row is joined rather than passed in, so a caller cannot ask about
|
||||
// a note that has been deleted and get an audience for it anyway.
|
||||
func (db *DB) NoteAudience(ctx context.Context, noteID string) ([]string, error) {
|
||||
rows, err := db.QueryContext(ctx, `
|
||||
SELECT created_by FROM notes WHERE id = ? AND deleted_at IS NULL AND created_by IS NOT NULL
|
||||
UNION
|
||||
SELECT user_id FROM note_shares WHERE note_id = ?
|
||||
UNION
|
||||
SELECT p.owner_id FROM notes n JOIN projects p ON p.id = n.project_id
|
||||
WHERE n.id = ? AND n.deleted_at IS NULL AND p.deleted_at IS NULL
|
||||
UNION
|
||||
SELECT m.user_id FROM notes n JOIN project_members m ON m.project_id = n.project_id
|
||||
WHERE n.id = ? AND n.deleted_at IS NULL`,
|
||||
noteID, noteID, noteID, noteID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var out []string
|
||||
for rows.Next() {
|
||||
var id string
|
||||
if err := rows.Scan(&id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out = append(out, id)
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user