servcvgen/handlers_tracking.go

157 lines
5.1 KiB
Go

package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
cfg "github.com/jesusperez/cfgsrv"
utils "github.com/jesusperez/datautils"
)
func get_tracking_list_handle(c *gin.Context, rtenv *RouteEnv) {
role := rtenv.Cfg.AdminRole
user,res := user_has_role(nil,c,rtenv,role)
if !res {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authentication failed"})
return
}
var trackingData []string
result := false
path := ""
var err error
switch (rtenv.Cfg.TrackingStore) {
case cfg.DsRedis:
path = "redis"
// TODO send to redis client
case cfg.DsFile:
path = rtenv.Cfg.TrackingOut
trackingData = getFileMatch(path,".json",false,false)
result = true
}
if result {
fmt.Printf("Tracking actions from (%s): %s\n",user.UserName, path)
logRoute(c,rtenv,"get_tracking",fmt.Sprintf("get %s: %s",user.UserName,path), fmt.Sprintf("get %s: %s",user.UserName,path))
// c.JSON(http.StatusOK, gin.H{"data": trackingData})
c.JSON(http.StatusOK, trackingData)
} else {
logRoute(c,rtenv,"get_tracking",fmt.Sprintf("get %s: read error %v ",user.UserName,err), fmt.Sprintf("get %s: %s",user.UserName,path))
fmt.Printf("Error get tracking from (%s) %s: %v\n", user.UserName, path, err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read tracking list"})
}
}
func get_tracking_handle(c *gin.Context, rtenv *RouteEnv) {
role := rtenv.Cfg.AdminRole
user,res := user_has_role(nil,c,rtenv,role)
if !res {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authentication failed"})
return
}
target := c.Params.ByName(rtenv.Cfg.Routes["tracking"].Param)
var trackingData []TrackAction
result := false
path := ""
var err error
switch (rtenv.Cfg.TrackingStore) {
case cfg.DsRedis:
path = "redis"
// TODO send to redis client
case cfg.DsFile:
path = fmt.Sprintf("%s/%s.json",rtenv.Cfg.TrackingOut,target)
var data []byte
data, err = loadPath(path)
if err == nil {
err = json.Unmarshal([]byte(fmt.Sprintf("[%s{}]",string(data))), &trackingData)
if err == nil {
result = true
}
}
}
if result {
fmt.Printf("Tracking actions from (%s): %s\n",user.UserName, path)
logRoute(c,rtenv,"get_tracking",fmt.Sprintf("get %s: %s",user.UserName,path), fmt.Sprintf("get %s: %s",user.UserName,path))
// c.JSON(http.StatusOK, gin.H{"data": trackingData})
c.JSON(http.StatusOK, trackingData)
} else {
logRoute(c,rtenv,"get_tracking",fmt.Sprintf("get %s: read error %v ",user.UserName,err), fmt.Sprintf("get %s: %s",user.UserName,path))
fmt.Printf("Error get tracking from (%s) %s: %v\n", user.UserName, path, err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read tracking"})
}
}
func post_tracking_handle(c *gin.Context, rtenv *RouteEnv) {
var trackpost PostTrackAction
err := c.BindJSON(&trackpost)
if err != nil {
fmt.Printf("err: %+v\n", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save info"})
return
}
if len(trackpost.Data) == 0 {
c.JSON(http.StatusNotAcceptable, gin.H{"track": "error data"})
return
}
userid := trackpost.Data
_, okmdl := rtenv.MdlsUsrs[userid]
auth := ""
if !okmdl {
_, okusr := rtenv.Users.Accounts[userid]
// if !okusr {
// c.JSON(http.StatusUnauthorized, gin.H{"error": "Authentication failed"})
// return
// }
if okusr && rtenv.Cfg.UseJWT {
tk, errtk := rtenv.AuthMiddleware.ParseToken(c)
if errtk == nil {
auth = fmt.Sprintf("%v",tk.Raw)
}
}
}
ip, _ := getIP(c.Request,true)
trackaction := &TrackAction{
When: trackpost.When,
Where: trackpost.Where,
What: trackpost.What,
Context: trackpost.Context,
Data: trackpost.Data,
Auth: auth,
Ip: ip,
// Info: requestInfo(c,rtenv,"post_tracking",fmt.Sprintf("post %s",trackpost.Data), fmt.Sprintf("post %s",userid)),
}
data,err := json.Marshal(trackaction)
if err != nil {
logRoute(c,rtenv,"post_tracking",fmt.Sprintf("post %s: error %v ",trackpost.Data,err), fmt.Sprintf("post %s",userid))
fmt.Printf("Error Parse tracking %s: %v\n", trackpost.Data, err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save tracking"})
return
}
result := false
path := ""
switch (rtenv.Cfg.TrackingStore) {
case cfg.DsRedis:
path = "redis"
// TODO send to redis client
case cfg.DsFile:
path = fmt.Sprintf("%s/%s.json",rtenv.Cfg.TrackingOut,time.Now().Format("2006_01_02"))
err := utils.CheckDirPath(fmt.Sprintf("%s",rtenv.Cfg.TrackingOut))
if err != nil {
log.Fatalf("setReqLog path %s: %v",rtenv.Cfg.TrackingOut,err)
}
err = utils.WriteAppendData(fmt.Sprintf("%s,",string(data)),path)
if err == nil {
result = true
}
}
if result {
fmt.Printf("Track action from %s writed to: %s\n", userid, path)
logRoute(c,rtenv,"post_tracking",fmt.Sprintf("post %s: %s",userid,path), fmt.Sprintf("post %s: %s",userid,path))
c.JSON(http.StatusOK, gin.H{"status": "ok"})
} else {
logRoute(c,rtenv,"post_tracking",fmt.Sprintf("post %s: write error %v ",userid,err), fmt.Sprintf("post %s: %s",userid,path))
fmt.Printf("Error write tracking from %s to %s: %v\n", userid, path, err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save tracking"})
}
}