package app import ( "encoding/json" "fmt" "io" "log" "net/http" "strconv" "github.com/andyleap/hnh-map/internal/app/store" "go.etcd.io/bbolt" ) func (a *App) uploadMarkers(rw http.ResponseWriter, req *http.Request) { defer req.Body.Close() markers := []struct { Name string GridID string X, Y int Image string Type string Color string }{} buf, err := io.ReadAll(req.Body) if err != nil { log.Println("Error reading marker json: ", err) return } err = json.Unmarshal(buf, &markers) if err != nil { log.Println("Error decoding marker json: ", err) log.Println("Original json: ", string(buf)) return } err = a.db.Update(func(tx *bbolt.Tx) error { mb, err := tx.CreateBucketIfNotExists(store.BucketMarkers) if err != nil { return err } grid, err := mb.CreateBucketIfNotExists(store.BucketMarkersGrid) if err != nil { return err } idB, err := mb.CreateBucketIfNotExists(store.BucketMarkersID) if err != nil { return err } for _, mraw := range markers { key := []byte(fmt.Sprintf("%s_%d_%d", mraw.GridID, mraw.X, mraw.Y)) if grid.Get(key) != nil { continue } if mraw.Image == "" { mraw.Image = "gfx/terobjs/mm/custom" } id, err := idB.NextSequence() if err != nil { return err } idKey := []byte(strconv.Itoa(int(id))) m := Marker{ Name: mraw.Name, ID: int(id), GridID: mraw.GridID, Position: Position{ X: mraw.X, Y: mraw.Y, }, Image: mraw.Image, } raw, _ := json.Marshal(m) grid.Put(key, raw) idB.Put(idKey, key) } return nil }) if err != nil { log.Println("Error update db: ", err) return } }