yats.git

ref: master

server/rest/rest-position.go


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
 * Yats - yats
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later. See the COPYING file.
 *
 * @author Paolo Lulli <kevwe.com>
 * @copyright Paolo Lulli 2024
 */

package rest

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
	"time"
	"yats-server/config"
	"yats-server/db"
	"yats-server/model"
	"yats-server/util"
)

// WritePosition godoc
// @Param X-SSL-Client-CN header string true "clientCN"
// @Summary write position to db
// @Schemes
// @Description store position
// @Tags Positions
// @Accept json
// @Param position body model.PositionRequest true "Position body data"
// @Produce json
// @Success 202 {string} WriteEvent
// @Router /position [post]
func WritePosition(cfg config.Configuration) gin.HandlerFunc {
	return func(c *gin.Context) {
		var position model.PositionRequest

		if err := c.BindJSON(&position); err != nil {
			JsonPrint(cfg, c, http.StatusAccepted, gin.H{"ret": "-1"})
			return
		}

		clientCN := GetClientCN(c, cfg)
		fmt.Printf("%s / %s / %f /%f", clientCN, position.Name, position.Lat, position.Lon)
		if position.Ptime == 0 {
			db.SavePosition(clientCN, position.Lat, position.Lon, position.Name)

		} else {
			unixTimeUTC := time.Unix(position.Ptime, 0)
			db.SavePositionAt(clientCN, position.Lat, position.Lon, unixTimeUTC, position.Name)
		}
		JsonPrint(cfg, c, http.StatusAccepted, gin.H{"ret": "OK"})
	}
}

// SearchPositions  godoc
// @Param X-SSL-Client-CN header string true "clientCN"
// @Summary Get the positions From ... and To when present
// @Schemes
// @Description retrieve positions in the specified time window
// @Tags Positions
// @Accept json
// @Param position body model.PositionSearchRequest true "Position query filters"
// @Produce json
// @Success 200 {string} SearchPositions
// @Router /position/search [post]
func SearchPositions(cfg config.Configuration) gin.HandlerFunc {
	return func(c *gin.Context) {
		var position model.PositionSearchRequest

		if err := c.BindJSON(&position); err != nil {
			JsonPrint(cfg, c, http.StatusBadRequest, gin.H{"ret": "-1"})
			return
		}

		clientCN := GetClientCN(c, cfg)
		fmt.Printf("Client ID: %s\n ", clientCN)

		if position.SourceApplication != "" {
			if !db.CanReadSourcePosition(clientCN, position.SourceApplication) {
				JsonPrint(cfg, c, http.StatusBadRequest, gin.H{"ret": "-1"})
				return
			}
			clientCN = position.SourceApplication
		}

		var positionsPack []model.EventModel
		if position.To == 0 {
			positionsPack = db.EventsFrom(db.Session, clientCN, util.Int64ToTimeUTC(position.From), 100)
		} else if position.From != 0 {
			positionsPack = db.EventsBetween(db.Session, clientCN, util.Int64ToTimeUTC(position.From), util.Int64ToTimeUTC(position.To), 100)
		}

		maxpage := positionsPack[len(positionsPack)-1].Etime
		JsonPrint(cfg, c, http.StatusAccepted, gin.H{"maxpage": maxpage, "data": positionsPack})

	}
}

// GetPositionsFrom godoc
// @Param X-SSL-Client-CN header string true "clientCN"
// @Summary Get the positions from timestamp {from}
// @Schemes
// @Description retrieve positions  from timestamp {from}
// @Tags Positions
// @Accept json
// @Param position body model.PositionSearchRequest true "Event query filters"
// @Produce json
// @Success 200 {string} SearchPositions
// @Router /position/{from} [get]
// @Param from path string true "Starting from timestamp :from"
func GetPositionsFrom(cfg config.Configuration) gin.HandlerFunc {
	return func(c *gin.Context) {

		fromParam := c.Param("from")
		fromParamInt64, err := strconv.ParseInt(fromParam, 10, 64)
		if err != nil {
			JsonPrint(cfg, c, http.StatusBadRequest, gin.H{"ret": "-1"})
		}

		clientCN := GetClientCN(c, cfg)
		fmt.Printf("Client ID: %s\n ", clientCN)

		var positionsPack []model.EventModel
		positionsPack = db.EventsFrom(db.Session, clientCN, util.Int64ToTimeUTC(fromParamInt64), 100)

		maxpage := positionsPack[len(positionsPack)-1].Etime
		JsonPrint(cfg, c, http.StatusAccepted, gin.H{"maxpage": maxpage, "data": positionsPack})
	}
}