yats.git

commit 7c2da97c1725f5f6388f3675e346377e63664207

Author: Paolo Lulli <paolo@lulli.net>

Add event endpoint

 .gitignore | 1 
 client/postEventNow | 8 ++++++
 client/postMetricNow.sh | 2 
 schema/schema.cql | 18 ++++++++++++++
 server/db/event.go | 18 ++++++++++++++
 server/geo/distances.go | 15 -----------
 server/geo/distances_test.go | 6 +++-
 server/rest/rest-event.go | 46 ++++++++++++++++++++++++++++++++++++++
 server/service-rest.go | 5 +++
 server/yats.go | 17 +++++++++++++


diff --git a/.gitignore b/.gitignore
index 56765fd5953b16777bdad7518505669d569a8d0d..e68b7924b97923e1119af047ce2d054c29d14d4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 server/yats-server
 .dqt
+.vscode/




diff --git a/client/postEventNow b/client/postEventNow
new file mode 100755
index 0000000000000000000000000000000000000000..ac6c90d31a2b44e8106b3820de3538bede35b047
--- /dev/null
+++ b/client/postEventNow
@@ -0,0 +1,8 @@
+#! /bin/bash
+
+event=$1
+curl \
+	-X POST\
+	--header "Content-Type: application/json"\
+	-d "{\"id_client\":\"cli1\",\"name\":\"${event}\"}"\
+	http://127.0.0.1:18081/rt/event




diff --git a/client/postMetricNow.sh b/client/postMetricNow.sh
index d255123644f4584744ddad742cac219889dba964..1224711169ffcd335f72eb49355c77c39012dae0 100755
--- a/client/postMetricNow.sh
+++ b/client/postMetricNow.sh
@@ -4,4 +4,4 @@ curl \
 	-X POST\
 	--header "Content-Type: application/json"\
 	-d '{"id_client":"cli1","name":"mone","value":"vone"}'\
-	http://127.0.0.1:18081/metric/now
+	http://127.0.0.1:18081/rt/metric




diff --git a/schema/schema.cql b/schema/schema.cql
index b0e24291d22408d1f6fc74cd48fa34d177ab8638..723965716188bbb3dec0c5d04064be5e3664944d 100644
--- a/schema/schema.cql
+++ b/schema/schema.cql
@@ -18,3 +18,21 @@  name text,
  created timestamp,
  PRIMARY KEY(id)
 );
+CREATE TABLE location (
+    hash text,
+    lname text,
+    lon double,
+    lat double,
+    code text,
+    cdist double,
+    PRIMARY KEY (code,cdist)
+);
+CREATE TABLE location_label (
+    hash text,
+    ltype text,
+    name text,
+    PRIMARY KEY (ltype,hash)
+);
+
+// select * from location where lat='' and lon=''
+// select * from location where ltype='' and code='' order by cdist




diff --git a/server/db/event.go b/server/db/event.go
new file mode 100644
index 0000000000000000000000000000000000000000..e0fd62e54f67cc558f02406050d74b9184ba290b
--- /dev/null
+++ b/server/db/event.go
@@ -0,0 +1,18 @@
+package db
+
+import (
+	"fmt"
+	"time"
+)
+
+func SaveEvent(idClient string, eventName string) {
+	q := fmt.Sprintf("insert into event ( id_client, etime, name) values ('%s',toTimestamp(now()),'%s');", idClient, eventName)
+	fmt.Printf("q=%s", q)
+	Session.Query(q).Exec()
+}
+
+func SaveEventAt(idClient string, tstamp time.Time, eventName string) {
+	timeAsBytes, _ := tstamp.UTC().MarshalText()
+	q := fmt.Sprintf("insert into event ( id_client, etime, name) values ('%s','%s','%s');", idClient, string(timeAsBytes), eventName)
+	Session.Query(q).Exec()
+}




diff --git a/server/geo/distances.go b/server/geo/distances.go
index 94f7a0e323f9a42e48f947288d9e6f9e7c9c7dcf..ea64ce2da50e0eb977995789fd3e8f9f62a22d19 100644
--- a/server/geo/distances.go
+++ b/server/geo/distances.go
@@ -12,27 +12,14 @@ func hsin(theta float64) float64 {
 	return math.Pow(math.Sin(theta/2), 2)
 }
 
-// Distance function returns the distance (in meters) between two points of
-//
-//	a given longitude and latitude relatively accurately (using a spherical
-//	approximation of the Earth) through the Haversin Distance Formula for
-//	great arc distance on a sphere with accuracy for small distances
-//
-// point coordinates are supplied in degrees and converted into rad. in the func
-//
-// distance returned is meters
-// http://en.wikipedia.org/wiki/Haversine_formula
 func Distance(coordinate1, coordinate2 coordinate) float64 {
-	// convert to radians
-	// must cast radius as float to multiply later
-
 	var la1, lo1, la2, lo2, r float64
 	la1 = coordinate1.lat * math.Pi / 180
 	lo1 = coordinate1.lon * math.Pi / 180
 	la2 = coordinate2.lat * math.Pi / 180
 	lo2 = coordinate2.lon * math.Pi / 180
 
-	r = 6378100 // Earth radius in meters
+	r = 6378100 // Earth radius
 
 	// calculate
 	h := hsin(la2-la1) + math.Cos(la1)*math.Cos(la2)*hsin(lo2-lo1)




diff --git a/server/geo/distances_test.go b/server/geo/distances_test.go
index 87c0ca92733d11c4f77896ebfa79b078ae94ed91..a959ca3d786c0a66eef1359b3b9b255b50bf498e 100644
--- a/server/geo/distances_test.go
+++ b/server/geo/distances_test.go
@@ -29,11 +29,13 @@ }
 
 func TestMaidenHead(t *testing.T) {
 	//winnipeg := coordinate{50.445210, -104.618896}
-	point := coordinate{50.445210, -104.618896}
+	//point := coordinate{50.445210, -104.618896}
+
+point := coordinate{0,0}
 
 	var p = maidenhead.NewPoint(point.lat, point.lon)
 
-	locator, _ := p.Locator(2)
+	locator, _ := p.Locator(3)
 	fmt.Printf("Locator: %s\n", locator)
 
 	var centerOfMaidenHead, _ = maidenhead.ParseLocatorCentered(locator)




diff --git a/server/rest/rest-event.go b/server/rest/rest-event.go
new file mode 100644
index 0000000000000000000000000000000000000000..81622fb57bad4e53e1f3c4c016451249e2264df5
--- /dev/null
+++ b/server/rest/rest-event.go
@@ -0,0 +1,46 @@
+package rest
+
+import (
+	"fmt"
+	"net/http"
+	"time"
+	"yats-server/db"
+
+	"github.com/gin-gonic/gin"
+)
+
+type EventRequest struct {
+	ID_client string `json:"id_client"`
+	Etime     int64  `json:"etime"`
+	Name      string `json:"name"`
+}
+
+func WriteEventNow(c *gin.Context) {
+	var event EventRequest
+
+	if err := c.BindJSON(&event); err != nil {
+		c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "-1"})
+		return
+	}
+
+	fmt.Printf("%s / %s ", event.ID_client, event.Name)
+	db.SaveEvent(event.ID_client, event.Name)
+
+	c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "0"})
+}
+
+func WriteEventcAt(c *gin.Context) {
+	var event EventRequest
+
+	if err := c.BindJSON(&event); err != nil {
+		c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "-1"})
+		return
+	}
+
+	fmt.Printf("%s / %s ", event.ID_client, event.Name)
+
+	unixTimeUTC := time.Unix(event.Etime, 0)
+	db.SaveEventAt(event.ID_client, unixTimeUTC, event.Name)
+
+	c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "OK"})
+}




diff --git a/server/service-rest.go b/server/service-rest.go
index 46cd7fecdb0d3cea22da283d3847dbeeb5ce66c9..f8c900eda9d40f0056b01d18c60ea0307ed8db0a 100644
--- a/server/service-rest.go
+++ b/server/service-rest.go
@@ -18,8 +18,11 @@
 	router.SetTrustedProxies([]string{"127.0.0.1"})
 	gin.SetMode(gin.ReleaseMode)
 
-	router.POST("/metric/now", rest.WriteMetricNow)
+	router.POST("/rt/metric", rest.WriteMetricNow)
 	router.POST("/metric", rest.WriteMetricAt)
+
+	router.POST("/rt/event", rest.WriteEventNow)
+	router.POST("/event", rest.WriteEventcAt)
 
 	router.Run(address)
 	//router.RunTLS(address, c.CertFile, c.KeyFile)




diff --git a/server/yats.go b/server/yats.go
index b1c96103d02e0b8137e9222c092797a9c297606c..9d6b266cdb8195eae0a4f6c4415375375c932edf 100644
--- a/server/yats.go
+++ b/server/yats.go
@@ -1,12 +1,28 @@
 package main
 
 import (
+	"fmt"
 	"os"
+	"time"
 	"yats-server/config"
 	"yats-server/db"
 )
 
 func main() {
+	go maintenanceThread()
+
+	startServer()
+}
+
+func maintenanceThread() {
+	var sleeptime, _ = time.ParseDuration("60s")
+	for {
+		time.Sleep(sleeptime)
+		fmt.Printf("Maintenance Thread\n")
+	}
+}
+
+func startServer() {
 	configuration := config.GetConfig(os.Getenv("HOME") + "/.yats.json")
 
 	db.Session = db.InitializeDb(configuration)
@@ -24,5 +40,4 @@
 		db.PrintMetrics(metrics)
 	*/
 	RestService(configuration)
-
 }