Changeset 0.19.0 (#81)

This commit is contained in:
2026-02-28 21:55:13 +00:00
parent a591b810a9
commit 091ce2af6a
5 changed files with 393 additions and 314 deletions

View File

@@ -98,60 +98,7 @@ func writeTagsArg(tags []string) interface{} {
return pq.Array(tags)
}
// ── JSON scanner (settings column) ──────────
// SQLite returns TEXT for JSON columns; json.RawMessage ([]byte) can't scan
// from a string with modernc.org/sqlite. This wrapper handles both dialects.
type jsonScanner struct{ dest *json.RawMessage }
func scanJSON(dest *json.RawMessage) *jsonScanner { return &jsonScanner{dest: dest} }
func (s *jsonScanner) Scan(src interface{}) error {
switch v := src.(type) {
case []byte:
*s.dest = json.RawMessage(v)
case string:
*s.dest = json.RawMessage(v)
case nil:
*s.dest = json.RawMessage("{}")
default:
*s.dest = json.RawMessage("{}")
}
return nil
}
// tagsScanner wraps a *[]string so rows.Scan can populate it on both dialects.
type tagsScanner struct {
dest *[]string
}
func scanTags(dest *[]string) *tagsScanner {
return &tagsScanner{dest: dest}
}
func (s *tagsScanner) Scan(src interface{}) error {
if database.IsSQLite() {
var raw string
switch v := src.(type) {
case string:
raw = v
case []byte:
raw = string(v)
case nil:
*s.dest = []string{}
return nil
}
var arr []string
if err := json.Unmarshal([]byte(raw), &arr); err != nil {
*s.dest = []string{}
return nil
}
*s.dest = arr
return nil
}
// Postgres: delegate to pq
return pq.Array(s.dest).Scan(src)
}
// scanJSON, scanTags, SafeJSON → safe_json.go
// ── Helpers ─────────────────────────────────
@@ -281,7 +228,7 @@ func (h *ChannelHandler) ListChannels(c *gin.Context) {
channels = append(channels, ch)
}
c.JSON(http.StatusOK, paginatedResponse{
SafeJSON(c, http.StatusOK, paginatedResponse{
Data: channels,
Page: page,
PerPage: perPage,
@@ -399,7 +346,7 @@ func (h *ChannelHandler) CreateChannel(c *gin.Context) {
}
}
c.JSON(http.StatusCreated, ch)
SafeJSON(c, http.StatusCreated, ch)
}
// ── Get Channel ─────────────────────────────
@@ -441,7 +388,7 @@ func (h *ChannelHandler) GetChannel(c *gin.Context) {
}
ch.Tags = tags
c.JSON(http.StatusOK, ch)
SafeJSON(c, http.StatusOK, ch)
}
// ── Update Channel ──────────────────────────