styx/models/main.go
2020-01-14 14:49:14 +01:00

113 lines
2.1 KiB
Go

package models
import (
"encoding/json"
"io/ioutil"
"os"
"time"
"github.com/google/uuid"
"github.com/jmoiron/jsonq"
"github.com/sirupsen/logrus"
)
const (
nodesFilename = "nodes.json"
edgesFilename = "edges.json"
)
// Node defines the data we gather through the parsing.
type Node struct {
ID uuid.UUID
Flag string `json:"flag"`
}
// Edge defines a relation between two nodes.
type Edge struct {
ID uuid.UUID
NodeOneID uuid.UUID `json:"NodeOneID"`
// NodeTwoID uuid.UUID `json:NodeTwoID` to implement
Timestamp time.Time `json:"Timestamp"`
Data jsonq.JsonQuery `json:"Data"`
}
// SaveData is the main function used to save data. You need to pass a specific
// flag to it and the data recieved. It just saves data, it doesn't filter or
// look for it in the stream.
func SaveData(flag string, data jsonq.JsonQuery) {
err := fileExists(nodesFilename)
if err != nil {
logrus.Error(err)
}
err = fileExists(edgesFilename)
if err != nil {
logrus.Error(err)
}
nodeFile, err := ioutil.ReadFile(nodesFilename)
if err != nil {
logrus.Error(err)
}
edgeFile, err := ioutil.ReadFile(edgesFilename)
if err != nil {
logrus.Error(err)
}
nodeDatas := []Node{}
edgeDatas := []Edge{}
json.Unmarshal(nodeFile, &nodeDatas)
json.Unmarshal(edgeFile, &edgeDatas)
node := &Node{
ID: uuid.New(),
Flag: flag,
}
edge := &Edge{
ID: uuid.New(),
NodeOneID: node.ID,
Timestamp: time.Now(),
Data: data,
}
nodeDatas = append(nodeDatas, *node)
edgeDatas = append(edgeDatas, *edge)
nodeBytes, err := json.Marshal(nodeDatas)
if err != nil {
logrus.Error(err)
}
edgeBytes, err := json.Marshal(edgeDatas)
if err != nil {
logrus.Error(err)
}
err = ioutil.WriteFile(nodesFilename, nodeBytes, 0644)
if err != nil {
logrus.Error(err)
}
err = ioutil.WriteFile(edgesFilename, edgeBytes, 0644)
if err != nil {
logrus.Error(err)
}
}
// Helpers
func fileExists(filename string) error {
_, err := os.Stat(filename)
if os.IsNotExist(err) {
_, err := os.Create(filename)
if err != nil {
return err
}
}
return nil
}