Files
kandev/apps/backend/internal/user/models/thread_view_json.go
T

53 lines
1.4 KiB
Go

package models
import (
"bytes"
"encoding/json"
"errors"
)
// Omitted presentation fields have compatibility defaults. Explicit nulls
// and empty layouts are not valid new settings values.
// Unknown layout strings are validated by the service layer; JSON checks
// reject explicit values that would otherwise become zero-value defaults.
func decodeThreadViewJSON(data []byte, target any) error {
if err := json.Unmarshal(data, target); err != nil {
return err
}
var fields struct {
Layout json.RawMessage `json:"layout"`
AutoHideComposer json.RawMessage `json:"auto_hide_composer"`
}
if err := json.Unmarshal(data, &fields); err != nil {
return err
}
layout := string(bytes.TrimSpace(fields.Layout))
if layout == "null" || layout == `""` {
return errors.New("thread layout must be columns or grid")
}
if bytes.Equal(bytes.TrimSpace(fields.AutoHideComposer), []byte("null")) {
return errors.New("auto_hide_composer must be a boolean")
}
return nil
}
func (v *ThreadView) UnmarshalJSON(data []byte) error {
type value ThreadView
var decoded value
if err := decodeThreadViewJSON(data, &decoded); err != nil {
return err
}
*v = ThreadView(decoded)
return nil
}
func (v *ThreadViewDraft) UnmarshalJSON(data []byte) error {
type value ThreadViewDraft
var decoded value
if err := decodeThreadViewJSON(data, &decoded); err != nil {
return err
}
*v = ThreadViewDraft(decoded)
return nil
}