fix(api): normaliza categories/tags nil para [] no JSON
Slices Go nil viram 'null' no JSON, o que quebra clientes com tipos não-nuláveis com default (kotlinx.serialization rejeita null explícito). newNoteView/normalizeNote garante [] em list/get/create/update/restore. Motivado por teste real do cliente Android (duplicava creates ao falhar o decode da resposta 201).
This commit is contained in:
1 parent
11fc26390d
commit
63fd024f68
2 files changed
+23
-4
No files matched your search
+22
-3
@@ -47,6 +47,22 @@ type noteView struct {
|
|||||||
Content string `json:"content"`
|
Content string `json:"content"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// normalizeNote garante que slices nil viram [] no JSON (null quebra
|
||||||
|
// clientes com tipos não-nuláveis, ex. kotlinx.serialization).
|
||||||
|
func normalizeNote(n *store.Note) {
|
||||||
|
if n.Categories == nil {
|
||||||
|
n.Categories = []string{}
|
||||||
|
}
|
||||||
|
if n.Tags == nil {
|
||||||
|
n.Tags = []string{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newNoteView(n *store.Note, content string) noteView {
|
||||||
|
normalizeNote(n)
|
||||||
|
return noteView{n, content}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) handleListNotes(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) handleListNotes(w http.ResponseWriter, r *http.Request) {
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
recursive := q.Get("recursive") != "0"
|
recursive := q.Get("recursive") != "0"
|
||||||
@@ -63,6 +79,9 @@ func (s *Server) handleListNotes(w http.ResponseWriter, r *http.Request) {
|
|||||||
if notes == nil {
|
if notes == nil {
|
||||||
notes = []*store.Note{}
|
notes = []*store.Note{}
|
||||||
}
|
}
|
||||||
|
for _, n := range notes {
|
||||||
|
normalizeNote(n)
|
||||||
|
}
|
||||||
writeJSON(w, http.StatusOK, notes)
|
writeJSON(w, http.StatusOK, notes)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +98,7 @@ func (s *Server) handleCreateNote(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.publishSaved(n, author, in.Session, false)
|
s.publishSaved(n, author, in.Session, false)
|
||||||
writeJSON(w, http.StatusCreated, noteView{n, content})
|
writeJSON(w, http.StatusCreated, newNoteView(n, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) handleGetNote(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) handleGetNote(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -88,7 +107,7 @@ func (s *Server) handleGetNote(w http.ResponseWriter, r *http.Request) {
|
|||||||
mapStoreError(w, err)
|
mapStoreError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
writeJSON(w, http.StatusOK, noteView{n, content})
|
writeJSON(w, http.StatusOK, newNoteView(n, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) handleUpdateNote(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) handleUpdateNote(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -113,7 +132,7 @@ func (s *Server) handleUpdateNote(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.publishSaved(n, author, in.Session, false)
|
s.publishSaved(n, author, in.Session, false)
|
||||||
writeJSON(w, http.StatusOK, noteView{n, content})
|
writeJSON(w, http.StatusOK, newNoteView(n, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) handleDeleteNote(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) handleDeleteNote(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ func (s *Server) handleRestore(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.publishSaved(n, in.Author, in.Session, false)
|
s.publishSaved(n, in.Author, in.Session, false)
|
||||||
writeJSON(w, http.StatusOK, noteView{n, content})
|
writeJSON(w, http.StatusOK, newNoteView(n, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
func short(hash string) string {
|
func short(hash string) string {
|
||||||
|
|||||||
Reference in new issue
Block a user