summaryrefslogtreecommitdiff
path: root/pkg/handler/location.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/handler/location.go')
-rw-r--r--pkg/handler/location.go141
1 files changed, 141 insertions, 0 deletions
diff --git a/pkg/handler/location.go b/pkg/handler/location.go
new file mode 100644
index 0000000..9f4a2c1
--- /dev/null
+++ b/pkg/handler/location.go
@@ -0,0 +1,141 @@
+package handler
+
+import (
+ "encoding/json"
+ "time"
+
+ "github.com/alexedwards/scs/v2"
+ "github.com/labstack/echo/v4"
+ "gitrepo.ru/neonxp/track/pkg/models"
+ "go.etcd.io/bbolt"
+ "go.neonxp.ru/objectid"
+)
+
+type Location struct {
+ db *bbolt.DB
+ sessions *scs.SessionManager
+}
+
+func NewLocation(db *bbolt.DB, sessions *scs.SessionManager) *Location {
+ return &Location{
+ db: db,
+ sessions: sessions,
+ }
+}
+
+func (l *Location) AddPoint(c echo.Context) error {
+ uu := l.sessions.Get(c.Request().Context(), "user")
+ if uu == nil {
+ return echo.ErrForbidden
+ }
+ user, ok := uu.(*models.User)
+ if !ok {
+ return echo.ErrForbidden
+ }
+
+ req := new(PointArgs)
+ if err := c.Bind(req); err != nil {
+ return err
+ }
+
+ point := &models.Point{
+ ID: objectid.FromTime(req.Time),
+ UserID: user.ID,
+ Lat: req.Lat,
+ Lon: req.Lon,
+ Time: req.Time,
+ Speed: req.Speed,
+ Direction: req.Direction,
+ Accuracy: req.Accuracy,
+ }
+
+ err := l.db.Update(func(tx *bbolt.Tx) error {
+ points, err := tx.CreateBucketIfNotExists([]byte("points"))
+ if err != nil {
+ return err
+ }
+ jp, err := json.Marshal(point)
+ if err != nil {
+ return err
+ }
+
+ return points.Put(point.ID, jp)
+ })
+ if err != nil {
+ return err
+ }
+
+ return c.NoContent(201)
+}
+
+func (l *Location) GetPoints(c echo.Context) error {
+ // uu := l.sessions.Get(c.Request().Context(), "user")
+ // if uu == nil {
+ // return echo.ErrForbidden
+ // }
+ // user, ok := uu.(*models.User)
+ // if !ok {
+ // return echo.ErrForbidden
+ // }
+
+ pointsResp := []models.Point{}
+ err := l.db.View(func(tx *bbolt.Tx) error {
+ points := tx.Bucket([]byte("points"))
+ point := new(models.Point)
+ return points.ForEach(func(k, v []byte) error {
+ if err := json.Unmarshal(v, point); err != nil {
+ return err
+ }
+ // if slices.Equal(point.UserID, user.ID) {
+ pointsResp = append(pointsResp, *point)
+ // }
+ return nil
+ })
+ })
+ if err != nil {
+ return err
+ }
+
+ return c.JSON(200, pointsResp)
+}
+
+func (l *Location) GetLast(c echo.Context) error {
+ // uu := l.sessions.Get(c.Request().Context(), "user")
+ // if uu == nil {
+ // return echo.ErrForbidden
+ // }
+ // user, ok := uu.(*models.User)
+ // if !ok {
+ // return echo.ErrForbidden
+ // }
+
+ lastPoint := new(models.Point)
+ err := l.db.View(func(tx *bbolt.Tx) error {
+ points := tx.Bucket([]byte("points"))
+ point := new(models.Point)
+ return points.ForEach(func(k, v []byte) error {
+ if err := json.Unmarshal(v, point); err != nil {
+ return err
+ }
+ // if slices.Equal(point.UserID, user.ID) && lastPoint.Time.Before(point.Time) {
+ if lastPoint.Time.Before(point.Time) {
+ lastPoint = point
+ }
+ return nil
+ })
+ })
+ if err != nil {
+ return err
+ }
+
+ return c.JSON(200, lastPoint)
+}
+
+type PointArgs struct {
+ Lat float64 `query:"lat"`
+ Lon float64 `query:"lon"`
+ Time time.Time `query:"time"`
+ Speed float64 `query:"spd"`
+ Direction float64 `query:"dir"`
+ Accuracy float64 `query:"acc"`
+}