- Added a new AGENTS.md file to document the project structure and conventions. - Updated .gitignore to include node_modules and refined cursor rules. - Introduced new backend and frontend components for improved map interactions, including context menus and controls. - Enhanced API composables for better admin and authentication functionalities. - Refactored existing components for cleaner code and improved user experience. - Updated README.md to clarify production asset serving and user setup instructions.
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/andyleap/hnh-map/internal/app/store"
|
|
"go.etcd.io/bbolt"
|
|
)
|
|
|
|
type zoomproc struct {
|
|
c Coord
|
|
m int
|
|
}
|
|
|
|
func (a *App) doRebuildZooms() {
|
|
needProcess := map[zoomproc]struct{}{}
|
|
saveGrid := map[zoomproc]string{}
|
|
|
|
a.db.Update(func(tx *bbolt.Tx) error {
|
|
b := tx.Bucket(store.BucketGrids)
|
|
if b == nil {
|
|
return nil
|
|
}
|
|
b.ForEach(func(k, v []byte) error {
|
|
grid := GridData{}
|
|
json.Unmarshal(v, &grid)
|
|
needProcess[zoomproc{grid.Coord.Parent(), grid.Map}] = struct{}{}
|
|
saveGrid[zoomproc{grid.Coord, grid.Map}] = grid.ID
|
|
return nil
|
|
})
|
|
tx.DeleteBucket(store.BucketTiles)
|
|
return nil
|
|
})
|
|
|
|
for g, id := range saveGrid {
|
|
f := fmt.Sprintf("%s/grids/%s.png", a.gridStorage, id)
|
|
if _, err := os.Stat(f); err != nil {
|
|
continue
|
|
}
|
|
a.SaveTile(g.m, g.c, 0, fmt.Sprintf("grids/%s.png", id), time.Now().UnixNano())
|
|
}
|
|
for z := 1; z <= 5; z++ {
|
|
process := needProcess
|
|
needProcess = map[zoomproc]struct{}{}
|
|
for p := range process {
|
|
a.updateZoomLevel(p.m, p.c, z)
|
|
needProcess[zoomproc{p.c.Parent(), p.m}] = struct{}{}
|
|
}
|
|
}
|
|
}
|