package admin import ( "strconv" "strings" ) // flexBool یک bool است که هنگامِ decode از JSON، مقادیرِ عددی/رشته‌ای را هم می‌پذیرد // (true/false، 0/1، "1"/"true"). دلیل: SQLite بولین‌ها را int برمی‌گرداند و پنل // همان مقدار را دوباره می‌فرستد؛ decodeِ سخت‌گیرِ Go عدد را در bool نمی‌پذیرد → 400. type flexBool bool func (f *flexBool) UnmarshalJSON(b []byte) error { s := strings.Trim(strings.TrimSpace(string(b)), `"`) *f = s == "1" || s == "true" || s == "1.0" return nil } // flexInt یک int64 است که از عدد، رشته‌ی عددی، خالی یا null هم decode می‌شود // (تا ورودی‌های متنیِ عددی مثلِ "2000" باعثِ 400 نشوند). type flexInt int64 func (f *flexInt) UnmarshalJSON(b []byte) error { s := strings.Trim(strings.TrimSpace(string(b)), `"`) if s == "" || s == "null" { *f = 0 return nil } v, err := strconv.ParseFloat(s, 64) // "2000" و "2000.0" هر دو if err != nil { return err } *f = flexInt(int64(v)) return nil } func (f flexInt) i() int64 { return int64(f) }