nidus-sync/sync/tile.go
Eli Ribble 44c4f17f32
Massive rework of platform layer user/organization
The goal of this rework is to make it so I can pass around platform.User
instead of a pair of models.Organization and models.User. This is useful
for reason I kind of forget now, but it started with working on
notifications and ballooned massively from there into refactoring a
number of things that were bugging me.

This also includes a tiny amount of work on server-side events (SSE).

 * background stuff lives inside the platform now, which I need for
   having it push updates through SSE
 * userfile now lives in the platform, under file, so other platform
   functions can safely use it
 * oauth is broken into pieces and inside platform because other stuff
   was calling it already, but badly.
 * notifications go into the platform as well
2026-03-12 23:49:16 +00:00

54 lines
1.4 KiB
Go

package sync
import (
"bytes"
"fmt"
"io"
"net/http"
"strconv"
"github.com/Gleipnir-Technology/nidus-sync/platform"
)
func getTileGPS(w http.ResponseWriter, r *http.Request, u platform.User) {
ctx := r.Context()
if err := r.ParseForm(); err != nil {
respondError(w, "Could not parse form", err, http.StatusBadRequest)
return
}
lat_s := r.FormValue("lat")
lng_s := r.FormValue("lng")
level_s := r.FormValue("level")
if lat_s == "" || lng_s == "" || level_s == "" {
respondError(w, "you must specify lat, lng, and level", nil, http.StatusBadRequest)
return
}
level, err := strconv.Atoi(level_s)
if err != nil {
respondError(w, "couldn't parse level", err, http.StatusBadRequest)
return
}
lat, err := strconv.ParseFloat(lat_s, 10)
if err != nil {
respondError(w, "couldn't parse lat", err, http.StatusBadRequest)
return
}
lng, err := strconv.ParseFloat(lng_s, 10)
if err != nil {
respondError(w, "couldn't parse lng", err, http.StatusBadRequest)
return
}
img, err := platform.ImageAtPoint(ctx, u.Organization, uint(level), lat, lng)
if err != nil {
respondError(w, "image at point", err, http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "image/png")
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(img.Content)))
_, err = io.Copy(w, bytes.NewBuffer(img.Content))
if err != nil {
respondError(w, "copy bytes", err, http.StatusInternalServerError)
return
}
}